ETH Price: $2,350.14 (-5.37%)

Contract

0xE3e3bed21fC39d0915f66509eD0AAc05dB6d6454
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Open Market95424732020-02-23 22:50:411830 days ago1582498241IN
0xE3e3bed2...5dB6d6454
0 ETH0.000281683.2
Create Currency88065212019-10-25 2:07:561951 days ago1571969276IN
0xE3e3bed2...5dB6d6454
0 ETH0.001635491
Create Currency80820752019-07-04 2:01:002064 days ago1562205660IN
0xE3e3bed2...5dB6d6454
0 ETH0.001961361.2
Transfer80820432019-07-04 1:53:042064 days ago1562205184IN
0xE3e3bed2...5dB6d6454
0.005 ETH0.000052612.5
Transfer80820172019-07-04 1:46:452064 days ago1562204805IN
0xE3e3bed2...5dB6d6454
0.005 ETH0.00005252.5
Create Currency78849442019-06-03 6:45:232095 days ago1559544323IN
0xE3e3bed2...5dB6d6454
0 ETH0.009803736
Open Market78761732019-06-01 21:43:152097 days ago1559425395IN
0xE3e3bed2...5dB6d6454
0 ETH0.000106552
Open Market78741692019-06-01 14:16:442097 days ago1559398604IN
0xE3e3bed2...5dB6d6454
0 ETH0.0007991215
Open Market78741532019-06-01 14:12:182097 days ago1559398338IN
0xE3e3bed2...5dB6d6454
0 ETH0.0011658514
Create Currency78741402019-06-01 14:09:352097 days ago1559398175IN
0xE3e3bed2...5dB6d6454
0 ETH0.024515115
Open Market78406462019-05-27 8:33:512102 days ago1558946031IN
0xE3e3bed2...5dB6d6454
0 ETH0.0005860211
Open Market78406382019-05-27 8:31:282102 days ago1558945888IN
0xE3e3bed2...5dB6d6454
0 ETH0.0005860211
Open Market78406382019-05-27 8:31:282102 days ago1558945888IN
0xE3e3bed2...5dB6d6454
0 ETH0.0005860211
Open Market78406362019-05-27 8:31:142102 days ago1558945874IN
0xE3e3bed2...5dB6d6454
0 ETH0.0005860211
Open Market78406352019-05-27 8:31:012102 days ago1558945861IN
0xE3e3bed2...5dB6d6454
0 ETH0.0005860211
Open Market78350762019-05-26 11:57:592103 days ago1558871879IN
0xE3e3bed2...5dB6d6454
0 ETH0.000083271
Create Currency78302512019-05-25 17:49:422104 days ago1558806582IN
0xE3e3bed2...5dB6d6454
0 ETH0.003268422
Open Market78290432019-05-25 13:27:292104 days ago1558790849IN
0xE3e3bed2...5dB6d6454
0 ETH0.00009161.1
Create Currency78285872019-05-25 11:46:042104 days ago1558784764IN
0xE3e3bed2...5dB6d6454
0 ETH0.00220611.35000148
Open Market76256852019-04-23 19:35:042136 days ago1556048104IN
0xE3e3bed2...5dB6d6454
0 ETH0.00009161.1
Create Currency76254042019-04-23 18:29:242136 days ago1556044164IN
0xE3e3bed2...5dB6d6454
0 ETH0.004906663
Open Market75082372019-04-05 13:08:022154 days ago1554469682IN
0xE3e3bed2...5dB6d6454
0 ETH0.00033314
Create Currency75078802019-04-05 11:43:432154 days ago1554464623IN
0xE3e3bed2...5dB6d6454
0 ETH0.009805276
Create Currency72314112019-02-17 9:51:242201 days ago1550397084IN
0xE3e3bed2...5dB6d6454
0 ETH0.009805276
Create Currency72152732019-02-13 12:53:362205 days ago1550062416IN
0xE3e3bed2...5dB6d6454
0 ETH0.008169785
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
88065212019-10-25 2:07:561951 days ago1571969276
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
88065212019-10-25 2:07:561951 days ago1571969276
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
80820752019-07-04 2:01:002064 days ago1562205660
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
80820752019-07-04 2:01:002064 days ago1562205660
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
78849442019-06-03 6:45:232095 days ago1559544323
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
78849442019-06-03 6:45:232095 days ago1559544323
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
78741402019-06-01 14:09:352097 days ago1559398175
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
78741402019-06-01 14:09:352097 days ago1559398175
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
78302512019-05-25 17:49:422104 days ago1558806582
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
78302512019-05-25 17:49:422104 days ago1558806582
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
78285872019-05-25 11:46:042104 days ago1558784764
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
78285872019-05-25 11:46:042104 days ago1558784764
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
76254042019-04-23 18:29:242136 days ago1556044164
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
76254042019-04-23 18:29:242136 days ago1556044164
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
75078802019-04-05 11:43:432154 days ago1554464623
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
75078802019-04-05 11:43:432154 days ago1554464623
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
72314112019-02-17 9:51:242201 days ago1550397084
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
72314112019-02-17 9:51:242201 days ago1550397084
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
72152732019-02-13 12:53:362205 days ago1550062416
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
72152732019-02-13 12:53:362205 days ago1550062416
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
71358352019-01-27 20:45:012222 days ago1548621901
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
71358352019-01-27 20:45:012222 days ago1548621901
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
71153392019-01-23 19:37:582226 days ago1548272278
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
71153392019-01-23 19:37:582226 days ago1548272278
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
70939852019-01-19 17:30:432230 days ago1547919043
0xE3e3bed2...5dB6d6454
 Contract Creation0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CurrencyFactory

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-05-27
*/

pragma solidity ^0.4.18;

// File: contracts/Ownable.sol

/// @title Ownable
/// @dev The Ownable contract has an owner address, and provides basic authorization control functions,
/// this simplifies the implementation of "user permissions".
/// @dev Based on OpenZeppelin's Ownable.

contract Ownable {
    address public owner;
    address public newOwnerCandidate;

    event OwnershipRequested(address indexed by, address indexed to);
    event OwnershipTransferred(address indexed from, address indexed to);

    /// @dev Constructor sets the original `owner` of the contract to the sender account.
    function Ownable() public {
        owner = msg.sender;
    }

    /// @dev Reverts if called by any account other than the owner.
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }

    modifier onlyOwnerCandidate() {
        require(msg.sender == newOwnerCandidate);
        _;
    }

    /// @dev Proposes to transfer control of the contract to a newOwnerCandidate.
    /// @param _newOwnerCandidate address The address to transfer ownership to.
    function requestOwnershipTransfer(address _newOwnerCandidate) external onlyOwner {
        require(_newOwnerCandidate != address(0));

        newOwnerCandidate = _newOwnerCandidate;

        OwnershipRequested(msg.sender, newOwnerCandidate);
    }

    /// @dev Accept ownership transfer. This method needs to be called by the perviously proposed owner.
    function acceptOwnership() external onlyOwnerCandidate {
        address previousOwner = owner;

        owner = newOwnerCandidate;
        newOwnerCandidate = address(0);

        OwnershipTransferred(previousOwner, owner);
    }
}

// File: contracts/SafeMath.sol

/// @title Math operations with safety checks
library SafeMath {
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a * b;
        require(a == 0 || c / a == b);
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // require(b > 0); // Solidity automatically throws when dividing by 0
        uint256 c = a / b;
        // require(a == b * c + a % b); // There is no case in which this doesn't hold
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        return a - b;
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);
        return c;
    }

    function max64(uint64 a, uint64 b) internal pure returns (uint64) {
        return a >= b ? a : b;
    }

    function min64(uint64 a, uint64 b) internal pure returns (uint64) {
        return a < b ? a : b;
    }

    function max256(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    function min256(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    function toPower2(uint256 a) internal pure returns (uint256) {
        return mul(a, a);
    }

    function sqrt(uint256 a) internal pure returns (uint256) {
        uint256 c = (a + 1) / 2;
        uint256 b = a;
        while (c < b) {
            b = c;
            c = (a / c + c) / 2;
        }
        return b;
    }
}

// File: contracts/ERC20.sol

/// @title ERC Token Standard #20 Interface (https://github.com/ethereum/EIPs/issues/20)
contract ERC20 {
    uint public totalSupply;
    function balanceOf(address _owner) constant public returns (uint balance);
    function transfer(address _to, uint _value) public returns (bool success);
    function transferFrom(address _from, address _to, uint _value) public returns (bool success);
    function approve(address _spender, uint _value) public returns (bool success);
    function allowance(address _owner, address _spender) public constant returns (uint remaining);
    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);
}

// File: contracts/BasicToken.sol

/// @title Basic ERC20 token contract implementation.
/// @dev Based on OpenZeppelin's StandardToken.
contract BasicToken is ERC20 {
    using SafeMath for uint256;

    uint256 public totalSupply;
    mapping (address => mapping (address => uint256)) allowed;
    mapping (address => uint256) balances;

    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 value);

    /// @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
    /// @param _spender address The address which will spend the funds.
    /// @param _value uint256 The amount of tokens to be spent.
    function approve(address _spender, uint256 _value) public returns (bool) {
        // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md#approve (see NOTE)
        if ((_value != 0) && (allowed[msg.sender][_spender] != 0)) {
            revert();
        }

        allowed[msg.sender][_spender] = _value;

        Approval(msg.sender, _spender, _value);

        return true;
    }

    /// @dev Function to check the amount of tokens that an owner allowed to a spender.
    /// @param _owner address The address which owns the funds.
    /// @param _spender address The address which will spend the funds.
    /// @return uint256 specifying the amount of tokens still available for the spender.
    function allowance(address _owner, address _spender) constant public returns (uint256 remaining) {
        return allowed[_owner][_spender];
    }


    /// @dev Gets the balance of the specified address.
    /// @param _owner address The address to query the the balance of.
    /// @return uint256 representing the amount owned by the passed address.
    function balanceOf(address _owner) constant public returns (uint256 balance) {
        return balances[_owner];
    }

    /// @dev Transfer token to a specified address.
    /// @param _to address The address to transfer to.
    /// @param _value uint256 The amount to be transferred.
    function transfer(address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
        balances[msg.sender] = balances[msg.sender].sub(_value);
        balances[_to] = balances[_to].add(_value);

        Transfer(msg.sender, _to, _value);

        return true;
    }

    /// @dev Transfer tokens from one address to another.
    /// @param _from address The address which you want to send tokens from.
    /// @param _to address The address which you want to transfer to.
    /// @param _value uint256 the amount of tokens to be transferred.
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
        require(_to != address(0));
        uint256 _allowance = allowed[_from][msg.sender];

        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);

        allowed[_from][msg.sender] = _allowance.sub(_value);

        Transfer(_from, _to, _value);

        return true;
    }
}

