Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
4513531 | 21 hrs ago | Contract Creation | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
ExclusiveDelegateResolver
Compiler Version
v0.8.28+commit.7893614a
ZkSolc Version
v1.5.7
Optimization Enabled:
Yes with Mode 3
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.28; import {IDelegateRegistry} from "./interfaces/IDelegateRegistry.sol"; /** * @title ExclusiveDelegateResolver * @author 0xQuit * @notice A contract to resolve a single canonical delegated owner for a given ERC721 token * @dev This contract is designed to be used in conjunction with a delegate registry to resolve the most specific * delegation that matches the rights, with specificity being determined by delegation type in order of ERC721 > * CONTRACT > ALL. ERC20 and ERC1155 are not supported. If multiple delegations of the same specificity match the rights, * the most recent one is respected. If no delegation matches the rights, global delegations (bytes24(0) are considered, * but MUST have an expiration greater than 0 to avoid conflicts with pre-existing delegations. * If no delegation matches the rights and there are no empty delegations, the owner is returned. * Expirations are supported by extracting a uint40 from the final 40 bits of a given delegation's rights value. * If the expiration is past, the delegation is not considered to match the request. */ contract ExclusiveDelegateResolver { /// @dev The address of the Delegate Registry contract address public constant DELEGATE_REGISTRY = 0x0000000059A24EB229eED07Ac44229DB56C5d797; /// @dev The rights value for a global delegation. These are considered only if no delegation by rights matches the request. bytes24 public constant GLOBAL_DELEGATION = bytes24(0); /** * @notice Gets an exclusive wallet delegation, resolved through delegatexyz if possible * @param vault The vault address * @param rights The rights to check * @return owner The vault wallet address or delegated wallet if one exists * @notice returns the most recent delegation that matches the rights for an entire wallet delegation * (type ALL) if multiple delegations of the same specificity match the rights, the most recent one is respected. * If no delegation matches the rights, global delegations (bytes24(0) are considered, * but MUST have an expiration greater than 0 to avoid conflicts with pre-existing delegations. * If no delegation matches the rights and there are no empty delegations, the owner is returned. * Expirations are supported by extracting a uint40 from the final 40 bits of a given delegation's rights value. * If the expiration is past, the delegation is not considered to match the request. */ function exclusiveWalletByRights(address vault, bytes24 rights) public view returns (address) { IDelegateRegistry.Delegation[] memory delegations = IDelegateRegistry(DELEGATE_REGISTRY).getOutgoingDelegations(vault); IDelegateRegistry.Delegation memory delegationToReturn; for (uint256 i = delegations.length; i > 0;) { unchecked { --i; } IDelegateRegistry.Delegation memory delegation = delegations[i]; if (_delegationMatchesRequest(delegation, rights)) { if (_delegationOutranksCurrent(delegationToReturn, delegation)) { // re-check rights here to ensure global delegation does not get early returned if ( delegation.type_ == IDelegateRegistry.DelegationType.ALL && bytes24(delegation.rights) == rights ) { return delegation.to; } delegationToReturn = delegation; } } } return delegationToReturn.to == address(0) ? vault : delegationToReturn.to; } /** * @notice Gets all wallets that have delegated to a given wallet * @param wallet The wallet to check * @param rights The rights to check * @return wallets The wallets that have delegated to the given wallet * @notice returns all wallets that have delegated to the given wallet, filtered by the rights * if multiple delegations of the same specificity match the rights, the most recent one is respected. * If no delegation matches the rights, global delegations (bytes24(0)) are considered, * but MUST have an expiration greater than 0 to avoid conflicts with pre-existing delegations. * Expirations are supported by extracting a uint40 from the final 40 bits of a given delegation's rights value. * If the expiration is past, the delegation is not considered to match the request. */ function delegatedWalletsByRights(address wallet, bytes24 rights) external view returns (address[] memory) { IDelegateRegistry.Delegation[] memory delegations = IDelegateRegistry(DELEGATE_REGISTRY).getIncomingDelegations(wallet); uint256 matchesCount = 0; bool[] memory matches = new bool[](delegations.length); for (uint256 i; i < delegations.length; ++i) { IDelegateRegistry.Delegation memory delegation = delegations[i]; if (_delegationMatchesRequest(delegation, rights)) { if (exclusiveWalletByRights(delegation.from, rights) == wallet) { matches[i] = true; matchesCount++; } } } address[] memory matchesArray = new address[](matchesCount); uint256 matchesIndex = 0; // filter to the delegated wallets that match the request for (uint256 i; i < delegations.length; ++i) { if (matches[i]) { matchesArray[matchesIndex] = delegations[i].from; matchesIndex++; } } return matchesArray; } /** * @notice Gets the owner of an ERC721 token, resolved through delegatexyz if possible * @param contractAddress The ERC721 contract address * @param tokenId The token ID to check * @return owner The owner address or delegated owner if one exists * @notice returns the most specific delegation that matches the rights, with specificity being determined * by delegation type in order of ERC721 > CONTRACT > ALL. ERC20 and ERC1155 are not supported * if multiple delegations of the same specificity match the rights, the most recent one is respected. * If no delegation matches the rights, global delegations (bytes24(0) are considered, * but MUST have an expiration greater than 0 to avoid conflicts with pre-existing delegations. * If no delegation matches the rights and there are no empty delegations, the owner is returned. * Expirations are supported by extracting a uint40 from the final 40 bits of a given delegation's rights value. * If the expiration is past, the delegation is not considered to match the request. */ function exclusiveOwnerByRights(address contractAddress, uint256 tokenId, bytes24 rights) external view returns (address owner) { owner = _getOwner(contractAddress, tokenId); IDelegateRegistry.Delegation[] memory delegations = IDelegateRegistry(DELEGATE_REGISTRY).getOutgoingDelegations(owner); IDelegateRegistry.Delegation memory delegationToReturn; for (uint256 i = delegations.length; i > 0;) { unchecked { --i; } IDelegateRegistry.Delegation memory delegation = delegations[i]; if (_delegationMatchesRequest(delegation, contractAddress, tokenId, rights)) { if (_delegationOutranksCurrent(delegationToReturn, delegation)) { // re-check rights here to ensure global ERC721 type delegations do not get early returned if ( delegation.type_ == IDelegateRegistry.DelegationType.ERC721 && bytes24(delegation.rights) == rights ) { return delegation.to; } delegationToReturn = delegation; } } } return delegationToReturn.to == address(0) ? owner : delegationToReturn.to; } /** * @notice Decodes a rights bytes32 value into its identifier and expiration * @param rights The rights bytes32 value * @return rightsIdentifier The rights identifier * @return expiration The expiration timestamp */ function decodeRightsExpiration(bytes32 rights) public pure returns (bytes24, uint40) { bytes24 rightsIdentifier = bytes24(rights); uint40 expiration = uint40(uint256(rights)); return (rightsIdentifier, expiration); } /** * @notice Convenience function to generate a rights bytes32 rights value with an expiration * @param rightsIdentifier The rights identifier * @param expiration The expiration timestamp * @return rights The rights bytes32 value */ function generateRightsWithExpiration(bytes24 rightsIdentifier, uint40 expiration) external pure returns (bytes32) { uint256 rights = uint256(uint192(rightsIdentifier)) << 64; return bytes32(rights | uint256(expiration)); } function _delegationMatchesRequest(IDelegateRegistry.Delegation memory delegation, bytes24 rights) internal view returns (bool) { (bytes24 rightsIdentifier, uint40 expiration) = decodeRightsExpiration(delegation.rights); if (block.timestamp > expiration) { return false; } else if (rightsIdentifier != rights && rightsIdentifier != GLOBAL_DELEGATION) { return false; } else if (delegation.type_ == IDelegateRegistry.DelegationType.ALL) { return true; } else { return false; } } function _delegationMatchesRequest( IDelegateRegistry.Delegation memory delegation, address contractAddress, uint256 tokenId, bytes24 rights ) internal view returns (bool) { // Extract rights identifier (remaining 192 bits) (bytes24 rightsIdentifier, uint40 expiration) = decodeRightsExpiration(delegation.rights); if (block.timestamp > expiration) { return false; } else if (rightsIdentifier != rights && rightsIdentifier != GLOBAL_DELEGATION) { return false; } else if (delegation.type_ == IDelegateRegistry.DelegationType.ALL) { return true; } else if (delegation.type_ == IDelegateRegistry.DelegationType.CONTRACT) { return delegation.contract_ == contractAddress; } else if (delegation.type_ == IDelegateRegistry.DelegationType.ERC721) { return delegation.contract_ == contractAddress && delegation.tokenId == tokenId; } else { return false; } } function _delegationOutranksCurrent( IDelegateRegistry.Delegation memory currentDelegation, IDelegateRegistry.Delegation memory newDelegation ) internal pure returns (bool) { bytes24 currentRightsIdentifier = bytes24(currentDelegation.rights); bytes24 newRightsIdentifier = bytes24(newDelegation.rights); if (currentRightsIdentifier == newRightsIdentifier) { return newDelegation.type_ > currentDelegation.type_; } else if (currentRightsIdentifier == GLOBAL_DELEGATION) { return true; } else { return false; } } function _getOwner(address contractAddress, uint256 tokenId) internal view returns (address owner) { /// @solidity memory-safe-assembly assembly { let m := mload(0x40) mstore(m, 0x6352211e00000000000000000000000000000000000000000000000000000000) mstore(add(m, 0x04), tokenId) let success := staticcall(gas(), contractAddress, m, 0x24, m, 0x20) if iszero(success) { mstore(0x00, 0x3204506f) // CallFailed() revert(0x1c, 0x04) } owner := mload(m) } } }
// SPDX-License-Identifier: CC0-1.0 pragma solidity >=0.8.13; /** * @title IDelegateRegistry * @custom:version 2.0 * @custom:author foobar (0xfoobar) * @notice A standalone immutable registry storing delegated permissions from one address to another */ interface IDelegateRegistry { /// @notice Delegation type, NONE is used when a delegation does not exist or is revoked enum DelegationType { NONE, ALL, CONTRACT, ERC721, ERC20, ERC1155 } /// @notice Struct for returning delegations struct Delegation { DelegationType type_; address to; address from; bytes32 rights; address contract_; uint256 tokenId; uint256 amount; } /// @notice Emitted when an address delegates or revokes rights for their entire wallet event DelegateAll(address indexed from, address indexed to, bytes32 rights, bool enable); /// @notice Emitted when an address delegates or revokes rights for a contract address event DelegateContract( address indexed from, address indexed to, address indexed contract_, bytes32 rights, bool enable ); /// @notice Emitted when an address delegates or revokes rights for an ERC721 tokenId event DelegateERC721( address indexed from, address indexed to, address indexed contract_, uint256 tokenId, bytes32 rights, bool enable ); /// @notice Emitted when an address delegates or revokes rights for an amount of ERC20 tokens event DelegateERC20( address indexed from, address indexed to, address indexed contract_, bytes32 rights, uint256 amount ); /// @notice Emitted when an address delegates or revokes rights for an amount of an ERC1155 tokenId event DelegateERC1155( address indexed from, address indexed to, address indexed contract_, uint256 tokenId, bytes32 rights, uint256 amount ); /// @notice Thrown if multicall calldata is malformed error MulticallFailed(); /** * ----------- WRITE ----------- */ /** * @notice Call multiple functions in the current contract and return the data from all of them if they all succeed * @param data The encoded function data for each of the calls to make to this contract * @return results The results from each of the calls passed in via data */ function multicall(bytes[] calldata data) external payable returns (bytes[] memory results); /** * @notice Allow the delegate to act on behalf of `msg.sender` for all contracts * @param to The address to act as delegate * @param rights Specific subdelegation rights granted to the delegate, pass an empty bytestring to encompass all rights * @param enable Whether to enable or disable this delegation, true delegates and false revokes * @return delegationHash The unique identifier of the delegation */ function delegateAll(address to, bytes32 rights, bool enable) external payable returns (bytes32 delegationHash); /** * @notice Allow the delegate to act on behalf of `msg.sender` for a specific contract * @param to The address to act as delegate * @param contract_ The contract whose rights are being delegated * @param rights Specific subdelegation rights granted to the delegate, pass an empty bytestring to encompass all rights * @param enable Whether to enable or disable this delegation, true delegates and false revokes * @return delegationHash The unique identifier of the delegation */ function delegateContract(address to, address contract_, bytes32 rights, bool enable) external payable returns (bytes32 delegationHash); /** * @notice Allow the delegate to act on behalf of `msg.sender` for a specific ERC721 token * @param to The address to act as delegate * @param contract_ The contract whose rights are being delegated * @param tokenId The token id to delegate * @param rights Specific subdelegation rights granted to the delegate, pass an empty bytestring to encompass all rights * @param enable Whether to enable or disable this delegation, true delegates and false revokes * @return delegationHash The unique identifier of the delegation */ function delegateERC721(address to, address contract_, uint256 tokenId, bytes32 rights, bool enable) external payable returns (bytes32 delegationHash); /** * @notice Allow the delegate to act on behalf of `msg.sender` for a specific amount of ERC20 tokens * @dev The actual amount is not encoded in the hash, just the existence of a amount (since it is an upper bound) * @param to The address to act as delegate * @param contract_ The address for the fungible token contract * @param rights Specific subdelegation rights granted to the delegate, pass an empty bytestring to encompass all rights * @param amount The amount to delegate, > 0 delegates and 0 revokes * @return delegationHash The unique identifier of the delegation */ function delegateERC20(address to, address contract_, bytes32 rights, uint256 amount) external payable returns (bytes32 delegationHash); /** * @notice Allow the delegate to act on behalf of `msg.sender` for a specific amount of ERC1155 tokens * @dev The actual amount is not encoded in the hash, just the existence of a amount (since it is an upper bound) * @param to The address to act as delegate * @param contract_ The address of the contract that holds the token * @param tokenId The token id to delegate * @param rights Specific subdelegation rights granted to the delegate, pass an empty bytestring to encompass all rights * @param amount The amount of that token id to delegate, > 0 delegates and 0 revokes * @return delegationHash The unique identifier of the delegation */ function delegateERC1155(address to, address contract_, uint256 tokenId, bytes32 rights, uint256 amount) external payable returns (bytes32 delegationHash); /** * ----------- CHECKS ----------- */ /** * @notice Check if `to` is a delegate of `from` for the entire wallet * @param to The potential delegate address * @param from The potential address who delegated rights * @param rights Specific rights to check for, pass the zero value to ignore subdelegations and check full delegations only * @return valid Whether delegate is granted to act on the from's behalf */ function checkDelegateForAll(address to, address from, bytes32 rights) external view returns (bool); /** * @notice Check if `to` is a delegate of `from` for the specified `contract_` or the entire wallet * @param to The delegated address to check * @param contract_ The specific contract address being checked * @param from The cold wallet who issued the delegation * @param rights Specific rights to check for, pass the zero value to ignore subdelegations and check full delegations only * @return valid Whether delegate is granted to act on from's behalf for entire wallet or that specific contract */ function checkDelegateForContract(address to, address from, address contract_, bytes32 rights) external view returns (bool); /** * @notice Check if `to` is a delegate of `from` for the specific `contract` and `tokenId`, the entire `contract_`, or the entire wallet * @param to The delegated address to check * @param contract_ The specific contract address being checked * @param tokenId The token id for the token to delegating * @param from The wallet that issued the delegation * @param rights Specific rights to check for, pass the zero value to ignore subdelegations and check full delegations only * @return valid Whether delegate is granted to act on from's behalf for entire wallet, that contract, or that specific tokenId */ function checkDelegateForERC721(address to, address from, address contract_, uint256 tokenId, bytes32 rights) external view returns (bool); /** * @notice Returns the amount of ERC20 tokens the delegate is granted rights to act on the behalf of * @param to The delegated address to check * @param contract_ The address of the token contract * @param from The cold wallet who issued the delegation * @param rights Specific rights to check for, pass the zero value to ignore subdelegations and check full delegations only * @return balance The delegated balance, which will be 0 if the delegation does not exist */ function checkDelegateForERC20(address to, address from, address contract_, bytes32 rights) external view returns (uint256); /** * @notice Returns the amount of a ERC1155 tokens the delegate is granted rights to act on the behalf of * @param to The delegated address to check * @param contract_ The address of the token contract * @param tokenId The token id to check the delegated amount of * @param from The cold wallet who issued the delegation * @param rights Specific rights to check for, pass the zero value to ignore subdelegations and check full delegations only * @return balance The delegated balance, which will be 0 if the delegation does not exist */ function checkDelegateForERC1155(address to, address from, address contract_, uint256 tokenId, bytes32 rights) external view returns (uint256); /** * ----------- ENUMERATIONS ----------- */ /** * @notice Returns all enabled delegations a given delegate has received * @param to The address to retrieve delegations for * @return delegations Array of Delegation structs */ function getIncomingDelegations(address to) external view returns (Delegation[] memory delegations); /** * @notice Returns all enabled delegations an address has given out * @param from The address to retrieve delegations for * @return delegations Array of Delegation structs */ function getOutgoingDelegations(address from) external view returns (Delegation[] memory delegations); /** * @notice Returns all hashes associated with enabled delegations an address has received * @param to The address to retrieve incoming delegation hashes for * @return delegationHashes Array of delegation hashes */ function getIncomingDelegationHashes(address to) external view returns (bytes32[] memory delegationHashes); /** * @notice Returns all hashes associated with enabled delegations an address has given out * @param from The address to retrieve outgoing delegation hashes for * @return delegationHashes Array of delegation hashes */ function getOutgoingDelegationHashes(address from) external view returns (bytes32[] memory delegationHashes); /** * @notice Returns the delegations for a given array of delegation hashes * @param delegationHashes is an array of hashes that correspond to delegations * @return delegations Array of Delegation structs, return empty structs for nonexistent or revoked delegations */ function getDelegationsFromHashes(bytes32[] calldata delegationHashes) external view returns (Delegation[] memory delegations); /** * ----------- STORAGE ACCESS ----------- */ /** * @notice Allows external contracts to read arbitrary storage slots */ function readSlot(bytes32 location) external view returns (bytes32); /** * @notice Allows external contracts to read an arbitrary array of storage slots */ function readSlots(bytes32[] calldata locations) external view returns (bytes32[] memory); }
{ "viaIR": false, "codegen": "yul", "remappings": [ "solady/=lib/solady/src/", "forge/=lib/forge-std/src/", "forge-std/=lib/forge-std/src/" ], "evmVersion": "cancun", "outputSelection": { "*": { "*": [ "abi", "metadata" ], "": [ "ast" ] } }, "optimizer": { "enabled": true, "mode": "3", "fallback_to_optimizing_for_size": false, "disable_system_request_memoization": true }, "metadata": {}, "libraries": {}, "enableEraVMExtensions": false, "forceEVMLA": false }
[{"inputs":[],"name":"DELEGATE_REGISTRY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GLOBAL_DELEGATION","outputs":[{"internalType":"bytes24","name":"","type":"bytes24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"rights","type":"bytes32"}],"name":"decodeRightsExpiration","outputs":[{"internalType":"bytes24","name":"","type":"bytes24"},{"internalType":"uint40","name":"","type":"uint40"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bytes24","name":"rights","type":"bytes24"}],"name":"delegatedWalletsByRights","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes24","name":"rights","type":"bytes24"}],"name":"exclusiveOwnerByRights","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"vault","type":"address"},{"internalType":"bytes24","name":"rights","type":"bytes24"}],"name":"exclusiveWalletByRights","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes24","name":"rightsIdentifier","type":"bytes24"},{"internalType":"uint40","name":"expiration","type":"uint40"}],"name":"generateRightsWithExpiration","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
3cda335100000000000000000000000000000000000000001abc31881b858cbe520c00400100018b48cb08d55e462ad7fc8441b148abb246b96d4322b71eb479fa8e16eb00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x0002000000000002001300000000000200010000000103550000006003100270000001650030019d0000008004000039000000400040043f0000000100200190000000270000c13d0000016502300197000000040020008c000002260000413d000000000301043b000000e003300270000001670030009c0000002f0000a13d000001680030009c000000500000213d0000016b0030009c000001080000613d0000016c0030009c000002260000c13d000000440020008c000002260000413d0000000002000416000000000002004b000002260000c13d0000000402100370000000000202043b0000017100200198000002260000c13d0000002401100370000000000101043b0000017e0010009c000002260000213d000000000121019f000000800010043f0000018301000041000005900001042e0000000001000416000000000001004b000002260000c13d0000002001000039000001000010044300000120000004430000016601000041000005900001042e0000016d0030009c0000010f0000613d0000016e0030009c0000011c0000613d0000016f0030009c000002260000c13d000000640020008c000002260000413d0000000002000416000000000002004b000002260000c13d0000000402100370000000000202043b000b00000002001d000001700020009c000002260000213d0000004402100370000000000202043b000a00000002001d0000017100200198000002260000c13d0000002401100370000000000201043b0000018401000041000000800010043f000900000002001d000000840020043f00000000010004140000000b02000029000000040020008c000001380000c13d00000080030000390000015b0000013d000001690030009c000001320000613d0000016a0030009c000002260000c13d000000440020008c000002260000413d0000000002000416000000000002004b000002260000c13d0000000402100370000000000202043b000400000002001d000001700020009c000002260000213d0000002401100370000000000101043b000300000001001d0000017100100198000002260000c13d0000017201000041000000800010043f0000000401000029000000840010043f0000000001000414000001650010009c0000016501008041000000c00110021000000173011001c70000017402000041058f058a0000040f00000060031002700000001f0430018f000001750530019700000165033001970000000100200190000001bd0000613d0000008002500039000000000005004b00000080080000390000007d0000613d000000000601034f000000006706043c0000000008780436000000000028004b000000790000c13d000000000004004b0000008a0000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f013000390000017601100197000100000001001d0000008001100039000c00000001001d000000400010043f000000200030008c000002260000413d000000800200043d000001710020009c000002260000213d00000080013000390000009f03200039000000000013004b000002260000813d00000080032000390000000004030433000001710040009c000001b70000213d00000005034002100000003f0330003900000177033001970000000c03300029000001710030009c000001b70000213d000000400030043f0000000c030000290000000000430435000000a002200039000000e0034000c90000000003230019000000000013004b000002260000213d000000000004004b0000000004000019000001e90000c13d00000005014002100000003f021000390000017a03200197000000400200043d000b00000002001d0000000002230019000000000032004b00000000030000390000000103004039000001710020009c000001b70000213d0000000100300190000001b70000c13d000000400020043f0000000b020000290000000002420436000a00000002001d0000001f0210018f000000000001004b000000ca0000613d0000000a04000029000000000114001900000000030000310000000103300367000000003503043c0000000004540436000000000014004b000000c60000c13d000000000002004b0000000c010000290000000001010433000000000001004b000200000000001d000002730000c13d000000020100002900000005031002100000003f013000390000017a04100197000000400200043d0000000001240019000000000041004b00000000040000390000000104004039000001710010009c000001b70000213d0000000100400190000001b70000c13d000000400010043f000000020100002900000000011204360000001f0430018f000000000003004b000000eb0000613d0000000003310019000000000500003100000001055003670000000006010019000000005705043c0000000006760436000000000036004b000000e70000c13d000000000004004b0000000c030000290000000006030433000000000006004b000003b50000c13d000000400300043d00000020040000390000000005430436000000000402043300000000004504350000004002300039000000000004004b000000ff0000613d00000000050000190000000016010434000001700660019700000000026204360000000105500039000000000045004b000000f90000413d0000000001320049000001650010009c00000165010080410000006001100210000001650030009c00000165030080410000004002300210000000000121019f000005900001042e0000000001000416000000000001004b000002260000c13d0000017401000041000000800010043f0000018301000041000005900001042e000000240020008c000002260000413d0000000002000416000000000002004b000002260000c13d0000000401100370000000000101043b0000017b02100197000000800020043f0000017e01100197000000a00010043f0000018801000041000005900001042e000000440020008c000002260000413d0000000002000416000000000002004b000002260000c13d0000000401100370000000000101043b000001700010009c000002260000213d001300000001001d058f04530000040f00000000020100190000001301000029058f045b0000040f0000017001100197000000400200043d0000000000120435000001650020009c0000016502008041000000400120021000000187011001c7000005900001042e0000000001000416000000000001004b000002260000c13d000000800000043f0000018301000041000005900001042e000001650010009c0000016501008041000000c00110021000000173011001c7058f058a0000040f00000060031002700000016503300197000000200030008c00000020030080390000001f0430018f000000200530019000000080035001bf0000014b0000613d0000008006000039000000000701034f000000007807043c0000000006860436000000000036004b000001470000c13d000000000004004b000001580000613d000000000151034f0000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001304350000000100200190000001e50000613d000000400300043d001300000003001d000000800200043d0000017f010000410000000000130435000800000002001d000001700120019700000004023000390000000000120435000001650030009c0000016501000041000000000103401900000040011002100000000002000414000001650020009c0000016502008041000000c002200210000000000112019f00000180011001c70000017402000041058f058a0000040f00000060031002700000001f0430018f000001750530019700000165033001970000000100200190000001c80000613d00000013090000290000000002590019000000000005004b0000017f0000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000027004b0000017b0000c13d000000000004004b0000018c0000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f0130003900000176011001970000000002910019000000000012004b00000000010000390000000101004039000e00000002001d000001710020009c000001b70000213d0000000100100190000001b70000c13d0000000e01000029000000400010043f000000200030008c000002260000413d0000000002090433000001710020009c000002260000213d000000000193001900000000029200190000001f03200039000000000013004b0000000004000019000001810400804100000181033001970000018105100197000000000653013f000000000053004b00000000030000190000018103004041000001810060009c000000000304c019000000000003004b000002260000c13d0000000023020434000001710030009c000001b70000213d00000005043002100000003f0440003900000177044001970000000e04400029000001710040009c0000021e0000a13d0000018201000041000000000010043f0000004101000039000000040010043f00000180010000410000059100010430000000400200043d0000000006520019000000000005004b000001d20000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000068004b000001c30000c13d000001d20000013d000000400200043d0000000006520019000000000005004b000001d20000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000068004b000001ce0000c13d000000000004004b000001df0000613d000000000151034f0000000304400210000000000506043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001604350000006001300210000001650020009c00000165020080410000004002200210000000000112019f00000591000104300000018501000041000000000010043f000001860100004100000591000104300000000c040000290000000005210049000001780050009c000002260000213d000000e00050008c000002260000413d000000400500043d000001790050009c000001b70000213d000000e006500039000000400060043f0000000067020434000000050070008c000002260000213d00000000077504360000000006060433000001700060009c000002260000213d000000000067043500000040062000390000000006060433000001700060009c000002260000213d00000040075000390000000000670435000000600650003900000060072000390000000007070433000000000076043500000080062000390000000006060433000001700060009c000002260000213d000000200440003900000080075000390000000000670435000000a0062000390000000006060433000000a0075000390000000000670435000000c0062000390000000006060433000000c00750003900000000006704350000000000540435000000e002200039000000000032004b000001ea0000413d0000000c010000290000000004010433000001710040009c000000ae0000a13d000001b70000013d000000400040043f0000000e040000290000000004340436000d00000004001d000000e0033000c90000000003230019000000000013004b000002280000a13d00000000010000190000059100010430000000000032004b0000025a0000813d0000000e040000290000000005210049000001780050009c000002260000213d000000e00050008c000002260000413d000000400500043d000001790050009c000001b70000213d000000e006500039000000400060043f0000000067020434000000050070008c000002260000213d00000000077504360000000006060433000001700060009c000002260000213d000000000067043500000040062000390000000006060433000001700060009c000002260000213d00000040075000390000000000670435000000600650003900000060072000390000000007070433000000000076043500000080062000390000000006060433000001700060009c000002260000213d000000200440003900000080075000390000000000670435000000a0062000390000000006060433000000a0075000390000000000670435000000c0062000390000000006060433000000c00750003900000000006704350000000000540435000000e002200039000000000032004b0000022b0000413d000000400100043d000001790010009c000001b70000213d0000000006010019000000e001600039000000400010043f000000c0016000390000000000010435000000a00160003900000000000104350000008001600039000000000001043500000060016000390000000000010435000000400160003900000000000104350000002001600039000000000001043500000000000604350000000e010000290000000001010433000000000001004b000003da0000c13d00000008010000290000012a0000013d00000003010000290008017b0010019b0000000101000029000600a00010003d0000000002000019000200000000001d000002800000013d000000090200002900000001022000390000000c010000290000000001010433000000000012004b000004440000813d000900000002001d0000000502200210000700000002001d00000006012000290000000001010433001200000001001d00000060011000390000000001010433001300000001001d0000017c0100004100000000001004430000000001000414000001650010009c0000016501008041000000c0011002100000017d011001c70000800b02000039058f058a0000040f0000000100200190000004380000613d00000013030000290000017e02300197000000000101043b000000000021004b0000027a0000213d0000017b01300197000000080010006c0000029e0000613d000000000001004b0000027a0000c13d00000012020000290000000001020433000000050010008c000004390000213d000000010010008c0000027a0000c13d00000040012000390000000001010433000000400300043d0000017f02000041000000000023043500000170021001970000000401300039000e00000002001d0000000000210435000001650030009c001300000003001d0000016501000041000000000103401900000040011002100000000002000414000001650020009c0000016502008041000000c002200210000000000112019f00000180011001c70000017402000041058f058a0000040f00000060031002700000001f0430018f000001750530019700000165033001970000000100200190000004480000613d00000013090000290000000002590019000000000005004b000002ca0000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000027004b000002c60000c13d000000000004004b000002d70000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f0130003900000176011001970000000002910019000000000012004b00000000010000390000000101004039001100000002001d000001710020009c000001b70000213d0000000100100190000001b70000c13d0000001101000029000000400010043f000000200030008c000002260000413d0000000002090433000001710020009c000002260000213d000000000193001900000000029200190000001f03200039000000000013004b0000000004000019000001810400804100000181033001970000018105100197000000000653013f000000000053004b00000000030000190000018103004041000001810060009c000000000304c019000000000003004b000002260000c13d0000000023020434000001710030009c000001b70000213d00000005043002100000003f0440003900000177044001970000001104400029000001710040009c000001b70000213d000000400040043f00000011040000290000000004340436000d00000004001d000000e0033000c90000000003230019000000000013004b000002260000213d000000000032004b0000033c0000813d00000011040000290000000005210049000001780050009c000002260000213d000000e00050008c000002260000413d000000400500043d000001790050009c000001b70000213d000000e006500039000000400060043f0000000067020434000000050070008c000002260000213d00000000077504360000000006060433000001700060009c000002260000213d000000000067043500000040062000390000000006060433000001700060009c000002260000213d00000040075000390000000000670435000000600650003900000060072000390000000007070433000000000076043500000080062000390000000006060433000001700060009c000002260000213d000000200440003900000080075000390000000000670435000000a0062000390000000006060433000000a0075000390000000000670435000000c0062000390000000006060433000000c00750003900000000006704350000000000540435000000e002200039000000000032004b0000030d0000413d000000400200043d000001790020009c000001b70000213d000000e001200039000000400010043f000000c0012000390000000000010435000000a001200039000000000001043500000080012000390000000000010435000000600120003900000000000104350000004001200039000000000001043500000020012000390000000000010435000000000002043500000011010000290000000006010433000000000006004b0000039c0000613d000500000002001d000003580000013d000000000003004b000003910000613d000000000006004b000003980000613d000000010660008a00000011010000290000000001010433000000000061004b000003d40000a13d001300000006001d00000005016002100000000d011000290000000001010433001000000001001d0000006001100039000f00000001001d0000000001010433001200000001001d0000017c0100004100000000001004430000000001000414000001650010009c0000016501008041000000c0011002100000017d011001c70000800b02000039058f058a0000040f0000000100200190000004380000613d00000012030000290000017e02300197000000000101043b000000000021004b0000000e050000290000001306000029000003560000213d0000017b01300197000000080010006c0000037d0000613d000000000001004b000003560000c13d00000010070000290000000012070434000000050020008c000004390000213d000000010020008c000003560000c13d0000000502000029000000600220003900000000020204330000017b032001970000000f0200002900000000020204330000017b04200197000000000043004b000003540000c13d00000005030000290000000003030433000000050030008c000003540000a13d000004390000013d000000030220014f000001710020009c000500000007001d000003560000213d00000000010104330000017005100197000003a00000013d0000000501000029000000200110003900000000010104330000039e0000013d00000000010000190000000e050000290000017001100198000000000501c0190000000902000029000000040050006c0000027b0000c13d0000000b010000290000000001010433000000000021004b000003d40000a13d00000007020000290000000a01200029000000010200003900000000002104350000000201000029000200010010003e00000009020000290000027b0000c13d0000018201000041000000000010043f0000001101000039000000040010043f000001800100004100000591000104300000000103000029000000a00330003900000000040000190000000005000019000003c80000013d0000000506500210000000000616001900000000077300190000000007070433000000400770003900000000070704330000017007700197000000000076043500000001055000390000000c0600002900000000060604330000000104400039000000000064004b000000f00000813d0000000b070000290000000007070433000000000047004b000003d40000a13d00000005074002100000000a087000290000000008080433000000000008004b000003c50000613d0000000006020433000000000056004b000003ba0000213d0000018201000041000000000010043f0000003201000039000000040010043f0000018001000041000005910001043000000000020100190000000a01000029000c017b0010019b000003e20000013d00000000060700190000001102000029000000000002004b0000043f0000613d001300000006001d000000010220008a0000000e010000290000000001010433000000000021004b000003d40000a13d001100000002001d00000005012002100000000d011000290000000001010433001000000001001d0000006001100039000f00000001001d0000000001010433001200000001001d0000017c0100004100000000001004430000000001000414000001650010009c0000016501008041000000c0011002100000017d011001c70000800b02000039058f058a0000040f0000000100200190000004380000613d00000012030000290000017e02300197000000000101043b000000000021004b0000001306000029000003df0000213d0000017b013001970000000c0010006c000004070000613d000000000001004b000003df0000c13d00000010070000290000000012070434000000060020008c000004390000813d000000010020008c000004200000613d000000020020008c0000041b0000613d000000030020008c000003df0000c13d000000800370003900000000030304330000000b0330014f0000017000300198000003df0000c13d000000a0037000390000000003030433000000090030006c000003df0000c13d000004200000013d000000800370003900000000030304330000000b0330014f0000017000300198000003df0000c13d000000600360003900000000030304330000017b043001970000000f0300002900000000030304330000017b05300197000000000054004b0000042e0000c13d0000000004060433000000050040008c000004390000213d000000000042004b000003df0000a13d000004300000013d000000000004004b000003df0000c13d000000030020008c000003de0000c13d0000000a0230014f000001710020009c0000000006070019000003df0000213d00000000010104330000012a0000013d000000000001042f0000018201000041000000000010043f0000002101000039000000040010043f000001800100004100000591000104300000002001600039000000000101043300000170011001980000012a0000c13d000002710000013d0000000201000029000001710010009c000000d00000a13d000001b70000013d000000400200043d0000000006520019000000000005004b000001d20000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000068004b0000044e0000c13d000001d20000013d00000024010000390000000101100367000000000101043b0000017100100198000004590000c13d000000000001042d00000000010000190000059100010430000a000000000002000200000002001d000000400300043d0000017f020000410000000000230435000100000001001d000001700110019700000004023000390000000000120435000001650030009c000a00000003001d0000016501000041000000000103401900000040011002100000000002000414000001650020009c0000016502008041000000c002200210000000000112019f00000180011001c70000017402000041058f058a0000040f00000060031002700000001f0430018f0000017505300197000001650330019700000001002001900000056c0000613d0000000a090000290000000002590019000000000005004b000004810000613d000000000601034f0000000007090019000000006806043c0000000007870436000000000027004b0000047d0000c13d000000000004004b0000048e0000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f0130003900000176011001970000000002910019000000000012004b00000000010000390000000101004039000800000002001d000001710020009c000005590000213d0000000100100190000005590000c13d0000000801000029000000400010043f0000001f0030008c000005570000a13d0000000002090433000001710020009c000005570000213d000000000193001900000000029200190000001f03200039000000000013004b0000000004000019000001810400804100000181033001970000018105100197000000000653013f000000000053004b00000000030000190000018103004041000001810060009c000000000304c019000000000003004b000005570000c13d0000000023020434000001710030009c000005590000213d00000005043002100000003f0440003900000177044001970000000804400029000001710040009c000005590000213d000000400040043f00000008040000290000000004340436000500000004001d000000e0033000c90000000003230019000000000013004b000005570000213d000000000032004b000004f30000813d00000008040000290000000005210049000001780050009c000005570000213d000000e00050008c000005570000413d000000400500043d000001790050009c000005590000213d000000e006500039000000400060043f0000000067020434000000050070008c000005570000213d00000000077504360000000006060433000001700060009c000005570000213d000000000067043500000040062000390000000006060433000001700060009c000005570000213d00000040075000390000000000670435000000600650003900000060072000390000000007070433000000000076043500000080062000390000000006060433000001700060009c000005570000213d000000200440003900000080075000390000000000670435000000a0062000390000000006060433000000a0075000390000000000670435000000c0062000390000000006060433000000c00750003900000000006704350000000000540435000000e002200039000000000032004b000004c40000413d000000400200043d000001790020009c000005590000213d000000e001200039000000400010043f000000c0012000390000000000010435000000a0012000390000000000010435000000800120003900000000000104350000006001200039000000000001043500000040012000390000000000010435000300000002001d0000000001020436000000000001043500000008020000290000000002020433000000000002004b000005510000613d00000002010000290004017b0010019b000005110000013d000000000003004b000005480000613d0000000902000029000000000002004b0000054f0000613d000000010220008a00000008010000290000000001010433000000000021004b0000055f0000a13d000900000002001d000000050120021000000005011000290000000001010433000700000001001d0000006001100039000600000001001d0000000001010433000a00000001001d0000017c0100004100000000001004430000000001000414000001650010009c0000016501008041000000c0011002100000017d011001c70000800b02000039058f058a0000040f0000000100200190000005650000613d0000000a030000290000017e02300197000000000101043b000000000021004b0000050e0000213d0000017b01300197000000040010006c000005340000613d000000000001004b0000050e0000c13d00000007050000290000000012050434000000060020008c000005660000813d000000010020008c0000050e0000c13d0000000302000029000000600220003900000000020204330000017b03200197000000060200002900000000020204330000017b04200197000000000043004b0000050c0000c13d00000003030000290000000003030433000000050030008c0000050c0000a13d000005660000013d000000020220014f000001710020009c000300000005001d0000050e0000213d00000000010104330000017001100197000000000001042d0000000301000029000000200110003900000000010104330000017001100198000000000201001900000001020060290000000001020019000000000001042d000000000100001900000591000104300000018201000041000000000010043f0000004101000039000000040010043f000001800100004100000591000104300000018201000041000000000010043f0000003201000039000000040010043f00000180010000410000059100010430000000000001042f0000018201000041000000000010043f0000002101000039000000040010043f00000180010000410000059100010430000000400200043d0000000006520019000000000005004b000005760000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000068004b000005720000c13d000000000004004b000005830000613d000000000151034f0000000304400210000000000506043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001604350000006001300210000001650020009c00000165020080410000004002200210000000000112019f0000059100010430000000000001042f0000058d002104230000000102000039000000000001042d0000000002000019000000000001042d0000058f00000432000005900001042e00000591000104300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff0000000200000000000000000000000000000040000001000000000000000000000000000000000000000000000000000000000000000000000000008286eee1000000000000000000000000000000000000000000000000000000009b0cc7d3000000000000000000000000000000000000000000000000000000009b0cc7d400000000000000000000000000000000000000000000000000000000e1030efb000000000000000000000000000000000000000000000000000000008286eee200000000000000000000000000000000000000000000000000000000981c103d000000000000000000000000000000000000000000000000000000003fbac58d0000000000000000000000000000000000000000000000000000000059892657000000000000000000000000000000000000000000000000000000007f63c3dd000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffff42f87c250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000008000000000000000000000000000000000000000000000000059a24eb229eed07ac44229db56c5d79700000000000000000000000000000000000000000000000000000000ffffffe000000000000000000000000000000000000000000000000000000001ffffffe07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffff1f00000000000000000000000000000000000000000000003fffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d955391320200000200000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffff51525e9a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000080000000000000000000000000000000000000000000000000000000000000004e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000008000000000000000006352211e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003204506f00000000000000000000000000000000000000040000001c000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000800000000000000000000000000000000000000000000000000000000000000000000000000000000029de6d153045aa11de0ef101215b66254eff70fb8889ab4afee01b30d7a55b95
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
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.