ETH Price: $2,415.65 (+5.19%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Deploy Metamorph...225716532025-05-27 4:11:1128 days ago1748319071IN
0x00000000...143685e7B
0 ETH0.001055010.5
Deploy Metamorph...225293242025-05-21 5:56:4734 days ago1747807007IN
0x00000000...143685e7B
0 ETH0.001250790.6
Deploy Metamorph...223593642025-04-27 9:02:1158 days ago1745744531IN
0x00000000...143685e7B
0 ETH0.00034730.3404095
Deploy Metamorph...223591462025-04-27 8:18:3558 days ago1745741915IN
0x00000000...143685e7B
0 ETH0.000652690.41911088
Deploy Metamorph...214296872024-12-18 13:22:35187 days ago1734528155IN
0x00000000...143685e7B
0 ETH0.0141079915.25066428
Deploy Metamorph...209017412024-10-05 20:31:11261 days ago1728160271IN
0x00000000...143685e7B
0 ETH0.003287813.55351029
Deploy Metamorph...207563022024-09-15 13:25:59281 days ago1726406759IN
0x00000000...143685e7B
0 ETH0.002022892.186401
Deploy Metamorph...207526802024-09-15 1:18:47282 days ago1726363127IN
0x00000000...143685e7B
0 ETH0.000550870.94706814
Deploy Metamorph...207524162024-09-15 0:25:47282 days ago1726359947IN
0x00000000...143685e7B
0 ETH0.00058811.01105534
Deploy Metamorph...207522222024-09-14 23:46:59282 days ago1726357619IN
0x00000000...143685e7B
0 ETH0.00054870.9432964
Deploy Metamorph...204767102024-08-07 12:31:35321 days ago1723033895IN
0x00000000...143685e7B
0 ETH0.003794284.10101395
Deploy Metamorph...204758822024-08-07 9:44:59321 days ago1723023899IN
0x00000000...143685e7B
0 ETH0.002057752.22609055
Deploy Metamorph...204690652024-08-06 10:55:11322 days ago1722941711IN
0x00000000...143685e7B
0 ETH0.001874412.02485583
Deploy Metamorph...204690282024-08-06 10:47:47322 days ago1722941267IN
0x00000000...143685e7B
0 ETH0.001897742.05384999
Deploy Metamorph...203067702024-07-14 19:15:59344 days ago1720984559IN
0x00000000...143685e7B
0 ETH0.009298512.80333063
Deploy Metamorph...199309332024-05-23 6:56:35397 days ago1716447395IN
0x00000000...143685e7B
0 ETH0.004683427.25383064
Deploy Metamorph...199307862024-05-23 6:26:59397 days ago1716445619IN
0x00000000...143685e7B
0 ETH0.004435876.87028235
Deploy Metamorph...196932492024-04-20 1:08:11430 days ago1713575291IN
0x00000000...143685e7B
0 ETH0.015167538
Deploy Metamorph...196874292024-04-19 5:32:59431 days ago1713504779IN
0x00000000...143685e7B
0 ETH0.0208325210
Deploy Metamorph...195737442024-04-03 7:24:47447 days ago1712129087IN
0x00000000...143685e7B
0 ETH0.1081951522.95534014
Deploy Metamorph...194872962024-03-22 2:49:35459 days ago1711075775IN
0x00000000...143685e7B
0 ETH0.0350901819
Deploy Metamorph...194265652024-03-13 13:51:11467 days ago1710337871IN
0x00000000...143685e7B
0 ETH0.0969693762.95629375
Deploy Metamorph...194066912024-03-10 19:09:35470 days ago1710097775IN
0x00000000...143685e7B
0 ETH0.0114750964.4317396
Deploy Metamorph...193816752024-03-07 7:02:59474 days ago1709794979IN
0x00000000...143685e7B
0 ETH0.1701760148.41724674
Deploy Metamorph...193320632024-02-29 8:45:11481 days ago1709196311IN
0x00000000...143685e7B
0 ETH0.1984146456.41623271
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
0x58602081225716532025-05-27 4:11:1128 days ago1748319071
0x00000000...143685e7B
 Contract Creation0 ETH
0x6112df80225716532025-05-27 4:11:1128 days ago1748319071
0x00000000...143685e7B
 Contract Creation0 ETH
0x58602081225293242025-05-21 5:56:4734 days ago1747807007
0x00000000...143685e7B
 Contract Creation0 ETH
0x6112a380225293242025-05-21 5:56:4734 days ago1747807007
0x00000000...143685e7B
 Contract Creation0 ETH
0x58602081223593642025-04-27 9:02:1158 days ago1745744531
0x00000000...143685e7B
 Contract Creation0 ETH
0x61088980223593642025-04-27 9:02:1158 days ago1745744531
0x00000000...143685e7B
 Contract Creation0 ETH
0x58602081223591462025-04-27 8:18:3558 days ago1745741915
0x00000000...143685e7B
 Contract Creation0 ETH
0x610d9d80223591462025-04-27 8:18:3558 days ago1745741915
0x00000000...143685e7B
 Contract Creation0 ETH
0x58602081214296872024-12-18 13:22:35187 days ago1734528155
0x00000000...143685e7B
 Contract Creation0 ETH
0x58602081209017412024-10-05 20:31:11261 days ago1728160271
0x00000000...143685e7B
 Contract Creation0 ETH
0x58602081207563022024-09-15 13:25:59281 days ago1726406759
0x00000000...143685e7B
 Contract Creation0 ETH
0x58602081207526802024-09-15 1:18:47282 days ago1726363127
0x00000000...143685e7B
 Contract Creation0 ETH
0x58602081207524162024-09-15 0:25:47282 days ago1726359947
0x00000000...143685e7B
 Contract Creation0 ETH
0x58602081207522222024-09-14 23:46:59282 days ago1726357619
0x00000000...143685e7B
 Contract Creation0 ETH
0x58602081204767102024-08-07 12:31:35321 days ago1723033895
0x00000000...143685e7B
 Contract Creation0 ETH
0x58602081204758822024-08-07 9:44:59321 days ago1723023899
0x00000000...143685e7B
 Contract Creation0 ETH
0x58602081204690652024-08-06 10:55:11322 days ago1722941711
0x00000000...143685e7B
 Contract Creation0 ETH
0x58602081204690282024-08-06 10:47:47322 days ago1722941267
0x00000000...143685e7B
 Contract Creation0 ETH
0x58602081203067702024-07-14 19:15:59344 days ago1720984559
0x00000000...143685e7B
 Contract Creation0 ETH
0x611e3d80203067702024-07-14 19:15:59344 days ago1720984559
0x00000000...143685e7B
 Contract Creation0 ETH
0x58602081199309332024-05-23 6:56:35397 days ago1716447395
0x00000000...143685e7B
 Contract Creation0 ETH
0x6104f980199309332024-05-23 6:56:35397 days ago1716447395
0x00000000...143685e7B
 Contract Creation0 ETH
0x58602081199307862024-05-23 6:26:59397 days ago1716445619
0x00000000...143685e7B
 Contract Creation0 ETH
0x6104f980199307862024-05-23 6:26:59397 days ago1716445619
0x00000000...143685e7B
 Contract Creation0 ETH
0x58602081196932492024-04-20 1:08:11430 days ago1713575291
0x00000000...143685e7B
 Contract Creation0 ETH
View All Internal Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MetamorphicContractFactory

Compiler Version
v0.5.6+commit.b259423e

Optimization Enabled:
Yes with 999 runs

Other Settings:
default evmVersion
/**
 *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

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"}]

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

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
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.