Source Code
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
RouterModuleRewardsFetcher
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.28;
import {RouterModuleBase} from "src/router/modules/RouterModuleBase.sol";
/// @title RouterModuleRewardsFetcher
/// @notice Single entrypoint to claim rewards from supported reward distributors.
/// @dev This module unifies reward claims across two on-chain conventions:
/// - UniversalRewardsDistributor (URD): Morpho-like merkle distributor with per-account cumulative amounts.
/// - MultiMerkleStash (MMS): per-token merkle distributor with index-based claims.
/// @dev Functions are restricted by `onlyDelegateCall`. They are meant to be invoked
/// via the Router using delegatecall so that transfers and state changes happen
/// in the Router context, enabling composition with other modules in the same transaction.
contract RouterModuleRewardsFetcher is RouterModuleBase {
string public constant name = type(RouterModuleRewardsFetcher).name;
string public constant version = "1.0.0";
/// @notice Thrown when `distributors` and payload arrays length mismatch
error InvalidParamsLength();
/// @notice Thrown when a provided distributor type is not supported
error InvalidDistributorType();
///////////////////////////////////////////////////////////////
// IUniversalRewardsDistributor
///////////////////////////////////////////////////////////////
/// @notice Batched claim payload for a UniversalRewardsDistributor.
/// @dev Mirrors the URD `claim` function parameters per item.
struct UniversalRewardsDistributorClaimData {
/// @notice Address to claim rewards for.
address account;
/// @notice Reward token address.
address reward;
/// @notice Overall cumulative claimable amount encoded in the merkle tree.
uint256 claimable;
/// @notice Merkle proof proving the (account, reward, claimable) leaf.
bytes32[] proof;
}
/// @notice Claim rewards from a UniversalRewardsDistributor.
/// @param distributor Address of the URD distributor.
/// @param account Address to claim rewards for.
/// @param reward Reward token address.
/// @param claimable Overall cumulative claimable amount proved by the merkle tree.
/// @param proof Merkle proof for (account, reward, claimable).
/// @return amount Newly claimed amount (delta since last claim) returned by the URD.
/// @dev Anyone can claim on behalf of `account`. Reverts bubble from the distributor
/// (e.g., invalid proof, root not set, or claimable too low). Tokens are transferred
/// by the distributor to its configured recipient logic (may be `account` or another recipient).
function claim(address distributor, address account, address reward, uint256 claimable, bytes32[] calldata proof)
external
onlyDelegateCall
returns (uint256 amount)
{
return IUniversalRewardsDistributor(distributor).claim(account, reward, claimable, proof);
}
/// @notice Batch claim rewards across multiple UniversalRewardsDistributor contracts.
/// @param distributors Array of URD distributor addresses.
/// @param claimData Array of per-URD claim parameters matching `distributors` order.
/// @return amounts Array of newly claimed amounts per distributor.
/// @dev Reverts with `InvalidParamsLength` if array lengths mismatch. Each claim is executed
/// independently in a loop; any revert from a distributor will revert the whole call.
function claims(address[] calldata distributors, UniversalRewardsDistributorClaimData[] calldata claimData)
external
onlyDelegateCall
returns (uint256[] memory amounts)
{
if (distributors.length != claimData.length) revert InvalidParamsLength();
amounts = new uint256[](distributors.length);
for (uint256 i; i < distributors.length; i++) {
amounts[i] = IUniversalRewardsDistributor(distributors[i])
.claim(claimData[i].account, claimData[i].reward, claimData[i].claimable, claimData[i].proof);
}
}
///////////////////////////////////////////////////////////////
// IMultiMerkleStash
///////////////////////////////////////////////////////////////
/// @notice Per-claim parameters for a MultiMerkleStash distributor.
/// @dev Mirrors the MMS `claim` function signature per token.
struct MultiMerkleStashClaimParams {
/// @notice Reward token address.
address token;
/// @notice Leaf index used by the MMS bitmap for idempotency.
uint256 index;
/// @notice Amount to claim for this leaf.
uint256 amount;
/// @notice Merkle proof proving (index, account, amount) for `token`.
bytes32[] merkleProof;
}
/// @notice Batched claim payload for a MultiMerkleStash distributor.
struct MultiMerkleStashClaimData {
/// @notice Address to claim rewards for.
address account;
/// @notice List of per-token claim parameters.
MultiMerkleStashClaimParams[] claimParams;
}
/// @notice Claim rewards from a MultiMerkleStash distributor for a single token leaf.
/// @param distributor Address of the MultiMerkleStash distributor.
/// @param token Reward token address.
/// @param index Leaf index used by the MMS claimed bitmap.
/// @param account Address to claim rewards for.
/// @param amount Amount to claim for the leaf.
/// @param merkleProof Merkle proof proving (index, account, amount) in the token tree.
/// @dev Reverts bubble from the distributor (e.g., already claimed or invalid proof). Tokens
/// are transferred by the distributor to `account`.
function claim(
address distributor,
address token,
uint256 index,
address account,
uint256 amount,
bytes32[] calldata merkleProof
) external onlyDelegateCall {
return IMultiMerkleStash(distributor).claim(token, index, account, amount, merkleProof);
}
/// @notice Batch claim rewards across multiple MultiMerkleStash distributors.
/// @param distributors Array of MMS distributor addresses.
/// @param claimData Array of per-distributor batched claim payloads matching `distributors` order.
/// @dev Reverts with `InvalidParamsLength` if array lengths mismatch. Each distributor call
/// uses `claimMulti` and may revert independently; any revert bubbles and reverts the whole call.
function claims(address[] calldata distributors, MultiMerkleStashClaimData[] calldata claimData)
external
onlyDelegateCall
{
if (distributors.length != claimData.length) revert InvalidParamsLength();
for (uint256 i; i < distributors.length; i++) {
IMultiMerkleStash(distributors[i]).claimMulti(claimData[i].account, claimData[i].claimParams);
}
}
///////////////////////////////////////////////////////////////
// BOTH IUniversalRewardsDistributor AND IMultiMerkleStash
///////////////////////////////////////////////////////////////
/// @notice Supported reward distributor types for batched claims.
/// @dev Extend this enum when adding new distributor conventions.
enum DistributorType {
/// @notice Morpho-like UniversalRewardsDistributor.
UniversalRewardsDistributor,
/// @notice MultiMerkleStash with per-token merkle trees and index-based claims.
MultiMerkleStash
}
/// @notice Batch claim rewards from distributors with per-item interface types.
/// @param distributors Array of distributor addresses.
/// @param distributorTypes Array of distributor types, one for each distributor in `distributors`.
/// @param claimData ABI-encoded per-item claim parameters, matching `distributors` order.
/// - If `distributorTypes[i] == DistributorType.UniversalRewardsDistributor`, each item must be
/// abi.encode(account, reward, claimable, proof) where:
/// account: address
/// reward: address
/// claimable: uint256
/// proof: bytes32[]
/// - If `distributorTypes[i] == DistributorType.MultiMerkleStash`, each item must be
/// abi.encode(token, index, account, amount, merkleProof) where:
/// token: address
/// index: uint256
/// account: address
/// amount: uint256
/// merkleProof: bytes32[]
/// @dev Use this function to claim rewards from multiple distributors with
/// different implementations. Reverts with `InvalidParamsLength` if array lengths mismatch
/// and `InvalidDistributorType` if the type is not supported. Any revert from a target distributor
/// bubbles up and reverts the entire call.
/// The contracts IMultiMerkleStash are called using the `claim` function not the `claimMulti` function.
function claims(
address[] calldata distributors,
DistributorType[] calldata distributorTypes,
bytes[] calldata claimData
) external onlyDelegateCall {
if (distributors.length != distributorTypes.length) {
revert InvalidParamsLength();
}
if (distributors.length != claimData.length) revert InvalidParamsLength();
for (uint256 i; i < distributors.length; i++) {
if (distributorTypes[i] == DistributorType.UniversalRewardsDistributor) {
(address account, address reward, uint256 claimable, bytes32[] memory proof) =
abi.decode(claimData[i], (address, address, uint256, bytes32[]));
IUniversalRewardsDistributor(distributors[i]).claim(account, reward, claimable, proof);
} else if (distributorTypes[i] == DistributorType.MultiMerkleStash) {
(address token, uint256 index, address account, uint256 amount, bytes32[] memory merkleProof) =
abi.decode(claimData[i], (address, uint256, address, uint256, bytes32[]));
IMultiMerkleStash(distributors[i]).claim(token, index, account, amount, merkleProof);
} else {
revert InvalidDistributorType();
}
}
}
}
interface IUniversalRewardsDistributor {
function claim(address account, address reward, uint256 claimable, bytes32[] memory proof)
external
returns (uint256 amount);
}
interface IMultiMerkleStash {
function claim(address token, uint256 index, address account, uint256 amount, bytes32[] calldata merkleProof)
external;
function claimMulti(address account, RouterModuleRewardsFetcher.MultiMerkleStashClaimParams[] calldata claims)
external;
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.28;
import {IRouterModule} from "src/router/interfaces/IRouterModule.sol";
/// @title RouterModuleBase
/// @notice An abstract contract that serves as the base for all router modules
/// @dev Exposes the onlyDelegateCall modifier to restrict functions to be called only by delegatecall
abstract contract RouterModuleBase is IRouterModule {
address private immutable THIS;
error OnlyDelegateCall();
constructor() {
THIS = address(this);
}
modifier onlyDelegateCall() {
require(address(this) != THIS, OnlyDelegateCall());
_;
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.28;
interface IRouterModule {
function name() external view returns (string memory name);
function version() external view returns (string memory version);
}{
"remappings": [
"forge-std/=node_modules/forge-std/",
"@shared/=node_modules/@stake-dao/shared/",
"@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/",
"@interfaces/=node_modules/@stake-dao/interfaces/src/interfaces/",
"@address-book/=node_modules/@stake-dao/address-book/",
"@strategies/=node_modules/@stake-dao/strategies/",
"@lockers/=node_modules/@stake-dao/lockers/",
"@safe/=node_modules/@stake-dao/strategies/node_modules/@safe-global/safe-smart-account/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "cancun",
"viaIR": false
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"name":"InvalidDistributorType","type":"error"},{"inputs":[],"name":"InvalidParamsLength","type":"error"},{"inputs":[],"name":"OnlyDelegateCall","type":"error"},{"inputs":[{"internalType":"address","name":"distributor","type":"address"},{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"reward","type":"address"},{"internalType":"uint256","name":"claimable","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claim","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"distributor","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"distributors","type":"address[]"},{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"reward","type":"address"},{"internalType":"uint256","name":"claimable","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"internalType":"struct RouterModuleRewardsFetcher.UniversalRewardsDistributorClaimData[]","name":"claimData","type":"tuple[]"}],"name":"claims","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"distributors","type":"address[]"},{"components":[{"internalType":"address","name":"account","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"internalType":"struct RouterModuleRewardsFetcher.MultiMerkleStashClaimParams[]","name":"claimParams","type":"tuple[]"}],"internalType":"struct RouterModuleRewardsFetcher.MultiMerkleStashClaimData[]","name":"claimData","type":"tuple[]"}],"name":"claims","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"distributors","type":"address[]"},{"internalType":"enum RouterModuleRewardsFetcher.DistributorType[]","name":"distributorTypes","type":"uint8[]"},{"internalType":"bytes[]","name":"claimData","type":"bytes[]"}],"name":"claims","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60a0604052348015600e575f5ffd5b50306080526080516111846100475f395f818161017c015281816103b701528181610522015281816105ea01526106a001526111845ff3fe608060405234801561000f575f5ffd5b506004361061007a575f3560e01c806354fd4d501161005857806354fd4d5014610105578063a21d1ade14610129578063ad1c662b1461014a578063b10fb3c31461015d575f5ffd5b806306fdde031461007e5780633a3b369f146100d05780634f3ebd52146100f0575b5f5ffd5b6100ba60405180604001604052601a8152806020017f526f757465724d6f64756c65526577617264734665746368657200000000000081525081565b6040516100c79190610977565b60405180910390f35b6100e36100de3660046109f3565b610170565b6040516100c79190610a5d565b6101036100fe3660046109f3565b6103ad565b005b6100ba604051806040016040528060058152602001640312e302e360dc1b81525081565b61013c610137366004610ab6565b610517565b6040519081526020016100c7565b610103610158366004610b35565b6105e0565b61010361016b366004610bbd565b610696565b60606001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036101bb57604051633c64f99360e21b815260040160405180910390fd5b8382146101db57604051633e5431b160e21b815260040160405180910390fd5b836001600160401b038111156101f3576101f3610c3b565b60405190808252806020026020018201604052801561021c578160200160208202803683370190505b5090505f5b848110156103a45785858281811061023b5761023b610c4f565b90506020020160208101906102509190610c63565b6001600160a01b031663fabed41285858481811061027057610270610c4f565b90506020028101906102829190610c85565b610290906020810190610c63565b8686858181106102a2576102a2610c4f565b90506020028101906102b49190610c85565b6102c5906040810190602001610c63565b8787868181106102d7576102d7610c4f565b90506020028101906102e99190610c85565b604001358888878181106102ff576102ff610c4f565b90506020028101906103119190610c85565b61031f906060810190610ca3565b6040518663ffffffff1660e01b815260040161033f959493929190610d18565b6020604051808303815f875af115801561035b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061037f9190610d4b565b82828151811061039157610391610c4f565b6020908102919091010152600101610221565b50949350505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036103f657604051633c64f99360e21b815260040160405180910390fd5b82811461041657604051633e5431b160e21b815260040160405180910390fd5b5f5b838110156105105784848281811061043257610432610c4f565b90506020020160208101906104479190610c63565b6001600160a01b03166320ce64de84848481811061046757610467610c4f565b90506020028101906104799190610d62565b610487906020810190610c63565b85858581811061049957610499610c4f565b90506020028101906104ab9190610d62565b6104b9906020810190610ca3565b6040518463ffffffff1660e01b81526004016104d793929190610d76565b5f604051808303815f87803b1580156104ee575f5ffd5b505af1158015610500573d5f5f3e3d5ffd5b5050600190920191506104189050565b5050505050565b5f6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361056157604051633c64f99360e21b815260040160405180910390fd5b604051637d5f6a0960e11b81526001600160a01b0388169063fabed412906105959089908990899089908990600401610d18565b6020604051808303815f875af11580156105b1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105d59190610d4b565b979650505050505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361062957604051633c64f99360e21b815260040160405180910390fd5b604051630968c76b60e11b81526001600160a01b038816906312d18ed69061065f90899089908990899089908990600401610e74565b5f604051808303815f87803b158015610676575f5ffd5b505af1158015610688573d5f5f3e3d5ffd5b505050505b50505050505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036106df57604051633c64f99360e21b815260040160405180910390fd5b8483146106ff57604051633e5431b160e21b815260040160405180910390fd5b84811461071f57604051633e5431b160e21b815260040160405180910390fd5b5f5b8581101561068d575f85858381811061073c5761073c610c4f565b90506020020160208101906107519190610ece565b600181111561076257610762610eba565b03610846575f5f5f5f86868681811061077d5761077d610c4f565b905060200281019061078f9190610eec565b81019061079c9190610fc8565b93509350935093508a8a868181106107b6576107b6610c4f565b90506020020160208101906107cb9190610c63565b6001600160a01b031663fabed412858585856040518563ffffffff1660e01b81526004016107fc9493929190611069565b6020604051808303815f875af1158015610818573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061083c9190610d4b565b505050505061096f565b600185858381811061085a5761085a610c4f565b905060200201602081019061086f9190610ece565b600181111561088057610880610eba565b03610956575f5f5f5f5f87878781811061089c5761089c610c4f565b90506020028101906108ae9190610eec565b8101906108bb91906110a5565b945094509450945094508b8b878181106108d7576108d7610c4f565b90506020020160208101906108ec9190610c63565b6001600160a01b03166312d18ed686868686866040518663ffffffff1660e01b815260040161091f959493929190611115565b5f604051808303815f87803b158015610936575f5ffd5b505af1158015610948573d5f5f3e3d5ffd5b50505050505050505061096f565b60405163e5ef70af60e01b815260040160405180910390fd5b600101610721565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f83601f8401126109bc575f5ffd5b5081356001600160401b038111156109d2575f5ffd5b6020830191508360208260051b85010111156109ec575f5ffd5b9250929050565b5f5f5f5f60408587031215610a06575f5ffd5b84356001600160401b03811115610a1b575f5ffd5b610a27878288016109ac565b90955093505060208501356001600160401b03811115610a45575f5ffd5b610a51878288016109ac565b95989497509550505050565b602080825282518282018190525f918401906040840190835b81811015610a94578351835260209384019390920191600101610a76565b509095945050505050565b6001600160a01b0381168114610ab3575f5ffd5b50565b5f5f5f5f5f5f60a08789031215610acb575f5ffd5b8635610ad681610a9f565b95506020870135610ae681610a9f565b94506040870135610af681610a9f565b93506060870135925060808701356001600160401b03811115610b17575f5ffd5b610b2389828a016109ac565b979a9699509497509295939492505050565b5f5f5f5f5f5f5f60c0888a031215610b4b575f5ffd5b8735610b5681610a9f565b96506020880135610b6681610a9f565b9550604088013594506060880135610b7d81610a9f565b93506080880135925060a08801356001600160401b03811115610b9e575f5ffd5b610baa8a828b016109ac565b989b979a50959850939692959293505050565b5f5f5f5f5f5f60608789031215610bd2575f5ffd5b86356001600160401b03811115610be7575f5ffd5b610bf389828a016109ac565b90975095505060208701356001600160401b03811115610c11575f5ffd5b610c1d89828a016109ac565b90955093505060408701356001600160401b03811115610b17575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610c73575f5ffd5b8135610c7e81610a9f565b9392505050565b5f8235607e19833603018112610c99575f5ffd5b9190910192915050565b5f5f8335601e19843603018112610cb8575f5ffd5b8301803591506001600160401b03821115610cd1575f5ffd5b6020019150600581901b36038213156109ec575f5ffd5b8183525f6001600160fb1b03831115610cff575f5ffd5b8260051b80836020870137939093016020019392505050565b6001600160a01b03868116825285166020820152604081018490526080606082018190525f906105d59083018486610ce8565b5f60208284031215610d5b575f5ffd5b5051919050565b5f8235603e19833603018112610c99575f5ffd5b6001600160a01b038416815260406020820181905281018290525f6060600584901b830181019083018583607e1936839003015b87821015610e6657868503605f190184528235818112610dc8575f5ffd5b89018035610dd581610a9f565b6001600160a01b031686526020818101359087015260408082013590870152606081013536829003601e19018112610e0b575f5ffd5b016020810190356001600160401b03811115610e25575f5ffd5b8060051b3603821315610e36575f5ffd5b60806060880152610e4b608088018284610ce8565b96505050602083019250602084019350600182019150610daa565b509298975050505050505050565b6001600160a01b03878116825260208201879052851660408201526060810184905260a0608082018190525f90610eae9083018486610ce8565b98975050505050505050565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215610ede575f5ffd5b813560028110610c7e575f5ffd5b5f5f8335601e19843603018112610f01575f5ffd5b8301803591506001600160401b03821115610f1a575f5ffd5b6020019150368190038213156109ec575f5ffd5b5f82601f830112610f3d575f5ffd5b81356001600160401b03811115610f5657610f56610c3b565b8060051b604051601f19603f83011681018181106001600160401b0382111715610f8257610f82610c3b565b604052918252602081850181019290810186841115610f9f575f5ffd5b6020860192505b83831015610fbe578235815260209283019201610fa6565b5095945050505050565b5f5f5f5f60808587031215610fdb575f5ffd5b8435610fe681610a9f565b93506020850135610ff681610a9f565b92506040850135915060608501356001600160401b03811115611017575f5ffd5b61102387828801610f2e565b91505092959194509250565b5f8151808452602084019350602083015f5b8281101561105f578151865260209586019590910190600101611041565b5093949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061109b9083018461102f565b9695505050505050565b5f5f5f5f5f60a086880312156110b9575f5ffd5b85356110c481610a9f565b94506020860135935060408601356110db81610a9f565b92506060860135915060808601356001600160401b038111156110fc575f5ffd5b61110888828901610f2e565b9150509295509295909350565b6001600160a01b03868116825260208201869052841660408201526060810183905260a0608082018190525f906105d59083018461102f56fea2646970667358221220e09dd18032dd1a8408f938cac7d332657847fd4ed91e993d80f4a4b8f8cc5cb164736f6c634300081c0033
Deployed Bytecode
0x608060405234801561000f575f5ffd5b506004361061007a575f3560e01c806354fd4d501161005857806354fd4d5014610105578063a21d1ade14610129578063ad1c662b1461014a578063b10fb3c31461015d575f5ffd5b806306fdde031461007e5780633a3b369f146100d05780634f3ebd52146100f0575b5f5ffd5b6100ba60405180604001604052601a8152806020017f526f757465724d6f64756c65526577617264734665746368657200000000000081525081565b6040516100c79190610977565b60405180910390f35b6100e36100de3660046109f3565b610170565b6040516100c79190610a5d565b6101036100fe3660046109f3565b6103ad565b005b6100ba604051806040016040528060058152602001640312e302e360dc1b81525081565b61013c610137366004610ab6565b610517565b6040519081526020016100c7565b610103610158366004610b35565b6105e0565b61010361016b366004610bbd565b610696565b60606001600160a01b037f00000000000000000000000036c7e1295590d70ebe6d81a4f666c092dba965141630036101bb57604051633c64f99360e21b815260040160405180910390fd5b8382146101db57604051633e5431b160e21b815260040160405180910390fd5b836001600160401b038111156101f3576101f3610c3b565b60405190808252806020026020018201604052801561021c578160200160208202803683370190505b5090505f5b848110156103a45785858281811061023b5761023b610c4f565b90506020020160208101906102509190610c63565b6001600160a01b031663fabed41285858481811061027057610270610c4f565b90506020028101906102829190610c85565b610290906020810190610c63565b8686858181106102a2576102a2610c4f565b90506020028101906102b49190610c85565b6102c5906040810190602001610c63565b8787868181106102d7576102d7610c4f565b90506020028101906102e99190610c85565b604001358888878181106102ff576102ff610c4f565b90506020028101906103119190610c85565b61031f906060810190610ca3565b6040518663ffffffff1660e01b815260040161033f959493929190610d18565b6020604051808303815f875af115801561035b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061037f9190610d4b565b82828151811061039157610391610c4f565b6020908102919091010152600101610221565b50949350505050565b6001600160a01b037f00000000000000000000000036c7e1295590d70ebe6d81a4f666c092dba965141630036103f657604051633c64f99360e21b815260040160405180910390fd5b82811461041657604051633e5431b160e21b815260040160405180910390fd5b5f5b838110156105105784848281811061043257610432610c4f565b90506020020160208101906104479190610c63565b6001600160a01b03166320ce64de84848481811061046757610467610c4f565b90506020028101906104799190610d62565b610487906020810190610c63565b85858581811061049957610499610c4f565b90506020028101906104ab9190610d62565b6104b9906020810190610ca3565b6040518463ffffffff1660e01b81526004016104d793929190610d76565b5f604051808303815f87803b1580156104ee575f5ffd5b505af1158015610500573d5f5f3e3d5ffd5b5050600190920191506104189050565b5050505050565b5f6001600160a01b037f00000000000000000000000036c7e1295590d70ebe6d81a4f666c092dba9651416300361056157604051633c64f99360e21b815260040160405180910390fd5b604051637d5f6a0960e11b81526001600160a01b0388169063fabed412906105959089908990899089908990600401610d18565b6020604051808303815f875af11580156105b1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105d59190610d4b565b979650505050505050565b6001600160a01b037f00000000000000000000000036c7e1295590d70ebe6d81a4f666c092dba9651416300361062957604051633c64f99360e21b815260040160405180910390fd5b604051630968c76b60e11b81526001600160a01b038816906312d18ed69061065f90899089908990899089908990600401610e74565b5f604051808303815f87803b158015610676575f5ffd5b505af1158015610688573d5f5f3e3d5ffd5b505050505b50505050505050565b6001600160a01b037f00000000000000000000000036c7e1295590d70ebe6d81a4f666c092dba965141630036106df57604051633c64f99360e21b815260040160405180910390fd5b8483146106ff57604051633e5431b160e21b815260040160405180910390fd5b84811461071f57604051633e5431b160e21b815260040160405180910390fd5b5f5b8581101561068d575f85858381811061073c5761073c610c4f565b90506020020160208101906107519190610ece565b600181111561076257610762610eba565b03610846575f5f5f5f86868681811061077d5761077d610c4f565b905060200281019061078f9190610eec565b81019061079c9190610fc8565b93509350935093508a8a868181106107b6576107b6610c4f565b90506020020160208101906107cb9190610c63565b6001600160a01b031663fabed412858585856040518563ffffffff1660e01b81526004016107fc9493929190611069565b6020604051808303815f875af1158015610818573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061083c9190610d4b565b505050505061096f565b600185858381811061085a5761085a610c4f565b905060200201602081019061086f9190610ece565b600181111561088057610880610eba565b03610956575f5f5f5f5f87878781811061089c5761089c610c4f565b90506020028101906108ae9190610eec565b8101906108bb91906110a5565b945094509450945094508b8b878181106108d7576108d7610c4f565b90506020020160208101906108ec9190610c63565b6001600160a01b03166312d18ed686868686866040518663ffffffff1660e01b815260040161091f959493929190611115565b5f604051808303815f87803b158015610936575f5ffd5b505af1158015610948573d5f5f3e3d5ffd5b50505050505050505061096f565b60405163e5ef70af60e01b815260040160405180910390fd5b600101610721565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f83601f8401126109bc575f5ffd5b5081356001600160401b038111156109d2575f5ffd5b6020830191508360208260051b85010111156109ec575f5ffd5b9250929050565b5f5f5f5f60408587031215610a06575f5ffd5b84356001600160401b03811115610a1b575f5ffd5b610a27878288016109ac565b90955093505060208501356001600160401b03811115610a45575f5ffd5b610a51878288016109ac565b95989497509550505050565b602080825282518282018190525f918401906040840190835b81811015610a94578351835260209384019390920191600101610a76565b509095945050505050565b6001600160a01b0381168114610ab3575f5ffd5b50565b5f5f5f5f5f5f60a08789031215610acb575f5ffd5b8635610ad681610a9f565b95506020870135610ae681610a9f565b94506040870135610af681610a9f565b93506060870135925060808701356001600160401b03811115610b17575f5ffd5b610b2389828a016109ac565b979a9699509497509295939492505050565b5f5f5f5f5f5f5f60c0888a031215610b4b575f5ffd5b8735610b5681610a9f565b96506020880135610b6681610a9f565b9550604088013594506060880135610b7d81610a9f565b93506080880135925060a08801356001600160401b03811115610b9e575f5ffd5b610baa8a828b016109ac565b989b979a50959850939692959293505050565b5f5f5f5f5f5f60608789031215610bd2575f5ffd5b86356001600160401b03811115610be7575f5ffd5b610bf389828a016109ac565b90975095505060208701356001600160401b03811115610c11575f5ffd5b610c1d89828a016109ac565b90955093505060408701356001600160401b03811115610b17575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610c73575f5ffd5b8135610c7e81610a9f565b9392505050565b5f8235607e19833603018112610c99575f5ffd5b9190910192915050565b5f5f8335601e19843603018112610cb8575f5ffd5b8301803591506001600160401b03821115610cd1575f5ffd5b6020019150600581901b36038213156109ec575f5ffd5b8183525f6001600160fb1b03831115610cff575f5ffd5b8260051b80836020870137939093016020019392505050565b6001600160a01b03868116825285166020820152604081018490526080606082018190525f906105d59083018486610ce8565b5f60208284031215610d5b575f5ffd5b5051919050565b5f8235603e19833603018112610c99575f5ffd5b6001600160a01b038416815260406020820181905281018290525f6060600584901b830181019083018583607e1936839003015b87821015610e6657868503605f190184528235818112610dc8575f5ffd5b89018035610dd581610a9f565b6001600160a01b031686526020818101359087015260408082013590870152606081013536829003601e19018112610e0b575f5ffd5b016020810190356001600160401b03811115610e25575f5ffd5b8060051b3603821315610e36575f5ffd5b60806060880152610e4b608088018284610ce8565b96505050602083019250602084019350600182019150610daa565b509298975050505050505050565b6001600160a01b03878116825260208201879052851660408201526060810184905260a0608082018190525f90610eae9083018486610ce8565b98975050505050505050565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215610ede575f5ffd5b813560028110610c7e575f5ffd5b5f5f8335601e19843603018112610f01575f5ffd5b8301803591506001600160401b03821115610f1a575f5ffd5b6020019150368190038213156109ec575f5ffd5b5f82601f830112610f3d575f5ffd5b81356001600160401b03811115610f5657610f56610c3b565b8060051b604051601f19603f83011681018181106001600160401b0382111715610f8257610f82610c3b565b604052918252602081850181019290810186841115610f9f575f5ffd5b6020860192505b83831015610fbe578235815260209283019201610fa6565b5095945050505050565b5f5f5f5f60808587031215610fdb575f5ffd5b8435610fe681610a9f565b93506020850135610ff681610a9f565b92506040850135915060608501356001600160401b03811115611017575f5ffd5b61102387828801610f2e565b91505092959194509250565b5f8151808452602084019350602083015f5b8281101561105f578151865260209586019590910190600101611041565b5093949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061109b9083018461102f565b9695505050505050565b5f5f5f5f5f60a086880312156110b9575f5ffd5b85356110c481610a9f565b94506020860135935060408601356110db81610a9f565b92506060860135915060808601356001600160401b038111156110fc575f5ffd5b61110888828901610f2e565b9150509295509295909350565b6001600160a01b03868116825260208201869052841660408201526060810183905260a0608082018190525f906105d59083018461102f56fea2646970667358221220e09dd18032dd1a8408f938cac7d332657847fd4ed91e993d80f4a4b8f8cc5cb164736f6c634300081c0033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.