// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {IUniversalRouter} from "./interfaces/IUniversalRouter.sol";
import {IPermit2} from "./interfaces/IPermit2.sol";
import {UniversalRouterLib} from "./libraries/UniversalRouterLib.sol";
import {Addresses} from "./config/Addresses.sol";
/// @title HoodPerp BuybackVault
/// @notice Accumulates protocol fee revenue (USDG) and, on a keeper-triggered cadence, market-buys
/// HOOD via Uniswap and burns it.
///
/// @dev Pricing uses a keeper-supplied `minHoodOut` floor, bounded on-chain by an owner-set
/// `minHoodPerUsdg` rate (HOOD wei per 1 USDG micro-unit). A compromised keeper cannot
/// undercut that rate. Additional blast-radius limits:
/// 1. Swaps only through the owner-set USDG -> WETH -> HOOD Uniswap v3 route.
/// 2. `maxSpendPerRun` caps USDG spent per run (required at deploy).
/// 3. `interval` throttles frequency (nonzero at deploy).
/// `rescue()` is scoped to exclude USDG/HOOD so the owner cannot sweep protocol funds.
contract BuybackVault is Ownable2Step, ReentrancyGuard {
using SafeERC20 for IERC20;
IERC20 public immutable usdg;
IERC20 public immutable hood;
IUniversalRouter public immutable universalRouter;
IPermit2 public immutable permit2;
address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD;
uint48 internal constant MAX_EXPIRATION = type(uint48).max;
uint256 public interval;
uint256 public lastRun;
address public keeper;
/// @notice Owner-set Uniswap v3 route: USDG -> WETH -> HOOD.
bool public hoodRouteSet;
uint24 public usdgWethFee;
uint24 public wethHoodFee;
/// @notice Max USDG spent per buyback run (bounds a compromised-keeper blast radius).
uint256 public maxSpendPerRun;
/// @notice Minimum HOOD (18 decimals) per 1 USDG micro-unit (6 decimals).
/// On-chain floor: `amountIn * minHoodPerUsdg / 1e6`.
uint256 public minHoodPerUsdg;
bool public minRateSet;
event BuybackExecuted(uint256 usdgSpent, uint256 hoodBought, uint256 timestamp);
event KeeperUpdated(address indexed keeper);
event IntervalUpdated(uint256 interval);
event HoodRouteUpdated(uint24 usdgWethFee, uint24 wethHoodFee);
event MaxSpendPerRunUpdated(uint256 maxSpendPerRun);
event MinHoodPerUsdgUpdated(uint256 minHoodPerUsdg);
error NotKeeper();
error TooSoon(uint256 nextAllowed);
error NothingToSpend();
error AmountTooLarge();
error NotConfigured();
error ZeroMinOut();
error ProtectedToken();
error InsufficientOutput(uint256 received, uint256 minRequired);
error ZeroMaxSpend();
error ZeroInterval();
error MinOutBelowFloor(uint256 minHoodOut, uint256 floor);
constructor(
address _usdg,
address _hood,
address _universalRouter,
address _permit2,
uint256 _interval,
uint256 _maxSpendPerRun,
address _owner
) Ownable(_owner) {
if (_interval == 0) revert ZeroInterval();
if (_maxSpendPerRun == 0) revert ZeroMaxSpend();
usdg = IERC20(_usdg);
hood = IERC20(_hood);
universalRouter = IUniversalRouter(_universalRouter);
permit2 = IPermit2(_permit2);
interval = _interval;
maxSpendPerRun = _maxSpendPerRun;
}
modifier onlyKeeper() {
if (msg.sender != keeper) revert NotKeeper();
_;
}
// --- Configuration (owner; recommend multisig + timelock) ---
function setKeeper(address _keeper) external onlyOwner {
keeper = _keeper;
emit KeeperUpdated(_keeper);
}
function setInterval(uint256 _interval) external onlyOwner {
if (_interval == 0) revert ZeroInterval();
interval = _interval;
emit IntervalUpdated(_interval);
}
/// @notice Set the Uniswap v3 buyback route (USDG -> WETH -> HOOD).
function setHoodRoute(uint24 _usdgWethFee, uint24 _wethHoodFee) external onlyOwner {
usdgWethFee = _usdgWethFee;
wethHoodFee = _wethHoodFee;
hoodRouteSet = true;
emit HoodRouteUpdated(_usdgWethFee, _wethHoodFee);
}
function setMaxSpendPerRun(uint256 _maxSpendPerRun) external onlyOwner {
if (_maxSpendPerRun == 0) revert ZeroMaxSpend();
maxSpendPerRun = _maxSpendPerRun;
emit MaxSpendPerRunUpdated(_maxSpendPerRun);
}
/// @notice Set the on-chain HOOD/USDG floor rate. Keeper `minHoodOut` must meet this bound.
function setMinHoodPerUsdg(uint256 _minHoodPerUsdg) external onlyOwner {
if (_minHoodPerUsdg == 0) revert ZeroMinOut();
minHoodPerUsdg = _minHoodPerUsdg;
minRateSet = true;
emit MinHoodPerUsdgUpdated(_minHoodPerUsdg);
}
/// @notice Direct keeper entrypoint. `minHoodOut` is the off-chain-derived floor (HOOD base units).
function executeBuyback(uint256 minHoodOut, uint256 deadline) external onlyKeeper nonReentrant {
_buyback(minHoodOut, deadline);
}
function _buyback(uint256 minHoodOut, uint256 deadline) internal {
if (block.timestamp < lastRun + interval) revert TooSoon(lastRun + interval);
if (!hoodRouteSet || !minRateSet) revert NotConfigured();
if (minHoodOut == 0) revert ZeroMinOut();
uint256 balance = usdg.balanceOf(address(this));
if (balance == 0) revert NothingToSpend();
uint256 amountIn = balance > maxSpendPerRun ? maxSpendPerRun : balance;
if (amountIn > type(uint128).max) revert AmountTooLarge();
uint256 onChainFloor = (amountIn * minHoodPerUsdg) / 1e6;
if (minHoodOut < onChainFloor) revert MinOutBelowFloor(minHoodOut, onChainFloor);
// Effects before interactions.
lastRun = block.timestamp;
usdg.forceApprove(address(permit2), amountIn);
permit2.approve(address(usdg), address(universalRouter), uint160(amountIn), MAX_EXPIRATION);
uint256 hoodBefore = hood.balanceOf(address(this));
_executeSwap(amountIn, minHoodOut, deadline);
uint256 hoodBought = hood.balanceOf(address(this)) - hoodBefore;
if (hoodBought < minHoodOut) revert InsufficientOutput(hoodBought, minHoodOut);
usdg.forceApprove(address(permit2), 0);
permit2.approve(address(usdg), address(universalRouter), 0, 0);
hood.safeTransfer(BURN_ADDRESS, hoodBought);
emit BuybackExecuted(amountIn, hoodBought, block.timestamp);
}
function _executeSwap(uint256 amountIn, uint256 minHoodOut, uint256 deadline) internal {
bytes memory path = UniversalRouterLib.buildV3PathTwoHop(
address(usdg), usdgWethFee, Addresses.WETH, wethHoodFee, address(hood)
);
(bytes memory commands, bytes[] memory inputs) =
UniversalRouterLib.buildV3ExactIn(path, address(this), amountIn, minHoodOut);
universalRouter.execute(commands, inputs, deadline);
}
// --- Admin recovery for stray tokens (protocol funds USDG/HOOD are NOT sweepable) ---
function rescue(address token, address to, uint256 amount) external onlyOwner {
if (token == address(usdg) || token == address(hood)) revert ProtectedToken();
IERC20(token).safeTransfer(to, amount);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_usdg",
"type": "address",
"internalType": "address"
},
{
"name": "_hood",
"type": "address",
"internalType": "address"
},
{
"name": "_universalRouter",
"type": "address",
"internalType": "address"
},
{
"name": "_permit2",
"type": "address",
"internalType": "address"
},
{
"name": "_interval",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "_maxSpendPerRun",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "_owner",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AmountTooLarge",
"type": "error",
"inputs": []
},
{
"name": "AmountTooLarge",
"type": "error",
"inputs": []
},
{
"name": "InsufficientOutput",
"type": "error",
"inputs": [
{
"name": "received",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "minRequired",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "MinOutBelowFloor",
"type": "error",
"inputs": [
{
"name": "minHoodOut",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "floor",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "NotConfigured",
"type": "error",
"inputs": []
},
{
"name": "NotKeeper",
"type": "error",
"inputs": []
},
{
"name": "NothingToSpend",
"type": "error",
"inputs": []
},
{
"name": "OwnableInvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "OwnableUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ProtectedToken",
"type": "error",
"inputs": []
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "TooSoon",
"type": "error",
"inputs": [
{
"name": "nextAllowed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ZeroInterval",
"type": "error",
"inputs": []
},
{
"name": "ZeroMaxSpend",
"type": "error",
"inputs": []
},
{
"name": "ZeroMinOut",
"type": "error",
"inputs": []
},
{
"name": "BuybackExecuted",
"type": "event",
"inputs": [
{
"name": "usdgSpent",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "hoodBought",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "timestamp",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "HoodRouteUpdated",
"type": "event",
"inputs": [
{
"name": "usdgWethFee",
"type": "uint24",
"indexed": false,
"internalType": "uint24"
},
{
"name": "wethHoodFee",
"type": "uint24",
"indexed": false,
"internalType": "uint24"
}
],
"anonymous": false
},
{
"name": "IntervalUpdated",
"type": "event",
"inputs": [
{
"name": "interval",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "KeeperUpdated",
"type": "event",
"inputs": [
{
"name": "keeper",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "MaxSpendPerRunUpdated",
"type": "event",
"inputs": [
{
"name": "maxSpendPerRun",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "MinHoodPerUsdgUpdated",
"type": "event",
"inputs": [
{
"name": "minHoodPerUsdg",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferStarted",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "BURN_ADDRESS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "acceptOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "executeBuyback",
"type": "function",
"inputs": [
{
"name": "minHoodOut",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "deadline",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "hood",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IERC20"
}
],
"stateMutability": "view"
},
{
"name": "hoodRouteSet",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "interval",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "keeper",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "lastRun",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "maxSpendPerRun",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "minHoodPerUsdg",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "minRateSet",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "pendingOwner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "permit2",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IPermit2"
}
],
"stateMutability": "view"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "rescue",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setHoodRoute",
"type": "function",
"inputs": [
{
"name": "_usdgWethFee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "_wethHoodFee",
"type": "uint24",
"internalType": "uint24"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setInterval",
"type": "function",
"inputs": [
{
"name": "_interval",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setKeeper",
"type": "function",
"inputs": [
{
"name": "_keeper",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMaxSpendPerRun",
"type": "function",
"inputs": [
{
"name": "_maxSpendPerRun",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMinHoodPerUsdg",
"type": "function",
"inputs": [
{
"name": "_minHoodPerUsdg",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "universalRouter",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IUniversalRouter"
}
],
"stateMutability": "view"
},
{
"name": "usdg",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IERC20"
}
],
"stateMutability": "view"
},
{
"name": "usdgWethFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "view"
},
{
"name": "wethHoodFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "view"
}
]0x610100604052348015610010575f5ffd5b5060405161174d38038061174d83398101604081905261002f91610181565b806001600160a01b03811661005d57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b610066816100fb565b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00555f8390036100ac5760405163346ff60760e01b815260040160405180910390fd5b815f036100cc576040516339c63a3560e11b815260040160405180910390fd5b506001600160a01b0395861660805293851660a05291841660c05290921660e0526002919091556005556101f5565b600180546001600160a01b031916905561011481610117565b50565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b038116811461017c575f5ffd5b919050565b5f5f5f5f5f5f5f60e0888a031215610197575f5ffd5b6101a088610166565b96506101ae60208901610166565b95506101bc60408901610166565b94506101ca60608901610166565b608089015160a08a0151919550935091506101e760c08901610166565b905092959891949750929550565b60805160a05160c05160e0516114a06102ad5f395f81816101a501528181610a7c01528181610b1c01528181610cf80152610d9101525f818161022201528181610ae001528181610d5c01526110a201525f818161032f015281816104e701528181610b8901528181610c2901528181610df5015261103d01525f81816103a3015281816104ac0152818161092501528181610a5a01528181610ab801528181610cd601528181610d340152610fc401526114a05ff3fe608060405234801561000f575f5ffd5b5060043610610187575f3560e01c8063748747e6116100d9578063ce8ab46b11610093578063e30c39781161006e578063e30c39781461037a578063f2fde38b1461038b578063f5b91b7b1461039e578063fccc2813146103c5575f5ffd5b8063ce8ab46b1461032a578063cf5d271b14610351578063e22eee8414610364575f5ffd5b8063748747e6146102d057806379ba5097146102e35780638da5cb5b146102eb578063947a36fb146102fb57806397975c7514610304578063aced166114610317575f5ffd5b80633673bcf7116101445780636ba18f921161011f5780636ba18f92146102a95780636f517684146102b25780636fb31726146102bf578063715018a6146102c8575f5ffd5b80633673bcf7146102445780634106518b14610268578063626189771461027f575f5ffd5b80630976eebd1461018b57806312261ee7146101a05780631e1c951b146101e457806320ff430b146101f757806322a900821461020a57806335a9e4df1461021d575b5f5ffd5b61019e6101993660046111ee565b6103ce565b005b6101c77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61019e6101f23660046111ee565b610445565b61019e610205366004611220565b6104a2565b61019e6102183660046111ee565b610552565b6101c77f000000000000000000000000000000000000000000000000000000000000000081565b60045461025890600160a01b900460ff1681565b60405190151581526020016101db565b61027160065481565b6040519081526020016101db565b60045461029590600160a81b900462ffffff1681565b60405162ffffff90911681526020016101db565b61027160035481565b6007546102589060ff1681565b61027160055481565b61019e6105af565b61019e6102de36600461125a565b6105c2565b61019e610613565b5f546001600160a01b03166101c7565b61027160025481565b61019e61031236600461127a565b61065c565b6004546101c7906001600160a01b031681565b6101c77f000000000000000000000000000000000000000000000000000000000000000081565b61019e61035f3660046112ac565b6106c6565b60045461029590600160c01b900462ffffff1681565b6001546001600160a01b03166101c7565b61019e61039936600461125a565b610759565b6101c77f000000000000000000000000000000000000000000000000000000000000000081565b6101c761dead81565b6103d66107c9565b805f036103f657604051630a1c302560e21b815260040160405180910390fd5b60068190556007805460ff191660011790556040517f6b72b1babeb9ff45f6f5faf5b15d2b91250f3d7c9a21d200194e9859409e4f399061043a9083815260200190565b60405180910390a150565b61044d6107c9565b805f0361046d576040516339c63a3560e11b815260040160405180910390fd5b60058190556040518181527fecfbad6b9a26ae0668d3f1fc44cd29124ad6a93abd01ceb1f0b2c5f00949e4369060200161043a565b6104aa6107c9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316148061051b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316145b156105395760405163093e1cdb60e01b815260040160405180910390fd5b61054d6001600160a01b03841683836107f5565b505050565b61055a6107c9565b805f0361057a5760405163346ff60760e01b815260040160405180910390fd5b60028190556040518181527fc6f44473d25b86976ee7357c1339328224e349abc5486edc3007ef658a57608a9060200161043a565b6105b76107c9565b6105c05f61082a565b565b6105ca6107c9565b600480546001600160a01b0319166001600160a01b0383169081179091556040517f0425bcd291db1d48816f2a98edc7ecaf6dd5c64b973d9e4b3b6b750763dc6c2e905f90a250565b60015433906001600160a01b031681146106505760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b6106598161082a565b50565b6004546001600160a01b0316331461068757604051631ea2564f60e31b815260040160405180910390fd5b61068f610843565b6106998282610871565b6106c260017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050565b6106ce6107c9565b60048054600160a01b65ffffffffffff60a81b19909116600160a81b62ffffff86811691820262ffffff60c01b191692909217600160c01b9286169283021760ff60a01b1916929092179092556040805191825260208201929092527fe3a67685149e5d9d29777413b37dc69813f8451a10d4b707870025471c0137bc910160405180910390a15050565b6107616107c9565b600180546001600160a01b0383166001600160a01b031990911681179091556107915f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f546001600160a01b031633146105c05760405163118cdaa760e01b8152336004820152602401610647565b6108028383836001610e68565b61054d57604051635274afe760e01b81526001600160a01b0384166004820152602401610647565b600180546001600160a01b031916905561065981610eca565b61084b610f19565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60025460035461088191906112f1565b4210156108b45760025460035461089891906112f1565b604051637437acf560e11b815260040161064791815260200190565b600454600160a01b900460ff1615806108d0575060075460ff16155b156108ee5760405163d311bc3960e01b815260040160405180910390fd5b815f0361090e57604051630a1c302560e21b815260040160405180910390fd5b6040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610972573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610996919061130a565b9050805f036109b857604051630ebd4a6160e01b815260040160405180910390fd5b5f60055482116109c857816109cc565b6005545b90506fffffffffffffffffffffffffffffffff8111156109ff57604051630625040160e01b815260040160405180910390fd5b5f620f424060065483610a129190611321565b610a1c9190611338565b905080851015610a495760405163a9ece82160e01b81526004810186905260248101829052604401610647565b42600355610aa16001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f000000000000000000000000000000000000000000000000000000000000000084610f5b565b6040516387517c4560e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527f000000000000000000000000000000000000000000000000000000000000000081166024830152838116604483015265ffffffffffff60648301527f000000000000000000000000000000000000000000000000000000000000000016906387517c45906084015f604051808303815f87803b158015610b5d575f5ffd5b505af1158015610b6f573d5f5f3e3d5ffd5b50506040516370a0823160e01b81523060048201525f92507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506370a0823190602401602060405180830381865afa158015610bd7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bfb919061130a565b9050610c08838787610fad565b6040516370a0823160e01b81523060048201525f9082906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610c6e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c92919061130a565b610c9c9190611357565b905086811015610cc957604051630583371760e31b81526004810182905260248101889052604401610647565b610d1d6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f00000000000000000000000000000000000000000000000000000000000000005f610f5b565b6040516387517c4560e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527f0000000000000000000000000000000000000000000000000000000000000000811660248301525f6044830181905260648301527f000000000000000000000000000000000000000000000000000000000000000016906387517c45906084015f604051808303815f87803b158015610dd2575f5ffd5b505af1158015610de4573d5f5f3e3d5ffd5b50610e209250506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016905061dead836107f5565b6040805185815260208101839052428183015290517ff7e3493d2eb6a455012bf7667cb0e1563155e97974bcf902b23dc50b0a76bb1f9181900360600190a150505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610ebe578383151615610eb2573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036105c057604051633ee5aeb560e01b815260040160405180910390fd5b610f678383835f611110565b61054d57610f7883835f6001611110565b610fa057604051635274afe760e01b81526001600160a01b0384166004820152602401610647565b6108028383836001611110565b600454604080516bffffffffffffffffffffffff197f0000000000000000000000000000000000000000000000000000000000000000606090811b821660208401526001600160e81b0319600160a81b860460e890811b82166034860152730bd7d308f8e1639fab988df18a8011f41eacad7360601b6037860152600160c01b90960490951b909416604b8301527f000000000000000000000000000000000000000000000000000000000000000090931b909216604e83015280518083036042018152606290920190525f5f6110868330888861115a565b604051630d64d59360e21b815291935091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633593564c906110db90859085908990600401611398565b5f604051808303815f87803b1580156110f2575f5ffd5b505af1158015611104573d5f5f3e3d5ffd5b50505050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610ebe578383151615610eb2573d5f823e3d81fd5b6060806040515f602082015260210160408051808303601f1901815260018084528383019092529350816020015b60608152602001906001900390816111885790505090508484848860016040516020016111b9959493929190611416565b604051602081830303815290604052815f815181106111da576111da611456565b602002602001018190525094509492505050565b5f602082840312156111fe575f5ffd5b5035919050565b80356001600160a01b038116811461121b575f5ffd5b919050565b5f5f5f60608486031215611232575f5ffd5b61123b84611205565b925061124960208501611205565b929592945050506040919091013590565b5f6020828403121561126a575f5ffd5b61127382611205565b9392505050565b5f5f6040838503121561128b575f5ffd5b50508035926020909101359150565b803562ffffff8116811461121b575f5ffd5b5f5f604083850312156112bd575f5ffd5b6112c68361129a565b91506112d46020840161129a565b90509250929050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115611304576113046112dd565b92915050565b5f6020828403121561131a575f5ffd5b5051919050565b8082028115828204841417611304576113046112dd565b5f8261135257634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115611304576113046112dd565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b606081525f6113aa606083018661136a565b828103602084015280855180835260208301915060208160051b840101602088015f5b838110156113ff57601f198684030185526113e983835161136a565b60209586019590935091909101906001016113cd565b505080945050505050826040830152949350505050565b60018060a01b038616815284602082015283604082015260a060608201525f61144260a083018561136a565b905082151560808301529695505050505050565b634e487b7160e01b5f52603260045260245ffdfea2646970667358221220ff6479ab7dff98cbf757a1e5d80e1254e9ddfad1875a6bdfd37405db13510ee664736f6c634300081c00330000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d1680000000000000000000000002b10d89ba75cfe18f2678a66e4c18c1005b03afa0000000000000000000000008876789976decbfcbbbe364623c63652db8c0904000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3000000000000000000000000000000000000000000000000000000000001518000000000000000000000000000000000000000000000000000000002540be40000000000000000000000000063172b76b5a97c6ae653c736bca2989be40fb719
0x608060405234801561000f575f5ffd5b5060043610610187575f3560e01c8063748747e6116100d9578063ce8ab46b11610093578063e30c39781161006e578063e30c39781461037a578063f2fde38b1461038b578063f5b91b7b1461039e578063fccc2813146103c5575f5ffd5b8063ce8ab46b1461032a578063cf5d271b14610351578063e22eee8414610364575f5ffd5b8063748747e6146102d057806379ba5097146102e35780638da5cb5b146102eb578063947a36fb146102fb57806397975c7514610304578063aced166114610317575f5ffd5b80633673bcf7116101445780636ba18f921161011f5780636ba18f92146102a95780636f517684146102b25780636fb31726146102bf578063715018a6146102c8575f5ffd5b80633673bcf7146102445780634106518b14610268578063626189771461027f575f5ffd5b80630976eebd1461018b57806312261ee7146101a05780631e1c951b146101e457806320ff430b146101f757806322a900821461020a57806335a9e4df1461021d575b5f5ffd5b61019e6101993660046111ee565b6103ce565b005b6101c77f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba381565b6040516001600160a01b0390911681526020015b60405180910390f35b61019e6101f23660046111ee565b610445565b61019e610205366004611220565b6104a2565b61019e6102183660046111ee565b610552565b6101c77f0000000000000000000000008876789976decbfcbbbe364623c63652db8c090481565b60045461025890600160a01b900460ff1681565b60405190151581526020016101db565b61027160065481565b6040519081526020016101db565b60045461029590600160a81b900462ffffff1681565b60405162ffffff90911681526020016101db565b61027160035481565b6007546102589060ff1681565b61027160055481565b61019e6105af565b61019e6102de36600461125a565b6105c2565b61019e610613565b5f546001600160a01b03166101c7565b61027160025481565b61019e61031236600461127a565b61065c565b6004546101c7906001600160a01b031681565b6101c77f0000000000000000000000002b10d89ba75cfe18f2678a66e4c18c1005b03afa81565b61019e61035f3660046112ac565b6106c6565b60045461029590600160c01b900462ffffff1681565b6001546001600160a01b03166101c7565b61019e61039936600461125a565b610759565b6101c77f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d16881565b6101c761dead81565b6103d66107c9565b805f036103f657604051630a1c302560e21b815260040160405180910390fd5b60068190556007805460ff191660011790556040517f6b72b1babeb9ff45f6f5faf5b15d2b91250f3d7c9a21d200194e9859409e4f399061043a9083815260200190565b60405180910390a150565b61044d6107c9565b805f0361046d576040516339c63a3560e11b815260040160405180910390fd5b60058190556040518181527fecfbad6b9a26ae0668d3f1fc44cd29124ad6a93abd01ceb1f0b2c5f00949e4369060200161043a565b6104aa6107c9565b7f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d1686001600160a01b0316836001600160a01b0316148061051b57507f0000000000000000000000002b10d89ba75cfe18f2678a66e4c18c1005b03afa6001600160a01b0316836001600160a01b0316145b156105395760405163093e1cdb60e01b815260040160405180910390fd5b61054d6001600160a01b03841683836107f5565b505050565b61055a6107c9565b805f0361057a5760405163346ff60760e01b815260040160405180910390fd5b60028190556040518181527fc6f44473d25b86976ee7357c1339328224e349abc5486edc3007ef658a57608a9060200161043a565b6105b76107c9565b6105c05f61082a565b565b6105ca6107c9565b600480546001600160a01b0319166001600160a01b0383169081179091556040517f0425bcd291db1d48816f2a98edc7ecaf6dd5c64b973d9e4b3b6b750763dc6c2e905f90a250565b60015433906001600160a01b031681146106505760405163118cdaa760e01b81526001600160a01b03821660048201526024015b60405180910390fd5b6106598161082a565b50565b6004546001600160a01b0316331461068757604051631ea2564f60e31b815260040160405180910390fd5b61068f610843565b6106998282610871565b6106c260017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5050565b6106ce6107c9565b60048054600160a01b65ffffffffffff60a81b19909116600160a81b62ffffff86811691820262ffffff60c01b191692909217600160c01b9286169283021760ff60a01b1916929092179092556040805191825260208201929092527fe3a67685149e5d9d29777413b37dc69813f8451a10d4b707870025471c0137bc910160405180910390a15050565b6107616107c9565b600180546001600160a01b0383166001600160a01b031990911681179091556107915f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f546001600160a01b031633146105c05760405163118cdaa760e01b8152336004820152602401610647565b6108028383836001610e68565b61054d57604051635274afe760e01b81526001600160a01b0384166004820152602401610647565b600180546001600160a01b031916905561065981610eca565b61084b610f19565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60025460035461088191906112f1565b4210156108b45760025460035461089891906112f1565b604051637437acf560e11b815260040161064791815260200190565b600454600160a01b900460ff1615806108d0575060075460ff16155b156108ee5760405163d311bc3960e01b815260040160405180910390fd5b815f0361090e57604051630a1c302560e21b815260040160405180910390fd5b6040516370a0823160e01b81523060048201525f907f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d1686001600160a01b0316906370a0823190602401602060405180830381865afa158015610972573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610996919061130a565b9050805f036109b857604051630ebd4a6160e01b815260040160405180910390fd5b5f60055482116109c857816109cc565b6005545b90506fffffffffffffffffffffffffffffffff8111156109ff57604051630625040160e01b815260040160405180910390fd5b5f620f424060065483610a129190611321565b610a1c9190611338565b905080851015610a495760405163a9ece82160e01b81526004810186905260248101829052604401610647565b42600355610aa16001600160a01b037f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d168167f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba384610f5b565b6040516387517c4560e01b81526001600160a01b037f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d168811660048301527f0000000000000000000000008876789976decbfcbbbe364623c63652db8c090481166024830152838116604483015265ffffffffffff60648301527f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba316906387517c45906084015f604051808303815f87803b158015610b5d575f5ffd5b505af1158015610b6f573d5f5f3e3d5ffd5b50506040516370a0823160e01b81523060048201525f92507f0000000000000000000000002b10d89ba75cfe18f2678a66e4c18c1005b03afa6001600160a01b031691506370a0823190602401602060405180830381865afa158015610bd7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bfb919061130a565b9050610c08838787610fad565b6040516370a0823160e01b81523060048201525f9082906001600160a01b037f0000000000000000000000002b10d89ba75cfe18f2678a66e4c18c1005b03afa16906370a0823190602401602060405180830381865afa158015610c6e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c92919061130a565b610c9c9190611357565b905086811015610cc957604051630583371760e31b81526004810182905260248101889052604401610647565b610d1d6001600160a01b037f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d168167f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba35f610f5b565b6040516387517c4560e01b81526001600160a01b037f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d168811660048301527f0000000000000000000000008876789976decbfcbbbe364623c63652db8c0904811660248301525f6044830181905260648301527f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba316906387517c45906084015f604051808303815f87803b158015610dd2575f5ffd5b505af1158015610de4573d5f5f3e3d5ffd5b50610e209250506001600160a01b037f0000000000000000000000002b10d89ba75cfe18f2678a66e4c18c1005b03afa16905061dead836107f5565b6040805185815260208101839052428183015290517ff7e3493d2eb6a455012bf7667cb0e1563155e97974bcf902b23dc50b0a76bb1f9181900360600190a150505050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610ebe578383151615610eb2573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036105c057604051633ee5aeb560e01b815260040160405180910390fd5b610f678383835f611110565b61054d57610f7883835f6001611110565b610fa057604051635274afe760e01b81526001600160a01b0384166004820152602401610647565b6108028383836001611110565b600454604080516bffffffffffffffffffffffff197f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d168606090811b821660208401526001600160e81b0319600160a81b860460e890811b82166034860152730bd7d308f8e1639fab988df18a8011f41eacad7360601b6037860152600160c01b90960490951b909416604b8301527f0000000000000000000000002b10d89ba75cfe18f2678a66e4c18c1005b03afa90931b909216604e83015280518083036042018152606290920190525f5f6110868330888861115a565b604051630d64d59360e21b815291935091506001600160a01b037f0000000000000000000000008876789976decbfcbbbe364623c63652db8c09041690633593564c906110db90859085908990600401611398565b5f604051808303815f87803b1580156110f2575f5ffd5b505af1158015611104573d5f5f3e3d5ffd5b50505050505050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610ebe578383151615610eb2573d5f823e3d81fd5b6060806040515f602082015260210160408051808303601f1901815260018084528383019092529350816020015b60608152602001906001900390816111885790505090508484848860016040516020016111b9959493929190611416565b604051602081830303815290604052815f815181106111da576111da611456565b602002602001018190525094509492505050565b5f602082840312156111fe575f5ffd5b5035919050565b80356001600160a01b038116811461121b575f5ffd5b919050565b5f5f5f60608486031215611232575f5ffd5b61123b84611205565b925061124960208501611205565b929592945050506040919091013590565b5f6020828403121561126a575f5ffd5b61127382611205565b9392505050565b5f5f6040838503121561128b575f5ffd5b50508035926020909101359150565b803562ffffff8116811461121b575f5ffd5b5f5f604083850312156112bd575f5ffd5b6112c68361129a565b91506112d46020840161129a565b90509250929050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115611304576113046112dd565b92915050565b5f6020828403121561131a575f5ffd5b5051919050565b8082028115828204841417611304576113046112dd565b5f8261135257634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115611304576113046112dd565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b606081525f6113aa606083018661136a565b828103602084015280855180835260208301915060208160051b840101602088015f5b838110156113ff57601f198684030185526113e983835161136a565b60209586019590935091909101906001016113cd565b505080945050505050826040830152949350505050565b60018060a01b038616815284602082015283604082015260a060608201525f61144260a083018561136a565b905082151560808301529695505050505050565b634e487b7160e01b5f52603260045260245ffdfea2646970667358221220ff6479ab7dff98cbf757a1e5d80e1254e9ddfad1875a6bdfd37405db13510ee664736f6c634300081c0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x19a4ef…c3da1a | 31 days agoWed, 15 Jul 2026 15:17:09 UTC | 0x0425bc…6c2e | [0] 0x000000000000…e40fb719 |
| 0x07c86e…6d04b5 | 31 days agoWed, 15 Jul 2026 15:17:09 UTC | 0x6b72b1…4f39 | data: 0x000000000000000000…a4d0b800 |
| 0xa253f9…599a9a | 31 days agoWed, 15 Jul 2026 15:17:09 UTC | 0xe3a676…37bc | data: 0x000000000000000000…00002710 |
| 0xc3ed8f…5936d1 | 31 days agoWed, 15 Jul 2026 15:10:13 UTC | 0x8be007…57e0 | [0] 0x000000000000…00000000 [1] 0x000000000000…e40fb719 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x19a4ef…c3da1a | setKeeper | 10,494,220 | 31 days agoWed, 15 Jul 2026 15:17:09 UTC | 0x6317…b719 | IN | BuybackVault | $0.000 ETH | 0.00000190 | |
| 0xa253f9…599a9a | setHoodRoute | 10,494,220 | 31 days agoWed, 15 Jul 2026 15:17:09 UTC | 0x6317…b719 | IN | BuybackVault | $0.000 ETH | 0.00000300 | |
| 0x07c86e…6d04b5 | setMinHoodPerUsdg | 10,494,220 | 31 days agoWed, 15 Jul 2026 15:17:09 UTC | 0x6317…b719 | IN | BuybackVault | $0.000 ETH | 0.00000435 |