// File: contracts/ERC223Receiver.sol

/// @title ERC223Receiver Interface
/// @dev Based on the specs form: https://github.com/ethereum/EIPs/issues/223
contract ERC223Receiver {
    function tokenFallback(address _sender, uint _value, bytes _data) external returns (bool ok);
}

// File: contracts/ERC677.sol

/// @title ERC Token Standard #677 Interface (https://github.com/ethereum/EIPs/issues/677)
contract ERC677 is ERC20 {
    function transferAndCall(address to, uint value, bytes data) public returns (bool ok);

    event TransferAndCall(address indexed from, address indexed to, uint value, bytes data);
}

// File: contracts/Standard677Token.sol

/// @title Standard677Token implentation, base on https://github.com/ethereum/EIPs/issues/677

contract Standard677Token is ERC677, BasicToken {

  /// @dev ERC223 safe token transfer from one address to another
  /// @param _to address the address which you want to transfer to.
  /// @param _value uint256 the amount of tokens to be transferred.
  /// @param _data bytes data that can be attached to the token transation
  function transferAndCall(address _to, uint _value, bytes _data) public returns (bool) {
    require(super.transfer(_to, _value)); // do a normal token transfer
    TransferAndCall(msg.sender, _to, _value, _data);
    //filtering if the target is a contract with bytecode inside it
    if (isContract(_to)) return contractFallback(_to, _value, _data);
    return true;
  }

  /// @dev called when transaction target is a contract
  /// @param _to address the address which you want to transfer to.
  /// @param _value uint256 the amount of tokens to be transferred.
  /// @param _data bytes data that can be attached to the token transation
  function contractFallback(address _to, uint _value, bytes _data) private returns (bool) {
    ERC223Receiver receiver = ERC223Receiver(_to);
    require(receiver.tokenFallback(msg.sender, _value, _data));
    return true;
  }

  /// @dev check if the address is contract
  /// assemble the given address bytecode. If bytecode exists then the _addr is a contract.
  /// @param _addr address the address to check
  function isContract(address _addr) private constant returns (bool is_contract) {
    // retrieve the size of the code on target address, this needs assembly
    uint length;
    assembly { length := extcodesize(_addr) }
    return length > 0;
  }
}

// File: contracts/TokenHolder.sol

/// @title Token holder contract.
contract TokenHolder is Ownable {
    /// @dev Allow the owner to transfer out any accidentally sent ERC20 tokens.
    /// @param _tokenAddress address The address of the ERC20 contract.
    /// @param _amount uint256 The amount of tokens to be transferred.
    function transferAnyERC20Token(address _tokenAddress, uint256 _amount) public onlyOwner returns (bool success) {
        return ERC20(_tokenAddress).transfer(owner, _amount);
    }
}

// File: contracts/ColuLocalCurrency.sol

/// @title Colu Local Currency contract.
/// @author Rotem Lev.
contract ColuLocalCurrency is Ownable, Standard677Token, TokenHolder {
    using SafeMath for uint256;
    string public name;
    string public symbol;
    uint8 public decimals;
    string public tokenURI;

    event TokenURIChanged(string newTokenURI);

    /// @dev cotract to use when issuing a CC (Local Currency)
    /// @param _name string name for CC token that is created.
    /// @param _symbol string symbol for CC token that is created.
    /// @param _decimals uint8 percison for CC token that is created.
    /// @param _totalSupply uint256 total supply of the CC token that is created.
    /// @param _tokenURI string the URI may point to a JSON file that conforms to the "Metadata JSON Schema".
    function ColuLocalCurrency(string _name, string _symbol, uint8 _decimals, uint256 _totalSupply, string _tokenURI) public {
        require(_totalSupply != 0);
        require(bytes(_name).length != 0);
        require(bytes(_symbol).length != 0);

        totalSupply = _totalSupply;
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        tokenURI = _tokenURI;
        balances[msg.sender] = totalSupply;
    }

    /// @dev Sets the tokenURI field, can be called by the owner only
    /// @param _tokenURI string the URI may point to a JSON file that conforms to the "Metadata JSON Schema".
    function setTokenURI(string _tokenURI) public onlyOwner {
      tokenURI = _tokenURI;
      TokenURIChanged(_tokenURI);
    }
}

// File: contracts/Standard223Receiver.sol

/// @title Standard ERC223 Token Receiver implementing tokenFallback function and tokenPayable modifier

contract Standard223Receiver is ERC223Receiver {
  Tkn tkn;

  struct Tkn {
    address addr;
    address sender; // the transaction caller
    uint256 value;
  }

  bool __isTokenFallback;

  modifier tokenPayable {
    require(__isTokenFallback);
    _;
  }

  /// @dev Called when the receiver of transfer is contract
  /// @param _sender address the address of tokens sender
  /// @param _value uint256 the amount of tokens to be transferred.
  /// @param _data bytes data that can be attached to the token transation
  function tokenFallback(address _sender, uint _value, bytes _data) external returns (bool ok) {
    if (!supportsToken(msg.sender)) {
      return false;
    }

    // Problem: This will do a sstore which is expensive gas wise. Find a way to keep it in memory.
    // Solution: Remove the the data
    tkn = Tkn(msg.sender, _sender, _value);
    __isTokenFallback = true;
    if (!address(this).delegatecall(_data)) {
      __isTokenFallback = false;
      return false;
    }
    // avoid doing an overwrite to .token, which would be more expensive
    // makes accessing .tkn values outside tokenPayable functions unsafe
    __isTokenFallback = false;

    return true;
  }

  function supportsToken(address token) public constant returns (bool);
}

// File: contracts/TokenOwnable.sol

/// @title TokenOwnable
/// @dev The TokenOwnable contract adds a onlyTokenOwner modifier as a tokenReceiver with ownable addaptation

contract TokenOwnable is Standard223Receiver, Ownable {
    /// @dev Reverts if called by any account other than the owner for token sending.
    modifier onlyTokenOwner() {
        require(tkn.sender == owner);
        _;
    }
}

// File: contracts/EllipseMarketMaker.sol

/// @title Ellipse Market Maker contract.
/// @dev market maker, using ellipse equation.
/// @author Tal Beja.
contract EllipseMarketMaker is TokenOwnable {

  // precision for price representation (as in ether or tokens).
  uint256 public constant PRECISION = 10 ** 18;

  // The tokens pair.
  ERC20 public token1;
  ERC20 public token2;

  // The tokens reserves.
  uint256 public R1;
  uint256 public R2;

  // The tokens full suplly.
  uint256 public S1;
  uint256 public S2;

  // State flags.
  bool public operational;
  bool public openForPublic;

  // Library contract address.
  address public mmLib;

  /// @dev Constructor calling the library contract using delegate.
  function EllipseMarketMaker(address _mmLib, address _token1, address _token2) public {
    require(_mmLib != address(0));
    // Signature of the mmLib's constructor function
    // bytes4 sig = bytes4(keccak256("constructor(address,address,address)"));
    bytes4 sig = 0x6dd23b5b;

    // 3 arguments of size 32
    uint256 argsSize = 3 * 32;
    // sig + arguments size
    uint256 dataSize = 4 + argsSize;


    bytes memory m_data = new bytes(dataSize);

    assembly {
        // Add the signature first to memory
        mstore(add(m_data, 0x20), sig)
        // Add the parameters
        mstore(add(m_data, 0x24), _mmLib)
        mstore(add(m_data, 0x44), _token1)
        mstore(add(m_data, 0x64), _token2)
    }

    // delegatecall to the library contract
    require(_mmLib.delegatecall(m_data));
  }

  /// @dev returns true iff token is supperted by this contract (for erc223/677 tokens calls)
  /// @param token can be token1 or token2
  function supportsToken(address token) public constant returns (bool) {
    return (token1 == token || token2 == token);
  }

  /// @dev gets called when no other function matches, delegate to the lib contract.
  function() public {
    address _mmLib = mmLib;
    if (msg.data.length > 0) {
      assembly {
        calldatacopy(0xff, 0, calldatasize)
        let retVal := delegatecall(gas, _mmLib, 0xff, calldatasize, 0, 0x20)
        switch retVal case 0 { revert(0,0) } default { return(0, 0x20) }
      }
    }
  }
}

// File: contracts/MarketMaker.sol

/// @title Market Maker Interface.
/// @author Tal Beja.
contract MarketMaker is ERC223Receiver {

  function getCurrentPrice() public constant returns (uint _price);
  function change(address _fromToken, uint _amount, address _toToken) public returns (uint _returnAmount);
  function change(address _fromToken, uint _amount, address _toToken, uint _minReturn) public returns (uint _returnAmount);
  function change(address _toToken) public returns (uint _returnAmount);
  function change(address _toToken, uint _minReturn) public returns (uint _returnAmount);
  function quote(address _fromToken, uint _amount, address _toToken) public constant returns (uint _returnAmount);
  function openForPublicTrade() public returns (bool success);
  function isOpenForPublic() public returns (bool success);

  event Change(address indexed fromToken, uint inAmount, address indexed toToken, uint returnAmount, address indexed account);
}

// File: contracts/IEllipseMarketMaker.sol

