More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x3f980034...4120FDBbD The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
CowSwapBurner
Compiler Version
vyper:0.3.10
Contract Source Code (Vyper language format)
# @version 0.3.10 """ @title CowSwapBurner @license MIT @author Curve Finance @notice Exchange tokens using CowSwap """ interface ERC20: def approve(_to: address, _value: uint256): nonpayable def transfer(_to: address, _value: uint256) -> bool: nonpayable def transferFrom(_from: address, _to: address, _value: uint256) -> bool: nonpayable def balanceOf(_owner: address) -> uint256: view ETH_ADDRESS: constant(address) = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE struct Transfer: coin: ERC20 to: address amount: uint256 # 2^256-1 for the whole balance enum Epoch: SLEEP # 1 COLLECT # 2 EXCHANGE # 4 FORWARD # 8 interface FeeCollector: def fee(_epoch: Epoch=empty(Epoch), _ts: uint256=block.timestamp) -> uint256: view def target() -> ERC20: view def owner() -> address: view def emergency_owner() -> address: view def epoch_time_frame(epoch: Epoch, ts: uint256=block.timestamp) -> (uint256, uint256): view def can_exchange(_coins: DynArray[ERC20, MAX_COINS_LEN]) -> bool: view def transfer(_transfers: DynArray[Transfer, MAX_COINS_LEN]): nonpayable MAX_COINS_LEN: constant(uint256) = 64 ONE: constant(uint256) = 10 ** 18 # Precision fee_collector: public(immutable(FeeCollector)) struct GPv2Order_Data: sellToken: ERC20 # token to sell buyToken: ERC20 # token to buy receiver: address # receiver of the token to buy sellAmount: uint256 buyAmount: uint256 validTo: uint32 # timestamp until order is valid appData: bytes32 # extra info about the order feeAmount: uint256 # amount of fees in sellToken kind: bytes32 # buy or sell partiallyFillable: bool # partially fillable (True) or fill-or-kill (False) sellTokenBalance: bytes32 # From where the sellToken balance is withdrawn buyTokenBalance: bytes32 # Where the buyToken is deposited struct ConditionalOrderParams: # The contract implementing the conditional order logic handler: address # self # Allows for multiple conditional orders of the same type and data salt: bytes32 # Not used for now # Data available to ALL discrete orders created by the conditional order staticData: Bytes[STATIC_DATA_LEN] # Using coin address struct PayloadStruct: proof: DynArray[bytes32, 32] params: ConditionalOrderParams offchainInput: Bytes[OFFCHAIN_DATA_LEN] interface ComposableCow: def create(params: ConditionalOrderParams, dispatch: bool): nonpayable def domainSeparator() -> bytes32: view def isValidSafeSignature( safe: address, sender: address, _hash: bytes32, _domainSeparator: bytes32, typeHash: bytes32, encodeData: Bytes[15 * 32], payload: Bytes[(32 + 3 + 1 + 8) * 32], ) -> bytes4: view STATIC_DATA_LEN: constant(uint256) = 20 OFFCHAIN_DATA_LEN: constant(uint256) = 1 vault_relayer: public(immutable(address)) composable_cow: public(immutable(ComposableCow)) ADD_DATA: public(constant(bytes32)) = 0x058315b749613051abcbf50cf2d605b4fa4a41554ec35d73fd058fc530da559f SELL_KIND: constant(bytes32) = keccak256("sell") # Surpluss in target coin TOKEN_BALANCE: constant(bytes32) = keccak256("erc20") # SignatureVerifierMuxer at # https://github.com/rndlabs/safe-contracts/blob/11273c1f08eda18ed8ff49ec1d4abec5e451ff21/contracts/handler/extensible/SignatureVerifierMuxer.sol: # method_id("domainVerifiers(address,bytes32)") == "0x51cad5ee" # method_id("setDomainVerifier(bytes32,address)") == "0x3365582c" SIGNATURE_VERIFIER_MUXER_INTERFACE: constant(bytes4) = 0x62af8dc2 ERC1271_MAGIC_VALUE: constant(bytes4) = 0x1626ba7e SUPPORTED_INTERFACES: constant(bytes4[4]) = [ # ERC165: method_id("supportsInterface(bytes4)") == 0x01ffc9a7 0x01ffc9a7, # Burner: # method_id("burn(address[],address)") == 0x72a436a8 # method_id("push_target()") == 0x2eb078cd # method_id("VERSION()") == 0xffa1ad74 0xa3b5e311, # Interface corresponding to IConditionalOrderGenerator: # method_id("getTradeableOrder(address,address,bytes32,bytes,bytes)") == 0xb8296fc4 0xb8296fc4, # ERC1271 interface: # method_id("isValidSignature(bytes32,bytes)") == 0x1626ba7e ERC1271_MAGIC_VALUE, ] VERSION: public(constant(String[20])) = "CowSwap" created: public(HashMap[ERC20, bool]) target_threshold: public(uint256) # min amount to exchange @external def __init__(_fee_collector: FeeCollector, _composable_cow: ComposableCow, _vault_relayer: address, _target_threshold: uint256): """ @notice Contract constructor @param _fee_collector FeeCollector to anchor to @param _composable_cow Address of ComposableCow contract @param _vault_relayer CowSwap's VaultRelayer contract address, all approves go there @param _target_threshold Minimum amount of target to buy per order """ fee_collector = _fee_collector vault_relayer = _vault_relayer composable_cow = _composable_cow assert _target_threshold > 0, "Bad target threshold" self.target_threshold = _target_threshold @external def burn(_coins: DynArray[ERC20, MAX_COINS_LEN], _receiver: address): """ @notice Post hook after collect to register coins for burn @dev Registers new orders in ComposableCow @param _coins Which coins to burn @param _receiver Receiver of profit """ assert msg.sender == fee_collector.address, "Only FeeCollector" fee: uint256 = fee_collector.fee(Epoch.COLLECT) fee_payouts: DynArray[Transfer, MAX_COINS_LEN] = [] self_transfers: DynArray[Transfer, MAX_COINS_LEN] = [] for coin in _coins: if not self.created[coin]: composable_cow.create(ConditionalOrderParams({ handler: self, salt: empty(bytes32), staticData: concat(b"", convert(coin.address, bytes20)), }), True) coin.approve(vault_relayer, max_value(uint256)) self.created[coin] = True amount: uint256 = coin.balanceOf(fee_collector.address) * fee / ONE fee_payouts.append(Transfer({coin: coin, to: _receiver, amount: amount})) self_transfers.append(Transfer({coin: coin, to: self, amount: max_value(uint256)})) fee_collector.transfer(fee_payouts) fee_collector.transfer(self_transfers) @view @internal def _get_order(sell_token: ERC20) -> GPv2Order_Data: buy_token: ERC20 = fee_collector.target() return GPv2Order_Data({ sellToken: sell_token, # token to sell buyToken: buy_token, # token to buy receiver: fee_collector.address, # receiver of the token to buy sellAmount: 0, # Set later buyAmount: self.target_threshold, validTo: convert(fee_collector.epoch_time_frame(Epoch.EXCHANGE)[1], uint32), # timestamp until order is valid appData: ADD_DATA, # extra info about the order feeAmount: 0, # amount of fees in sellToken kind: SELL_KIND, # buy or sell partiallyFillable: True, # partially fillable (True) or fill-or-kill (False) sellTokenBalance: TOKEN_BALANCE, # From where the sellToken balance is withdrawn buyTokenBalance: TOKEN_BALANCE, # Where the buyToken is deposited }) @view @external def get_current_order(sell_token: address=empty(address)) -> GPv2Order_Data: """ @notice Get current order parameters @param sell_token Address of possible sell token @return Order parameters """ return self._get_order(ERC20(sell_token)) @view @external def getTradeableOrder(_owner: address, _sender: address, _ctx: bytes32, _static_input: Bytes[STATIC_DATA_LEN], _offchain_input: Bytes[OFFCHAIN_DATA_LEN]) -> GPv2Order_Data: """ @notice Generate order for WatchTower @dev _owner, _sender, _ctx, _offchain_input are ignored @param _owner Owner of order (self) @param _sender `msg.sender` context calling `isValidSignature` @param _ctx Execution context @param _static_input sellToken encoded as bytes(Bytes[20]) @param _offchain_input Not used, zero-length bytes @return Order parameters """ sell_token: ERC20 = ERC20(convert(convert(_static_input, bytes20), address)) order: GPv2Order_Data = self._get_order(sell_token) order.sellAmount = sell_token.balanceOf(self) if order.sellAmount == 0 or not fee_collector.can_exchange([sell_token]): start: uint256 = 0 end: uint256 = 0 start, end = fee_collector.epoch_time_frame(Epoch.EXCHANGE) if block.timestamp >= start: start, end = fee_collector.epoch_time_frame(Epoch.EXCHANGE, block.timestamp + 7 * 24 * 3600) reason: String[11] = "ZeroBalance" if order.sellAmount != 0: # FeeCollector reject reason = "NotAllowed" raw_revert(_abi_encode(start, reason, method_id=method_id("PollTryAtEpoch(uint256,string)"))) return order @view @external def verify( _owner: address, _sender: address, _hash: bytes32, _domain_separator: bytes32, _ctx: bytes32, _static_input: Bytes[STATIC_DATA_LEN], _offchain_input: Bytes[OFFCHAIN_DATA_LEN], _order: GPv2Order_Data, ): """ @notice Verify order @dev Called from ComposableCow. _owner, _sender, _hash, _domain_separator, _ctx are ignored. @param _owner Owner of conditional order (self) @param _sender `msg.sender` context calling `isValidSignature` @param _hash `EIP-712` order digest @param _domain_separator `EIP-712` domain separator @param _ctx Execution context @param _static_input ConditionalOrder's staticData (coin address) @param _offchain_input Conditional order type-specific data NOT known at time of creation for a specific discrete order (or zero-length bytes if not applicable) @param _order The proposed discrete order's `GPv2Order.Data` struct """ sell_token: ERC20 = ERC20(convert(convert(_static_input, bytes20), address)) if not fee_collector.can_exchange([sell_token]): raw_revert(_abi_encode("NotAllowed", method_id=method_id("OrderNotValid(string)"))) if _offchain_input != b"": raw_revert(_abi_encode("NonZeroOffchainInput", method_id=method_id("OrderNotValid(string)"))) order: GPv2Order_Data = self._get_order(sell_token) order.sellAmount = _order.sellAmount # Any amount allowed order.buyAmount = max(_order.buyAmount, order.buyAmount) # Price is discovered within CowSwap competition if _abi_encode(order) != _abi_encode(_order): raw_revert(_abi_encode("BadOrder", method_id=method_id("OrderNotValid(string)"))) @view @external def isValidSignature(_hash: bytes32, signature: Bytes[1792]) -> bytes4: """ @notice ERC1271 signature verifier method @dev Forwards query to ComposableCow @param _hash Hash of signed object. Ignored here @param signature Signature for the object. (GPv2Order.Data, PayloadStruct) here @return `ERC1271_MAGIC_VALUE` if signature is OK """ order: GPv2Order_Data = empty(GPv2Order_Data) payload: PayloadStruct = empty(PayloadStruct) order, payload = _abi_decode(signature, (GPv2Order_Data, PayloadStruct)) return composable_cow.isValidSafeSignature(self, msg.sender, _hash, composable_cow.domainSeparator(), empty(bytes32), _abi_encode(order), _abi_encode(payload), ) @external def push_target() -> uint256: """ @notice In case target coin is left in contract can be pushed to forward @return Amount of coin pushed further """ target: ERC20 = fee_collector.target() amount: uint256 = target.balanceOf(self) if amount > 0: target.transfer(fee_collector.address, amount) return amount @pure @external def supportsInterface(_interface_id: bytes4) -> bool: """ @dev Interface identification is specified in ERC-165. Fails on SignatureVerifierMuxer for compatability with ComposableCow. @param _interface_id Id of the interface @return True if contract supports given interface """ assert _interface_id != SIGNATURE_VERIFIER_MUXER_INTERFACE return _interface_id in SUPPORTED_INTERFACES @external def set_target_threshold(_target_threshold: uint256): """ @dev Callable only by owner @param _target_threshold Minimum amount of target to receive, with base=10**18 """ assert msg.sender == fee_collector.owner(), "Only owner" assert _target_threshold > 0, "Bad target threshold" self.target_threshold = _target_threshold @external def recover(_coins: DynArray[ERC20, MAX_COINS_LEN]): """ @notice Recover ERC20 tokens or Ether from this contract @dev Callable only by owner and emergency owner @param _coins Token addresses """ assert msg.sender in [fee_collector.owner(), fee_collector.emergency_owner()], "Only owner" for coin in _coins: if coin.address == ETH_ADDRESS: raw_call(fee_collector.address, b"", value=self.balance) else: coin.transfer(fee_collector.address, coin.balanceOf(self)) # do not need safe transfer
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_fee_collector","type":"address"},{"name":"_composable_cow","type":"address"},{"name":"_vault_relayer","type":"address"},{"name":"_target_threshold","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"burn","inputs":[{"name":"_coins","type":"address[]"},{"name":"_receiver","type":"address"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"get_current_order","inputs":[],"outputs":[{"name":"","type":"tuple","components":[{"name":"sellToken","type":"address"},{"name":"buyToken","type":"address"},{"name":"receiver","type":"address"},{"name":"sellAmount","type":"uint256"},{"name":"buyAmount","type":"uint256"},{"name":"validTo","type":"uint32"},{"name":"appData","type":"bytes32"},{"name":"feeAmount","type":"uint256"},{"name":"kind","type":"bytes32"},{"name":"partiallyFillable","type":"bool"},{"name":"sellTokenBalance","type":"bytes32"},{"name":"buyTokenBalance","type":"bytes32"}]}]},{"stateMutability":"view","type":"function","name":"get_current_order","inputs":[{"name":"sell_token","type":"address"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"sellToken","type":"address"},{"name":"buyToken","type":"address"},{"name":"receiver","type":"address"},{"name":"sellAmount","type":"uint256"},{"name":"buyAmount","type":"uint256"},{"name":"validTo","type":"uint32"},{"name":"appData","type":"bytes32"},{"name":"feeAmount","type":"uint256"},{"name":"kind","type":"bytes32"},{"name":"partiallyFillable","type":"bool"},{"name":"sellTokenBalance","type":"bytes32"},{"name":"buyTokenBalance","type":"bytes32"}]}]},{"stateMutability":"view","type":"function","name":"getTradeableOrder","inputs":[{"name":"_owner","type":"address"},{"name":"_sender","type":"address"},{"name":"_ctx","type":"bytes32"},{"name":"_static_input","type":"bytes"},{"name":"_offchain_input","type":"bytes"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"sellToken","type":"address"},{"name":"buyToken","type":"address"},{"name":"receiver","type":"address"},{"name":"sellAmount","type":"uint256"},{"name":"buyAmount","type":"uint256"},{"name":"validTo","type":"uint32"},{"name":"appData","type":"bytes32"},{"name":"feeAmount","type":"uint256"},{"name":"kind","type":"bytes32"},{"name":"partiallyFillable","type":"bool"},{"name":"sellTokenBalance","type":"bytes32"},{"name":"buyTokenBalance","type":"bytes32"}]}]},{"stateMutability":"view","type":"function","name":"verify","inputs":[{"name":"_owner","type":"address"},{"name":"_sender","type":"address"},{"name":"_hash","type":"bytes32"},{"name":"_domain_separator","type":"bytes32"},{"name":"_ctx","type":"bytes32"},{"name":"_static_input","type":"bytes"},{"name":"_offchain_input","type":"bytes"},{"name":"_order","type":"tuple","components":[{"name":"sellToken","type":"address"},{"name":"buyToken","type":"address"},{"name":"receiver","type":"address"},{"name":"sellAmount","type":"uint256"},{"name":"buyAmount","type":"uint256"},{"name":"validTo","type":"uint32"},{"name":"appData","type":"bytes32"},{"name":"feeAmount","type":"uint256"},{"name":"kind","type":"bytes32"},{"name":"partiallyFillable","type":"bool"},{"name":"sellTokenBalance","type":"bytes32"},{"name":"buyTokenBalance","type":"bytes32"}]}],"outputs":[]},{"stateMutability":"view","type":"function","name":"isValidSignature","inputs":[{"name":"_hash","type":"bytes32"},{"name":"signature","type":"bytes"}],"outputs":[{"name":"","type":"bytes4"}]},{"stateMutability":"nonpayable","type":"function","name":"push_target","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"pure","type":"function","name":"supportsInterface","inputs":[{"name":"_interface_id","type":"bytes4"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"nonpayable","type":"function","name":"set_target_threshold","inputs":[{"name":"_target_threshold","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"recover","inputs":[{"name":"_coins","type":"address[]"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"fee_collector","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"vault_relayer","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"composable_cow","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"ADD_DATA","inputs":[],"outputs":[{"name":"","type":"bytes32"}]},{"stateMutability":"view","type":"function","name":"VERSION","inputs":[],"outputs":[{"name":"","type":"string"}]},{"stateMutability":"view","type":"function","name":"created","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"view","type":"function","name":"target_threshold","inputs":[],"outputs":[{"name":"","type":"uint256"}]}]
Deployed Bytecode
0x5f3560e01c60026014820660011b61190101601e395f51565b63f5e8fa23811861003657346118fd57602061192960403960206040f35b63d42efd838118611795576024361034176118fd576004358060a01c6118fd576040525f6040516020525f5260405f205460605260206060f3611795565b6334dd4ee8811861009257346118fd57602061194960403960206040f35b63ceb4c2f88118611795576024361034176118fd5760206119295f395f51638da5cb5b604052602060406004605c845afa6100cf573d5f5f3e3d5ffd5b60203d106118fd576040518060a01c6118fd57608052608090505133181561014d57600a60a0527f4f6e6c79206f776e65720000000000000000000000000000000000000000000060c05260a05060a0518060c001601f825f031636823750506308c379a06060526020608052601f19601f60a0510116604401607cfd5b6004356101af5760146040527f42616420746172676574207468726573686f6c6400000000000000000000000060605260405060405180606001601f825f031636823750506308c379a05f526020602052601f19601f6040510116604401601cfd5b60043560015500611795565b6311742cea81186101d957346118fd57602061196960403960206040f35b633df5e0ce811861179557346118fd575f60e052610a4d56611795565b6348507e61811861179557346118fd577f058315b749613051abcbf50cf2d605b4fa4a41554ec35d73fd058fc530da559f60405260206040f3611795565b63ffa1ad7481186102b257346118fd5760208060805260076040527f436f77537761700000000000000000000000000000000000000000000000000060605260408160800181518152602082015160208201528051806020830101601f825f03163682375050601f19601f8251602001011690509050810190506080f35b6372a436a88118611795576064361034176118fd5760043560040160408135116118fd5780355f81604081116118fd57801561030f57905b8060051b6020850101358060a01c6118fd578160051b606001526001018181186102ea575b50508060405250506024358060a01c6118fd576108605260206119295f395f5133181561039b576011610880527f4f6e6c7920466565436f6c6c6563746f720000000000000000000000000000006108a0526108805061088051806108a001601f825f031636823750506308c379a061084052602061086052601f19601f61088051011660440161085cfd5b60206119295f395f516339b37ab06108a05260026108c05260206108a060246108bc845afa6103cc573d5f5f3e3d5ffd5b60203d106118fd576108a0905051610880525f6108a0525f6120c0525f604051604081116118fd57801561063657905b8060051b606001516138e0525f6138e0516020525f5260405f205461053f5760206119695f395f51636bfae1ca6139605260408061398052806139800160603082525f60208301528060408301525f6138e0518060601b90508161394001526014810190508061392052613920905081830181518152602082015160208201528051806020830101601f825f03163682375050601f19601f82516020010116905090508101905090508101905060016139a05250803b156118fd575f61396060e461397c5f855af16104d0573d5f5f3e3d5ffd5b506138e05163095ea7b3613900526020611949613920397fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61394052803b156118fd575f613900604461391c5f855af161052c573d5f5f3e3d5ffd5b5060015f6138e0516020525f5260405f20555b6138e0516370a08231613920526020611929613940396020613920602461393c845afa61056e573d5f5f3e3d5ffd5b60203d106118fd57613920905051610880518082028115838383041417156118fd5790509050670de0b6b3a764000081049050613900526108a051603f81116118fd57606081026108c0016138e051815261086051602082015261390051604082015250600181016108a052506120c051603f81116118fd57606081026120e0016138e05181523060208201527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604082015250600181016120c052506001018181186103fc575b505060206119295f395f51630e67c6bc6138e0526020806139005280613900015f6108a051808352606081025f82604081116118fd5780156106aa57905b606081026020870101606082026108c0018051825260208101516020830152604081015160408301525050600101818118610674575b50508201602001915050905081015050803b156118fd575f6138e06118446138fc5f855af16106db573d5f5f3e3d5ffd5b5060206119295f395f51630e67c6bc6138e0526020806139005280613900015f6120c051808352606081025f82604081116118fd57801561074e57905b606081026020870101606082026120e0018051825260208101516020830152604081015160408301525050600101818118610718575b50508201602001915050905081015050803b156118fd575f6138e06118446138fc5f855af161077f573d5f5f3e3d5ffd5b5000611795565b63bd39679681186107a257346118fd5760015460405260206040f35b6318ab6efe8118611795576044361034176118fd5760043560040160408135116118fd5780355f81604081116118fd5780156107ff57905b8060051b6020850101358060a01c6118fd578160051b606001526001018181186107da575b50508060405250503360206119295f395f51638da5cb5b610920526020610920600461093c845afa610833573d5f5f3e3d5ffd5b60203d106118fd57610920518060a01c6118fd5761096052610960905051811861085e5760016108ab565b60206119295f395f516363a4042a610980526020610980600461099c845afa610889573d5f5f3e3d5ffd5b60203d106118fd57610980518060a01c6118fd576109c0526109c09050518118155b905061091657600a610a00527f4f6e6c79206f776e657200000000000000000000000000000000000000000000610a2052610a0050610a005180610a2001601f825f031636823750506308c379a06109c05260206109e052601f19601f610a005101166044016109dcfd5b5f604051604081116118fd578015610a2157905b8060051b606001516108605273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610860511861098b5760206119295f395f51475a5f61088052610880505f5f610880516108a0858786f1905090509050610a16573d5f5f3e3d5ffd610a16565b6108605163a9059cbb6108c05260206119296108e039610860516370a0823161088052306108a0526020610880602461089c845afa6109cc573d5f5f3e3d5ffd5b60203d106118fd576108809050516109005260206108c060446108dc5f855af16109f8573d5f5f3e3d5ffd5b60203d106118fd576108c0518060011c6118fd576109205261092050505b60010181811861092a575b505000611795565b630d3ecec48118610a66576024361034176118fd576004358060a01c6118fd5760e0525b61018060e051604052610a61610100611799565b610100f35b63b8296fc481186117955760e4361034176118fd576004358060a01c6118fd5760e0526024358060a01c6118fd576101005260643560040160148135116118fd576020813501808261012037505060843560040160018135116118fd57602081350180826101603750506101205160200360031b61014051811c811b90508060601c90506101a0526101a051604052610b00610340611799565b6103406101806101c06101808360045afa50506101a0516370a082316103405230610360526020610340602461035c845afa610b3e573d5f5f3e3d5ffd5b60203d106118fd576103409050516102205261022051610b5f576001610c14565b60206119295f395f5163dc7168e9610340526020806103605280610360015f6101a051610bc0526001610ba0525f610ba0518084528060051b5f82604081116118fd578015610bc857905b8060051b610bc001518160051b602089010152600101818118610baa575b505082016020019150509050905081015050602061034061084461035c845afa610bf4573d5f5f3e3d5ffd5b60203d106118fd57610340518060011c6118fd576113c0526113c0905051155b15610dc4576040366113e03760206119295f395f5163dffe059c611420526004611440526040611420602461143c845afa610c51573d5f5f3e3d5ffd5b60403d106118fd57611420905080516113e052602081015161140052506113e0514210610cdb5760206119295f395f5163b676f748611420526004611440524262093a8081018181106118fd579050611460526040611420604461143c845afa610cbd573d5f5f3e3d5ffd5b60403d106118fd57611420905080516113e052602081015161140052505b600b611460527f5a65726f42616c616e636500000000000000000000000000000000000000000061148052611460805161142052602081015161144052506102205115610d6157600a611460527f4e6f74416c6c6f7765640000000000000000000000000000000000000000000061148052611460805161142052602081015161144052505b637e33463761146452600460406113e05161148452806114a45280611484016114205181526114405160208201528051806020830101601f825f03163682375050601f19601f825160200101169050810190500161146052611460805160208201fd5b6101806101c0f3611795565b6314a2a7848118611795576102a4361034176118fd576004358060a01c6118fd5760e0526024358060a01c6118fd576101005260a43560040160148135116118fd576020813501808261012037505060c43560040160018135116118fd576020813501808261016037505060e4358060a01c6118fd576101a052610104358060a01c6118fd576101c052610124358060a01c6118fd576101e052604061014461020037610184358060201c6118fd57610240526101a4356102605260406101c461028037610204358060011c6118fd576102c05260406102246102e0376101205160200360031b61014051811c811b90508060601c90506103205260206119295f395f5163dc7168e9610340526020806103605280610360015f61032051610bc0526001610ba0525f610ba0518084528060051b5f82604081116118fd578015610f3457905b8060051b610bc001518160051b602089010152600101818118610f16575b505082016020019150509050905081015050602061034061084461035c845afa610f60573d5f5f3e3d5ffd5b60203d106118fd57610340518060011c6118fd576113c0526113c090505161100c5763c8fc272561142452600460208061144452600a6113e0527f4e6f74416c6c6f77656400000000000000000000000000000000000000000000611400526113e0816114440181518152602082015160208201528051806020830101601f825f03163682375050601f19601f8251602001011690509050810190500161142052611420805160208201fd5b5f610360526103608051602082012090506101605161018020146110b45763c8fc27256103c45260046020806103e4526014610380527f4e6f6e5a65726f4f6666636861696e496e7075740000000000000000000000006103a052610380816103e40181518152602082015160208201528051806020830101601f825f03163682375050601f19601f825160200101169050905081019050016103c0526103c0805160208201fd5b610320516040526110c66104c0611799565b6104c06101806103406101808360045afa5050610200516103a052610220516103c051808281188284110218905090506103c0526101806109c06101806101a060045afa506101806109a0526109a080516020820120905061018061082061018061034060045afa5061018061080052610800805160208201209050146111d15763c8fc2725610b84526004602080610ba4526008610b40527f4261644f72646572000000000000000000000000000000000000000000000000610b6052610b4081610ba40181518152602082015160208201528051806020830101601f825f03163682375050601f19601f82516020010116905090508101905001610b8052610b80805160208201fd5b00611795565b631626ba7e8118611795576064361034176118fd576024356004016107008135116118fd57602081350180826040375050610660366107603760405161070181106102bf821116156118fd57506060518060a01c6118fd57610dc0526080518060a01c6118fd57610de05260a0518060a01c6118fd57610e005260c051610e205260e051610e4052610100518060201c6118fd57610e605261012051610e805261014051610ea05261016051610ec052610180518060011c6118fd57610ee0526101a051610f00526101c051610f20526101e0516060018051810160208151116118fd57805160208160051b0180610f40828560045afa505050506020810151810180518060a01c6118fd57611360526020810151611380526040810151810160148151116118fd5780516113a05260208101516113c05250506040810151810160018151116118fd5780516113e0526020810151611400525050610dc06101806107606101808360045afa5061018081016104e06108e06104e08360045afa505050602060206119695f395f516353f00b146115405260e0306115605233611580526004356115a05260206119695f395f5163f698da25610dc0526020610dc06004610ddc845afa6113ac573d5f5f3e3d5ffd5b60203d106118fd57610dc09050516115c0525f6115e0528061160052610180610e2061018061076060045afa50610180610e0052610e00816115600160208251018082828560045afa50508051806020830101601f825f03163682375050601f19601f8251602001011690509050810190508061162052602080610fc05280610fc00160608082528082015f6108e0518083528060051b5f82602081116118fd57801561147357905b8060051b61090001518160051b602088010152600101818118611455575b505082016020019150509050810190508060208301528082016060610d00518252610d20516020830152806040830152808201610d40518152610d605160208201528051806020830101601f825f03163682375050601f19601f82516020010116905081019050905081019050806040830152808201610d80518152610da05160208201528051806020830101601f825f03163682375050601f19601f82516020010116905081019050905081019050610fa052610fa0816115600160208251018082828560045afa50508051806020830101601f825f03163682375050601f19601f825160200101169050905081015050602061154061082461155c845afa61157f573d5f5f3e3d5ffd5b60203d106118fd57611540518060201b6118fd57611d8052611d809050f3611795565b632eb078cd811861179557346118fd5760206119295f395f5163d4b83992606052602060606004607c845afa6115da573d5f5f3e3d5ffd5b60203d106118fd576060518060a01c6118fd5760a05260a09050516040526040516370a082316080523060a052602060806024609c845afa61161e573d5f5f3e3d5ffd5b60203d106118fd576080905051606052606051156116825760405163a9059cbb608052602061192960a03960605160c052602060806044609c5f855af1611667573d5f5f3e3d5ffd5b60203d106118fd576080518060011c6118fd5760e05260e050505b60206060f3611795565b6301ffc9a78118611795576024361034176118fd576004358060201b6118fd576040527f62af8dc200000000000000000000000000000000000000000000000000000000604051146118fd576040517f01ffc9a700000000000000000000000000000000000000000000000000000000811861170957600161178a565b7fa3b5e31100000000000000000000000000000000000000000000000000000000811861173757600161178a565b7fb8296fc400000000000000000000000000000000000000000000000000000000811861176557600161178a565b7f1626ba7e000000000000000000000000000000000000000000000000000000008118155b905060805260206080f35b5f5ffd5b60206119295f395f5163d4b83992608052602060806004609c845afa6117c1573d5f5f3e3d5ffd5b60203d106118fd576080518060a01c6118fd5760c05260c090505160605260405181526060516020820152602061192960408301395f6060820152600154608082015260206119295f395f5163dffe059c608052600460a052604060806024609c845afa611831573d5f5f3e3d5ffd5b60403d106118fd5760809050602081019050518060201c6118fd5760a08201527f058315b749613051abcbf50cf2d605b4fa4a41554ec35d73fd058fc530da559f60c08201525f60e08201527ff3b277728b3fee749481eb3e0b3b48980dbbab78658fc419025cb16eee34677561010082015260016101208201527f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc96101408201527f5a28e9363bb942b639270062aa6bb295f434bcdfc42c97267bf003f272060dc961016082015250565b5f80fd0234179511d71795179501f601bb001800741795179517950a291795078617950dd015a21795168c000000000000000000000000bb7404f9965487a9dde721b3a5f0f3ccfa9aa4c5000000000000000000000000c92e8bdf79f0507f65a392b0ab4667716bfe0110000000000000000000000000fdafc9d1902f4e0b84f65f49f244b32b31013b74
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
GNO | 100.00% | $1.18 | 0.4185 | $0.4938 |
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.