Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 152 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deploy Metamorph... | 22571653 | 28 days ago | IN | 0 ETH | 0.00105501 | ||||
Deploy Metamorph... | 22529324 | 34 days ago | IN | 0 ETH | 0.00125079 | ||||
Deploy Metamorph... | 22359364 | 58 days ago | IN | 0 ETH | 0.0003473 | ||||
Deploy Metamorph... | 22359146 | 58 days ago | IN | 0 ETH | 0.00065269 | ||||
Deploy Metamorph... | 21429687 | 187 days ago | IN | 0 ETH | 0.01410799 | ||||
Deploy Metamorph... | 20901741 | 261 days ago | IN | 0 ETH | 0.00328781 | ||||
Deploy Metamorph... | 20756302 | 281 days ago | IN | 0 ETH | 0.00202289 | ||||
Deploy Metamorph... | 20752680 | 282 days ago | IN | 0 ETH | 0.00055087 | ||||
Deploy Metamorph... | 20752416 | 282 days ago | IN | 0 ETH | 0.0005881 | ||||
Deploy Metamorph... | 20752222 | 282 days ago | IN | 0 ETH | 0.0005487 | ||||
Deploy Metamorph... | 20476710 | 321 days ago | IN | 0 ETH | 0.00379428 | ||||
Deploy Metamorph... | 20475882 | 321 days ago | IN | 0 ETH | 0.00205775 | ||||
Deploy Metamorph... | 20469065 | 322 days ago | IN | 0 ETH | 0.00187441 | ||||
Deploy Metamorph... | 20469028 | 322 days ago | IN | 0 ETH | 0.00189774 | ||||
Deploy Metamorph... | 20306770 | 344 days ago | IN | 0 ETH | 0.00929851 | ||||
Deploy Metamorph... | 19930933 | 397 days ago | IN | 0 ETH | 0.00468342 | ||||
Deploy Metamorph... | 19930786 | 397 days ago | IN | 0 ETH | 0.00443587 | ||||
Deploy Metamorph... | 19693249 | 430 days ago | IN | 0 ETH | 0.01516753 | ||||
Deploy Metamorph... | 19687429 | 431 days ago | IN | 0 ETH | 0.02083252 | ||||
Deploy Metamorph... | 19573744 | 447 days ago | IN | 0 ETH | 0.10819515 | ||||
Deploy Metamorph... | 19487296 | 459 days ago | IN | 0 ETH | 0.03509018 | ||||
Deploy Metamorph... | 19426565 | 467 days ago | IN | 0 ETH | 0.09696937 | ||||
Deploy Metamorph... | 19406691 | 470 days ago | IN | 0 ETH | 0.01147509 | ||||
Deploy Metamorph... | 19381675 | 474 days ago | IN | 0 ETH | 0.17017601 | ||||
Deploy Metamorph... | 19332063 | 481 days ago | IN | 0 ETH | 0.19841464 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
0x58602081 | 22571653 | 28 days ago | Contract Creation | 0 ETH | |||
0x6112df80 | 22571653 | 28 days ago | Contract Creation | 0 ETH | |||
0x58602081 | 22529324 | 34 days ago | Contract Creation | 0 ETH | |||
0x6112a380 | 22529324 | 34 days ago | Contract Creation | 0 ETH | |||
0x58602081 | 22359364 | 58 days ago | Contract Creation | 0 ETH | |||
0x61088980 | 22359364 | 58 days ago | Contract Creation | 0 ETH | |||
0x58602081 | 22359146 | 58 days ago | Contract Creation | 0 ETH | |||
0x610d9d80 | 22359146 | 58 days ago | Contract Creation | 0 ETH | |||
0x58602081 | 21429687 | 187 days ago | Contract Creation | 0 ETH | |||
0x58602081 | 20901741 | 261 days ago | Contract Creation | 0 ETH | |||
0x58602081 | 20756302 | 281 days ago | Contract Creation | 0 ETH | |||
0x58602081 | 20752680 | 282 days ago | Contract Creation | 0 ETH | |||
0x58602081 | 20752416 | 282 days ago | Contract Creation | 0 ETH | |||
0x58602081 | 20752222 | 282 days ago | Contract Creation | 0 ETH | |||
0x58602081 | 20476710 | 321 days ago | Contract Creation | 0 ETH | |||
0x58602081 | 20475882 | 321 days ago | Contract Creation | 0 ETH | |||
0x58602081 | 20469065 | 322 days ago | Contract Creation | 0 ETH | |||
0x58602081 | 20469028 | 322 days ago | Contract Creation | 0 ETH | |||
0x58602081 | 20306770 | 344 days ago | Contract Creation | 0 ETH | |||
0x611e3d80 | 20306770 | 344 days ago | Contract Creation | 0 ETH | |||
0x58602081 | 19930933 | 397 days ago | Contract Creation | 0 ETH | |||
0x6104f980 | 19930933 | 397 days ago | Contract Creation | 0 ETH | |||
0x58602081 | 19930786 | 397 days ago | Contract Creation | 0 ETH | |||
0x6104f980 | 19930786 | 397 days ago | Contract Creation | 0 ETH | |||
0x58602081 | 19693249 | 430 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
MetamorphicContractFactory
Compiler Version
v0.5.6+commit.b259423e
Optimization Enabled:
Yes with 999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-04-07 */ pragma solidity 0.5.6; /** * @title Metamorphic Contract Factory * @author 0age * @notice This contract creates metamorphic contracts, or contracts that can be * redeployed with new code to the same address. It does so by deploying a * contract with fixed, non-deterministic initialization code via the CREATE2 * opcode. This contract clones the implementation contract in its constructor. * Once a contract undergoes metamorphosis, all existing storage will be deleted * and any existing contract code will be replaced with the deployed contract * code of the new implementation contract. * @dev CREATE2 will not be available on mainnet until (at least) block * 7,280,000. This contract has not yet been fully tested or audited - proceed * with caution and please share any exploits or optimizations you discover. */ contract MetamorphicContractFactory { // fires when a metamorphic contract is deployed by cloning another contract. event Metamorphosed(address metamorphicContract, address newImplementation); // fires when a metamorphic contract is deployed through a transient contract. event MetamorphosedWithConstructor( address metamorphicContract, address transientContract ); // store the initialization code for metamorphic contracts. bytes private _metamorphicContractInitializationCode; // store hash of the initialization code for metamorphic contracts as well. bytes32 private _metamorphicContractInitializationCodeHash; // store init code for transient contracts that deploy metamorphic contracts. bytes private _transientContractInitializationCode; // store the hash of the initialization code for transient contracts as well. bytes32 private _transientContractInitializationCodeHash; // maintain a mapping of metamorphic contracts to metamorphic implementations. mapping(address => address) private _implementations; // maintain a mapping of transient contracts to metamorphic init codes. mapping(address => bytes) private _initCodes; /** * @dev In the constructor, set up the initialization code for metamorphic * contracts as well as the keccak256 hash of the given initialization code. * @param transientContractInitializationCode bytes The initialization code * that will be used to deploy any transient contracts, which will deploy any * metamorphic contracts that require the use of a constructor. * * Metamorphic contract initialization code (29 bytes): * * 0x5860208158601c335a63aaf10f428752fa158151803b80938091923cf3 * * Description: * * pc|op|name | [stack] | <memory> * * ** set the first stack item to zero - used later ** * 00 58 getpc [0] <> * * ** set second stack item to 32, length of word returned from staticcall ** * 01 60 push1 * 02 20 outsize [0, 32] <> * * ** set third stack item to 0, position of word returned from staticcall ** * 03 81 dup2 [0, 32, 0] <> * * ** set fourth stack item to 4, length of selector given to staticcall ** * 04 58 getpc [0, 32, 0, 4] <> * * ** set fifth stack item to 28, position of selector given to staticcall ** * 05 60 push1 * 06 1c inpos [0, 32, 0, 4, 28] <> * * ** set the sixth stack item to msg.sender, target address for staticcall ** * 07 33 caller [0, 32, 0, 4, 28, caller] <> * * ** set the seventh stack item to msg.gas, gas to forward for staticcall ** * 08 5a gas [0, 32, 0, 4, 28, caller, gas] <> * * ** set the eighth stack item to selector, "what" to store via mstore ** * 09 63 push4 * 10 aaf10f42 selector [0, 32, 0, 4, 28, caller, gas, 0xaaf10f42] <> * * ** set the ninth stack item to 0, "where" to store via mstore *** * 11 87 dup8 [0, 32, 0, 4, 28, caller, gas, 0xaaf10f42, 0] <> * * ** call mstore, consume 8 and 9 from the stack, place selector in memory ** * 12 52 mstore [0, 32, 0, 4, 0, caller, gas] <0xaaf10f42> * * ** call staticcall, consume items 2 through 7, place address in memory ** * 13 fa staticcall [0, 1 (if successful)] <address> * * ** flip success bit in second stack item to set to 0 ** * 14 15 iszero [0, 0] <address> * * ** push a third 0 to the stack, position of address in memory ** * 15 81 dup2 [0, 0, 0] <address> * * ** place address from position in memory onto third stack item ** * 16 51 mload [0, 0, address] <> * * ** place address to fourth stack item for extcodesize to consume ** * 17 80 dup1 [0, 0, address, address] <> * * ** get extcodesize on fourth stack item for extcodecopy ** * 18 3b extcodesize [0, 0, address, size] <> * * ** dup and swap size for use by return at end of init code ** * 19 80 dup1 [0, 0, address, size, size] <> * 20 93 swap4 [size, 0, address, size, 0] <> * * ** push code position 0 to stack and reorder stack items for extcodecopy ** * 21 80 dup1 [size, 0, address, size, 0, 0] <> * 22 91 swap2 [size, 0, address, 0, 0, size] <> * 23 92 swap3 [size, 0, size, 0, 0, address] <> * * ** call extcodecopy, consume four items, clone runtime code to memory ** * 24 3c extcodecopy [size, 0] <code> * * ** return to deploy final code in memory ** * 25 f3 return [] *deployed!* * * * Transient contract initialization code derived from TransientContract.sol. */ constructor(bytes memory transientContractInitializationCode) public { // assign the initialization code for the metamorphic contract. _metamorphicContractInitializationCode = ( hex"5860208158601c335a63aaf10f428752fa158151803b80938091923cf3" ); // calculate and assign keccak256 hash of metamorphic initialization code. _metamorphicContractInitializationCodeHash = keccak256( abi.encodePacked( _metamorphicContractInitializationCode ) ); // store the initialization code for the transient contract. _transientContractInitializationCode = transientContractInitializationCode; // calculate and assign keccak256 hash of transient initialization code. _transientContractInitializationCodeHash = keccak256( abi.encodePacked( _transientContractInitializationCode ) ); } /* solhint-disable function-max-lines */ /** * @dev Deploy a metamorphic contract by submitting a given salt or nonce * along with the initialization code for the metamorphic contract, and * optionally provide calldata for initializing the new metamorphic contract. * To replace the contract, first selfdestruct the current contract, then call * with the same salt value and new initialization code (be aware that all * existing state will be wiped from the existing contract). Also note that * the first 20 bytes of the salt must match the calling address, which * prevents contracts from being created by unintended parties. * @param salt bytes32 The nonce that will be passed into the CREATE2 call and * thus will determine the resulant address of the metamorphic contract. * @param implementationContractInitializationCode bytes The initialization * code for the implementation contract for the metamorphic contract. It will * be used to deploy a new contract that the metamorphic contract will then * clone in its constructor. * @param metamorphicContractInitializationCalldata bytes An optional data * parameter that can be used to atomically initialize the metamorphic * contract. * @return Address of the metamorphic contract that will be created. */ function deployMetamorphicContract( bytes32 salt, bytes calldata implementationContractInitializationCode, bytes calldata metamorphicContractInitializationCalldata ) external payable containsCaller(salt) returns ( address metamorphicContractAddress ) { // move implementation init code and initialization calldata to memory. bytes memory implInitCode = implementationContractInitializationCode; bytes memory data = metamorphicContractInitializationCalldata; // move the initialization code from storage to memory. bytes memory initCode = _metamorphicContractInitializationCode; // declare variable to verify successful metamorphic contract deployment. address deployedMetamorphicContract; // determine the address of the metamorphic contract. metamorphicContractAddress = _getMetamorphicContractAddress(salt); // declare a variable for the address of the implementation contract. address implementationContract; // load implementation init code and length, then deploy via CREATE. /* solhint-disable no-inline-assembly */ assembly { let encoded_data := add(0x20, implInitCode) // load initialization code. let encoded_size := mload(implInitCode) // load init code's length. implementationContract := create( // call CREATE with 3 arguments. 0, // do not forward any endowment. encoded_data, // pass in initialization code. encoded_size // pass in init code's length. ) } /* solhint-enable no-inline-assembly */ require( implementationContract != address(0), "Could not deploy implementation." ); // store the implementation to be retrieved by the metamorphic contract. _implementations[metamorphicContractAddress] = implementationContract; // load metamorphic contract data and length of data and deploy via CREATE2. /* solhint-disable no-inline-assembly */ assembly { let encoded_data := add(0x20, initCode) // load initialization code. let encoded_size := mload(initCode) // load the init code's length. deployedMetamorphicContract := create2( // call CREATE2 with 4 arguments. 0, // do not forward any endowment. encoded_data, // pass in initialization code. encoded_size, // pass in init code's length. salt // pass in the salt value. ) } /* solhint-enable no-inline-assembly */ // ensure that the contracts were successfully deployed. require( deployedMetamorphicContract == metamorphicContractAddress, "Failed to deploy the new metamorphic contract." ); // initialize the new metamorphic contract if any data or value is provided. if (data.length > 0 || msg.value > 0) { /* solhint-disable avoid-call-value */ (bool success,) = deployedMetamorphicContract.call.value(msg.value)(data); /* solhint-enable avoid-call-value */ require(success, "Failed to initialize the new metamorphic contract."); } emit Metamorphosed(deployedMetamorphicContract, implementationContract); } /* solhint-enable function-max-lines */ /** * @dev Deploy a metamorphic contract by submitting a given salt or nonce * along with the address of an existing implementation contract to clone, and * optionally provide calldata for initializing the new metamorphic contract. * To replace the contract, first selfdestruct the current contract, then call * with the same salt value and a new implementation address (be aware that * all existing state will be wiped from the existing contract). Also note * that the first 20 bytes of the salt must match the calling address, which * prevents contracts from being created by unintended parties. * @param salt bytes32 The nonce that will be passed into the CREATE2 call and * thus will determine the resulant address of the metamorphic contract. * @param implementationContract address The address of the existing * implementation contract to clone. * @param metamorphicContractInitializationCalldata bytes An optional data * parameter that can be used to atomically initialize the metamorphic * contract. * @return Address of the metamorphic contract that will be created. */ function deployMetamorphicContractFromExistingImplementation( bytes32 salt, address implementationContract, bytes calldata metamorphicContractInitializationCalldata ) external payable containsCaller(salt) returns ( address metamorphicContractAddress ) { // move initialization calldata to memory. bytes memory data = metamorphicContractInitializationCalldata; // move the initialization code from storage to memory. bytes memory initCode = _metamorphicContractInitializationCode; // declare variable to verify successful metamorphic contract deployment. address deployedMetamorphicContract; // determine the address of the metamorphic contract. metamorphicContractAddress = _getMetamorphicContractAddress(salt); // store the implementation to be retrieved by the metamorphic contract. _implementations[metamorphicContractAddress] = implementationContract; // using inline assembly: load data and length of data, then call CREATE2. /* solhint-disable no-inline-assembly */ assembly { let encoded_data := add(0x20, initCode) // load initialization code. let encoded_size := mload(initCode) // load the init code's length. deployedMetamorphicContract := create2( // call CREATE2 with 4 arguments. 0, // do not forward any endowment. encoded_data, // pass in initialization code. encoded_size, // pass in init code's length. salt // pass in the salt value. ) } /* solhint-enable no-inline-assembly */ // ensure that the contracts were successfully deployed. require( deployedMetamorphicContract == metamorphicContractAddress, "Failed to deploy the new metamorphic contract." ); // initialize the new metamorphic contract if any data or value is provided. if (data.length > 0 || msg.value > 0) { /* solhint-disable avoid-call-value */ (bool success,) = metamorphicContractAddress.call.value(msg.value)(data); /* solhint-enable avoid-call-value */ require(success, "Failed to initialize the new metamorphic contract."); } emit Metamorphosed(deployedMetamorphicContract, implementationContract); } /* solhint-disable function-max-lines */ /** * @dev Deploy a metamorphic contract by submitting a given salt or nonce * along with the initialization code to a transient contract which will then * deploy the metamorphic contract before immediately selfdestructing. To * replace the metamorphic contract, first selfdestruct the current contract, * then call with the same salt value and new initialization code (be aware * that all existing state will be wiped from the existing contract). Also * note that the first 20 bytes of the salt must match the calling address, * which prevents contracts from being created by unintended parties. * @param salt bytes32 The nonce that will be passed into the CREATE2 call and * thus will determine the resulant address of the metamorphic contract. * @param initializationCode bytes The initialization code for the metamorphic * contract that will be deployed by the transient contract. * @return Address of the metamorphic contract that will be created. */ function deployMetamorphicContractWithConstructor( bytes32 salt, bytes calldata initializationCode ) external payable containsCaller(salt) returns ( address metamorphicContractAddress ) { // move transient contract initialization code from storage to memory. bytes memory initCode = _transientContractInitializationCode; // declare variable to verify successful transient contract deployment. address deployedTransientContract; // determine the address of the transient contract. address transientContractAddress = _getTransientContractAddress(salt); // store the initialization code to be retrieved by the transient contract. _initCodes[transientContractAddress] = initializationCode; // load transient contract data and length of data, then deploy via CREATE2. /* solhint-disable no-inline-assembly */ assembly { let encoded_data := add(0x20, initCode) // load initialization code. let encoded_size := mload(initCode) // load the init code's length. deployedTransientContract := create2( // call CREATE2 with 4 arguments. callvalue, // forward any supplied endowment. encoded_data, // pass in initialization code. encoded_size, // pass in init code's length. salt // pass in the salt value. ) } /* solhint-enable no-inline-assembly */ // ensure that the contracts were successfully deployed. require( deployedTransientContract == transientContractAddress, "Failed to deploy metamorphic contract using given salt and init code." ); metamorphicContractAddress = _getMetamorphicContractAddressWithConstructor( transientContractAddress ); emit MetamorphosedWithConstructor( metamorphicContractAddress, transientContractAddress ); } /* solhint-enable function-max-lines */ /** * @dev View function for retrieving the address of the implementation * contract to clone. Called by the constructor of each metamorphic contract. */ function getImplementation() external view returns (address implementation) { return _implementations[msg.sender]; } /** * @dev View function for retrieving the initialization code for a given * metamorphic contract to deploy via a transient contract. Called by the * constructor of each transient contract. * @return The initialization code to use to deploy the metamorphic contract. */ function getInitializationCode() external view returns ( bytes memory initializationCode ) { return _initCodes[msg.sender]; } /** * @dev View function for retrieving the address of the current implementation * contract of a given metamorphic contract, where the address of the contract * is supplied as an argument. Be aware that the implementation contract has * an independent state and may have been altered or selfdestructed from when * it was last cloned by the metamorphic contract. * @param metamorphicContractAddress address The address of the metamorphic * contract. * @return Address of the corresponding implementation contract. */ function getImplementationContractAddress( address metamorphicContractAddress ) external view returns (address implementationContractAddress) { return _implementations[metamorphicContractAddress]; } /** * @dev View function for retrieving the initialization code for a given * metamorphic contract instance deployed via a transient contract, where the address * of the transient contract is supplied as an argument. * @param transientContractAddress address The address of the transient * contract that deployed the metamorphic contract. * @return The initialization code used to deploy the metamorphic contract. */ function getMetamorphicContractInstanceInitializationCode( address transientContractAddress ) external view returns (bytes memory initializationCode) { return _initCodes[transientContractAddress]; } /** * @dev Compute the address of the metamorphic contract that will be created * upon submitting a given salt to the contract. * @param salt bytes32 The nonce passed into CREATE2 by metamorphic contract. * @return Address of the corresponding metamorphic contract. */ function findMetamorphicContractAddress( bytes32 salt ) external view returns (address metamorphicContractAddress) { // determine the address where the metamorphic contract will be deployed. metamorphicContractAddress = _getMetamorphicContractAddress(salt); } /** * @dev Compute the address of the transient contract that will be created * upon submitting a given salt to the contract. * @param salt bytes32 The nonce passed into CREATE2 when deploying the * transient contract. * @return Address of the corresponding transient contract. */ function findTransientContractAddress( bytes32 salt ) external view returns (address transientContractAddress) { // determine the address where the transient contract will be deployed. transientContractAddress = _getTransientContractAddress(salt); } /** * @dev Compute the address of the metamorphic contract that will be created * by the transient contract upon submitting a given salt to the contract. * @param salt bytes32 The nonce passed into CREATE2 when deploying the * transient contract. * @return Address of the corresponding metamorphic contract. */ function findMetamorphicContractAddressWithConstructor( bytes32 salt ) external view returns (address metamorphicContractAddress) { // determine the address of the metamorphic contract. metamorphicContractAddress = _getMetamorphicContractAddressWithConstructor( _getTransientContractAddress(salt) ); } /** * @dev View function for retrieving the initialization code of metamorphic * contracts for purposes of verification. */ function getMetamorphicContractInitializationCode() external view returns ( bytes memory metamorphicContractInitializationCode ) { return _metamorphicContractInitializationCode; } /** * @dev View function for retrieving the keccak256 hash of the initialization * code of metamorphic contracts for purposes of verification. */ function getMetamorphicContractInitializationCodeHash() external view returns ( bytes32 metamorphicContractInitializationCodeHash ) { return _metamorphicContractInitializationCodeHash; } /** * @dev View function for retrieving the initialization code of transient * contracts for purposes of verification. */ function getTransientContractInitializationCode() external view returns ( bytes memory transientContractInitializationCode ) { return _transientContractInitializationCode; } /** * @dev View function for retrieving the keccak256 hash of the initialization * code of transient contracts for purposes of verification. */ function getTransientContractInitializationCodeHash() external view returns ( bytes32 transientContractInitializationCodeHash ) { return _transientContractInitializationCodeHash; } /** * @dev Internal view function for calculating a metamorphic contract address * given a particular salt. */ function _getMetamorphicContractAddress( bytes32 salt ) internal view returns (address) { // determine the address of the metamorphic contract. return address( uint160( // downcast to match the address type. uint256( // convert to uint to truncate upper digits. keccak256( // compute the CREATE2 hash using 4 inputs. abi.encodePacked( // pack all inputs to the hash together. hex"ff", // start with 0xff to distinguish from RLP. address(this), // this contract will be the caller. salt, // pass in the supplied salt value. _metamorphicContractInitializationCodeHash // the init code hash. ) ) ) ) ); } /** * @dev Internal view function for calculating a transient contract address * given a particular salt. */ function _getTransientContractAddress( bytes32 salt ) internal view returns (address) { // determine the address of the transient contract. return address( uint160( // downcast to match the address type. uint256( // convert to uint to truncate upper digits. keccak256( // compute the CREATE2 hash using 4 inputs. abi.encodePacked( // pack all inputs to the hash together. hex"ff", // start with 0xff to distinguish from RLP. address(this), // this contract will be the caller. salt, // pass in the supplied salt value. _transientContractInitializationCodeHash // supply init code hash. ) ) ) ) ); } /** * @dev Internal view function for calculating a metamorphic contract address * that has been deployed via a transient contract given the address of the * transient contract. */ function _getMetamorphicContractAddressWithConstructor( address transientContractAddress ) internal pure returns (address) { // determine the address of the metamorphic contract. return address( uint160( // downcast to match the address type. uint256( // set to uint to truncate upper digits. keccak256( // compute CREATE hash via RLP encoding. abi.encodePacked( // pack all inputs to the hash together. byte(0xd6), // first RLP byte. byte(0x94), // second RLP byte. transientContractAddress, // called by the transient contract. byte(0x01) // nonce begins at 1 for contracts. ) ) ) ) ); } /** * @dev Modifier to ensure that the first 20 bytes of a submitted salt match * those of the calling account. This provides protection against the salt * being stolen by frontrunners or other attackers. * @param salt bytes32 The salt value to check against the calling address. */ modifier containsCaller(bytes32 salt) { // prevent contract submissions from being stolen from tx.pool by requiring // that the first 20 bytes of the submitted salt match msg.sender. require( address(bytes20(salt)) == msg.sender, "Invalid salt - first 20 bytes of the salt must match calling address." ); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":true,"inputs":[],"name":"getTransientContractInitializationCodeHash","outputs":[{"name":"transientContractInitializationCodeHash","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTransientContractInitializationCode","outputs":[{"name":"transientContractInitializationCode","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"salt","type":"bytes32"},{"name":"initializationCode","type":"bytes"}],"name":"deployMetamorphicContractWithConstructor","outputs":[{"name":"metamorphicContractAddress","type":"address"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getInitializationCode","outputs":[{"name":"initializationCode","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"transientContractAddress","type":"address"}],"name":"getMetamorphicContractInstanceInitializationCode","outputs":[{"name":"initializationCode","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMetamorphicContractInitializationCodeHash","outputs":[{"name":"metamorphicContractInitializationCodeHash","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"salt","type":"bytes32"}],"name":"findMetamorphicContractAddressWithConstructor","outputs":[{"name":"metamorphicContractAddress","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"salt","type":"bytes32"},{"name":"implementationContractInitializationCode","type":"bytes"},{"name":"metamorphicContractInitializationCalldata","type":"bytes"}],"name":"deployMetamorphicContract","outputs":[{"name":"metamorphicContractAddress","type":"address"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"salt","type":"bytes32"},{"name":"implementationContract","type":"address"},{"name":"metamorphicContractInitializationCalldata","type":"bytes"}],"name":"deployMetamorphicContractFromExistingImplementation","outputs":[{"name":"metamorphicContractAddress","type":"address"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"salt","type":"bytes32"}],"name":"findTransientContractAddress","outputs":[{"name":"transientContractAddress","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getImplementation","outputs":[{"name":"implementation","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"salt","type":"bytes32"}],"name":"findMetamorphicContractAddress","outputs":[{"name":"metamorphicContractAddress","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"metamorphicContractAddress","type":"address"}],"name":"getImplementationContractAddress","outputs":[{"name":"implementationContractAddress","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMetamorphicContractInitializationCode","outputs":[{"name":"metamorphicContractInitializationCode","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"transientContractInitializationCode","type":"bytes"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"metamorphicContract","type":"address"},{"indexed":false,"name":"newImplementation","type":"address"}],"name":"Metamorphosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"metamorphicContract","type":"address"},{"indexed":false,"name":"transientContract","type":"address"}],"name":"MetamorphosedWithConstructor","type":"event"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620015a1380380620015a1833981018060405260208110156200003757600080fd5b8101908080516401000000008111156200005057600080fd5b820160208101848111156200006457600080fd5b81516401000000008111828201871017156200007f57600080fd5b505060408051808201909152601d8082527f5860208158601c335a63aaf10f428752fa158151803b80938091923cf30000006020909201918252919450620000cd93506000925090620001f1565b5060006040516020018082805460018160011615610100020316600290048015620001325780601f106200010f57610100808354040283529182019162000132565b820191906000526020600020905b8154815290600101906020018083116200011d575b505060408051601f19818403018152919052805160209182012060015583516200016593506002925090840190620001f1565b5060026040516020018082805460018160011615610100020316600290048015620001ca5780601f10620001a7576101008083540402835291820191620001ca565b820191906000526020600020905b815481529060010190602001808311620001b5575b505060408051601f1981840301815291905280516020909101206003555062000296915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200023457805160ff191683800117855562000264565b8280016001018555821562000264579182015b828111156200026457825182559160200191906001019062000247565b506200027292915062000276565b5090565b6200029391905b808211156200027257600081556001016200027d565b90565b6112fb80620002a66000396000f3fe6080604052600436106100dd5760003560e01c80636f8bda371161007f578063aaf10f4211610059578063aaf10f4214610425578063b5714de61461043a578063b7d2b0b414610464578063c762ef5814610497576100dd565b80636f8bda37146102ad57806382cd583314610376578063a32cfb69146103fb576100dd565b806357b9f523116100bb57806357b9f5231461022657806359449e551461023b578063641b2afa1461026e578063687c42fd14610283576100dd565b8063010fcf85146100e25780630563ef93146101095780632c51145c14610193575b600080fd5b3480156100ee57600080fd5b506100f76104ac565b60408051918252519081900360200190f35b34801561011557600080fd5b5061011e6104b3565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610158578181015183820152602001610140565b50505050905090810190601f1680156101855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61020a600480360360408110156101a957600080fd5b813591908101906040810160208201356401000000008111156101cb57600080fd5b8201836020820111156101dd57600080fd5b803590602001918460018302840111640100000000831117156101ff57600080fd5b509092509050610546565b604080516001600160a01b039092168252519081900360200190f35b34801561023257600080fd5b5061011e610718565b34801561024757600080fd5b5061011e6004803603602081101561025e57600080fd5b50356001600160a01b0316610783565b34801561027a57600080fd5b506100f761082e565b34801561028f57600080fd5b5061020a600480360360208110156102a657600080fd5b5035610834565b61020a600480360360608110156102c357600080fd5b813591908101906040810160208201356401000000008111156102e557600080fd5b8201836020820111156102f757600080fd5b8035906020019184600183028401116401000000008311171561031957600080fd5b91939092909160208101903564010000000081111561033757600080fd5b82018360208201111561034957600080fd5b8035906020019184600183028401116401000000008311171561036b57600080fd5b50909250905061084d565b61020a6004803603606081101561038c57600080fd5b8135916001600160a01b03602082013516918101906060810160408201356401000000008111156103bc57600080fd5b8201836020820111156103ce57600080fd5b803590602001918460018302840111640100000000831117156103f057600080fd5b509092509050610c14565b34801561040757600080fd5b5061020a6004803603602081101561041e57600080fd5b5035610f30565b34801561043157600080fd5b5061020a610f3b565b34801561044657600080fd5b5061020a6004803603602081101561045d57600080fd5b5035610f57565b34801561047057600080fd5b5061020a6004803603602081101561048757600080fd5b50356001600160a01b0316610f62565b3480156104a357600080fd5b5061011e610f80565b6003545b90565b60028054604080516020601f600019610100600187161502019094168590049384018190048102820181019092528281526060939092909183018282801561053c5780601f106105115761010080835404028352916020019161053c565b820191906000526020600020905b81548152906001019060200180831161051f57829003601f168201915b5050505050905090565b600083606081901c6001600160a01b0316331461059757604051600160e51b62461bcd0281526004018080602001828103825260458152602001806112186045913960600191505060405180910390fd5b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156106205780601f106105f557610100808354040283529160200191610620565b820191906000526020600020905b81548152906001019060200180831161060357829003601f168201915b5050505050905060008061063388610fe1565b6001600160a01b038116600090815260056020526040902090915061065990888861114d565b5082602001835189818334f593505050806001600160a01b0316826001600160a01b0316146106bc57604051600160e51b62461bcd02815260040180806020018281038252604581526020018061125d6045913960600191505060405180910390fd5b6106c581611043565b604080516001600160a01b0380841682528416602082015281519297507f5a450ff2319c286ed6a7b238e478f4c3c97d76f47704d5d9f4a568eb842afbd3929081900390910190a1505050509392505050565b3360009081526005602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084526060939283018282801561053c5780601f106105115761010080835404028352916020019161053c565b6001600160a01b03811660009081526005602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156108225780601f106107f757610100808354040283529160200191610822565b820191906000526020600020905b81548152906001019060200180831161080557829003601f168201915b50505050509050919050565b60015490565b600061084761084283610fe1565b611043565b92915050565b600085606081901c6001600160a01b0316331461089e57604051600160e51b62461bcd0281526004018080602001828103825260458152602001806112186045913960600191505060405180910390fd5b606086868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a0181900481028201810190925288815293945060609392508891508790819084018382808284376000920182905250805460408051602060026000196101006001871615020190941693909304601f8101849004840282018401909252818152969750606096955091935090915083018282801561099c5780601f106109715761010080835404028352916020019161099c565b820191906000526020600020905b81548152906001019060200180831161097f57829003601f168201915b5050505050905060006109ae8b6110eb565b9550600084602001855180826000f0925050506001600160a01b038116610a1f5760408051600160e51b62461bcd02815260206004820181905260248201527f436f756c64206e6f74206465706c6f7920696d706c656d656e746174696f6e2e604482015290519081900360640190fd5b6001600160a01b0387811660009081526004602090815260408220805473ffffffffffffffffffffffffffffffffffffffff191693851693909317909255845191850191908e9082908490f593505050866001600160a01b0316826001600160a01b031614610ac257604051600160e51b62461bcd02815260040180806020018281038252602e8152602001806112a2602e913960400191505060405180910390fd5b600084511180610ad25750600034115b15610bc0576000826001600160a01b031634866040518082805190602001908083835b60208310610b145780518252601f199092019160209182019101610af5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114610b76576040519150601f19603f3d011682016040523d82523d6000602084013e610b7b565b606091505b5050905080610bbe57604051600160e51b62461bcd0281526004018080602001828103825260328152602001806111e66032913960400191505060405180910390fd5b505b604080516001600160a01b0380851682528316602082015281517f2d2abf98ee3d10557b7f9aca6b41a1c0ee9095804e5dc6caa3c836995ceaeffb929181900390910190a150505050505095945050505050565b600084606081901c6001600160a01b03163314610c6557604051600160e51b62461bcd0281526004018080602001828103825260458152602001806112186045913960600191505060405180910390fd5b606084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250805460408051602060026000196101006001871615020190941693909304601f81018490048402820184019092528181529697506060969550919350909150830182828015610d295780601f10610cfe57610100808354040283529160200191610d29565b820191906000526020600020905b815481529060010190602001808311610d0c57829003601f168201915b505050505090506000610d3b896110eb565b6001600160a01b0381811660009081526004602090815260408220805473ffffffffffffffffffffffffffffffffffffffff1916938d1693909317909255845192975090840191908b9082908490f592505050846001600160a01b0316816001600160a01b031614610de157604051600160e51b62461bcd02815260040180806020018281038252602e8152602001806112a2602e913960400191505060405180910390fd5b600083511180610df15750600034115b15610edf576000856001600160a01b031634856040518082805190602001908083835b60208310610e335780518252601f199092019160209182019101610e14565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114610e95576040519150601f19603f3d011682016040523d82523d6000602084013e610e9a565b606091505b5050905080610edd57604051600160e51b62461bcd0281526004018080602001828103825260328152602001806111e66032913960400191505060405180910390fd5b505b604080516001600160a01b0380841682528a16602082015281517f2d2abf98ee3d10557b7f9aca6b41a1c0ee9095804e5dc6caa3c836995ceaeffb929181900390910190a150505050949350505050565b600061084782610fe1565b336000908152600460205260409020546001600160a01b031690565b6000610847826110eb565b6001600160a01b039081166000908152600460205260409020541690565b60008054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561053c5780601f106105115761010080835404028352916020019161053c565b600354604080517fff000000000000000000000000000000000000000000000000000000000000006020808301919091523060601b60218301526035820194909452605580820193909352815180820390930183526075019052805191012090565b604080517fd6000000000000000000000000000000000000000000000000000000000000006020808301919091527f940000000000000000000000000000000000000000000000000000000000000060218301526001600160a01b03841660601b60228301527f010000000000000000000000000000000000000000000000000000000000000060368301528251601781840301815260379092019092528051910120919050565b600154604080517fff000000000000000000000000000000000000000000000000000000000000006020808301919091523060601b60218301526035820194909452605580820193909352815180820390930183526075019052805191012090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061118e5782800160ff198235161785556111bb565b828001600101855582156111bb579182015b828111156111bb5782358255916020019190600101906111a0565b506111c79291506111cb565b5090565b6104b091905b808211156111c757600081556001016111d156fe4661696c656420746f20696e697469616c697a6520746865206e6577206d6574616d6f727068696320636f6e74726163742e496e76616c69642073616c74202d206669727374203230206279746573206f66207468652073616c74206d757374206d617463682063616c6c696e6720616464726573732e4661696c656420746f206465706c6f79206d6574616d6f727068696320636f6e7472616374207573696e6720676976656e2073616c7420616e6420696e697420636f64652e4661696c656420746f206465706c6f7920746865206e6577206d6574616d6f727068696320636f6e74726163742ea165627a7a7230582040a2612c311743060c0acf5302091f118547c549d97d08e7c02535e3a4e3fc42002900000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000108608060408190527f57b9f52300000000000000000000000000000000000000000000000000000000815260609033906357b9f5239060849060009060048186803b15801561004c57600080fd5b505afa158015610060573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561008957600080fd5b8101908080516401000000008111156100a157600080fd5b820160208101848111156100b457600080fd5b81516401000000008111828201871017156100ce57600080fd5b505092919050505090506000816020018251808234f0925050506001600160a01b0381166100fb57600080fd5b806001600160a01b0316fffe000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106100dd5760003560e01c80636f8bda371161007f578063aaf10f4211610059578063aaf10f4214610425578063b5714de61461043a578063b7d2b0b414610464578063c762ef5814610497576100dd565b80636f8bda37146102ad57806382cd583314610376578063a32cfb69146103fb576100dd565b806357b9f523116100bb57806357b9f5231461022657806359449e551461023b578063641b2afa1461026e578063687c42fd14610283576100dd565b8063010fcf85146100e25780630563ef93146101095780632c51145c14610193575b600080fd5b3480156100ee57600080fd5b506100f76104ac565b60408051918252519081900360200190f35b34801561011557600080fd5b5061011e6104b3565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610158578181015183820152602001610140565b50505050905090810190601f1680156101855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61020a600480360360408110156101a957600080fd5b813591908101906040810160208201356401000000008111156101cb57600080fd5b8201836020820111156101dd57600080fd5b803590602001918460018302840111640100000000831117156101ff57600080fd5b509092509050610546565b604080516001600160a01b039092168252519081900360200190f35b34801561023257600080fd5b5061011e610718565b34801561024757600080fd5b5061011e6004803603602081101561025e57600080fd5b50356001600160a01b0316610783565b34801561027a57600080fd5b506100f761082e565b34801561028f57600080fd5b5061020a600480360360208110156102a657600080fd5b5035610834565b61020a600480360360608110156102c357600080fd5b813591908101906040810160208201356401000000008111156102e557600080fd5b8201836020820111156102f757600080fd5b8035906020019184600183028401116401000000008311171561031957600080fd5b91939092909160208101903564010000000081111561033757600080fd5b82018360208201111561034957600080fd5b8035906020019184600183028401116401000000008311171561036b57600080fd5b50909250905061084d565b61020a6004803603606081101561038c57600080fd5b8135916001600160a01b03602082013516918101906060810160408201356401000000008111156103bc57600080fd5b8201836020820111156103ce57600080fd5b803590602001918460018302840111640100000000831117156103f057600080fd5b509092509050610c14565b34801561040757600080fd5b5061020a6004803603602081101561041e57600080fd5b5035610f30565b34801561043157600080fd5b5061020a610f3b565b34801561044657600080fd5b5061020a6004803603602081101561045d57600080fd5b5035610f57565b34801561047057600080fd5b5061020a6004803603602081101561048757600080fd5b50356001600160a01b0316610f62565b3480156104a357600080fd5b5061011e610f80565b6003545b90565b60028054604080516020601f600019610100600187161502019094168590049384018190048102820181019092528281526060939092909183018282801561053c5780601f106105115761010080835404028352916020019161053c565b820191906000526020600020905b81548152906001019060200180831161051f57829003601f168201915b5050505050905090565b600083606081901c6001600160a01b0316331461059757604051600160e51b62461bcd0281526004018080602001828103825260458152602001806112186045913960600191505060405180910390fd5b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156106205780601f106105f557610100808354040283529160200191610620565b820191906000526020600020905b81548152906001019060200180831161060357829003601f168201915b5050505050905060008061063388610fe1565b6001600160a01b038116600090815260056020526040902090915061065990888861114d565b5082602001835189818334f593505050806001600160a01b0316826001600160a01b0316146106bc57604051600160e51b62461bcd02815260040180806020018281038252604581526020018061125d6045913960600191505060405180910390fd5b6106c581611043565b604080516001600160a01b0380841682528416602082015281519297507f5a450ff2319c286ed6a7b238e478f4c3c97d76f47704d5d9f4a568eb842afbd3929081900390910190a1505050509392505050565b3360009081526005602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084526060939283018282801561053c5780601f106105115761010080835404028352916020019161053c565b6001600160a01b03811660009081526005602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156108225780601f106107f757610100808354040283529160200191610822565b820191906000526020600020905b81548152906001019060200180831161080557829003601f168201915b50505050509050919050565b60015490565b600061084761084283610fe1565b611043565b92915050565b600085606081901c6001600160a01b0316331461089e57604051600160e51b62461bcd0281526004018080602001828103825260458152602001806112186045913960600191505060405180910390fd5b606086868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a0181900481028201810190925288815293945060609392508891508790819084018382808284376000920182905250805460408051602060026000196101006001871615020190941693909304601f8101849004840282018401909252818152969750606096955091935090915083018282801561099c5780601f106109715761010080835404028352916020019161099c565b820191906000526020600020905b81548152906001019060200180831161097f57829003601f168201915b5050505050905060006109ae8b6110eb565b9550600084602001855180826000f0925050506001600160a01b038116610a1f5760408051600160e51b62461bcd02815260206004820181905260248201527f436f756c64206e6f74206465706c6f7920696d706c656d656e746174696f6e2e604482015290519081900360640190fd5b6001600160a01b0387811660009081526004602090815260408220805473ffffffffffffffffffffffffffffffffffffffff191693851693909317909255845191850191908e9082908490f593505050866001600160a01b0316826001600160a01b031614610ac257604051600160e51b62461bcd02815260040180806020018281038252602e8152602001806112a2602e913960400191505060405180910390fd5b600084511180610ad25750600034115b15610bc0576000826001600160a01b031634866040518082805190602001908083835b60208310610b145780518252601f199092019160209182019101610af5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114610b76576040519150601f19603f3d011682016040523d82523d6000602084013e610b7b565b606091505b5050905080610bbe57604051600160e51b62461bcd0281526004018080602001828103825260328152602001806111e66032913960400191505060405180910390fd5b505b604080516001600160a01b0380851682528316602082015281517f2d2abf98ee3d10557b7f9aca6b41a1c0ee9095804e5dc6caa3c836995ceaeffb929181900390910190a150505050505095945050505050565b600084606081901c6001600160a01b03163314610c6557604051600160e51b62461bcd0281526004018080602001828103825260458152602001806112186045913960600191505060405180910390fd5b606084848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250805460408051602060026000196101006001871615020190941693909304601f81018490048402820184019092528181529697506060969550919350909150830182828015610d295780601f10610cfe57610100808354040283529160200191610d29565b820191906000526020600020905b815481529060010190602001808311610d0c57829003601f168201915b505050505090506000610d3b896110eb565b6001600160a01b0381811660009081526004602090815260408220805473ffffffffffffffffffffffffffffffffffffffff1916938d1693909317909255845192975090840191908b9082908490f592505050846001600160a01b0316816001600160a01b031614610de157604051600160e51b62461bcd02815260040180806020018281038252602e8152602001806112a2602e913960400191505060405180910390fd5b600083511180610df15750600034115b15610edf576000856001600160a01b031634856040518082805190602001908083835b60208310610e335780518252601f199092019160209182019101610e14565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114610e95576040519150601f19603f3d011682016040523d82523d6000602084013e610e9a565b606091505b5050905080610edd57604051600160e51b62461bcd0281526004018080602001828103825260328152602001806111e66032913960400191505060405180910390fd5b505b604080516001600160a01b0380841682528a16602082015281517f2d2abf98ee3d10557b7f9aca6b41a1c0ee9095804e5dc6caa3c836995ceaeffb929181900390910190a150505050949350505050565b600061084782610fe1565b336000908152600460205260409020546001600160a01b031690565b6000610847826110eb565b6001600160a01b039081166000908152600460205260409020541690565b60008054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561053c5780601f106105115761010080835404028352916020019161053c565b600354604080517fff000000000000000000000000000000000000000000000000000000000000006020808301919091523060601b60218301526035820194909452605580820193909352815180820390930183526075019052805191012090565b604080517fd6000000000000000000000000000000000000000000000000000000000000006020808301919091527f940000000000000000000000000000000000000000000000000000000000000060218301526001600160a01b03841660601b60228301527f010000000000000000000000000000000000000000000000000000000000000060368301528251601781840301815260379092019092528051910120919050565b600154604080517fff000000000000000000000000000000000000000000000000000000000000006020808301919091523060601b60218301526035820194909452605580820193909352815180820390930183526075019052805191012090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061118e5782800160ff198235161785556111bb565b828001600101855582156111bb579182015b828111156111bb5782358255916020019190600101906111a0565b506111c79291506111cb565b5090565b6104b091905b808211156111c757600081556001016111d156fe4661696c656420746f20696e697469616c697a6520746865206e6577206d6574616d6f727068696320636f6e74726163742e496e76616c69642073616c74202d206669727374203230206279746573206f66207468652073616c74206d757374206d617463682063616c6c696e6720616464726573732e4661696c656420746f206465706c6f79206d6574616d6f727068696320636f6e7472616374207573696e6720676976656e2073616c7420616e6420696e697420636f64652e4661696c656420746f206465706c6f7920746865206e6577206d6574616d6f727068696320636f6e74726163742ea165627a7a7230582040a2612c311743060c0acf5302091f118547c549d97d08e7c02535e3a4e3fc420029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000108608060408190527f57b9f52300000000000000000000000000000000000000000000000000000000815260609033906357b9f5239060849060009060048186803b15801561004c57600080fd5b505afa158015610060573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561008957600080fd5b8101908080516401000000008111156100a157600080fd5b820160208101848111156100b457600080fd5b81516401000000008111828201871017156100ce57600080fd5b505092919050505090506000816020018251808234f0925050506001600160a01b0381166100fb57600080fd5b806001600160a01b0316fffe000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : transientContractInitializationCode (bytes): 0x608060408190527f57b9f52300000000000000000000000000000000000000000000000000000000815260609033906357b9f5239060849060009060048186803b15801561004c57600080fd5b505afa158015610060573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561008957600080fd5b8101908080516401000000008111156100a157600080fd5b820160208101848111156100b457600080fd5b81516401000000008111828201871017156100ce57600080fd5b505092919050505090506000816020018251808234f0925050506001600160a01b0381166100fb57600080fd5b806001600160a01b0316fffe
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000108
Arg [2] : 608060408190527f57b9f5230000000000000000000000000000000000000000
Arg [3] : 0000000000000000815260609033906357b9f523906084906000906004818680
Arg [4] : 3b15801561004c57600080fd5b505afa158015610060573d6000803e3d6000fd
Arg [5] : 5b505050506040513d6000823e601f3d908101601f1916820160405260208110
Arg [6] : 1561008957600080fd5b8101908080516401000000008111156100a157600080
Arg [7] : fd5b820160208101848111156100b457600080fd5b8151640100000000811182
Arg [8] : 8201871017156100ce57600080fd5b5050929190505050905060008160200182
Arg [9] : 51808234f0925050506001600160a01b0381166100fb57600080fd5b80600160
Arg [10] : 0160a01b0316fffe000000000000000000000000000000000000000000000000
Swarm Source
bzzr://40a2612c311743060c0acf5302091f118547c549d97d08e7c02535e3a4e3fc42
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.