/// @title Ellipse Market Maker Interfase
/// @author Tal Beja
contract IEllipseMarketMaker is MarketMaker {

    // precision for price representation (as in ether or tokens).
    uint256 public constant PRECISION = 10 ** 18;

    // The tokens pair.
    ERC20 public token1;
    ERC20 public token2;

    // The tokens reserves.
    uint256 public R1;
    uint256 public R2;

    // The tokens full suplly.
    uint256 public S1;
    uint256 public S2;

    // State flags.
    bool public operational;
    bool public openForPublic;

    // Library contract address.
    address public mmLib;

    function supportsToken(address token) public constant returns (bool);

    function calcReserve(uint256 _R1, uint256 _S1, uint256 _S2) public pure returns (uint256);

    function validateReserves() public view returns (bool);

    function withdrawExcessReserves() public returns (uint256);

    function initializeAfterTransfer() public returns (bool);

    function initializeOnTransfer() public returns (bool);

    function getPrice(uint256 _R1, uint256 _R2, uint256 _S1, uint256 _S2) public constant returns (uint256);
}

// File: contracts/CurrencyFactory.sol

/// @title Colu Local Currency + Market Maker factory contract.
/// @author Rotem Lev.
contract CurrencyFactory is Standard223Receiver, TokenHolder {

  struct CurrencyStruct {
    string name;
    uint8 decimals;
    uint256 totalSupply;
    address owner;
    address mmAddress;
  }


  // map of Market Maker owners: token address => currency struct
  mapping (address => CurrencyStruct) public currencyMap;
  // address of the deployed CLN contract (ERC20 Token)
  address public clnAddress;
  // address of the deployed elipse market maker contract
  address public mmLibAddress;

  address[] public tokens;

  event MarketOpen(address indexed marketMaker);
  event TokenCreated(address indexed token, address indexed owner);

  // modifier to check if called by issuer of the token
  modifier tokenIssuerOnly(address token, address owner) {
    require(currencyMap[token].owner == owner);
    _;
  }
  // modifier to only accept transferAndCall from CLN token
  modifier CLNOnly() {
    require(msg.sender == clnAddress);
    _;
  }

  /// @dev checks if the instance of market maker contract is closed for public
  /// @param _token address address of the CC token.
  modifier marketClosed(address _token) {
  	require(!MarketMaker(currencyMap[_token].mmAddress).isOpenForPublic());
  	_;
  }

  /// @dev checks if the instance of market maker contract is open for public
  /// @param _token address address of the CC token.
  modifier marketOpen(address _token) {
    require(MarketMaker(currencyMap[_token].mmAddress).isOpenForPublic());
    _;
  }

  /// @dev constructor only reuires the address of the CLN token which must use the ERC20 interface
  /// @param _mmLib address for the deployed market maker elipse contract
  /// @param _clnAddress address for the deployed ERC20 CLN token
  function CurrencyFactory(address _mmLib, address _clnAddress) public {
  	require(_mmLib != address(0));
  	require(_clnAddress != address(0));
  	mmLibAddress = _mmLib;
  	clnAddress = _clnAddress;
  }

  /// @dev create the MarketMaker and the CC token put all the CC token in the Market Maker reserve
  /// @param _name string name for CC token that is created.
  /// @param _symbol string symbol for CC token that is created.
  /// @param _decimals uint8 percison for CC token that is created.
  /// @param _totalSupply uint256 total supply of the CC token that is created.
  /// @param _tokenURI string the URI may point to a JSON file that conforms to the "Metadata JSON Schema".
  function createCurrency(string _name,
                          string _symbol,
                          uint8 _decimals,
                          uint256 _totalSupply,
                          string _tokenURI) public
                          returns (address) {

  	ColuLocalCurrency subToken = new ColuLocalCurrency(_name, _symbol, _decimals, _totalSupply, _tokenURI);
  	EllipseMarketMaker newMarketMaker = new EllipseMarketMaker(mmLibAddress, clnAddress, subToken);
  	//set allowance
  	require(subToken.transfer(newMarketMaker, _totalSupply));
  	require(IEllipseMarketMaker(newMarketMaker).initializeAfterTransfer());
  	currencyMap[subToken] = CurrencyStruct({ name: _name, decimals: _decimals, totalSupply: _totalSupply, mmAddress: newMarketMaker, owner: msg.sender});
    tokens.push(subToken);
  	TokenCreated(subToken, msg.sender);
  	return subToken;
  }

  /// @dev create the MarketMaker and the CC token put all the CC token in the Market Maker reserve
  /// @param _name string name for CC token that is created.
  /// @param _symbol string symbol for CC token that is created.
  /// @param _decimals uint8 percison for CC token that is created.
  /// @param _totalSupply uint256 total supply of the CC token that is created.
  function createCurrency(string _name,
                          string _symbol,
                          uint8 _decimals,
                          uint256 _totalSupply) public
                          returns (address) {
    return createCurrency(_name, _symbol, _decimals, _totalSupply, '');
  }

  /// @dev normal send cln to the market maker contract, sender must approve() before calling method. can only be called by owner
  /// @dev sending CLN will return CC from the reserve to the sender.
  /// @param _token address address of the cc token managed by this factory.
  /// @param _clnAmount uint256 amount of CLN to transfer into the Market Maker reserve.
  function insertCLNtoMarketMaker(address _token,
                                  uint256 _clnAmount) public
                                  tokenIssuerOnly(_token, msg.sender)
                                  returns (uint256 _subTokenAmount) {
  	require(_clnAmount > 0);
  	address marketMakerAddress = getMarketMakerAddressFromToken(_token);
  	require(ERC20(clnAddress).transferFrom(msg.sender, this, _clnAmount));
  	require(ERC20(clnAddress).approve(marketMakerAddress, _clnAmount));
  	_subTokenAmount = IEllipseMarketMaker(marketMakerAddress).change(clnAddress, _clnAmount, _token);
    require(ERC20(_token).transfer(msg.sender, _subTokenAmount));
  }

  /// @dev ERC223 transferAndCall, send cln to the market maker contract can only be called by owner (see MarketMaker)
  /// @dev sending CLN will return CC from the reserve to the sender.
  /// @param _token address address of the cc token managed by this factory.
  function insertCLNtoMarketMaker(address _token) public
                                  tokenPayable
                                  CLNOnly
                                  tokenIssuerOnly(_token, tkn.sender)
                                  returns (uint256 _subTokenAmount) {
  	address marketMakerAddress = getMarketMakerAddressFromToken(_token);
  	require(ERC20(clnAddress).approve(marketMakerAddress, tkn.value));
  	_subTokenAmount = IEllipseMarketMaker(marketMakerAddress).change(clnAddress, tkn.value, _token);
    require(ERC20(_token).transfer(tkn.sender, _subTokenAmount));
  }

  /// @dev normal send cc to the market maker contract, sender must approve() before calling method. can only be called by owner
  /// @dev sending CC will return CLN from the reserve to the sender.
  /// @param _token address address of the cc token managed by this factory.
  /// @param _ccAmount uint256 amount of CC to transfer into the Market Maker reserve.
  function extractCLNfromMarketMaker(address _token,
                                     uint256 _ccAmount) public
                                     tokenIssuerOnly(_token, msg.sender)
                                     returns (uint256 _clnTokenAmount) {
  	address marketMakerAddress = getMarketMakerAddressFromToken(_token);
  	require(ERC20(_token).transferFrom(msg.sender, this, _ccAmount));
  	require(ERC20(_token).approve(marketMakerAddress, _ccAmount));
  	_clnTokenAmount = IEllipseMarketMaker(marketMakerAddress).change(_token, _ccAmount, clnAddress);
  	require(ERC20(clnAddress).transfer(msg.sender, _clnTokenAmount));
  }

  /// @dev ERC223 transferAndCall, send CC to the market maker contract can only be called by owner (see MarketMaker)
  /// @dev sending CC will return CLN from the reserve to the sender.
  function extractCLNfromMarketMaker() public
                                    tokenPayable
                                    tokenIssuerOnly(msg.sender, tkn.sender)
                                    returns (uint256 _clnTokenAmount) {
  	address marketMakerAddress = getMarketMakerAddressFromToken(msg.sender);
  	require(ERC20(msg.sender).approve(marketMakerAddress, tkn.value));
  	_clnTokenAmount = IEllipseMarketMaker(marketMakerAddress).change(msg.sender, tkn.value, clnAddress);
  	require(ERC20(clnAddress).transfer(tkn.sender, _clnTokenAmount));
  }

  /// @dev opens the Market Maker to recvice transactions from all sources.
  /// @dev Request to transfer ownership of Market Maker contract to Owner instead of factory.
  /// @param _token address address of the cc token managed by this factory.
  function openMarket(address _token) public
                      tokenIssuerOnly(_token, msg.sender)
                      returns (bool) {
  	address marketMakerAddress = getMarketMakerAddressFromToken(_token);
  	require(MarketMaker(marketMakerAddress).openForPublicTrade());
  	Ownable(marketMakerAddress).requestOwnershipTransfer(msg.sender);
    Ownable(_token).requestOwnershipTransfer(msg.sender);
  	MarketOpen(marketMakerAddress);
  	return true;
  }

  /// @dev implementation for standard 223 reciver.
  /// @param _token address of the token used with transferAndCall.
  function supportsToken(address _token) public constant returns (bool) {
  	return (clnAddress == _token || currencyMap[_token].totalSupply > 0);
  }

  /// @dev sets tokenURI for the given currency, can be used during the sell only
  /// @param _token address address of the token to update
  /// @param _tokenURI string the URI may point to a JSON file that conforms to the "Metadata JSON Schema".
  function setTokenURI(address _token, string _tokenURI) public
                              tokenIssuerOnly(_token, msg.sender)
                              marketClosed(_token)
                              returns (bool) {
    ColuLocalCurrency(_token).setTokenURI(_tokenURI);
    return true;
  }

  /// @dev helper function to get the market maker address form token
  /// @param _token address of the token used with transferAndCall.
  function getMarketMakerAddressFromToken(address _token) public constant returns (address _marketMakerAddress) {
  	_marketMakerAddress = currencyMap[_token].mmAddress;
    require(_marketMakerAddress != address(0));
  }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"_token","type":"address"}],"name":"supportsToken","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwnerCandidate","type":"address"}],"name":"requestOwnershipTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"currencyMap","outputs":[{"name":"name","type":"string"},{"name":"decimals","type":"uint8"},{"name":"totalSupply","type":"uint256"},{"name":"owner","type":"address"},{"name":"mmAddress","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"openMarket","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"clnAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"mmLibAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"extractCLNfromMarketMaker","outputs":[{"name":"_clnTokenAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tokens","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_decimals","type":"uint8"},{"name":"_totalSupply","type":"uint256"},{"name":"_tokenURI","type":"string"}],"name":"createCurrency","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_token","type":"address"}],"name":"getMarketMakerAddressFromToken","outputs":[{"name":"_marketMakerAddress","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"insertCLNtoMarketMaker","outputs":[{"name":"_subTokenAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_sender","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"tokenFallback","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"newOwnerCandidate","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_decimals","type":"uint8"},{"name":"_totalSupply","type":"uint256"}],"name":"createCurrency","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_ccAmount","type":"uint256"}],"name":"extractCLNfromMarketMaker","outputs":[{"name":"_clnTokenAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenAddress","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transferAnyERC20Token","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_clnAmount","type":"uint256"}],"name":"insertCLNtoMarketMaker","outputs":[{"name":"_subTokenAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_mmLib","type":"address"},{"name":"_clnAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"marketMaker","type":"address"}],"name":"MarketOpen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"token","type":"address"},{"indexed":true,"name":"owner","type":"address"}],"name":"TokenCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":true,"name":"to","type":"address"}],"name":"OwnershipRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

