Source Code
Overview
S Balance
More Info
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Loading...
Loading
Contract Name:
SOMockSettlement
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: LGPL-3.0-or-later pragma solidity ^0.8.18; import './SOMockVaultRelayer.sol'; import '../../../external/cow/GPv2Order.sol'; contract SOMockSettlement { SOMockVaultRelayer public immutable vaultRelayer; mapping(bytes => uint256) public filledAmount; mapping(bytes => bool) public presignatures; bytes32 public immutable domainSeparator; bytes32 private constant DOMAIN_TYPE_HASH = keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'); bytes32 private constant DOMAIN_NAME = keccak256('Gnosis Protocol'); bytes32 private constant DOMAIN_VERSION = keccak256('v2'); constructor(address _vault) { vaultRelayer = SOMockVaultRelayer(_vault); domainSeparator = keccak256( abi.encode(DOMAIN_TYPE_HASH, DOMAIN_NAME, DOMAIN_VERSION, block.chainid, address(this)) ); } function setPreSignature(bytes memory orderUID, bool signed) external { presignatures[orderUID] = signed; } function fill( GPv2Order.Data calldata order, bytes memory orderUID, uint256 sellAmount, uint256 feeAmount, uint256 buyAmount ) public { require(presignatures[orderUID], 'not presigned'); filledAmount[orderUID] += sellAmount; vaultRelayer.transfer(order.sellToken, order.receiver, address(vaultRelayer), sellAmount + feeAmount); vaultRelayer.transfer(order.buyToken, address(vaultRelayer), order.receiver, buyAmount); } function invalidateOrder(bytes calldata orderUid) external { filledAmount[orderUid] = type(uint256).max; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: LGPL-3.0-or-later pragma solidity ^0.8.18; import "@openzeppelin/contracts-v4/token/ERC20/IERC20.sol"; /// @title Gnosis Protocol v2 Order Library /// @author Gnosis Developers library GPv2Order { /// @dev The complete data for a Gnosis Protocol order. This struct contains /// all order parameters that are signed for submitting to GP. struct Data { IERC20 sellToken; IERC20 buyToken; address receiver; uint256 sellAmount; uint256 buyAmount; uint32 validTo; bytes32 appData; uint256 feeAmount; bytes32 kind; bool partiallyFillable; bytes32 sellTokenBalance; bytes32 buyTokenBalance; } /// @dev The order EIP-712 type hash for the [`GPv2Order.Data`] struct. /// /// This value is pre-computed from the following expression: /// ``` /// keccak256( /// "Order(" + /// "address sellToken," + /// "address buyToken," + /// "address receiver," + /// "uint256 sellAmount," + /// "uint256 buyAmount," + /// "uint32 validTo," + /// "bytes32 appData," + /// "uint256 feeAmount," + /// "string kind," + /// "bool partiallyFillable" + /// "string sellTokenBalance" + /// "string buyTokenBalance" + /// ")" /// ) /// ``` bytes32 internal constant TYPE_HASH = hex"d5a25ba2e97094ad7d83dc28a6572da797d6b3e7fc6663bd93efb789fc17e489"; /// @dev The marker value for a sell order for computing the order struct /// hash. This allows the EIP-712 compatible wallets to display a /// descriptive string for the order kind (instead of 0 or 1). /// /// This value is pre-computed from the following expression: /// ``` /// keccak256("sell") /// ``` bytes32 internal constant KIND_SELL = hex"f3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee346775"; /// @dev The OrderKind marker value for a buy order for computing the order /// struct hash. /// /// This value is pre-computed from the following expression: /// ``` /// keccak256("buy") /// ``` bytes32 internal constant KIND_BUY = hex"6ed88e868af0a1983e3886d5f3e95a2fafbd6c3450bc229e27342283dc429ccc"; /// @dev The TokenBalance marker value for using direct ERC20 balances for /// computing the order struct hash. /// /// This value is pre-computed from the following expression: /// ``` /// keccak256("erc20") /// ``` bytes32 internal constant BALANCE_ERC20 = hex"5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc9"; /// @dev The TokenBalance marker value for using Balancer Vault external /// balances (in order to re-use Vault ERC20 approvals) for computing the /// order struct hash. /// /// This value is pre-computed from the following expression: /// ``` /// keccak256("external") /// ``` bytes32 internal constant BALANCE_EXTERNAL = hex"abee3b73373acd583a130924aad6dc38cfdc44ba0555ba94ce2ff63980ea0632"; /// @dev The TokenBalance marker value for using Balancer Vault internal /// balances for computing the order struct hash. /// /// This value is pre-computed from the following expression: /// ``` /// keccak256("internal") /// ``` bytes32 internal constant BALANCE_INTERNAL = hex"4ac99ace14ee0a5ef932dc609df0943ab7ac16b7583634612f8dc35a4289a6ce"; /// @dev Marker address used to indicate that the receiver of the trade /// proceeds should the owner of the order. /// /// This is chosen to be `address(0)` for gas efficiency as it is expected /// to be the most common case. address internal constant RECEIVER_SAME_AS_OWNER = address(0); /// @dev The byte length of an order unique identifier. uint256 internal constant UID_LENGTH = 56; /// @dev Returns the actual receiver for an order. This function checks /// whether or not the [`receiver`] field uses the marker value to indicate /// it is the same as the order owner. /// /// @return receiver The actual receiver of trade proceeds. function actualReceiver(Data memory order, address owner) internal pure returns (address receiver) { if (order.receiver == RECEIVER_SAME_AS_OWNER) { receiver = owner; } else { receiver = order.receiver; } } /// @dev Return the EIP-712 signing hash for the specified order. /// /// @param order The order to compute the EIP-712 signing hash for. /// @param domainSeparator The EIP-712 domain separator to use. /// @return orderDigest The 32 byte EIP-712 struct hash. function hash(Data memory order, bytes32 domainSeparator) internal pure returns (bytes32 orderDigest) { bytes32 structHash; // NOTE: Compute the EIP-712 order struct hash in place. As suggested // in the EIP proposal, noting that the order struct has 10 fields, and // including the type hash `(12 + 1) * 32 = 416` bytes to hash. // <https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md#rationale-for-encodedata> // solhint-disable-next-line no-inline-assembly assembly { let dataStart := sub(order, 32) let temp := mload(dataStart) mstore(dataStart, TYPE_HASH) structHash := keccak256(dataStart, 416) mstore(dataStart, temp) } // NOTE: Now that we have the struct hash, compute the EIP-712 signing // hash using scratch memory past the free memory pointer. The signing // hash is computed from `"\x19\x01" || domainSeparator || structHash`. // <https://docs.soliditylang.org/en/v0.7.6/internals/layout_in_memory.html#layout-in-memory> // <https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md#specification> // solhint-disable-next-line no-inline-assembly assembly { let freeMemoryPointer := mload(0x40) mstore(freeMemoryPointer, "\x19\x01") mstore(add(freeMemoryPointer, 2), domainSeparator) mstore(add(freeMemoryPointer, 34), structHash) orderDigest := keccak256(freeMemoryPointer, 66) } } /// @dev Packs order UID parameters into the specified memory location. The /// result is equivalent to `abi.encodePacked(...)` with the difference that /// it allows re-using the memory for packing the order UID. /// /// This function reverts if the order UID buffer is not the correct size. /// /// @param orderUid The buffer pack the order UID parameters into. /// @param orderDigest The EIP-712 struct digest derived from the order /// parameters. /// @param owner The address of the user who owns this order. /// @param validTo The epoch time at which the order will stop being valid. function packOrderUidParams( bytes memory orderUid, bytes32 orderDigest, address owner, uint32 validTo ) internal pure { require(orderUid.length == UID_LENGTH, "GPv2: uid buffer overflow"); // NOTE: Write the order UID to the allocated memory buffer. The order // parameters are written to memory in **reverse order** as memory // operations write 32-bytes at a time and we want to use a packed // encoding. This means, for example, that after writing the value of // `owner` to bytes `20:52`, writing the `orderDigest` to bytes `0:32` // will **overwrite** bytes `20:32`. This is desirable as addresses are // only 20 bytes and `20:32` should be `0`s: // // | 1111111111222222222233333333334444444444555555 // byte | 01234567890123456789012345678901234567890123456789012345 // -------+--------------------------------------------------------- // field | [.........orderDigest..........][......owner.......][vT] // -------+--------------------------------------------------------- // mstore | [000000000000000000000000000.vT] // | [00000000000.......owner.......] // | [.........orderDigest..........] // // Additionally, since Solidity `bytes memory` are length prefixed, // 32 needs to be added to all the offsets. // // solhint-disable-next-line no-inline-assembly assembly { mstore(add(orderUid, 56), validTo) mstore(add(orderUid, 52), owner) mstore(add(orderUid, 32), orderDigest) } } /// @dev Extracts specific order information from the standardized unique /// order id of the protocol. /// /// @param orderUid The unique identifier used to represent an order in /// the protocol. This uid is the packed concatenation of the order digest, /// the validTo order parameter and the address of the user who created the /// order. It is used by the user to interface with the contract directly, /// and not by calls that are triggered by the solvers. /// @return orderDigest The EIP-712 signing digest derived from the order /// parameters. /// @return owner The address of the user who owns this order. /// @return validTo The epoch time at which the order will stop being valid. function extractOrderUidParams(bytes calldata orderUid) internal pure returns ( bytes32 orderDigest, address owner, uint32 validTo ) { require(orderUid.length == UID_LENGTH, "GPv2: invalid uid"); // Use assembly to efficiently decode packed calldata. // solhint-disable-next-line no-inline-assembly assembly { orderDigest := calldataload(orderUid.offset) owner := shr(96, calldataload(add(orderUid.offset, 32))) validTo := shr(224, calldataload(add(orderUid.offset, 52))) } } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.18; import '@openzeppelin/contracts-v4/token/ERC20/IERC20.sol'; contract SOMockVaultRelayer { constructor() {} function transfer( IERC20 token, address from, address to, uint256 amount ) external { if (from == address(this)) { token.transfer(to, amount); } else { token.transferFrom(from, to, amount); } } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"contract IERC20","name":"sellToken","type":"address"},{"internalType":"contract IERC20","name":"buyToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"sellAmount","type":"uint256"},{"internalType":"uint256","name":"buyAmount","type":"uint256"},{"internalType":"uint32","name":"validTo","type":"uint32"},{"internalType":"bytes32","name":"appData","type":"bytes32"},{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"internalType":"bytes32","name":"kind","type":"bytes32"},{"internalType":"bool","name":"partiallyFillable","type":"bool"},{"internalType":"bytes32","name":"sellTokenBalance","type":"bytes32"},{"internalType":"bytes32","name":"buyTokenBalance","type":"bytes32"}],"internalType":"struct GPv2Order.Data","name":"order","type":"tuple"},{"internalType":"bytes","name":"orderUID","type":"bytes"},{"internalType":"uint256","name":"sellAmount","type":"uint256"},{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"internalType":"uint256","name":"buyAmount","type":"uint256"}],"name":"fill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"filledAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"orderUid","type":"bytes"}],"name":"invalidateOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"presignatures","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"orderUID","type":"bytes"},{"internalType":"bool","name":"signed","type":"bool"}],"name":"setPreSignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaultRelayer","outputs":[{"internalType":"contract SOMockVaultRelayer","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c060405234801561001057600080fd5b506040516108b23803806108b283398101604081905261002f916100e8565b6001600160a01b0381166080908152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f6c85c0337eba1661327f94f3bf46c8a7f9311a563f4d5c948362567f5d8ed60c918101919091527ff9446b8e937d86f0bc87cac73923491692b123ca5f8761908494703758206adf606082015246918101919091523060a082015260c00160408051601f19818403018152919052805160209091012060a05250610118565b6000602082840312156100fa57600080fd5b81516001600160a01b038116811461011157600080fd5b9392505050565b60805160a05161075a610158600039600061017d01526000818160ed01528181610268015281816102ac0152818161034d0152610388015261075a6000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c80639b552cc21161005b5780639b552cc2146100e8578063d3a0975514610127578063ec6cb13f14610165578063f698da251461017857600080fd5b806315337bc0146100825780632479fb6e146100975780635b75a25b146100d5575b600080fd5b610095610090366004610463565b61019f565b005b6100c26100a5366004610578565b805160208183018101805160008252928201919093012091525481565b6040519081526020015b60405180910390f35b6100956100e33660046105b5565b6101c8565b61010f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100cc565b610155610135366004610578565b805160208183018101805160018252928201919093012091525460ff1681565b60405190151581526020016100cc565b61009561017336600461062b565b61042e565b6100c27f000000000000000000000000000000000000000000000000000000000000000081565b600019600083836040516101b4929190610682565b908152604051908190036020019020555050565b6001846040516101d89190610692565b9081526040519081900360200190205460ff1661022b5760405162461bcd60e51b815260206004820152600d60248201526c1b9bdd081c1c995cda59db9959609a1b604482015260640160405180910390fd5b8260008560405161023c9190610692565b9081526020016040518091039020600082825461025991906106c1565b90915550506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663f18d03cc61029a6020880188610700565b6102aa6060890160408a01610700565b7f00000000000000000000000000000000000000000000000000000000000000006102d587896106c1565b6040516001600160e01b031960e087901b1681526001600160a01b0394851660048201529284166024840152921660448201526064810191909152608401600060405180830381600087803b15801561032d57600080fd5b505af1158015610341573d6000803e3d6000fd5b50506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915063f18d03cc90506103866040880160208901610700565b7f00000000000000000000000000000000000000000000000000000000000000006103b760608a0160408b01610700565b60405160e085901b6001600160e01b03191681526001600160a01b0393841660048201529183166024830152909116604482015260648101849052608401600060405180830381600087803b15801561040f57600080fd5b505af1158015610423573d6000803e3d6000fd5b505050505050505050565b8060018360405161043f9190610692565b908152604051908190036020019020805491151560ff199092169190911790555050565b6000806020838503121561047657600080fd5b823567ffffffffffffffff8082111561048e57600080fd5b818501915085601f8301126104a257600080fd5b8135818111156104b157600080fd5b8660208285010111156104c357600080fd5b60209290920196919550909350505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126104fc57600080fd5b813567ffffffffffffffff80821115610517576105176104d5565b604051601f8301601f19908116603f0116810190828211818310171561053f5761053f6104d5565b8160405283815286602085880101111561055857600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561058a57600080fd5b813567ffffffffffffffff8111156105a157600080fd5b6105ad848285016104eb565b949350505050565b60008060008060008587036102008112156105cf57600080fd5b610180808212156105df57600080fd5b879650860135905067ffffffffffffffff8111156105fc57600080fd5b610608888289016104eb565b95989597505050506101a0840135936101c0810135936101e09091013592509050565b6000806040838503121561063e57600080fd5b823567ffffffffffffffff81111561065557600080fd5b610661858286016104eb565b9250506020830135801515811461067757600080fd5b809150509250929050565b8183823760009101908152919050565b6000825160005b818110156106b35760208186018101518583015201610699565b506000920191825250919050565b808201808211156106e257634e487b7160e01b600052601160045260246000fd5b92915050565b6001600160a01b03811681146106fd57600080fd5b50565b60006020828403121561071257600080fd5b813561071d816106e8565b939250505056fea26469706673582212201362c3791f6038efba201c9a9df56c5fcb4ac969323dd7c2ed2da9a7c33fddae64736f6c634300081200330000000000000000000000005cc47a8e956dc84553f2aa2009bc739888384324
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061007d5760003560e01c80639b552cc21161005b5780639b552cc2146100e8578063d3a0975514610127578063ec6cb13f14610165578063f698da251461017857600080fd5b806315337bc0146100825780632479fb6e146100975780635b75a25b146100d5575b600080fd5b610095610090366004610463565b61019f565b005b6100c26100a5366004610578565b805160208183018101805160008252928201919093012091525481565b6040519081526020015b60405180910390f35b6100956100e33660046105b5565b6101c8565b61010f7f0000000000000000000000005cc47a8e956dc84553f2aa2009bc73988838432481565b6040516001600160a01b0390911681526020016100cc565b610155610135366004610578565b805160208183018101805160018252928201919093012091525460ff1681565b60405190151581526020016100cc565b61009561017336600461062b565b61042e565b6100c27fbb9c759ab92a3c0d4798b9afd837356afac2890e746cc880ba22554e62f6f95181565b600019600083836040516101b4929190610682565b908152604051908190036020019020555050565b6001846040516101d89190610692565b9081526040519081900360200190205460ff1661022b5760405162461bcd60e51b815260206004820152600d60248201526c1b9bdd081c1c995cda59db9959609a1b604482015260640160405180910390fd5b8260008560405161023c9190610692565b9081526020016040518091039020600082825461025991906106c1565b90915550506001600160a01b037f0000000000000000000000005cc47a8e956dc84553f2aa2009bc7398883843241663f18d03cc61029a6020880188610700565b6102aa6060890160408a01610700565b7f0000000000000000000000005cc47a8e956dc84553f2aa2009bc7398883843246102d587896106c1565b6040516001600160e01b031960e087901b1681526001600160a01b0394851660048201529284166024840152921660448201526064810191909152608401600060405180830381600087803b15801561032d57600080fd5b505af1158015610341573d6000803e3d6000fd5b50506001600160a01b037f0000000000000000000000005cc47a8e956dc84553f2aa2009bc73988838432416915063f18d03cc90506103866040880160208901610700565b7f0000000000000000000000005cc47a8e956dc84553f2aa2009bc7398883843246103b760608a0160408b01610700565b60405160e085901b6001600160e01b03191681526001600160a01b0393841660048201529183166024830152909116604482015260648101849052608401600060405180830381600087803b15801561040f57600080fd5b505af1158015610423573d6000803e3d6000fd5b505050505050505050565b8060018360405161043f9190610692565b908152604051908190036020019020805491151560ff199092169190911790555050565b6000806020838503121561047657600080fd5b823567ffffffffffffffff8082111561048e57600080fd5b818501915085601f8301126104a257600080fd5b8135818111156104b157600080fd5b8660208285010111156104c357600080fd5b60209290920196919550909350505050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126104fc57600080fd5b813567ffffffffffffffff80821115610517576105176104d5565b604051601f8301601f19908116603f0116810190828211818310171561053f5761053f6104d5565b8160405283815286602085880101111561055857600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006020828403121561058a57600080fd5b813567ffffffffffffffff8111156105a157600080fd5b6105ad848285016104eb565b949350505050565b60008060008060008587036102008112156105cf57600080fd5b610180808212156105df57600080fd5b879650860135905067ffffffffffffffff8111156105fc57600080fd5b610608888289016104eb565b95989597505050506101a0840135936101c0810135936101e09091013592509050565b6000806040838503121561063e57600080fd5b823567ffffffffffffffff81111561065557600080fd5b610661858286016104eb565b9250506020830135801515811461067757600080fd5b809150509250929050565b8183823760009101908152919050565b6000825160005b818110156106b35760208186018101518583015201610699565b506000920191825250919050565b808201808211156106e257634e487b7160e01b600052601160045260246000fd5b92915050565b6001600160a01b03811681146106fd57600080fd5b50565b60006020828403121561071257600080fd5b813561071d816106e8565b939250505056fea26469706673582212201362c3791f6038efba201c9a9df56c5fcb4ac969323dd7c2ed2da9a7c33fddae64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005cc47a8e956dc84553f2aa2009bc739888384324
-----Decoded View---------------
Arg [0] : _vault (address): 0x5Cc47a8E956dc84553F2aA2009Bc739888384324
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005cc47a8e956dc84553f2aa2009bc739888384324
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.