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 | |||
---|---|---|---|---|---|---|
4524649 | 17 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 immutable DELEGATE_REGISTRY; /// @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); constructor(address delegateRegistry) { DELEGATE_REGISTRY = delegateRegistry; } /** * @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":[{"internalType":"address","name":"delegateRegistry","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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
3cda3351000000000000000000000000000000000000000052a2c3b1b2e2b6d8b7c40016010001bd309633e0485d8275969e54e9004a1d43d31b807fcd32b1164e4260f8000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000059a24eb229eed07ac44229db56c5d797
Deployed Bytecode
0x000400000000000200150000000000020000006004100270000001940340019700030000003103550002000000010355000001940040019d0000000100200190000000280000c13d0000008002000039000000400020043f000000040030008c000002610000413d000000000201043b000000e002200270000001990020009c000000540000a13d0000019a0020009c000000750000213d0000019d0020009c000000a20000613d0000019e0020009c000002610000c13d000000440030008c000002610000413d0000000002000416000000000002004b000002610000c13d0000000402100370000000000202043b000001a200200198000002610000c13d0000002401100370000000000101043b000001b00010009c000002610000213d000000000121019f000000800010043f000001b4010000410000064e0001042e0000000002000416000000000002004b000002610000c13d0000001f023000390000019502200197000000a002200039000000400020043f0000001f0430018f0000019605300198000000a002500039000000390000613d000000a006000039000000000701034f000000007807043c0000000006860436000000000026004b000000350000c13d000000000004004b000000460000613d000000000151034f0000000304400210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000120435000000200030008c000002610000413d000000a00100043d000001970010009c000002610000213d000000800010043f00000140000004430000016000100443000000200100003900000100001004430000000101000039000001200010044300000198010000410000064e0001042e0000019f0020009c000000b30000613d000001a00020009c000000c00000613d000001a10020009c000002610000c13d000000640030008c000002610000413d0000000002000416000000000002004b000002610000c13d0000000402100370000000000202043b000b00000002001d000001970020009c000002610000213d0000004402100370000000000202043b000a00000002001d000001a200200198000002610000c13d0000002401100370000000000201043b000001b501000041000000800010043f000900000002001d000000840020043f00000000010004140000000b02000029000000040020008c000000dc0000c13d0000008003000039000001020000013d0000019b0020009c000000d60000613d0000019c0020009c000002610000c13d000000440030008c000002610000413d0000000002000416000000000002004b000002610000c13d0000000402100370000000000202043b000400000002001d000001970020009c000002610000213d0000002401100370000000000101043b000300000001001d000001a200100198000002610000c13d000001a301000041000000800010043f0000000401000029000000840010043f000001a40100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000001940010009c0000019401008041000000c001100210000001a5011001c70000800502000039064d06480000040f0000000100200190000004990000613d000000000201043b00000000010004140000019702200197000000040020008c000001200000c13d000000030100036700000001030000310000012b0000013d0000000001000416000000000001004b000002610000c13d0000000001000412001500000001001d001400000000003d000080050100003900000044030000390000000004000415000000150440008a0000000504400210000001a402000041064d062a0000040f0000019701100197000000800010043f000001b4010000410000064e0001042e000000240030008c000002610000413d0000000002000416000000000002004b000002610000c13d0000000401100370000000000101043b000001ad02100197000000800020043f000001b001100197000000a00010043f000001b9010000410000064e0001042e000000440030008c000002610000413d0000000002000416000000000002004b000002610000c13d0000000401100370000000000101043b000001970010009c000002610000213d001300000001001d064d04db0000040f00000000020100190000001301000029064d04e30000040f0000019701100197000000400200043d0000000000120435000001940020009c00000194020080410000004001200210000001b8011001c70000064e0001042e0000000001000416000000000001004b000002610000c13d000000800000043f000001b4010000410000064e0001042e000001940010009c0000019401008041000000c001100210000001a6011001c7064d06480000040f00000060031002700000019403300197000000200030008c000000200400003900000000040340190000001f0540018f000000200640019000000080046001bf000000f00000613d0000008007000039000000000801034f000000008908043c0000000007970436000000000047004b000000ec0000c13d000000000005004b000000fd0000613d000000000661034f0000000305500210000000000704043300000000075701cf000000000757022f000000000606043b0000010005500089000000000656022f00000000055601cf000000000575019f0000000000540435000100000003001f00030000000103550000000100200190000001d00000613d000000400300043d000000800200043d000001b1010000410000000000130435001300000003001d0000000401300039000800000002001d00000197022001970000000000210435000001a40100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000001940010009c0000019401008041000000c001100210000001a5011001c70000800502000039064d06480000040f0000000100200190000004990000613d000000000201043b00000000010004140000019702200197000000040020008c000001d40000c13d00000003010003670000000103000031000001e40000013d000001940010009c0000019401008041000000c001100210000001a6011001c7064d06480000040f0000006003100270000101940030019d0000019403300197000300000001035500000001002001900000022f0000613d000001ba043001980000001f0530018f00000080024000390000008008000039000001350000613d000000000601034f000000006706043c0000000008780436000000000028004b000001310000c13d000000000005004b000001420000613d000000000141034f0000000304500210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f01300039000001ba01100197000100000001001d000001a70010009c000002290000213d00000001010000290000008001100039000c00000001001d000000400010043f000001a80030009c000002610000213d000000200030008c000002610000413d000000800200043d000001a20020009c000002610000213d00000080013000390000009f03200039000000000013004b0000000004000019000001a904008041000001a905100197000001a903300197000000000653013f000000000053004b0000000003000019000001a903004041000001a90060009c000000000304c019000000000003004b000002610000c13d00000080032000390000000004030433000001a20040009c000002290000213d00000005034002100000003f03300039000001aa033001970000000c03300029000001a20030009c000002290000213d000000400030043f0000000c030000290000000000430435000000a002200039000000e0034000c90000000003230019000000000013004b000002610000213d000000000004004b0000000004000019000002630000c13d00000005014002100000003f02100039000001ac03200197000000400200043d000b00000002001d0000000002230019000000000032004b00000000030000390000000103004039000001a20020009c000002290000213d0000000100300190000002290000c13d000000400020043f0000000b020000290000000002420436000a00000002001d0000001f0210018f000000000001004b000001920000613d0000000a04000029000000000114001900000000030000310000000203300367000000003503043c0000000004540436000000000014004b0000018e0000c13d000000000002004b0000000c010000290000000001010433000000000001004b000200000000001d000002e30000c13d000000020100002900000005031002100000003f01300039000001ac04100197000000400200043d0000000001240019000000000041004b00000000040000390000000104004039000001a20010009c000002290000213d0000000100400190000002290000c13d000000400010043f000000020100002900000000011204360000001f0430018f000000000003004b000001b30000613d0000000003310019000000000500003100000002055003670000000006010019000000005705043c0000000006760436000000000036004b000001af0000c13d000000000004004b0000000c030000290000000006030433000000000006004b0000049a0000c13d000000400300043d00000020040000390000000005430436000000000402043300000000004504350000004002300039000000000004004b000001c70000613d00000000050000190000000016010434000001970660019700000000026204360000000105500039000000000045004b000001c10000413d0000000001320049000001940010009c00000194010080410000006001100210000001940030009c00000194030080410000004002300210000000000121019f0000064e0001042e000001b601000041000000000010043f000001b7010000410000064f000104300000001303000029000001940030009c00000194030080410000004003300210000001940010009c0000019401008041000000c001100210000000000131019f000001b2011001c7064d06480000040f0000006003100270000101940030019d0000019403300197000300000001035500000001002001900000023b0000613d000000130a000029000001ba053001980000001f0630018f00000000045a0019000001ef0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000048004b000001eb0000c13d000000000006004b000001fc0000613d000000000151034f0000000305600210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000001f01300039000001ba011001970000000002a10019000000000012004b00000000010000390000000101004039000e00000002001d000001a20020009c000002290000213d0000000100100190000002290000c13d0000000e01000029000000400010043f000001a80030009c000002610000213d000000200030008c000002610000413d00000000020a0433000001a20020009c000002610000213d0000000001a300190000000002a200190000001f03200039000000000013004b0000000004000019000001a904008041000001a903300197000001a905100197000000000653013f000000000053004b0000000003000019000001a903004041000001a90060009c000000000304c019000000000003004b000002610000c13d0000000023020434000001a20030009c000002290000213d00000005043002100000003f04400039000001aa044001970000000e04400029000001a20040009c000002590000a13d000001b301000041000000000010043f0000004101000039000000040010043f000001b2010000410000064f000104300000001f0530018f0000019606300198000000400200043d0000000004620019000002460000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000002360000c13d000002460000013d0000001f0530018f0000019606300198000000400200043d0000000004620019000002460000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000002420000c13d000000000005004b000002530000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000001940020009c00000194020080410000004002200210000000000112019f0000064f00010430000000400040043f0000000e040000290000000004340436000d00000004001d000000e0033000c90000000003230019000000000013004b000002980000a13d00000000010000190000064f000104300000000c040000290000000005210049000001a80050009c000002610000213d000000e00050008c000002610000413d000000400500043d000001ab0050009c000002290000213d000000e006500039000000400060043f0000000067020434000000050070008c000002610000213d00000000077504360000000006060433000001970060009c000002610000213d000000000067043500000040062000390000000006060433000001970060009c000002610000213d00000040075000390000000000670435000000600650003900000060072000390000000007070433000000000076043500000080062000390000000006060433000001970060009c000002610000213d000000200440003900000080075000390000000000670435000000a0062000390000000006060433000000a0075000390000000000670435000000c0062000390000000006060433000000c00750003900000000006704350000000000540435000000e002200039000000000032004b000002640000413d0000000c010000290000000004010433000001a20040009c000001760000a13d000002290000013d000000000032004b000002ca0000813d0000000e040000290000000005210049000001a80050009c000002610000213d000000e00050008c000002610000413d000000400500043d000001ab0050009c000002290000213d000000e006500039000000400060043f0000000067020434000000050070008c000002610000213d00000000077504360000000006060433000001970060009c000002610000213d000000000067043500000040062000390000000006060433000001970060009c000002610000213d00000040075000390000000000670435000000600650003900000060072000390000000007070433000000000076043500000080062000390000000006060433000001970060009c000002610000213d000000200440003900000080075000390000000000670435000000a0062000390000000006060433000000a0075000390000000000670435000000c0062000390000000006060433000000c00750003900000000006704350000000000540435000000e002200039000000000032004b0000029b0000413d000000400100043d000001ab0010009c000002290000213d0000000006010019000000e001600039000000400010043f000000c0016000390000000000010435000000a00160003900000000000104350000008001600039000000000001043500000060016000390000000000010435000000400160003900000000000104350000002001600039000000000001043500000000000604350000000e010000290000000001010433000000000001004b0000043b0000c13d0000000801000029000000ce0000013d0000000301000029000801ad0010019b0000000101000029000600a00010003d0000000002000019000200000000001d000002f00000013d000000090200002900000001022000390000000c010000290000000001010433000000000012004b000004cb0000813d000900000002001d0000000502200210000700000002001d00000006012000290000000001010433001200000001001d00000060011000390000000001010433001300000001001d000001ae0100004100000000001004430000000001000414000001940010009c0000019401008041000000c001100210000001af011001c70000800b02000039064d06480000040f0000000100200190000004990000613d0000001303000029000001b002300197000000000101043b000000000021004b000002ea0000213d000001ad01300197000000080010006c0000030e0000613d000000000001004b000002ea0000c13d00000012020000290000000001020433000000050010008c000004c50000213d000000010010008c000002ea0000c13d00000040012000390000000001010433000000400300043d000001b10200004100000000002304350000019702100197001300000003001d0000000401300039000e00000002001d0000000000210435000001a40100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000001940010009c0000019401008041000000c001100210000001a5011001c70000800502000039064d06480000040f0000000100200190000004990000613d000000000201043b00000000010004140000019702200197000000040020008c000003340000c13d00000003010003670000000103000031000003440000013d0000001303000029000001940030009c00000194030080410000004003300210000001940010009c0000019401008041000000c001100210000000000131019f000001b2011001c7064d06480000040f0000006003100270000101940030019d000001940330019700030000000103550000000100200190000004cf0000613d0000001308000029000001ba0430019800000000024800190000034e0000613d000000000501034f0000000006080019000000005705043c0000000006760436000000000026004b0000034a0000c13d0000001f053001900000035b0000613d000000000141034f0000000304500210000000000502043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f00000000001204350000001f01300039000001ba011001970000000002810019000000000012004b00000000010000390000000101004039001100000002001d000001a20020009c000002290000213d0000000100100190000002290000c13d0000001101000029000000400010043f000001a80030009c000002610000213d000000200030008c000002610000413d0000000002080433000001a20020009c000002610000213d000000000183001900000000028200190000001f03200039000000000013004b0000000004000019000001a904008041000001a903300197000001a905100197000000000653013f000000000053004b0000000003000019000001a903004041000001a90060009c000000000304c019000000000003004b000002610000c13d0000000023020434000001a20030009c000002290000213d00000005043002100000003f04400039000001aa044001970000001104400029000001a20040009c000002290000213d000000400040043f00000011040000290000000004340436000d00000004001d000000e0033000c90000000003230019000000000013004b000002610000213d000000000032004b000003c20000813d00000011040000290000000005210049000001a80050009c000002610000213d000000e00050008c000002610000413d000000400500043d000001ab0050009c000002290000213d000000e006500039000000400060043f0000000067020434000000050070008c000002610000213d00000000077504360000000006060433000001970060009c000002610000213d000000000067043500000040062000390000000006060433000001970060009c000002610000213d00000040075000390000000000670435000000600650003900000060072000390000000007070433000000000076043500000080062000390000000006060433000001970060009c000002610000213d000000200440003900000080075000390000000000670435000000a0062000390000000006060433000000a0075000390000000000670435000000c0062000390000000006060433000000c00750003900000000006704350000000000540435000000e002200039000000000032004b000003930000413d000000400200043d000001ab0020009c000002290000213d000000e001200039000000400010043f000000c0012000390000000000010435000000a001200039000000000001043500000080012000390000000000010435000000600120003900000000000104350000004001200039000000000001043500000020012000390000000000010435000000000002043500000011010000290000000006010433000000000006004b000004220000613d000500000002001d000003dd0000013d0000000e05000029000000000006004b0000041e0000613d000000010660008a00000011010000290000000001010433000000000061004b000004ba0000a13d001300000006001d00000005016002100000000d011000290000000001010433001000000001001d0000006001100039000f00000001001d0000000001010433001200000001001d000001ae0100004100000000001004430000000001000414000001940010009c0000019401008041000000c001100210000001af011001c70000800b02000039064d06480000040f0000000100200190000004990000613d0000001203000029000001b002300197000000000101043b000000000021004b0000001306000029000003da0000213d000001ad01300197000000080010006c0000000e05000029000004020000613d000000000001004b000003db0000c13d00000010070000290000000012070434000000050020008c000004c50000213d000000010020008c000003db0000c13d000000050200002900000060022000390000000002020433000001ad032001970000000f020000290000000002020433000001ad04200197000000000043004b000004150000c13d00000005030000290000000003030433000000050030008c000004c50000213d000000000003004b000003db0000c13d000000030220014f000001a20020009c000500000007001d000003db0000213d00000000010104330000019705100197000004260000013d000000050100002900000020011000390000000001010433000004240000013d00000000010000190000000e050000290000019701100198000000000501c0190000000902000029000000040050006c000002eb0000c13d0000000b010000290000000001010433000000000021004b000004ba0000a13d00000007020000290000000a01200029000000010200003900000000002104350000000201000029000200010010003e0000000902000029000002eb0000c13d000001b301000041000000000010043f0000001101000039000000040010043f000001b2010000410000064f0001043000000000020100190000000a01000029000c01ad0010019b000004430000013d00000000060700190000001102000029000000000002004b000004c00000613d001300000006001d000000010220008a0000000e010000290000000001010433000000000021004b000004ba0000a13d001100000002001d00000005012002100000000d011000290000000001010433001000000001001d0000006001100039000f00000001001d0000000001010433001200000001001d000001ae0100004100000000001004430000000001000414000001940010009c0000019401008041000000c001100210000001af011001c70000800b02000039064d06480000040f0000000100200190000004990000613d0000001203000029000001b002300197000000000101043b000000000021004b0000001306000029000004400000213d000001ad013001970000000c0010006c000004680000613d000000000001004b000004400000c13d00000010070000290000000012070434000000060020008c000004c50000813d000000010020008c000004810000613d000000020020008c0000047c0000613d000000030020008c000004400000c13d000000800370003900000000030304330000000b0330014f0000019700300198000004400000c13d000000a0037000390000000003030433000000090030006c000004400000c13d000004810000013d000000800370003900000000030304330000000b0330014f0000019700300198000004400000c13d00000060036000390000000003030433000001ad043001970000000f030000290000000003030433000001ad05300197000000000054004b0000048f0000c13d0000000004060433000000050040008c000004c50000213d000000000042004b000004400000a13d000004910000013d000000000004004b000004400000c13d000000030020008c0000043f0000c13d0000000a0230014f000001a20020009c0000000006070019000004400000213d0000000001010433000000ce0000013d000000000001042f0000000103000029000000a00330003900000000040000190000000005000019000004a20000013d0000000104400039000000000064004b000001b80000813d0000000b070000290000000007070433000000000047004b000004ba0000a13d00000005074002100000000a087000290000000008080433000000000008004b0000049f0000613d0000000006020433000000000056004b000004ba0000a13d0000000506500210000000000616001900000000077300190000000007070433000000400770003900000000070704330000019707700197000000000076043500000001055000390000000c0600002900000000060604330000049f0000013d000001b301000041000000000010043f0000003201000039000000040010043f000001b2010000410000064f00010430000000200160003900000000010104330000019701100198000000ce0000c13d000002e10000013d000001b301000041000000000010043f0000002101000039000000040010043f000001b2010000410000064f000104300000000201000029000001a20010009c000001980000a13d000002290000013d0000001f0530018f0000019606300198000000400200043d0000000004620019000002460000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000004d60000c13d000002460000013d00000024010000390000000201100367000000000101043b000001a200100198000004e10000c13d000000000001042d00000000010000190000064f00010430000a000000000002000200000002001d000000400300043d000001b1020000410000000000230435000100000001001d0000019701100197000a00000003001d00000004023000390000000000120435000001a40100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000001940010009c0000019401008041000000c001100210000001a5011001c70000800502000039064d06480000040f0000000100200190000005f80000613d000000000201043b00000000010004140000019702200197000000040020008c000005030000c13d00000003010003670000000103000031000005130000013d0000000a03000029000001940030009c00000194030080410000004003300210000001940010009c0000019401008041000000c001100210000000000131019f000001b2011001c7064d06480000040f0000006003100270000101940030019d0000019403300197000300000001035500000001002001900000060b0000613d0000000a0a000029000001ba053001980000001f0630018f00000000045a00190000051e0000613d000000000701034f00000000080a0019000000007907043c0000000008980436000000000048004b0000051a0000c13d000000000006004b0000052b0000613d000000000151034f0000000305600210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000001f01300039000001ba011001970000000002a10019000000000012004b00000000010000390000000101004039000800000002001d000001a20020009c000005f90000213d0000000100100190000005f90000c13d0000000801000029000000400010043f000001a80030009c000005f60000213d0000001f0030008c000005f60000a13d00000000020a0433000001a20020009c000005f60000213d0000000001a300190000000002a200190000001f03200039000000000013004b0000000004000019000001a904008041000001a903300197000001a905100197000000000653013f000000000053004b0000000003000019000001a903004041000001a90060009c000000000304c019000000000003004b000005f60000c13d0000000023020434000001a20030009c000005f90000213d00000005043002100000003f04400039000001aa044001970000000804400029000001a20040009c000005f90000213d000000400040043f00000008040000290000000004340436000500000004001d000000e0033000c90000000003230019000000000013004b000005f60000213d000000000032004b000005920000813d00000008040000290000000005210049000001a80050009c000005f60000213d000000e00050008c000005f60000413d000000400500043d000001ab0050009c000005f90000213d000000e006500039000000400060043f0000000067020434000000050070008c000005f60000213d00000000077504360000000006060433000001970060009c000005f60000213d000000000067043500000040062000390000000006060433000001970060009c000005f60000213d00000040075000390000000000670435000000600650003900000060072000390000000007070433000000000076043500000080062000390000000006060433000001970060009c000005f60000213d000000200440003900000080075000390000000000670435000000a0062000390000000006060433000000a0075000390000000000670435000000c0062000390000000006060433000000c00750003900000000006704350000000000540435000000e002200039000000000032004b000005630000413d000000400200043d000001ab0020009c000005f90000213d000000e001200039000000400010043f000000c0012000390000000000010435000000a0012000390000000000010435000000800120003900000000000104350000006001200039000000000001043500000040012000390000000000010435000300000002001d0000000001020436000000000001043500000008020000290000000002020433000000000002004b000005f00000613d0000000201000029000401ad0010019b000005b00000013d000000000003004b000005e70000613d0000000902000029000000000002004b000005ee0000613d000000010220008a00000008010000290000000001010433000000000021004b000005ff0000a13d000900000002001d000000050120021000000005011000290000000001010433000700000001001d0000006001100039000600000001001d0000000001010433000a00000001001d000001ae0100004100000000001004430000000001000414000001940010009c0000019401008041000000c001100210000001af011001c70000800b02000039064d06480000040f0000000100200190000005f80000613d0000000a03000029000001b002300197000000000101043b000000000021004b000005ad0000213d000001ad01300197000000040010006c000005d30000613d000000000001004b000005ad0000c13d00000007050000290000000012050434000000060020008c000006050000813d000000010020008c000005ad0000c13d000000030200002900000060022000390000000002020433000001ad0320019700000006020000290000000002020433000001ad04200197000000000043004b000005ab0000c13d00000003030000290000000003030433000000050030008c000005ab0000a13d000006050000013d000000020220014f000001a20020009c000300000005001d000005ad0000213d00000000010104330000019701100197000000000001042d0000000301000029000000200110003900000000010104330000019701100198000000000201001900000001020060290000000001020019000000000001042d00000000010000190000064f00010430000000000001042f000001b301000041000000000010043f0000004101000039000000040010043f000001b2010000410000064f00010430000001b301000041000000000010043f0000003201000039000000040010043f000001b2010000410000064f00010430000001b301000041000000000010043f0000002101000039000000040010043f000001b2010000410000064f000104300000001f0530018f0000019606300198000000400200043d0000000004620019000006160000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000006120000c13d000000000005004b000006230000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000001940020009c00000194020080410000004002200210000000000112019f0000064f00010430000000000001042f00000000050100190000000000200443000000050030008c000006380000413d000000040100003900000000020000190000000506200210000000000664001900000005066002700000000006060031000000000161043a0000000102200039000000000031004b000006300000413d000001940030009c000001940300804100000060013002100000000002000414000001940020009c0000019402008041000000c002200210000000000112019f000001bb011001c70000000002050019064d06480000040f0000000100200190000006470000613d000000000101043b000000000001042d000000000001042f0000064b002104230000000102000039000000000001042d0000000002000019000000000001042d0000064d000004320000064e0001042e0000064f0001043000000000000000000000000000000000000000000000000000000000ffffffff00000000000000000000000000000000000000000000000000000001ffffffe000000000000000000000000000000000000000000000000000000000ffffffe0000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000200000000000000000000000000000080000001000000000000000000000000000000000000000000000000000000000000000000000000008286eee1000000000000000000000000000000000000000000000000000000009b0cc7d3000000000000000000000000000000000000000000000000000000009b0cc7d400000000000000000000000000000000000000000000000000000000e1030efb000000000000000000000000000000000000000000000000000000008286eee200000000000000000000000000000000000000000000000000000000981c103d000000000000000000000000000000000000000000000000000000003fbac58d0000000000000000000000000000000000000000000000000000000059892657000000000000000000000000000000000000000000000000000000007f63c3dd000000000000000000000000000000000000000000000000ffffffffffffffff42f87c2500000000000000000000000000000000000000000000000000000000310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e02000002000000000000000000000000000000440000000000000000000000000000000000000000000000000000000000000024000000800000000000000000000000000000000000000000000000000000000000000000ffffffffffffff7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0000000000000000000000000000000000000000000000000ffffffffffffff1f00000000000000000000000000000000000000000000003fffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000796b89b91644bc98cd93958e4c9038275d622183e25ac5af08cc6b5d955391320200000200000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffff51525e9a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000240000000000000000000000004e487b710000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000008000000000000000006352211e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003204506f00000000000000000000000000000000000000040000001c000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000800000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe002000002000000000000000000000000000000000000000000000000000000004fe6da934eb4adf6a59ec0803d6ca1d82fcfcecee3b9e35aba72c4ae6f5eb2ad
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.