608060405234801561001057600080fd5b506040516040806134fa8339810160405280516020909101516003805461010060a860020a0319163361010002179055600160a060020a038216151561005557600080fd5b600160a060020a038116151561006a57600080fd5b60078054600160a060020a03938416600160a060020a03199182161790915560068054929093169116179055613455806100a56000396000f3006080604052600436106200010d5763ffffffff60e060020a600035041663061f76508114620001125780630952c504146200014a578063115bdfe7146200017057806321a4c6c3146200023b578063451cd22d146200025f5780634d68954314620002935780634daadff914620002ab5780634f64b2be14620002d557806379ba509714620002f05780638da5cb5b146200030857806398d7352f1462000320578063a49cc76c146200038a578063ac3c49e01462000472578063b7073d2e1462000496578063c0ee0b8a14620004ba578063d091b55014620004ee578063d8bd47611462000506578063d9eb547b14620005ab578063dc39d06d14620005d2578063e5714ea314620005f9575b600080fd5b3480156200011f57600080fd5b5062000136600160a060020a036004351662000620565b604080519115158252519081900360200190f35b3480156200015757600080fd5b506200016e600160a060020a036004351662000661565b005b3480156200017d57600080fd5b5062000194600160a060020a0360043516620006f3565b6040805160ff8616602080830191909152918101859052600160a060020a0380851660608301528316608082015260a080825287519082015286519091829160c083019189019080838360005b83811015620001fb578181015183820152602001620001e1565b50505050905090810190601f168015620002295780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b3480156200024857600080fd5b5062000136600160a060020a0360043516620007c2565b3480156200026c57600080fd5b5062000277620009af565b60408051600160a060020a039092168252519081900360200190f35b348015620002a057600080fd5b5062000277620009be565b348015620002b857600080fd5b50620002c3620009cd565b60408051918252519081900360200190f35b348015620002e257600080fd5b506200027760043562000bf9565b348015620002fd57600080fd5b506200016e62000c22565b3480156200031557600080fd5b506200027762000cc9565b3480156200032d57600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855262000136958335600160a060020a031695369560449491939091019190819084018382808284375094975062000cdd9650505050505050565b3480156200039757600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526200027794369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020888301358a018035601f8101839004830284018301909452838352979a893560ff169a8a8301359a9199909850606090910196509194509081019250819084018382808284375094975062000ea49650505050505050565b3480156200047f57600080fd5b5062000277600160a060020a0360043516620012e5565b348015620004a357600080fd5b50620002c3600160a060020a036004351662001310565b348015620004c757600080fd5b506200013660048035600160a060020a031690602480359160443591820191013562001556565b348015620004fb57600080fd5b50620002776200162e565b3480156200051357600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526200027794369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497505050833560ff169450505060209091013590506200163d565b348015620005b857600080fd5b50620002c3600160a060020a036004351660243562001667565b348015620005df57600080fd5b5062000136600160a060020a036004351660243562001914565b3480156200060657600080fd5b50620002c3600160a060020a0360043516602435620019c8565b600654600090600160a060020a0383811691161480620006595750600160a060020a038216600090815260056020526040812060020154115b90505b919050565b6003546101009004600160a060020a031633146200067e57600080fd5b600160a060020a03811615156200069457600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03838116919091179182905560405191169033907f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec490600090a350565b60056020908152600091825260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529092918391908301828280156200078e5780601f1062000762576101008083540402835291602001916200078e565b820191906000526020600020905b8154815290600101906020018083116200077057829003601f168201915b505050600184015460028501546003860154600490960154949560ff90921694909350600160a060020a0391821692501685565b600160a060020a038082166000908152600560205260408120600301549091829184913391168114620007f457600080fd5b620007ff85620012e5565b925082600160a060020a031663ec3324886040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156200084057600080fd5b505af115801562000855573d6000803e3d6000fd5b505050506040513d60208110156200086c57600080fd5b505115156200087a57600080fd5b604080517f0952c5040000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03851691630952c50491602480830192600092919082900301818387803b158015620008db57600080fd5b505af1158015620008f0573d6000803e3d6000fd5b5050604080517f0952c5040000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a0389169350630952c5049250602480830192600092919082900301818387803b1580156200095557600080fd5b505af11580156200096a573d6000803e3d6000fd5b5050604051600160a060020a03861692507fd89dc0ad0949ca0a2fb2c8b9bd54f53eef80290fdbb947a3e778efe61e6fef929150600090a2600193505b505050919050565b600654600160a060020a031681565b600754600160a060020a031681565b600354600090819060ff161515620009e457600080fd5b600154336000818152600560205260409020600301549091600160a060020a039081169116811462000a1557600080fd5b62000a2033620012e5565b600254604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a0384166004820152602481019290925251919450339163095ea7b3916044808201926020929091908290030181600087803b15801562000a9057600080fd5b505af115801562000aa5573d6000803e3d6000fd5b505050506040513d602081101562000abc57600080fd5b5051151562000aca57600080fd5b6002546006546040805160e060020a63de683a7d0281523360048201526024810193909352600160a060020a039182166044840152519085169163de683a7d9160648083019260209291908290030181600087803b15801562000b2c57600080fd5b505af115801562000b41573d6000803e3d6000fd5b505050506040513d602081101562000b5857600080fd5b50516006546001546040805160e060020a63a9059cbb028152600160a060020a03928316600482015260248101859052905193975091169163a9059cbb916044808201926020929091908290030181600087803b15801562000bb957600080fd5b505af115801562000bce573d6000803e3d6000fd5b505050506040513d602081101562000be557600080fd5b5051151562000bf357600080fd5b50505090565b600880548290811062000c0857fe5b600091825260209091200154600160a060020a0316905081565b600454600090600160a060020a0316331462000c3d57600080fd5b506003805460048054600160a060020a0381811661010090810274ffffffffffffffffffffffffffffffffffffffff00198616179586905573ffffffffffffffffffffffffffffffffffffffff199092169092556040519281900482169304169082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6003546101009004600160a060020a031681565b600160a060020a0380831660009081526005602052604081206003015490918491339116811462000d0d57600080fd5b600160a060020a03808616600090815260056020908152604080832060049081015482517f727d508a00000000000000000000000000000000000000000000000000000000815292518b96919091169463727d508a94848401949093908390030190829087803b15801562000d8157600080fd5b505af115801562000d96573d6000803e3d6000fd5b505050506040513d602081101562000dad57600080fd5b50511562000dba57600080fd5b6040517fe0df5b6f000000000000000000000000000000000000000000000000000000008152602060048201818152875160248401528751600160a060020a038a169363e0df5b6f938a939283926044019185019080838360005b8381101562000e2f57818101518382015260200162000e15565b50505050905090810190601f16801562000e5d5780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b15801562000e7d57600080fd5b505af115801562000e92573d6000803e3d6000fd5b50505050600193505b50505092915050565b6000806000878787878762000eb862001c55565b60ff841660408201526060810183905260a080825286519082015285518190602080830191608084019160c0850191908b019080838360005b8381101562000f0b57818101518382015260200162000ef1565b50505050905090810190601f16801562000f395780820380516001836020036101000a031916815260200191505b5084810383528851815288516020918201918a019080838360005b8381101562000f6e57818101518382015260200162000f54565b50505050905090810190601f16801562000f9c5780820380516001836020036101000a031916815260200191505b50848103825285518152855160209182019187019080838360005b8381101562000fd157818101518382015260200162000fb7565b50505050905090810190601f16801562000fff5780820380516001836020036101000a031916815260200191505b5098505050505050505050604051809103906000f08015801562001027573d6000803e3d6000fd5b50600754600654919350600160a060020a039081169116836200104962001c66565b600160a060020a03938416815291831660208301529091166040808301919091525190819003606001906000f08015801562001089573d6000803e3d6000fd5b50905081600160a060020a031663a9059cbb82876040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015620010f057600080fd5b505af115801562001105573d6000803e3d6000fd5b505050506040513d60208110156200111c57600080fd5b505115156200112a57600080fd5b80600160a060020a0316638bc0b8876040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156200116957600080fd5b505af11580156200117e573d6000803e3d6000fd5b505050506040513d60208110156200119557600080fd5b50511515620011a357600080fd5b6040805160a08101825289815260ff8816602080830191909152818301889052336060830152600160a060020a0384811660808401528516600090815260058252929092208151805192939192620011ff928492019062001c77565b5060208201516001828101805460ff191660ff909316929092179091556040808401516002840155606084015160038401805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03938416179091556080909501516004909401805486169482169490941790935560088054928301815560009081527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee39092018054909416928616928317909355915133927fd5f9bdf12adf29dab0248c349842c3822d53ae2bb4f36352f301630d018c813991a3509695505050505050565b600160a060020a03808216600090815260056020526040902060040154168015156200065c57600080fd5b600354600090819060ff1615156200132757600080fd5b600654600160a060020a031633146200133f57600080fd5b600154600160a060020a0380851660009081526005602052604090206003015485928216911681146200137157600080fd5b6200137c85620012e5565b600654600254604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a0380861660048301526024820193909352905193965091169163095ea7b3916044808201926020929091908290030181600087803b158015620013f257600080fd5b505af115801562001407573d6000803e3d6000fd5b505050506040513d60208110156200141e57600080fd5b505115156200142c57600080fd5b6006546002546040805160e060020a63de683a7d028152600160a060020a03938416600482015260248101929092528783166044830152519185169163de683a7d916064808201926020929091908290030181600087803b1580156200149157600080fd5b505af1158015620014a6573d6000803e3d6000fd5b505050506040513d6020811015620014bd57600080fd5b50516001546040805160e060020a63a9059cbb028152600160a060020a0392831660048201526024810184905290519296509087169163a9059cbb916044808201926020929091908290030181600087803b1580156200151c57600080fd5b505af115801562001531573d6000803e3d6000fd5b505050506040513d60208110156200154857600080fd5b50511515620009a757600080fd5b6000620015633362000620565b1515620015735750600062001626565b6040805160608101825233808252600160a060020a038816602083018190529183018790526000805473ffffffffffffffffffffffffffffffffffffffff19908116909217905560018054909116909117815560028690556003805460ff191690911790555130908490849080838380828437820191505092505050600060405180830381855af491505015156200161857506003805460ff19169055600062001626565b506003805460ff1916905560015b949350505050565b600454600160a060020a031681565b60006200165e85858585602060405190810160405280600081525062000ea4565b95945050505050565b600160a060020a0380831660009081526005602052604081206003015490918291859133911681146200169957600080fd5b620016a486620012e5565b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018890529051919450600160a060020a038816916323b872dd916064808201926020929091908290030181600087803b1580156200171757600080fd5b505af11580156200172c573d6000803e3d6000fd5b505050506040513d60208110156200174357600080fd5b505115156200175157600080fd5b85600160a060020a031663095ea7b384876040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015620017b557600080fd5b505af1158015620017ca573d6000803e3d6000fd5b505050506040513d6020811015620017e157600080fd5b50511515620017ef57600080fd5b6006546040805160e060020a63de683a7d028152600160a060020a03898116600483015260248201899052928316604482015290519185169163de683a7d916064808201926020929091908290030181600087803b1580156200185157600080fd5b505af115801562001866573d6000803e3d6000fd5b505050506040513d60208110156200187d57600080fd5b50516006546040805160e060020a63a9059cbb028152336004820152602481018490529051929650600160a060020a039091169163a9059cbb916044808201926020929091908290030181600087803b158015620018da57600080fd5b505af1158015620018ef573d6000803e3d6000fd5b505050506040513d60208110156200190657600080fd5b5051151562000e9b57600080fd5b6003546000906101009004600160a060020a031633146200193457600080fd5b6003546040805160e060020a63a9059cbb028152610100909204600160a060020a0390811660048401526024830185905290519085169163a9059cbb9160448083019260209291908290030181600087803b1580156200199357600080fd5b505af1158015620019a8573d6000803e3d6000fd5b505050506040513d6020811015620019bf57600080fd5b50519392505050565b600160a060020a038083166000908152600560205260408120600301549091829185913391168114620019fa57600080fd5b6000851162001a0857600080fd5b62001a1386620012e5565b600654604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018990529051929550600160a060020a03909116916323b872dd916064808201926020929091908290030181600087803b15801562001a8a57600080fd5b505af115801562001a9f573d6000803e3d6000fd5b505050506040513d602081101562001ab657600080fd5b5051151562001ac457600080fd5b600654604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152602482018990529151919092169163095ea7b39160448083019260209291908290030181600087803b15801562001b3457600080fd5b505af115801562001b49573d6000803e3d6000fd5b505050506040513d602081101562001b6057600080fd5b5051151562001b6e57600080fd5b6006546040805160e060020a63de683a7d028152600160a060020a03928316600482015260248101889052888316604482015290519185169163de683a7d916064808201926020929091908290030181600087803b15801562001bd057600080fd5b505af115801562001be5573d6000803e3d6000fd5b505050506040513d602081101562001bfc57600080fd5b50516040805160e060020a63a9059cbb028152336004820152602481018390529051919550600160a060020a0388169163a9059cbb916044808201926020929091908290030181600087803b158015620018da57600080fd5b604051610fc18062001d1d83390190565b60405161074c8062002cde83390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062001cba57805160ff191683800117855562001cea565b8280016001018555821562001cea579182015b8281111562001cea57825182559160200191906001019062001ccd565b5062001cf892915062001cfc565b5090565b62001d1991905b8082111562001cf8576000815560010162001d03565b90560060806040523480156200001157600080fd5b5060405162000fc138038062000fc183398101604090815281516020830151918301516060840151608085015160048054600160a060020a03191633179055928501949384019391929091018115156200006a57600080fd5b845115156200007857600080fd5b835115156200008657600080fd5b60018290558451620000a0906006906020880190620000fb565b508351620000b6906007906020870190620000fb565b506008805460ff191660ff85161790558051620000db906009906020840190620000fb565b50506001543360009081526003602052604090205550620001a092505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200013e57805160ff19168380011785556200016e565b828001600101855582156200016e579182015b828111156200016e57825182559160200191906001019062000151565b506200017c92915062000180565b5090565b6200019d91905b808211156200017c576000815560010162000187565b90565b610e1180620001b06000396000f3006080604052600436106100f05763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100f55780630952c5041461017f578063095ea7b3146101a257806318160ddd146101da57806323b872dd14610201578063313ce5671461022b5780633c130d90146102565780634000aea01461026b57806370a08231146102d457806379ba5097146102f55780638da5cb5b1461030a57806395d89b411461033b578063a9059cbb14610350578063d091b55014610374578063dc39d06d14610389578063dd62ed3e146103ad578063e0df5b6f146103d4575b600080fd5b34801561010157600080fd5b5061010a61042d565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561014457818101518382015260200161012c565b50505050905090810190601f1680156101715780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561018b57600080fd5b506101a0600160a060020a03600435166104bb565b005b3480156101ae57600080fd5b506101c6600160a060020a0360043516602435610546565b604080519115158252519081900360200190f35b3480156101e657600080fd5b506101ef6105ea565b60408051918252519081900360200190f35b34801561020d57600080fd5b506101c6600160a060020a03600435811690602435166044356105f0565b34801561023757600080fd5b50610240610712565b6040805160ff9092168252519081900360200190f35b34801561026257600080fd5b5061010a61071b565b34801561027757600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526101c6948235600160a060020a03169460248035953695946064949201919081908401838280828437509497506107769650505050505050565b3480156102e057600080fd5b506101ef600160a060020a036004351661086d565b34801561030157600080fd5b506101a0610888565b34801561031657600080fd5b5061031f610910565b60408051600160a060020a039092168252519081900360200190f35b34801561034757600080fd5b5061010a61091f565b34801561035c57600080fd5b506101c6600160a060020a036004351660243561097a565b34801561038057600080fd5b5061031f610a41565b34801561039557600080fd5b506101c6600160a060020a0360043516602435610a50565b3480156103b957600080fd5b506101ef600160a060020a0360043581169060243516610b0d565b3480156103e057600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101a0943694929360249392840191908190840183828082843750949750610b389650505050505050565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104b35780601f10610488576101008083540402835291602001916104b3565b820191906000526020600020905b81548152906001019060200180831161049657829003601f168201915b505050505081565b600454600160a060020a031633146104d257600080fd5b600160a060020a03811615156104e757600080fd5b6005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03838116919091179182905560405191169033907f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec490600090a350565b600081158015906105795750336000908152600260209081526040808320600160a060020a038716845290915290205415155b1561058357600080fd5b336000818152600260209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b60015481565b600080600160a060020a038416151561060857600080fd5b50600160a060020a03841660008181526002602090815260408083203384528252808320549383526003909152902054610648908463ffffffff610bff16565b600160a060020a03808716600090815260036020526040808220939093559086168152205461067d908463ffffffff610c1416565b600160a060020a0385166000908152600360205260409020556106a6818463ffffffff610bff16565b600160a060020a03808716600081815260026020908152604080832033845282529182902094909455805187815290519288169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a3506001949350505050565b60085460ff1681565b6009805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104b35780601f10610488576101008083540402835291602001916104b3565b6000610782848461097a565b151561078d57600080fd5b83600160a060020a031633600160a060020a03167fce8124fd2ae9fd7904103e5a9ebe88b527b9ca0e32a32fd497845c82706542d385856040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156108075781810151838201526020016107ef565b50505050905090810190601f1680156108345780820380516001836020036101000a031916815260200191505b50935050505060405180910390a361084b84610c26565b156108625761085b848484610c2e565b9050610866565b5060015b9392505050565b600160a060020a031660009081526003602052604090205490565b600554600090600160a060020a031633146108a257600080fd5b50600480546005805473ffffffffffffffffffffffffffffffffffffffff19808416600160a060020a038381169190911795869055911690915560405191811692169082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b600454600160a060020a031681565b6007805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104b35780601f10610488576101008083540402835291602001916104b3565b6000600160a060020a038316151561099157600080fd5b336000908152600360205260409020546109b1908363ffffffff610bff16565b3360009081526003602052604080822092909255600160a060020a038516815220546109e3908363ffffffff610c1416565b600160a060020a0384166000818152600360209081526040918290209390935580518581529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b600554600160a060020a031681565b600454600090600160a060020a03163314610a6a57600080fd5b60048054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039283169381019390935260248301859052519085169163a9059cbb9160448083019260209291908290030181600087803b158015610ada57600080fd5b505af1158015610aee573d6000803e3d6000fd5b505050506040513d6020811015610b0457600080fd5b50519392505050565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b600454600160a060020a03163314610b4f57600080fd5b8051610b62906009906020840190610d4a565b507f2eb900bac6e5b21f659a14cf4e0b4a5689edb16947c549906436bc73b7053d16816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bc2578181015183820152602001610baa565b50505050905090810190601f168015610bef5780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b600082821115610c0e57600080fd5b50900390565b60008282018381101561086657600080fd5b6000903b1190565b6040517fc0ee0b8a0000000000000000000000000000000000000000000000000000000081523360048201818152602483018590526060604484019081528451606485015284516000948894600160a060020a0386169463c0ee0b8a9491938a938a939160849091019060208501908083838e5b83811015610cba578181015183820152602001610ca2565b50505050905090810190601f168015610ce75780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610d0857600080fd5b505af1158015610d1c573d6000803e3d6000fd5b505050506040513d6020811015610d3257600080fd5b50511515610d3f57600080fd5b506001949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610d8b57805160ff1916838001178555610db8565b82800160010185558215610db8579182015b82811115610db8578251825591602001919060010190610d9d565b50610dc4929150610dc8565b5090565b610de291905b80821115610dc45760008155600101610dce565b905600a165627a7a723058209639595b3309c99105a7c374771b79578020c23eb8380eebb58de8d7506449130029608060405234801561001057600080fd5b5060405160608061074c8339810160409081528151602083015191909201516003805461010060a860020a0319163361010002179055600080806060600160a060020a038716151561006157600080fd5b60408051606480825260a082019092527f6dd23b5b000000000000000000000000000000000000000000000000000000009550606094509092508260208201610c808038833901905050905083602082015286602482015285604482015284606482015286600160a060020a03168160405180828051906020019080838360005b838110156100fa5781810151838201526020016100e2565b50505050905090810190601f1680156101275780820380516001836020036101000a031916815260200191505b50915050600060405180830381855af4915050151561014557600080fd5b505050505050506105f18061015b6000396000f3006080604052600436106100e55763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663061f765081146101325780630952c504146101675780630a4010861461018a57806325be124e1461019f57806363ddc54d146101d057806365581793146101e55780637826f28f1461020c57806379ba5097146102215780638da5cb5b14610236578063aaf5eb681461024b578063b22dd2ca14610260578063c0ee0b8a14610275578063d091b550146102a6578063d21220a7146102bb578063eff3c4e7146102d0578063fee2cb05146102e5575b3480156100f157600080fd5b50600b54620100009004600160a060020a0316600036111561012f5736600060ff37602060003660ff845af480801561012a5760206000f35b600080fd5b50005b34801561013e57600080fd5b50610153600160a060020a03600435166102fa565b604080519115158252519081900360200190f35b34801561017357600080fd5b50610188600160a060020a036004351661032c565b005b34801561019657600080fd5b506101536103bc565b3480156101ab57600080fd5b506101b46103c5565b60408051600160a060020a039092168252519081900360200190f35b3480156101dc57600080fd5b506101b46103d4565b3480156101f157600080fd5b506101fa6103e9565b60408051918252519081900360200190f35b34801561021857600080fd5b506101fa6103ef565b34801561022d57600080fd5b506101886103f5565b34801561024257600080fd5b506101b461049b565b34801561025757600080fd5b506101fa6104af565b34801561026c57600080fd5b506101fa6104bb565b34801561028157600080fd5b5061015360048035600160a060020a03169060248035916044359182019101356104c1565b3480156102b257600080fd5b506101b4610593565b3480156102c757600080fd5b506101b46105a2565b3480156102dc57600080fd5b506101536105b1565b3480156102f157600080fd5b506101fa6105bf565b600554600090600160a060020a03838116911614806103265750600654600160a060020a038381169116145b92915050565b6003546101009004600160a060020a0316331461034857600080fd5b600160a060020a038116151561035d57600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03838116919091179182905560405191169033907f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec490600090a350565b600b5460ff1681565b600654600160a060020a031681565b600b54620100009004600160a060020a031681565b600a5481565b60095481565b600454600090600160a060020a0316331461040f57600080fd5b506003805460048054600160a060020a0381811661010090810274ffffffffffffffffffffffffffffffffffffffff00198616179586905573ffffffffffffffffffffffffffffffffffffffff199092169092556040519281900482169304169082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6003546101009004600160a060020a031681565b670de0b6b3a764000081565b60075481565b60006104cc336102fa565b15156104da5750600061058b565b6040805160608101825233808252600160a060020a038816602083018190529183018790526000805473ffffffffffffffffffffffffffffffffffffffff19908116909217905560018054909116909117815560028690556003805460ff191690911790555130908490849080838380828437820191505092505050600060405180830381855af4915050151561057d57506003805460ff19169055600061058b565b506003805460ff1916905560015b949350505050565b600454600160a060020a031681565b600554600160a060020a031681565b600b54610100900460ff1681565b600854815600a165627a7a72305820988e41707ba319a85965f953a58b1b4c5bd3240eb4afca0a7731851035ddb50a0029a165627a7a723058201daafcbdd3bfa143178a13f29197811fc4d9f839bb22344767259af627422ae90029000000000000000000000000c70636e0886ec4a4f2b7e42ac57ccd1b976352d00000000000000000000000004162178b78d6985480a308b2190ee5517460406d

