Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CollateralPoolPartitionValidator
Compiler Version
v0.6.10+commit.00c0fcaf
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-08-28 */ // SPDX-License-Identifier: MIT pragma solidity 0.6.10; abstract contract ERC1820Registry { function setInterfaceImplementer( address _addr, bytes32 _interfaceHash, address _implementer ) external virtual; function getInterfaceImplementer(address _addr, bytes32 _interfaceHash) external virtual view returns (address); function setManager(address _addr, address _newManager) external virtual; function getManager(address _addr) public virtual view returns (address); } /// Base client to interact with the registry. contract ERC1820Client { ERC1820Registry constant ERC1820REGISTRY = ERC1820Registry( 0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24 ); function setInterfaceImplementation( string memory _interfaceLabel, address _implementation ) internal { bytes32 interfaceHash = keccak256(abi.encodePacked(_interfaceLabel)); ERC1820REGISTRY.setInterfaceImplementer( address(this), interfaceHash, _implementation ); } function interfaceAddr(address addr, string memory _interfaceLabel) internal view returns (address) { bytes32 interfaceHash = keccak256(abi.encodePacked(_interfaceLabel)); return ERC1820REGISTRY.getInterfaceImplementer(addr, interfaceHash); } function delegateManagement(address _newManager) internal { ERC1820REGISTRY.setManager(address(this), _newManager); } } contract ERC1820Implementer { /** * @dev ERC1820 well defined magic value indicating the contract has * registered with the ERC1820Registry that it can implement an interface. */ bytes32 constant ERC1820_ACCEPT_MAGIC = keccak256( abi.encodePacked("ERC1820_ACCEPT_MAGIC") ); /** * @dev Mapping of interface name keccak256 hashes for which this contract * implements the interface. * @dev Only settable internally. */ mapping(bytes32 => bool) internal _interfaceHashes; /** * @notice Indicates whether the contract implements the interface `_interfaceHash` * for the address `_addr`. * @param _interfaceHash keccak256 hash of the name of the interface. * @return ERC1820_ACCEPT_MAGIC only if the contract implements `ìnterfaceHash` * for the address `_addr`. * @dev In this implementation, the `_addr` (the address for which the * contract will implement the interface) is always `address(this)`. */ function canImplementInterfaceForAddress( bytes32 _interfaceHash, address // Comments to avoid compilation warnings for unused variables. /*addr*/ ) external view returns (bytes32) { if (_interfaceHashes[_interfaceHash]) { return ERC1820_ACCEPT_MAGIC; } else { return ""; } } /** * @notice Internally set the fact this contract implements the interface * identified by `_interfaceLabel` * @param _interfaceLabel String representation of the interface. */ function _setInterface(string memory _interfaceLabel) internal { _interfaceHashes[keccak256(abi.encodePacked(_interfaceLabel))] = true; } } /** * @notice Partition strategy validator hooks for Amp */ interface IAmpPartitionStrategyValidator { function tokensFromPartitionToValidate( bytes4 _functionSig, bytes32 _partition, address _operator, address _from, address _to, uint256 _value, bytes calldata _data, bytes calldata _operatorData ) external; function tokensToPartitionToValidate( bytes4 _functionSig, bytes32 _partition, address _operator, address _from, address _to, uint256 _value, bytes calldata _data, bytes calldata _operatorData ) external; function isOperatorForPartitionScope( bytes32 _partition, address _operator, address _tokenHolder ) external view returns (bool); } /** * @title PartitionUtils * @notice Partition related helper functions. */ library PartitionUtils { bytes32 public constant CHANGE_PARTITION_FLAG = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; /** * @notice Retrieve the destination partition from the 'data' field. * A partition change is requested ONLY when 'data' starts with the flag: * * 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff * * When the flag is detected, the destination partition is extracted from the * 32 bytes following the flag. * @param _data Information attached to the transfer. Will contain the * destination partition if a change is requested. * @param _fallbackPartition Partition value to return if a partition change * is not requested in the `_data`. * @return toPartition Destination partition. If the `_data` does not contain * the prefix and bytes32 partition in the first 64 bytes, the method will * return the provided `_fromPartition`. */ function _getDestinationPartition(bytes memory _data, bytes32 _fallbackPartition) internal pure returns (bytes32) { if (_data.length < 64) { return _fallbackPartition; } (bytes32 flag, bytes32 toPartition) = abi.decode(_data, (bytes32, bytes32)); if (flag == CHANGE_PARTITION_FLAG) { return toPartition; } return _fallbackPartition; } /** * @notice Helper to get the strategy identifying prefix from the `_partition`. * @param _partition Partition to get the prefix for. * @return 4 byte partition strategy prefix. */ function _getPartitionPrefix(bytes32 _partition) internal pure returns (bytes4) { return bytes4(_partition); } /** * @notice Helper method to split the partition into the prefix, sub partition * and partition owner components. * @param _partition The partition to split into parts. * @return The 4 byte partition prefix, 8 byte sub partition, and final 20 * bytes representing an address. */ function _splitPartition(bytes32 _partition) internal pure returns ( bytes4, bytes8, address ) { bytes4 prefix = bytes4(_partition); bytes8 subPartition = bytes8(_partition << 32); address addressPart = address(uint160(uint256(_partition))); return (prefix, subPartition, addressPart); } /** * @notice Helper method to get a partition strategy ERC1820 interface name * based on partition prefix. * @param _prefix 4 byte partition prefix. * @dev Each 4 byte prefix has a unique interface name so that an individual * hook implementation can be set for each prefix. */ function _getPartitionStrategyValidatorIName(bytes4 _prefix) internal pure returns (string memory) { return string(abi.encodePacked("AmpPartitionStrategyValidator", _prefix)); } } /** * @title Base contract that satisfies the IAmpPartitionStrategyValidator * interface */ contract AmpPartitionStrategyValidatorBase is IAmpPartitionStrategyValidator, ERC1820Client, ERC1820Implementer { /** * @notice Partition prefix the hooks are valid for. * @dev Must to be set by the parent contract. */ bytes4 public partitionPrefix; /** * @notice Amp contract address. */ address public amp; /** * @notice Initialize the partition prefix and register the implementation * with the ERC1820 registry for the dynamic interface name. * @param _prefix Partition prefix the hooks are valid for. * @param _amp The address of the Amp contract. */ constructor(bytes4 _prefix, address _amp) public { partitionPrefix = _prefix; string memory iname = PartitionUtils._getPartitionStrategyValidatorIName( partitionPrefix ); ERC1820Implementer._setInterface(iname); amp = _amp; } /** * @dev Placeholder to satisfy IAmpPartitionSpaceValidator interface that * can be overridden by parent. */ function tokensFromPartitionToValidate( bytes4, /* functionSig */ bytes32, /* fromPartition */ address, /* operator */ address, /* from */ address, /* to */ uint256, /* value */ bytes calldata, /* data */ bytes calldata /* operatorData */ ) external virtual override {} /** * @dev Placeholder to satisfy IAmpPartitionSpaceValidator interface that * can be overridden by parent. */ function tokensToPartitionToValidate( bytes4, /* functionSig */ bytes32, /* fromPartition */ address, /* operator */ address, /* from */ address, /* to */ uint256, /* value */ bytes calldata, /* data */ bytes calldata /* operatorData */ ) external virtual override {} /** * @notice Report if address is an operator for a partition based on the * partition's strategy. * @dev Placeholder that can be overridden by parent. */ function isOperatorForPartitionScope( bytes32, /* partition */ address, /* operator */ address /* tokenHolder */ ) external virtual override view returns (bool) { return false; } } interface IAmp { function isCollateralManager(address) external view returns (bool); } /** * @title CollateralPoolPartitionValidator */ contract CollateralPoolPartitionValidator is AmpPartitionStrategyValidatorBase { bytes4 constant PARTITION_PREFIX = 0xCCCCCCCC; constructor(address _amp) public AmpPartitionStrategyValidatorBase(PARTITION_PREFIX, _amp) {} /** * @notice Reports if the token holder is an operator for the partition. * @dev The `_operator` address param is unused. For this strategy, this will * be being called on behalf of suppliers, as they have sent their tokens * to the collateral manager address, and are now trying to execute a * transfer from the pool. This implies that the pool sender hook * MUST be implemented in such a way as to restrict any unauthorized * transfers, as the partitions affected by this strategy will allow * all callers to make an attempt to transfer from the collateral * managers partition. * @param _partition The partition to check. * @param _tokenHolder The collateral manager holding the pool of tokens. * @return The operator check for this strategy returns true if the partition * owner (identified by the final 20 bytes of the partition) is the * same as the token holder address, as in this case the token holder * is the collateral manager address. */ function isOperatorForPartitionScope( bytes32 _partition, address, /* operator */ address _tokenHolder ) external override view returns (bool) { require(msg.sender == address(amp), "Hook must be called by amp"); (, , address partitionOwner) = PartitionUtils._splitPartition(_partition); if (!IAmp(amp).isCollateralManager(partitionOwner)) { return false; } return _tokenHolder == partitionOwner; } /** * @notice Validate the rules of the strategy when tokens are being sent to * a partition under the purview of the strategy. * @dev The `_toPartition` must be formatted with the PARTITION_PREFIX as the * first 4 bytes, the `_to` value as the final 20 bytes. The 8 bytes in the * middle can be used by the manager to create sub partitions within their * impelemntation. * @param _toPartition The partition the tokens are transferred to. * @param _to The address of the collateral manager. */ function tokensToPartitionToValidate( bytes4, /* functionSig */ bytes32 _toPartition, address, /* operator */ address, /* from */ address _to, uint256, /* value */ bytes calldata, /* _data */ bytes calldata /* operatorData */ ) external override { require(msg.sender == address(amp), "Hook must be called by amp"); (, , address toPartitionOwner) = PartitionUtils._splitPartition(_toPartition); require( _to == toPartitionOwner, "Transfers to this partition must be to the partitionOwner" ); require( IAmp(amp).isCollateralManager(toPartitionOwner), "Partition owner is not a registered collateral manager" ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_amp","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"amp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_interfaceHash","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"canImplementInterfaceForAddress","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_partition","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"_tokenHolder","type":"address"}],"name":"isOperatorForPartitionScope","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partitionPrefix","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"tokensFromPartitionToValidate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"},{"internalType":"bytes32","name":"_toPartition","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"tokensToPartitionToValidate","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506040516109be3803806109be8339818101604052602081101561003357600080fd5b50516001805463cccccccc63ffffffff199091161790819055633333333360e21b9082906060906100719060e01b6100ba602090811b61066f17901c565b90506100868161010a60201b6106bf1760201c565b50600180546001600160a01b0390921664010000000002600160201b600160c01b0319909216919091179055506101a59050565b604080517f416d70506172746974696f6e537472617465677956616c696461746f7200000060208201526001600160e01b031992909216603d830152805180830360210181526041909201905290565b6001600080836040516020018082805190602001908083835b602083106101425780518252601f199092019160209182019101610123565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61080a806101b46000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80630973e6ba14610067578063249cb3fa1461008b5780633d006039146100c95780633f0413df146100ee578063b3c46f4214610136578063dc86ad7a14610235575b600080fd5b61006f610332565b604080516001600160a01b039092168252519081900360200190f35b6100b7600480360360408110156100a157600080fd5b50803590602001356001600160a01b0316610348565b60408051918252519081900360200190f35b6100d16103ae565b604080516001600160e01b03199092168252519081900360200190f35b6101226004803603606081101561010457600080fd5b508035906001600160a01b03602082013581169160400135166103b7565b604080519115158252519081900360200190f35b610233600480360361010081101561014d57600080fd5b6001600160e01b0319823516916020810135916001600160a01b036040830135811692606081013582169260808201359092169160a0820135919081019060e0810160c0820135600160201b8111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111600160201b831117156101d857600080fd5b919390929091602081019035600160201b8111156101f557600080fd5b82018360208201111561020757600080fd5b803590602001918460018302840111600160201b8311171561022857600080fd5b5090925090506104d5565b005b610233600480360361010081101561024c57600080fd5b6001600160e01b0319823516916020810135916001600160a01b036040830135811692606081013582169260808201359092169160a0820135919081019060e0810160c0820135600160201b8111156102a457600080fd5b8201836020820111156102b657600080fd5b803590602001918460018302840111600160201b831117156102d757600080fd5b919390929091602081019035600160201b8111156102f457600080fd5b82018360208201111561030657600080fd5b803590602001918460018302840111600160201b8311171561032757600080fd5b509092509050610663565b600154600160201b90046001600160a01b031681565b60008281526020819052604081205460ff16156103a457604051602001808073455243313832305f4143434550545f4d4147494360601b81525060140190506040516020818303038152906040528051906020012090506103a8565b5060005b92915050565b60015460e01b81565b600154600090600160201b90046001600160a01b03163314610420576040805162461bcd60e51b815260206004820152601a60248201527f486f6f6b206d7573742062652063616c6c656420627920616d70000000000000604482015290519081900360640190fd5b600061042b8561075a565b60015460408051630e0e923b60e01b81526001600160a01b0380851660048301529151939650600160201b909204169350630e0e923b9250602480820192602092909190829003018186803b15801561048357600080fd5b505afa158015610497573d6000803e3d6000fd5b505050506040513d60208110156104ad57600080fd5b50516104bd5760009150506104ce565b6001600160a01b0383811691161490505b9392505050565b600154600160201b90046001600160a01b0316331461053b576040805162461bcd60e51b815260206004820152601a60248201527f486f6f6b206d7573742062652063616c6c656420627920616d70000000000000604482015290519081900360640190fd5b60006105468a61075a565b92505050806001600160a01b0316876001600160a01b03161461059a5760405162461bcd60e51b815260040180806020018281038252603981526020018061079c6039913960400191505060405180910390fd5b60015460408051630e0e923b60e01b81526001600160a01b0384811660048301529151600160201b90930490911691630e0e923b91602480820192602092909190829003018186803b1580156105ef57600080fd5b505afa158015610603573d6000803e3d6000fd5b505050506040513d602081101561061957600080fd5b50516106565760405162461bcd60e51b81526004018080602001828103825260368152602001806107666036913960400191505060405180910390fd5b5050505050505050505050565b50505050505050505050565b604080517f416d70506172746974696f6e537472617465677956616c696461746f7200000060208201526001600160e01b031992909216603d830152805180830360210181526041909201905290565b6001600080836040516020018082805190602001908083835b602083106106f75780518252601f1990920191602091820191016106d8565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b90602082901b90829056fe506172746974696f6e206f776e6572206973206e6f742061207265676973746572656420636f6c6c61746572616c206d616e616765725472616e736665727320746f207468697320706172746974696f6e206d75737420626520746f2074686520706172746974696f6e4f776e6572a2646970667358221220e81c00e17ae5d4a7870b1b5d199fabbea10a06217f3c0b890d29af812cb54e8d64736f6c634300060a0033000000000000000000000000ff20817765cb7f73d4bde2e66e067e58d11095c2
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100625760003560e01c80630973e6ba14610067578063249cb3fa1461008b5780633d006039146100c95780633f0413df146100ee578063b3c46f4214610136578063dc86ad7a14610235575b600080fd5b61006f610332565b604080516001600160a01b039092168252519081900360200190f35b6100b7600480360360408110156100a157600080fd5b50803590602001356001600160a01b0316610348565b60408051918252519081900360200190f35b6100d16103ae565b604080516001600160e01b03199092168252519081900360200190f35b6101226004803603606081101561010457600080fd5b508035906001600160a01b03602082013581169160400135166103b7565b604080519115158252519081900360200190f35b610233600480360361010081101561014d57600080fd5b6001600160e01b0319823516916020810135916001600160a01b036040830135811692606081013582169260808201359092169160a0820135919081019060e0810160c0820135600160201b8111156101a557600080fd5b8201836020820111156101b757600080fd5b803590602001918460018302840111600160201b831117156101d857600080fd5b919390929091602081019035600160201b8111156101f557600080fd5b82018360208201111561020757600080fd5b803590602001918460018302840111600160201b8311171561022857600080fd5b5090925090506104d5565b005b610233600480360361010081101561024c57600080fd5b6001600160e01b0319823516916020810135916001600160a01b036040830135811692606081013582169260808201359092169160a0820135919081019060e0810160c0820135600160201b8111156102a457600080fd5b8201836020820111156102b657600080fd5b803590602001918460018302840111600160201b831117156102d757600080fd5b919390929091602081019035600160201b8111156102f457600080fd5b82018360208201111561030657600080fd5b803590602001918460018302840111600160201b8311171561032757600080fd5b509092509050610663565b600154600160201b90046001600160a01b031681565b60008281526020819052604081205460ff16156103a457604051602001808073455243313832305f4143434550545f4d4147494360601b81525060140190506040516020818303038152906040528051906020012090506103a8565b5060005b92915050565b60015460e01b81565b600154600090600160201b90046001600160a01b03163314610420576040805162461bcd60e51b815260206004820152601a60248201527f486f6f6b206d7573742062652063616c6c656420627920616d70000000000000604482015290519081900360640190fd5b600061042b8561075a565b60015460408051630e0e923b60e01b81526001600160a01b0380851660048301529151939650600160201b909204169350630e0e923b9250602480820192602092909190829003018186803b15801561048357600080fd5b505afa158015610497573d6000803e3d6000fd5b505050506040513d60208110156104ad57600080fd5b50516104bd5760009150506104ce565b6001600160a01b0383811691161490505b9392505050565b600154600160201b90046001600160a01b0316331461053b576040805162461bcd60e51b815260206004820152601a60248201527f486f6f6b206d7573742062652063616c6c656420627920616d70000000000000604482015290519081900360640190fd5b60006105468a61075a565b92505050806001600160a01b0316876001600160a01b03161461059a5760405162461bcd60e51b815260040180806020018281038252603981526020018061079c6039913960400191505060405180910390fd5b60015460408051630e0e923b60e01b81526001600160a01b0384811660048301529151600160201b90930490911691630e0e923b91602480820192602092909190829003018186803b1580156105ef57600080fd5b505afa158015610603573d6000803e3d6000fd5b505050506040513d602081101561061957600080fd5b50516106565760405162461bcd60e51b81526004018080602001828103825260368152602001806107666036913960400191505060405180910390fd5b5050505050505050505050565b50505050505050505050565b604080517f416d70506172746974696f6e537472617465677956616c696461746f7200000060208201526001600160e01b031992909216603d830152805180830360210181526041909201905290565b6001600080836040516020018082805190602001908083835b602083106106f75780518252601f1990920191602091820191016106d8565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b90602082901b90829056fe506172746974696f6e206f776e6572206973206e6f742061207265676973746572656420636f6c6c61746572616c206d616e616765725472616e736665727320746f207468697320706172746974696f6e206d75737420626520746f2074686520706172746974696f6e4f776e6572a2646970667358221220e81c00e17ae5d4a7870b1b5d199fabbea10a06217f3c0b890d29af812cb54e8d64736f6c634300060a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ff20817765cb7f73d4bde2e66e067e58d11095c2
-----Decoded View---------------
Arg [0] : _amp (address): 0xfF20817765cB7f73d4bde2e66e067E58D11095C2
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000ff20817765cb7f73d4bde2e66e067e58d11095c2
Deployed Bytecode Sourcemap
10006:3180:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7855:18;;;:::i;:::-;;;;-1:-1:-1;;;;;7855:18:0;;;;;;;;;;;;;;2626:356;;;;;;;;;;;;;;;;-1:-1:-1;2626:356:0;;;;;;-1:-1:-1;;;;;2626:356:0;;:::i;:::-;;;;;;;;;;;;;;;;7761:29;;;:::i;:::-;;;;-1:-1:-1;;;;;;7761:29:0;;;;;;;;;;;;;;11324:496;;;;;;;;;;;;;;;;-1:-1:-1;11324:496:0;;;-1:-1:-1;;;;;11324:496:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;12381:802;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;12381:802:0;;;;;;;;;-1:-1:-1;;;;;12381:802:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12381:802:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12381:802:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12381:802:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12381:802:0;;;;;;;;;;-1:-1:-1;12381:802:0;;-1:-1:-1;12381:802:0;-1:-1:-1;12381:802:0;:::i;:::-;;8598:346;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;8598:346:0;;;;;;;;;-1:-1:-1;;;;;8598:346:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8598:346:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8598:346:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8598:346:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8598:346:0;;;;;;;;;;-1:-1:-1;8598:346:0;;-1:-1:-1;8598:346:0;-1:-1:-1;8598:346:0;:::i;7855:18::-;;;-1:-1:-1;;;7855:18:0;;-1:-1:-1;;;;;7855:18:0;;:::o;2626:356::-;2821:7;2845:32;;;;;;;;;;;;;2841:134;;;1856:40;;;;;;-1:-1:-1;;;1856:40:0;;;;;;;;;;;;;;;;;;;1836:67;;;;;;2894:27;;;;2841:134;-1:-1:-1;2954:9:0;2841:134;2626:356;;;;:::o;7761:29::-;;;;;;:::o;11324:496::-;11540:3;;11493:4;;-1:-1:-1;;;11540:3:0;;-1:-1:-1;;;;;11540:3:0;11518:10;:26;11510:65;;;;;-1:-1:-1;;;11510:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11593:22;11619:42;11650:10;11619:30;:42::i;:::-;11682:3;;11677:45;;;-1:-1:-1;;;11677:45:0;;-1:-1:-1;;;;;11677:45:0;;;11682:3;11677:45;;;;;11588:73;;-1:-1:-1;;;;11682:3:0;;;;;-1:-1:-1;11677:29:0;;-1:-1:-1;11677:45:0;;;;;;;;;;;;;;;11682:3;11677:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11677:45:0;11672:91;;11746:5;11739:12;;;;;11672:91;-1:-1:-1;;;;;11782:30:0;;;;;;;-1:-1:-1;11324:496:0;;;;;;:::o;12381:802::-;12745:3;;-1:-1:-1;;;12745:3:0;;-1:-1:-1;;;;;12745:3:0;12723:10;:26;12715:65;;;;;-1:-1:-1;;;12715:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12798:24;12826:44;12857:12;12826:30;:44::i;:::-;12793:77;;;;12912:16;-1:-1:-1;;;;;12905:23:0;:3;-1:-1:-1;;;;;12905:23:0;;12883:130;;;;-1:-1:-1;;;12883:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13051:3;;13046:47;;;-1:-1:-1;;;13046:47:0;;-1:-1:-1;;;;;13046:47:0;;;13051:3;13046:47;;;;;-1:-1:-1;;;13051:3:0;;;;;;;13046:29;;:47;;;;;;;;;;;;;;;13051:3;13046:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13046:47:0;13024:151;;;;-1:-1:-1;;;13024:151:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12381:802;;;;;;;;;;;:::o;8598:346::-;;;;;;;;;;;:::o;7169:223::-;7325:58;;;;;;;;-1:-1:-1;;;;;;7325:58:0;;;;;;;;;;;;;;;;;;;;;;;;7169:223::o;3198:151::-;3337:4;3272:16;:62;3316:15;3299:33;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3299:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3289:44;;;;;;3272:62;;;;;;;;;;;;:69;;;;;;;;;;;;;;;;;;3198:151;:::o;6433:408::-;6642:10;6707:2;6693:16;;;;6642:10;;6433:408::o
Swarm Source
ipfs://e81c00e17ae5d4a7870b1b5d199fabbea10a06217f3c0b890d29af812cb54e8d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.