Deployed Bytecode

0x6080604052600436106200010d5763ffffffff60e060020a600035041663061f76508114620001125780630952c504146200014a578063115bdfe7146200017057806321a4c6c3146200023b578063451cd22d146200025f5780634d68954314620002935780634daadff914620002ab5780634f64b2be14620002d557806379ba509714620002f05780638da5cb5b146200030857806398d7352f1462000320578063a49cc76c146200038a578063ac3c49e01462000472578063b7073d2e1462000496578063c0ee0b8a14620004ba578063d091b55014620004ee578063d8bd47611462000506578063d9eb547b14620005ab578063dc39d06d14620005d2578063e5714ea314620005f9575b600080fd5b3480156200011f57600080fd5b5062000136600160a060020a036004351662000620565b604080519115158252519081900360200190f35b3480156200015757600080fd5b506200016e600160a060020a036004351662000661565b005b3480156200017d57600080fd5b5062000194600160a060020a0360043516620006f3565b6040805160ff8616602080830191909152918101859052600160a060020a0380851660608301528316608082015260a080825287519082015286519091829160c083019189019080838360005b83811015620001fb578181015183820152602001620001e1565b50505050905090810190601f168015620002295780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b3480156200024857600080fd5b5062000136600160a060020a0360043516620007c2565b3480156200026c57600080fd5b5062000277620009af565b60408051600160a060020a039092168252519081900360200190f35b348015620002a057600080fd5b5062000277620009be565b348015620002b857600080fd5b50620002c3620009cd565b60408051918252519081900360200190f35b348015620002e257600080fd5b506200027760043562000bf9565b348015620002fd57600080fd5b506200016e62000c22565b3480156200031557600080fd5b506200027762000cc9565b3480156200032d57600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855262000136958335600160a060020a031695369560449491939091019190819084018382808284375094975062000cdd9650505050505050565b3480156200039757600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526200027794369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375050604080516020888301358a018035601f8101839004830284018301909452838352979a893560ff169a8a8301359a9199909850606090910196509194509081019250819084018382808284375094975062000ea49650505050505050565b3480156200047f57600080fd5b5062000277600160a060020a0360043516620012e5565b348015620004a357600080fd5b50620002c3600160a060020a036004351662001310565b348015620004c757600080fd5b506200013660048035600160a060020a031690602480359160443591820191013562001556565b348015620004fb57600080fd5b50620002776200162e565b3480156200051357600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526200027794369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497505050833560ff169450505060209091013590506200163d565b348015620005b857600080fd5b50620002c3600160a060020a036004351660243562001667565b348015620005df57600080fd5b5062000136600160a060020a036004351660243562001914565b3480156200060657600080fd5b50620002c3600160a060020a0360043516602435620019c8565b600654600090600160a060020a0383811691161480620006595750600160a060020a038216600090815260056020526040812060020154115b90505b919050565b6003546101009004600160a060020a031633146200067e57600080fd5b600160a060020a03811615156200069457600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03838116919091179182905560405191169033907f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec490600090a350565b60056020908152600091825260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529092918391908301828280156200078e5780601f1062000762576101008083540402835291602001916200078e565b820191906000526020600020905b8154815290600101906020018083116200077057829003601f168201915b505050600184015460028501546003860154600490960154949560ff90921694909350600160a060020a0391821692501685565b600160a060020a038082166000908152600560205260408120600301549091829184913391168114620007f457600080fd5b620007ff85620012e5565b925082600160a060020a031663ec3324886040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156200084057600080fd5b505af115801562000855573d6000803e3d6000fd5b505050506040513d60208110156200086c57600080fd5b505115156200087a57600080fd5b604080517f0952c5040000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03851691630952c50491602480830192600092919082900301818387803b158015620008db57600080fd5b505af1158015620008f0573d6000803e3d6000fd5b5050604080517f0952c5040000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a0389169350630952c5049250602480830192600092919082900301818387803b1580156200095557600080fd5b505af11580156200096a573d6000803e3d6000fd5b5050604051600160a060020a03861692507fd89dc0ad0949ca0a2fb2c8b9bd54f53eef80290fdbb947a3e778efe61e6fef929150600090a2600193505b505050919050565b600654600160a060020a031681565b600754600160a060020a031681565b600354600090819060ff161515620009e457600080fd5b600154336000818152600560205260409020600301549091600160a060020a039081169116811462000a1557600080fd5b62000a2033620012e5565b600254604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a0384166004820152602481019290925251919450339163095ea7b3916044808201926020929091908290030181600087803b15801562000a9057600080fd5b505af115801562000aa5573d6000803e3d6000fd5b505050506040513d602081101562000abc57600080fd5b5051151562000aca57600080fd5b6002546006546040805160e060020a63de683a7d0281523360048201526024810193909352600160a060020a039182166044840152519085169163de683a7d9160648083019260209291908290030181600087803b15801562000b2c57600080fd5b505af115801562000b41573d6000803e3d6000fd5b505050506040513d602081101562000b5857600080fd5b50516006546001546040805160e060020a63a9059cbb028152600160a060020a03928316600482015260248101859052905193975091169163a9059cbb916044808201926020929091908290030181600087803b15801562000bb957600080fd5b505af115801562000bce573d6000803e3d6000fd5b505050506040513d602081101562000be557600080fd5b5051151562000bf357600080fd5b50505090565b600880548290811062000c0857fe5b600091825260209091200154600160a060020a0316905081565b600454600090600160a060020a0316331462000c3d57600080fd5b506003805460048054600160a060020a0381811661010090810274ffffffffffffffffffffffffffffffffffffffff00198616179586905573ffffffffffffffffffffffffffffffffffffffff199092169092556040519281900482169304169082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6003546101009004600160a060020a031681565b600160a060020a0380831660009081526005602052604081206003015490918491339116811462000d0d57600080fd5b600160a060020a03808616600090815260056020908152604080832060049081015482517f727d508a00000000000000000000000000000000000000000000000000000000815292518b96919091169463727d508a94848401949093908390030190829087803b15801562000d8157600080fd5b505af115801562000d96573d6000803e3d6000fd5b505050506040513d602081101562000dad57600080fd5b50511562000dba57600080fd5b6040517fe0df5b6f000000000000000000000000000000000000000000000000000000008152602060048201818152875160248401528751600160a060020a038a169363e0df5b6f938a939283926044019185019080838360005b8381101562000e2f57818101518382015260200162000e15565b50505050905090810190601f16801562000e5d5780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b15801562000e7d57600080fd5b505af115801562000e92573d6000803e3d6000fd5b50505050600193505b50505092915050565b6000806000878787878762000eb862001c55565b60ff841660408201526060810183905260a080825286519082015285518190602080830191608084019160c0850191908b019080838360005b8381101562000f0b57818101518382015260200162000ef1565b50505050905090810190601f16801562000f395780820380516001836020036101000a031916815260200191505b5084810383528851815288516020918201918a019080838360005b8381101562000f6e57818101518382015260200162000f54565b50505050905090810190601f16801562000f9c5780820380516001836020036101000a031916815260200191505b50848103825285518152855160209182019187019080838360005b8381101562000fd157818101518382015260200162000fb7565b50505050905090810190601f16801562000fff5780820380516001836020036101000a031916815260200191505b5098505050505050505050604051809103906000f08015801562001027573d6000803e3d6000fd5b50600754600654919350600160a060020a039081169116836200104962001c66565b600160a060020a03938416815291831660208301529091166040808301919091525190819003606001906000f08015801562001089573d6000803e3d6000fd5b50905081600160a060020a031663a9059cbb82876040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015620010f057600080fd5b505af115801562001105573d6000803e3d6000fd5b505050506040513d60208110156200111c57600080fd5b505115156200112a57600080fd5b80600160a060020a0316638bc0b8876040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156200116957600080fd5b505af11580156200117e573d6000803e3d6000fd5b505050506040513d60208110156200119557600080fd5b50511515620011a357600080fd5b6040805160a08101825289815260ff8816602080830191909152818301889052336060830152600160a060020a0384811660808401528516600090815260058252929092208151805192939192620011ff928492019062001c77565b5060208201516001828101805460ff191660ff909316929092179091556040808401516002840155606084015160038401805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03938416179091556080909501516004909401805486169482169490941790935560088054928301815560009081527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee39092018054909416928616928317909355915133927fd5f9bdf12adf29dab0248c349842c3822d53ae2bb4f36352f301630d018c813991a3509695505050505050565b600160a060020a03808216600090815260056020526040902060040154168015156200065c57600080fd5b600354600090819060ff1615156200132757600080fd5b600654600160a060020a031633146200133f57600080fd5b600154600160a060020a0380851660009081526005602052604090206003015485928216911681146200137157600080fd5b6200137c85620012e5565b600654600254604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a0380861660048301526024820193909352905193965091169163095ea7b3916044808201926020929091908290030181600087803b158015620013f257600080fd5b505af115801562001407573d6000803e3d6000fd5b505050506040513d60208110156200141e57600080fd5b505115156200142c57600080fd5b6006546002546040805160e060020a63de683a7d028152600160a060020a03938416600482015260248101929092528783166044830152519185169163de683a7d916064808201926020929091908290030181600087803b1580156200149157600080fd5b505af1158015620014a6573d6000803e3d6000fd5b505050506040513d6020811015620014bd57600080fd5b50516001546040805160e060020a63a9059cbb028152600160a060020a0392831660048201526024810184905290519296509087169163a9059cbb916044808201926020929091908290030181600087803b1580156200151c57600080fd5b505af115801562001531573d6000803e3d6000fd5b505050506040513d60208110156200154857600080fd5b50511515620009a757600080fd5b6000620015633362000620565b1515620015735750600062001626565b6040805160608101825233808252600160a060020a038816602083018190529183018790526000805473ffffffffffffffffffffffffffffffffffffffff19908116909217905560018054909116909117815560028690556003805460ff191690911790555130908490849080838380828437820191505092505050600060405180830381855af491505015156200161857506003805460ff19169055600062001626565b506003805460ff1916905560015b949350505050565b600454600160a060020a031681565b60006200165e85858585602060405190810160405280600081525062000ea4565b95945050505050565b600160a060020a0380831660009081526005602052604081206003015490918291859133911681146200169957600080fd5b620016a486620012e5565b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018890529051919450600160a060020a038816916323b872dd916064808201926020929091908290030181600087803b1580156200171757600080fd5b505af11580156200172c573d6000803e3d6000fd5b505050506040513d60208110156200174357600080fd5b505115156200175157600080fd5b85600160a060020a031663095ea7b384876040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015620017b557600080fd5b505af1158015620017ca573d6000803e3d6000fd5b505050506040513d6020811015620017e157600080fd5b50511515620017ef57600080fd5b6006546040805160e060020a63de683a7d028152600160a060020a03898116600483015260248201899052928316604482015290519185169163de683a7d916064808201926020929091908290030181600087803b1580156200185157600080fd5b505af115801562001866573d6000803e3d6000fd5b505050506040513d60208110156200187d57600080fd5b50516006546040805160e060020a63a9059cbb028152336004820152602481018490529051929650600160a060020a039091169163a9059cbb916044808201926020929091908290030181600087803b158015620018da57600080fd5b505af1158015620018ef573d6000803e3d6000fd5b505050506040513d60208110156200190657600080fd5b5051151562000e9b57600080fd5b6003546000906101009004600160a060020a031633146200193457600080fd5b6003546040805160e060020a63a9059cbb028152610100909204600160a060020a0390811660048401526024830185905290519085169163a9059cbb9160448083019260209291908290030181600087803b1580156200199357600080fd5b505af1158015620019a8573d6000803e3d6000fd5b505050506040513d6020811015620019bf57600080fd5b50519392505050565b600160a060020a038083166000908152600560205260408120600301549091829185913391168114620019fa57600080fd5b6000851162001a0857600080fd5b62001a1386620012e5565b600654604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018990529051929550600160a060020a03909116916323b872dd916064808201926020929091908290030181600087803b15801562001a8a57600080fd5b505af115801562001a9f573d6000803e3d6000fd5b505050506040513d602081101562001ab657600080fd5b5051151562001ac457600080fd5b600654604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152602482018990529151919092169163095ea7b39160448083019260209291908290030181600087803b15801562001b3457600080fd5b505af115801562001b49573d6000803e3d6000fd5b505050506040513d602081101562001b6057600080fd5b5051151562001b6e57600080fd5b6006546040805160e060020a63de683a7d028152600160a060020a03928316600482015260248101889052888316604482015290519185169163de683a7d916064808201926020929091908290030181600087803b15801562001bd057600080fd5b505af115801562001be5573d6000803e3d6000fd5b505050506040513d602081101562001bfc57600080fd5b50516040805160e060020a63a9059cbb028152336004820152602481018390529051919550600160a060020a0388169163a9059cbb916044808201926020929091908290030181600087803b158015620018da57600080fd5b604051610fc18062001d1d83390190565b60405161074c8062002cde83390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062001cba57805160ff191683800117855562001cea565b8280016001018555821562001cea579182015b8281111562001cea57825182559160200191906001019062001ccd565b5062001cf892915062001cfc565b5090565b62001d1991905b8082111562001cf8576000815560010162001d03565b90560060806040523480156200001157600080fd5b5060405162000fc138038062000fc183398101604090815281516020830151918301516060840151608085015160048054600160a060020a03191633179055928501949384019391929091018115156200006a57600080fd5b845115156200007857600080fd5b835115156200008657600080fd5b60018290558451620000a0906006906020880190620000fb565b508351620000b6906007906020870190620000fb565b506008805460ff191660ff85161790558051620000db906009906020840190620000fb565b50506001543360009081526003602052604090205550620001a092505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200013e57805160ff19168380011785556200016e565b828001600101855582156200016e579182015b828111156200016e57825182559160200191906001019062000151565b506200017c92915062000180565b5090565b6200019d91905b808211156200017c576000815560010162000187565b90565b610e1180620001b06000396000f3006080604052600436106100f05763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146100f55780630952c5041461017f578063095ea7b3146101a257806318160ddd146101da57806323b872dd14610201578063313ce5671461022b5780633c130d90146102565780634000aea01461026b57806370a08231146102d457806379ba5097146102f55780638da5cb5b1461030a57806395d89b411461033b578063a9059cbb14610350578063d091b55014610374578063dc39d06d14610389578063dd62ed3e146103ad578063e0df5b6f146103d4575b600080fd5b34801561010157600080fd5b5061010a61042d565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561014457818101518382015260200161012c565b50505050905090810190601f1680156101715780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561018b57600080fd5b506101a0600160a060020a03600435166104bb565b005b3480156101ae57600080fd5b506101c6600160a060020a0360043516602435610546565b604080519115158252519081900360200190f35b3480156101e657600080fd5b506101ef6105ea565b60408051918252519081900360200190f35b34801561020d57600080fd5b506101c6600160a060020a03600435811690602435166044356105f0565b34801561023757600080fd5b50610240610712565b6040805160ff9092168252519081900360200190f35b34801561026257600080fd5b5061010a61071b565b34801561027757600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526101c6948235600160a060020a03169460248035953695946064949201919081908401838280828437509497506107769650505050505050565b3480156102e057600080fd5b506101ef600160a060020a036004351661086d565b34801561030157600080fd5b506101a0610888565b34801561031657600080fd5b5061031f610910565b60408051600160a060020a039092168252519081900360200190f35b34801561034757600080fd5b5061010a61091f565b34801561035c57600080fd5b506101c6600160a060020a036004351660243561097a565b34801561038057600080fd5b5061031f610a41565b34801561039557600080fd5b506101c6600160a060020a0360043516602435610a50565b3480156103b957600080fd5b506101ef600160a060020a0360043581169060243516610b0d565b3480156103e057600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526101a0943694929360249392840191908190840183828082843750949750610b389650505050505050565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104b35780601f10610488576101008083540402835291602001916104b3565b820191906000526020600020905b81548152906001019060200180831161049657829003601f168201915b505050505081565b600454600160a060020a031633146104d257600080fd5b600160a060020a03811615156104e757600080fd5b6005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03838116919091179182905560405191169033907f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec490600090a350565b600081158015906105795750336000908152600260209081526040808320600160a060020a038716845290915290205415155b1561058357600080fd5b336000818152600260209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b60015481565b600080600160a060020a038416151561060857600080fd5b50600160a060020a03841660008181526002602090815260408083203384528252808320549383526003909152902054610648908463ffffffff610bff16565b600160a060020a03808716600090815260036020526040808220939093559086168152205461067d908463ffffffff610c1416565b600160a060020a0385166000908152600360205260409020556106a6818463ffffffff610bff16565b600160a060020a03808716600081815260026020908152604080832033845282529182902094909455805187815290519288169391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a3506001949350505050565b60085460ff1681565b6009805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104b35780601f10610488576101008083540402835291602001916104b3565b6000610782848461097a565b151561078d57600080fd5b83600160a060020a031633600160a060020a03167fce8124fd2ae9fd7904103e5a9ebe88b527b9ca0e32a32fd497845c82706542d385856040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156108075781810151838201526020016107ef565b50505050905090810190601f1680156108345780820380516001836020036101000a031916815260200191505b50935050505060405180910390a361084b84610c26565b156108625761085b848484610c2e565b9050610866565b5060015b9392505050565b600160a060020a031660009081526003602052604090205490565b600554600090600160a060020a031633146108a257600080fd5b50600480546005805473ffffffffffffffffffffffffffffffffffffffff19808416600160a060020a038381169190911795869055911690915560405191811692169082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b600454600160a060020a031681565b6007805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156104b35780601f10610488576101008083540402835291602001916104b3565b6000600160a060020a038316151561099157600080fd5b336000908152600360205260409020546109b1908363ffffffff610bff16565b3360009081526003602052604080822092909255600160a060020a038516815220546109e3908363ffffffff610c1416565b600160a060020a0384166000818152600360209081526040918290209390935580518581529051919233927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a350600192915050565b600554600160a060020a031681565b600454600090600160a060020a03163314610a6a57600080fd5b60048054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039283169381019390935260248301859052519085169163a9059cbb9160448083019260209291908290030181600087803b158015610ada57600080fd5b505af1158015610aee573d6000803e3d6000fd5b505050506040513d6020811015610b0457600080fd5b50519392505050565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b600454600160a060020a03163314610b4f57600080fd5b8051610b62906009906020840190610d4a565b507f2eb900bac6e5b21f659a14cf4e0b4a5689edb16947c549906436bc73b7053d16816040518080602001828103825283818151815260200191508051906020019080838360005b83811015610bc2578181015183820152602001610baa565b50505050905090810190601f168015610bef5780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b600082821115610c0e57600080fd5b50900390565b60008282018381101561086657600080fd5b6000903b1190565b6040517fc0ee0b8a0000000000000000000000000000000000000000000000000000000081523360048201818152602483018590526060604484019081528451606485015284516000948894600160a060020a0386169463c0ee0b8a9491938a938a939160849091019060208501908083838e5b83811015610cba578181015183820152602001610ca2565b50505050905090810190601f168015610ce75780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610d0857600080fd5b505af1158015610d1c573d6000803e3d6000fd5b505050506040513d6020811015610d3257600080fd5b50511515610d3f57600080fd5b506001949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610d8b57805160ff1916838001178555610db8565b82800160010185558215610db8579182015b82811115610db8578251825591602001919060010190610d9d565b50610dc4929150610dc8565b5090565b610de291905b80821115610dc45760008155600101610dce565b905600a165627a7a723058209639595b3309c99105a7c374771b79578020c23eb8380eebb58de8d7506449130029608060405234801561001057600080fd5b5060405160608061074c8339810160409081528151602083015191909201516003805461010060a860020a0319163361010002179055600080806060600160a060020a038716151561006157600080fd5b60408051606480825260a082019092527f6dd23b5b000000000000000000000000000000000000000000000000000000009550606094509092508260208201610c808038833901905050905083602082015286602482015285604482015284606482015286600160a060020a03168160405180828051906020019080838360005b838110156100fa5781810151838201526020016100e2565b50505050905090810190601f1680156101275780820380516001836020036101000a031916815260200191505b50915050600060405180830381855af4915050151561014557600080fd5b505050505050506105f18061015b6000396000f3006080604052600436106100e55763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663061f765081146101325780630952c504146101675780630a4010861461018a57806325be124e1461019f57806363ddc54d146101d057806365581793146101e55780637826f28f1461020c57806379ba5097146102215780638da5cb5b14610236578063aaf5eb681461024b578063b22dd2ca14610260578063c0ee0b8a14610275578063d091b550146102a6578063d21220a7146102bb578063eff3c4e7146102d0578063fee2cb05146102e5575b3480156100f157600080fd5b50600b54620100009004600160a060020a0316600036111561012f5736600060ff37602060003660ff845af480801561012a5760206000f35b600080fd5b50005b34801561013e57600080fd5b50610153600160a060020a03600435166102fa565b604080519115158252519081900360200190f35b34801561017357600080fd5b50610188600160a060020a036004351661032c565b005b34801561019657600080fd5b506101536103bc565b3480156101ab57600080fd5b506101b46103c5565b60408051600160a060020a039092168252519081900360200190f35b3480156101dc57600080fd5b506101b46103d4565b3480156101f157600080fd5b506101fa6103e9565b60408051918252519081900360200190f35b34801561021857600080fd5b506101fa6103ef565b34801561022d57600080fd5b506101886103f5565b34801561024257600080fd5b506101b461049b565b34801561025757600080fd5b506101fa6104af565b34801561026c57600080fd5b506101fa6104bb565b34801561028157600080fd5b5061015360048035600160a060020a03169060248035916044359182019101356104c1565b3480156102b257600080fd5b506101b4610593565b3480156102c757600080fd5b506101b46105a2565b3480156102dc57600080fd5b506101536105b1565b3480156102f157600080fd5b506101fa6105bf565b600554600090600160a060020a03838116911614806103265750600654600160a060020a038381169116145b92915050565b6003546101009004600160a060020a0316331461034857600080fd5b600160a060020a038116151561035d57600080fd5b6004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03838116919091179182905560405191169033907f13a4b3bc0d5234dd3d87c9f1557d8faefa37986da62c36ba49309e2fb2c9aec490600090a350565b600b5460ff1681565b600654600160a060020a031681565b600b54620100009004600160a060020a031681565b600a5481565b60095481565b600454600090600160a060020a0316331461040f57600080fd5b506003805460048054600160a060020a0381811661010090810274ffffffffffffffffffffffffffffffffffffffff00198616179586905573ffffffffffffffffffffffffffffffffffffffff199092169092556040519281900482169304169082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6003546101009004600160a060020a031681565b670de0b6b3a764000081565b60075481565b60006104cc336102fa565b15156104da5750600061058b565b6040805160608101825233808252600160a060020a038816602083018190529183018790526000805473ffffffffffffffffffffffffffffffffffffffff19908116909217905560018054909116909117815560028690556003805460ff191690911790555130908490849080838380828437820191505092505050600060405180830381855af4915050151561057d57506003805460ff19169055600061058b565b506003805460ff1916905560015b949350505050565b600454600160a060020a031681565b600554600160a060020a031681565b600b54610100900460ff1681565b600854815600a165627a7a72305820988e41707ba319a85965f953a58b1b4c5bd3240eb4afca0a7731851035ddb50a0029a165627a7a723058201daafcbdd3bfa143178a13f29197811fc4d9f839bb22344767259af627422ae90029

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000c70636e0886ec4a4f2b7e42ac57ccd1b976352d00000000000000000000000004162178b78d6985480a308b2190ee5517460406d

-----Decoded View---------------
Arg [0] : _mmLib (address): 0xc70636e0886eC4a4F2B7e42aC57ccD1B976352d0
Arg [1] : _clnAddress (address): 0x4162178B78D6985480A308B2190EE5517460406D

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000c70636e0886ec4a4f2b7e42ac57ccd1b976352d0
Arg [1] : 0000000000000000000000004162178b78d6985480a308b2190ee5517460406d


Swarm Source

bzzr://1daafcbdd3bfa143178a13f29197811fc4d9f839bb22344767259af627422ae9

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.