Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0.03 ETH
Eth Value
$68.49 (@ $2,283.01/ETH)More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 621 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Add New User | 10535283 | 1503 days ago | IN | 0 ETH | 0.06414386 | ||||
Add New User | 9697795 | 1633 days ago | IN | 0 ETH | 0.00186826 | ||||
Add New User | 9541513 | 1657 days ago | IN | 0 ETH | 0.00311372 | ||||
Add New User | 9060460 | 1736 days ago | IN | 0 ETH | 0.00619204 | ||||
Transfer | 8877291 | 1767 days ago | IN | 0.03 ETH | 0.00007784 | ||||
Add New User | 8793117 | 1781 days ago | IN | 0 ETH | 0.00309602 | ||||
Add New User | 8582568 | 1814 days ago | IN | 0 ETH | 0.01238408 | ||||
Add New User | 8540948 | 1820 days ago | IN | 0 ETH | 0.01300018 | ||||
Add New User | 8495643 | 1827 days ago | IN | 0 ETH | 0.00866885 | ||||
Add New User | 8431098 | 1837 days ago | IN | 0 ETH | 0.00769582 | ||||
Add New User | 8417590 | 1840 days ago | IN | 0 ETH | 0.00557283 | ||||
Add New User | 7975929 | 1908 days ago | IN | 0 ETH | 0.01238408 | ||||
Add New User | 7956211 | 1911 days ago | IN | 0 ETH | 0.00619204 | ||||
Add New User | 7949414 | 1912 days ago | IN | 0 ETH | 0.00476787 | ||||
Add New User | 7841012 | 1929 days ago | IN | 0 ETH | 0.00619204 | ||||
Add New User | 7735206 | 1946 days ago | IN | 0 ETH | 0.00185761 | ||||
Add New User | 7734561 | 1946 days ago | IN | 0 ETH | 0.00557283 | ||||
Add New User | 7733027 | 1946 days ago | IN | 0 ETH | 0.00495363 | ||||
Add New User | 7731473 | 1947 days ago | IN | 0 ETH | 0.00371522 | ||||
Add New User | 7728025 | 1947 days ago | IN | 0 ETH | 0.00371522 | ||||
Add New User | 7726807 | 1947 days ago | IN | 0 ETH | 0.00433442 | ||||
Add New User | 7719717 | 1948 days ago | IN | 0 ETH | 0.00377714 | ||||
Add New User | 7702576 | 1951 days ago | IN | 0 ETH | 0.00303409 | ||||
Add New User | 7590492 | 1969 days ago | IN | 0 ETH | 0.00433442 | ||||
Add New User | 7580461 | 1970 days ago | IN | 0 ETH | 0.00455114 |
Latest 25 internal transactions (View All)
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
Exchange
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-07-12 */ pragma solidity ^0.4.15; /** * @title Log Various Error Types * @author Adam Lemmon <[email protected]> * @dev Inherit this contract and your may now log errors easily * To support various error types, params, etc. */ contract LoggingErrors { /** * Events */ event LogErrorString(string errorString); /** * Error cases */ /** * @dev Default error to simply log the error message and return * @param _errorMessage The error message to log * @return ALWAYS false */ function error(string _errorMessage) internal returns(bool) { LogErrorString(_errorMessage); return false; } } /** * @title Wallet Connector * @dev Connect the wallet contract to the correct Wallet Logic version */ contract WalletConnector is LoggingErrors { /** * Storage */ address public owner_; address public latestLogic_; uint256 public latestVersion_; mapping(uint256 => address) public logicVersions_; uint256 public birthBlock_; /** * Events */ event LogLogicVersionAdded(uint256 version); event LogLogicVersionRemoved(uint256 version); /** * @dev Constructor to set the latest logic address * @param _latestVersion Latest version of the wallet logic * @param _latestLogic Latest address of the wallet logic contract */ function WalletConnector ( uint256 _latestVersion, address _latestLogic ) public { owner_ = msg.sender; latestLogic_ = _latestLogic; latestVersion_ = _latestVersion; logicVersions_[_latestVersion] = _latestLogic; birthBlock_ = block.number; } /** * Add a new version of the logic contract * @param _version The version to be associated with the new contract. * @param _logic New logic contract. * @return Success of the transaction. */ function addLogicVersion ( uint256 _version, address _logic ) external returns(bool) { if (msg.sender != owner_) return error('msg.sender != owner, WalletConnector.addLogicVersion()'); if (logicVersions_[_version] != 0) return error('Version already exists, WalletConnector.addLogicVersion()'); // Update latest if this is the latest version if (_version > latestVersion_) { latestLogic_ = _logic; latestVersion_ = _version; } logicVersions_[_version] = _logic; LogLogicVersionAdded(_version); return true; } /** * @dev Remove a version. Cannot remove the latest version. * @param _version The version to remove. */ function removeLogicVersion(uint256 _version) external { require(msg.sender == owner_); require(_version != latestVersion_); delete logicVersions_[_version]; LogLogicVersionRemoved(_version); } /** * Constants */ /** * Called from user wallets in order to upgrade their logic. * @param _version The version to upgrade to. NOTE pass in 0 to upgrade to latest. * @return The address of the logic contract to upgrade to. */ function getLogic(uint256 _version) external constant returns(address) { if (_version == 0) return latestLogic_; else return logicVersions_[_version]; } } /** * @title Wallet to hold and trade ERC20 tokens and ether * @author Adam Lemmon <[email protected]> * @dev User wallet to interact with the exchange. * all tokens and ether held in this wallet, 1 to 1 mapping to user EOAs. */ contract Wallet is LoggingErrors { /** * Storage */ // Vars included in wallet logic "lib", the order must match between Wallet and Logic address public owner_; address public exchange_; mapping(address => uint256) public tokenBalances_; address public logic_; // storage location 0x3 loaded for delegatecalls so this var must remain at index 3 uint256 public birthBlock_; // Address updated at deploy time WalletConnector private connector_ = WalletConnector(0x03d6e7b2f48120fd57a89ff0bbd56e9ec39af21c); /** * Events */ event LogDeposit(address token, uint256 amount, uint256 balance); event LogWithdrawal(address token, uint256 amount, uint256 balance); /** * @dev Contract consturtor. Set user as owner and connector address. * @param _owner The address of the user's EOA, wallets created from the exchange * so must past in the owner address, msg.sender == exchange. */ function Wallet(address _owner) public { owner_ = _owner; exchange_ = msg.sender; logic_ = connector_.latestLogic_(); birthBlock_ = block.number; } /** * @dev Fallback - Only enable funds to be sent from the exchange. * Ensures balances will be consistent. */ function () external payable { require(msg.sender == exchange_); } /** * External */ /** * @dev Deposit ether into this wallet, default to address 0 for consistent token lookup. */ function depositEther() external payable { require(logic_.delegatecall(bytes4(sha3('deposit(address,uint256)')), 0, msg.value)); } /** * @dev Deposit any ERC20 token into this wallet. * @param _token The address of the existing token contract. * @param _amount The amount of tokens to deposit. * @return Bool if the deposit was successful. */ function depositERC20Token ( address _token, uint256 _amount ) external returns(bool) { // ether if (_token == 0) return error('Cannot deposit ether via depositERC20, Wallet.depositERC20Token()'); require(logic_.delegatecall(bytes4(sha3('deposit(address,uint256)')), _token, _amount)); return true; } /** * @dev The result of an order, update the balance of this wallet. * @param _token The address of the token balance to update. * @param _amount The amount to update the balance by. * @param _subtractionFlag If true then subtract the token amount else add. * @return Bool if the update was successful. */ function updateBalance ( address _token, uint256 _amount, bool _subtractionFlag ) external returns(bool) { assembly { calldatacopy(0x40, 0, calldatasize) delegatecall(gas, sload(0x3), 0x40, calldatasize, 0, 32) return(0, 32) pop } } /** * User may update to the latest version of the exchange contract. * Note that multiple versions are NOT supported at this time and therefore if a * user does not wish to update they will no longer be able to use the exchange. * @param _exchange The new exchange. * @return Success of this transaction. */ function updateExchange(address _exchange) external returns(bool) { if (msg.sender != owner_) return error('msg.sender != owner_, Wallet.updateExchange()'); // If subsequent messages are not sent from this address all orders will fail exchange_ = _exchange; return true; } /** * User may update to a new or older version of the logic contract. * @param _version The versin to update to. * @return Success of this transaction. */ function updateLogic(uint256 _version) external returns(bool) { if (msg.sender != owner_) return error('msg.sender != owner_, Wallet.updateLogic()'); address newVersion = connector_.getLogic(_version); // Invalid version as defined by connector if (newVersion == 0) return error('Invalid version, Wallet.updateLogic()'); logic_ = newVersion; return true; } /** * @dev Verify an order that the Exchange has received involving this wallet. * Internal checks and then authorize the exchange to move the tokens. * If sending ether will transfer to the exchange to broker the trade. * @param _token The address of the token contract being sold. * @param _amount The amount of tokens the order is for. * @param _fee The fee for the current trade. * @param _feeToken The token of which the fee is to be paid in. * @return If the order was verified or not. */ function verifyOrder ( address _token, uint256 _amount, uint256 _fee, address _feeToken ) external returns(bool) { assembly { calldatacopy(0x40, 0, calldatasize) delegatecall(gas, sload(0x3), 0x40, calldatasize, 0, 32) return(0, 32) pop } } /** * @dev Withdraw any token, including ether from this wallet to an EOA. * @param _token The address of the token to withdraw. * @param _amount The amount to withdraw. * @return Success of the withdrawal. */ function withdraw(address _token, uint256 _amount) external returns(bool) { if(msg.sender != owner_) return error('msg.sender != owner, Wallet.withdraw()'); assembly { calldatacopy(0x40, 0, calldatasize) delegatecall(gas, sload(0x3), 0x40, calldatasize, 0, 32) return(0, 32) pop } } /** * Constants */ /** * @dev Get the balance for a specific token. * @param _token The address of the token contract to retrieve the balance of. * @return The current balance within this contract. */ function balanceOf(address _token) public constant returns(uint) { return tokenBalances_[_token]; } } /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { function mul(uint256 a, uint256 b) internal constant returns (uint256) { uint256 c = a * b; assert(a == 0 || c / a == b); return c; } function div(uint256 a, uint256 b) internal constant returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } function sub(uint256 a, uint256 b) internal constant returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal constant returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } } contract Token { /// @return total amount of tokens function totalSupply() constant returns (uint256 supply) {} /// @param _owner The address from which the balance will be retrieved /// @return The balance function balanceOf(address _owner) constant returns (uint256 balance) {} /// @notice send `_value` token to `_to` from `msg.sender` /// @param _to The address of the recipient /// @param _value The amount of token to be transferred /// @return Whether the transfer was successful or not function transfer(address _to, uint256 _value) returns (bool success) {} /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from` /// @param _from The address of the sender /// @param _to The address of the recipient /// @param _value The amount of token to be transferred /// @return Whether the transfer was successful or not function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {} /// @notice `msg.sender` approves `_addr` to spend `_value` tokens /// @param _spender The address of the account able to transfer the tokens /// @param _value The amount of wei to be approved for transfer /// @return Whether the approval was successful or not function approve(address _spender, uint256 _value) returns (bool success) {} /// @param _owner The address of the account owning tokens /// @param _spender The address of the account able to transfer the tokens /// @return Amount of remaining tokens allowed to spent function allowance(address _owner, address _spender) constant returns (uint256 remaining) {} event Transfer(address indexed _from, address indexed _to, uint256 _value); event Approval(address indexed _owner, address indexed _spender, uint256 _value); uint public decimals; string public name; } /** * @title Decentralized exchange for ether and ERC20 tokens. * @author Adam Lemmon <[email protected]> * @dev All trades brokered by this contract. * Orders submitted by off chain order book and this contract handles * verification and execution of orders. * All value between parties is transferred via this exchange. * Methods arranged by visibility; external, public, internal, private and alphabatized within. */ contract Exchange is LoggingErrors { using SafeMath for uint256; /** * Data Structures */ struct Order { bool active_; // True: active, False: filled or cancelled address offerToken_; uint256 offerTokenTotal_; uint256 offerTokenRemaining_; // Amount left to give address wantToken_; uint256 wantTokenTotal_; uint256 wantTokenReceived_; // Amount received, note this may exceed want total } /** * Storage */ address private orderBookAccount_; address private owner_; uint256 public minOrderEthAmount_; uint256 public birthBlock_; address public edoToken_; uint256 public edoPerWei_; uint256 public edoPerWeiDecimals_; address public eidooWallet_; mapping(bytes32 => Order) public orders_; // Map order hashes to order data struct mapping(address => address) public userAccountToWallet_; // User EOA to wallet addresses /** * Events */ event LogEdoRateSet(uint256 rate); event LogOrderExecutionSuccess(); event LogOrderFilled(bytes32 indexed orderId, uint256 fillAmount, uint256 fillRemaining); event LogUserAdded(address indexed user, address walletAddress); event LogWalletDeposit(address indexed walletAddress, address token, uint256 amount, uint256 balance); event LogWalletWithdrawal(address indexed walletAddress, address token, uint256 amount, uint256 balance); /** * @dev Contract constructor - CONFIRM matches contract name. Set owner and addr of order book. * @param _bookAccount The EOA address for the order book, will submit ALL orders. * @param _minOrderEthAmount Minimum amount of ether that each order must contain. * @param _edoToken Deployed edo token. * @param _edoPerWei Rate of edo tokens per wei. * @param _edoPerWeiDecimals Decimlas carried in edo rate. * @param _eidooWallet Wallet to pay fees to. */ function Exchange( address _bookAccount, uint256 _minOrderEthAmount, address _edoToken, uint256 _edoPerWei, uint256 _edoPerWeiDecimals, address _eidooWallet ) public { orderBookAccount_ = _bookAccount; minOrderEthAmount_ = _minOrderEthAmount; owner_ = msg.sender; birthBlock_ = block.number; edoToken_ = _edoToken; edoPerWei_ = _edoPerWei; edoPerWeiDecimals_ = _edoPerWeiDecimals; eidooWallet_ = _eidooWallet; } /** * @dev Fallback. wallets utilize to send ether in order to broker trade. */ function () external payable { } /** * External */ /** * @dev Add a new user to the exchange, create a wallet for them. * Map their account address to the wallet contract for lookup. * @param _userAccount The address of the user's EOA. * @return Success of the transaction, false if error condition met. */ function addNewUser(address _userAccount) external returns (bool) { if (userAccountToWallet_[_userAccount] != address(0)) return error('User already exists, Exchange.addNewUser()'); // Pass the userAccount address to wallet constructor so owner is not the exchange contract address userWallet = new Wallet(_userAccount); userAccountToWallet_[_userAccount] = userWallet; LogUserAdded(_userAccount, userWallet); return true; } /** * Execute orders in batches. * @param _token_and_EOA_Addresses Tokan and user addresses. * @param _amountsExpirationAndSalt Offer and want token amount and expiration and salt values. * @param _sig_v All order signature v values. * @param _sig_r_and_s All order signature r and r values. * @return The success of this transaction. */ function batchExecuteOrder( address[4][] _token_and_EOA_Addresses, uint256[8][] _amountsExpirationAndSalt, // Packing to save stack size uint8[2][] _sig_v, bytes32[4][] _sig_r_and_s ) external returns(bool) { for (uint256 i = 0; i < _amountsExpirationAndSalt.length; i++) { require(executeOrder( _token_and_EOA_Addresses[i], _amountsExpirationAndSalt[i], _sig_v[i], _sig_r_and_s[i] )); } return true; } /** * @dev Execute an order that was submitted by the external order book server. * The order book server believes it to be a match. * There are components for both orders, maker and taker, 2 signatures as well. * @param _token_and_EOA_Addresses The addresses of the maker and taker EOAs and offered token contracts. * [makerEOA, makerOfferToken, takerEOA, takerOfferToken] * @param _amountsExpirationAndSalt The amount of tokens, [makerOffer, makerWant, takerOffer, takerWant]. * and the block number at which this order expires * and a random number to mitigate replay. [makerExpiry, makerSalt, takerExpiry, takerSalt] * @param _sig_v ECDSA signature parameter v, maker 0 and taker 1. * @param _sig_r_and_s ECDSA signature parameters r ans s, maker 0, 1 and taker 2, 3. * @return Success of the transaction, false if error condition met. * Like types grouped to eliminate stack depth error */ function executeOrder ( address[4] _token_and_EOA_Addresses, uint256[8] _amountsExpirationAndSalt, // Packing to save stack size uint8[2] _sig_v, bytes32[4] _sig_r_and_s ) public returns(bool) { // Only read wallet addresses from storage once // Need one more stack slot so squashing into array Wallet[2] memory wallets = [ Wallet(userAccountToWallet_[_token_and_EOA_Addresses[0]]), // maker Wallet(userAccountToWallet_[_token_and_EOA_Addresses[2]]) // taker ]; // Basic pre-conditions, return if any input data is invalid if(!__executeOrderInputIsValid__( _token_and_EOA_Addresses, _amountsExpirationAndSalt, wallets[0], wallets[1] )) return error('Input is invalid, Exchange.executeOrder()'); // Verify Maker and Taker signatures bytes32 makerOrderHash; bytes32 takerOrderHash; (makerOrderHash, takerOrderHash) = __generateOrderHashes__(_token_and_EOA_Addresses, _amountsExpirationAndSalt); if (!__signatureIsValid__( _token_and_EOA_Addresses[0], makerOrderHash, _sig_v[0], _sig_r_and_s[0], _sig_r_and_s[1] )) return error('Maker signature is invalid, Exchange.executeOrder()'); if (!__signatureIsValid__( _token_and_EOA_Addresses[2], takerOrderHash, _sig_v[1], _sig_r_and_s[2], _sig_r_and_s[3] )) return error('Taker signature is invalid, Exchange.executeOrder()'); // Exchange Order Verification and matching. Order memory makerOrder = orders_[makerOrderHash]; Order memory takerOrder = orders_[takerOrderHash]; if (makerOrder.wantTokenTotal_ == 0) { // Check for existence makerOrder.active_ = true; makerOrder.offerToken_ = _token_and_EOA_Addresses[1]; makerOrder.offerTokenTotal_ = _amountsExpirationAndSalt[0]; makerOrder.offerTokenRemaining_ = _amountsExpirationAndSalt[0]; // Amount to give makerOrder.wantToken_ = _token_and_EOA_Addresses[3]; makerOrder.wantTokenTotal_ = _amountsExpirationAndSalt[1]; makerOrder.wantTokenReceived_ = 0; // Amount received } if (takerOrder.wantTokenTotal_ == 0) { // Check for existence takerOrder.active_ = true; takerOrder.offerToken_ = _token_and_EOA_Addresses[3]; takerOrder.offerTokenTotal_ = _amountsExpirationAndSalt[2]; takerOrder.offerTokenRemaining_ = _amountsExpirationAndSalt[2]; // Amount to give takerOrder.wantToken_ = _token_and_EOA_Addresses[1]; takerOrder.wantTokenTotal_ = _amountsExpirationAndSalt[3]; takerOrder.wantTokenReceived_ = 0; // Amount received } if (!__ordersMatch_and_AreVaild__(makerOrder, takerOrder)) return error('Orders do not match, Exchange.executeOrder()'); // Trade amounts uint256 toTakerAmount; uint256 toMakerAmount; (toTakerAmount, toMakerAmount) = __getTradeAmounts__(makerOrder, takerOrder); // TODO consider removing. Can this condition be met? if (toTakerAmount < 1 || toMakerAmount < 1) return error('Token amount < 1, price ratio is invalid! Token value < 1, Exchange.executeOrder()'); // Taker is offering edo tokens so ensure sufficient balance in order to offer edo and pay fee in edo if ( takerOrder.offerToken_ == edoToken_ && Token(edoToken_).balanceOf(wallets[1]) < __calculateFee__(makerOrder, toTakerAmount, toMakerAmount).add(toMakerAmount) ) { return error('Taker has an insufficient EDO token balance to cover the fee AND the offer, Exchange.executeOrder()'); // Taker has sufficent EDO token balance to pay the fee } else if (Token(edoToken_).balanceOf(wallets[1]) < __calculateFee__(makerOrder, toTakerAmount, toMakerAmount)) return error('Taker has an insufficient EDO token balance to cover the fee, Exchange.executeOrder()'); // Wallet Order Verification, reach out to the maker and taker wallets. if (!__ordersVerifiedByWallets__( _token_and_EOA_Addresses, toMakerAmount, toTakerAmount, wallets[0], wallets[1], __calculateFee__(makerOrder, toTakerAmount, toMakerAmount) )) return error('Order could not be verified by wallets, Exchange.executeOrder()'); // Order Execution, Order Fully Verified by this point, time to execute! // Local order structs __updateOrders__(makerOrder, takerOrder, toTakerAmount, toMakerAmount); // Write to storage then external calls // Update orders active flag if filled if (makerOrder.offerTokenRemaining_ == 0) makerOrder.active_ = false; if (takerOrder.offerTokenRemaining_ == 0) takerOrder.active_ = false; // Finally write orders to storage orders_[makerOrderHash] = makerOrder; orders_[takerOrderHash] = takerOrder; // Transfer the external value, ether <> tokens require( __executeTokenTransfer__( _token_and_EOA_Addresses, toTakerAmount, toMakerAmount, __calculateFee__(makerOrder, toTakerAmount, toMakerAmount), wallets[0], wallets[1] ) ); // Log the order id(hash), amount of offer given, amount of offer remaining LogOrderFilled(makerOrderHash, toTakerAmount, makerOrder.offerTokenRemaining_); LogOrderFilled(takerOrderHash, toMakerAmount, takerOrder.offerTokenRemaining_); LogOrderExecutionSuccess(); return true; } /** * @dev Set the rate of wei per edo token in or to calculate edo fee * @param _edoPerWei Rate of edo tokens per wei. * @return Success of the transaction. */ function setEdoRate( uint256 _edoPerWei ) external returns(bool) { if (msg.sender != owner_) return error('msg.sender != owner, Exchange.setEdoRate()'); edoPerWei_ = _edoPerWei; LogEdoRateSet(edoPerWei_); return true; } /** * @dev Set the wallet for fees to be paid to. * @param _eidooWallet Wallet to pay fees to. * @return Success of the transaction. */ function setEidooWallet( address _eidooWallet ) external returns(bool) { if (msg.sender != owner_) return error('msg.sender != owner, Exchange.setEidooWallet()'); eidooWallet_ = _eidooWallet; return true; } /** * @dev Set the minimum amount of ether required per order. * @param _minOrderEthAmount Min amount of ether required per order. * @return Success of the transaction. */ function setMinOrderEthAmount ( uint256 _minOrderEthAmount ) external returns(bool) { if (msg.sender != owner_) return error('msg.sender != owner, Exchange.setMinOrderEtherAmount()'); minOrderEthAmount_ = _minOrderEthAmount; return true; } /** * @dev Set a new order book account. * @param _account The new order book account. */ function setOrderBookAcount ( address _account ) external returns(bool) { if (msg.sender != owner_) return error('msg.sender != owner, Exchange.setOrderBookAcount()'); orderBookAccount_ = _account; return true; } /* Methods to catch events from external contracts, user wallets primarily */ /** * @dev Simply log the event to track wallet interaction off-chain * @param _token The address of the token that was deposited. * @param _amount The amount of the token that was deposited. * @param _walletBalance The updated balance of the wallet after deposit. */ function walletDeposit( address _token, uint256 _amount, uint256 _walletBalance ) external { LogWalletDeposit(msg.sender, _token, _amount, _walletBalance); } /** * @dev Simply log the event to track wallet interaction off-chain * @param _token The address of the token that was deposited. * @param _amount The amount of the token that was deposited. * @param _walletBalance The updated balance of the wallet after deposit. */ function walletWithdrawal( address _token, uint256 _amount, uint256 _walletBalance ) external { LogWalletWithdrawal(msg.sender, _token, _amount, _walletBalance); } /** * Private */ /** * Calculate the fee for the given trade. Calculated as the set % of the wei amount * converted into EDO tokens using the manually set conversion ratio. * @param _makerOrder The maker order object. * @param _toTaker The amount of tokens going to the taker. * @param _toMaker The amount of tokens going to the maker. * @return The total fee to be paid in EDO tokens. */ function __calculateFee__( Order _makerOrder, uint256 _toTaker, uint256 _toMaker ) private constant returns(uint256) { // weiAmount * (fee %) * (EDO/Wei) / (decimals in edo/wei) / (decimals in percentage) if (_makerOrder.offerToken_ == address(0)) { return _toTaker.mul(edoPerWei_).div(10**edoPerWeiDecimals_); } else { return _toMaker.mul(edoPerWei_).div(10**edoPerWeiDecimals_); } } /** * @dev Verify the input to order execution is valid. * @param _token_and_EOA_Addresses The addresses of the maker and taker EOAs and offered token contracts. * [makerEOA, makerOfferToken, takerEOA, takerOfferToken] * @param _amountsExpirationAndSalt The amount of tokens, [makerOffer, makerWant, takerOffer, takerWant]. * as well as The block number at which this order expires, maker[4] and taker[6]. * @return Success if all checks pass. */ function __executeOrderInputIsValid__( address[4] _token_and_EOA_Addresses, uint256[8] _amountsExpirationAndSalt, address _makerWallet, address _takerWallet ) private constant returns(bool) { if (msg.sender != orderBookAccount_) return error('msg.sender != orderBookAccount, Exchange.__executeOrderInputIsValid__()'); if (block.number > _amountsExpirationAndSalt[4]) return error('Maker order has expired, Exchange.__executeOrderInputIsValid__()'); if (block.number > _amountsExpirationAndSalt[6]) return error('Taker order has expired, Exchange.__executeOrderInputIsValid__()'); // Wallets if (_makerWallet == address(0)) return error('Maker wallet does not exist, Exchange.__executeOrderInputIsValid__()'); if (_takerWallet == address(0)) return error('Taker wallet does not exist, Exchange.__executeOrderInputIsValid__()'); // Tokens, addresses and amounts, ether exists if (_token_and_EOA_Addresses[1] != address(0) && _token_and_EOA_Addresses[3] != address(0)) return error('Ether omitted! Is not offered by either the Taker or Maker, Exchange.__executeOrderInputIsValid__()'); if (_token_and_EOA_Addresses[1] == address(0) && _token_and_EOA_Addresses[3] == address(0)) return error('Taker and Maker offer token are both ether, Exchange.__executeOrderInputIsValid__()'); if ( _amountsExpirationAndSalt[0] == 0 || _amountsExpirationAndSalt[1] == 0 || _amountsExpirationAndSalt[2] == 0 || _amountsExpirationAndSalt[3] == 0 ) return error('May not execute an order where token amount == 0, Exchange.__executeOrderInputIsValid__()'); // Confirm order ether amount >= min amount // Maker uint256 minOrderEthAmount = minOrderEthAmount_; // Single storage read if (_token_and_EOA_Addresses[1] == 0 && _amountsExpirationAndSalt[0] < minOrderEthAmount) return error('Maker order does not meet the minOrderEthAmount_ of ether, Exchange.__executeOrderInputIsValid__()'); // Taker if (_token_and_EOA_Addresses[3] == 0 && _amountsExpirationAndSalt[2] < minOrderEthAmount) return error('Taker order does not meet the minOrderEthAmount_ of ether, Exchange.__executeOrderInputIsValid__()'); return true; } /** * @dev Execute the external transfer of tokens. * @param _token_and_EOA_Addresses The addresses of the maker and taker EOAs and offered token contracts. * [makerEOA, makerOfferToken, takerEOA, takerOfferToken] * @param _toTakerAmount The amount of tokens to transfer to the taker. * @param _toMakerAmount The amount of tokens to transfer to the maker. * @return Success if both wallets verify the order. */ function __executeTokenTransfer__( address[4] _token_and_EOA_Addresses, uint256 _toTakerAmount, uint256 _toMakerAmount, uint256 _fee, Wallet _makerWallet, Wallet _takerWallet ) private returns (bool) { // Wallet mapping balances address makerOfferToken = _token_and_EOA_Addresses[1]; address takerOfferToken = _token_and_EOA_Addresses[3]; // Taker to pay fee before trading require(_takerWallet.updateBalance(edoToken_, _fee, true)); // Subtraction flag require(Token(edoToken_).transferFrom(_takerWallet, eidooWallet_, _fee)); // Move the toTakerAmount from the maker to the taker require(_makerWallet.updateBalance(makerOfferToken, _toTakerAmount, true)); // Subtraction flag /*return error('Unable to subtract maker token from maker wallet, Exchange.__executeTokenTransfer__()');*/ require(_takerWallet.updateBalance(makerOfferToken, _toTakerAmount, false)); /*return error('Unable to add maker token to taker wallet, Exchange.__executeTokenTransfer__()');*/ // Move the toMakerAmount from the taker to the maker require(_takerWallet.updateBalance(takerOfferToken, _toMakerAmount, true)); // Subtraction flag /*return error('Unable to subtract taker token from taker wallet, Exchange.__executeTokenTransfer__()');*/ require(_makerWallet.updateBalance(takerOfferToken, _toMakerAmount, false)); /*return error('Unable to add taker token to maker wallet, Exchange.__executeTokenTransfer__()');*/ // Contract ether balances and token contract balances // Ether to the taker and tokens to the maker if (makerOfferToken == address(0)) { _takerWallet.transfer(_toTakerAmount); require( Token(takerOfferToken).transferFrom(_takerWallet, _makerWallet, _toMakerAmount) ); assert( __tokenAndWalletBalancesMatch__(_makerWallet, _takerWallet, takerOfferToken) ); // Ether to the maker and tokens to the taker } else if (takerOfferToken == address(0)) { _makerWallet.transfer(_toMakerAmount); require( Token(makerOfferToken).transferFrom(_makerWallet, _takerWallet, _toTakerAmount) ); assert( __tokenAndWalletBalancesMatch__(_makerWallet, _takerWallet, makerOfferToken) ); // Something went wrong one had to have been ether } else revert(); return true; } /** * @dev compute the log10 of a given number, takes the floor, ie. 2.5 = 2 * @param _number The number to compute the log 10 of. * @return The floored log 10. */ function __flooredLog10__(uint _number) public constant returns (uint256) { uint unit = 0; while (_number / (10**unit) >= 10) unit++; return unit; } /** * @dev Calculates Keccak-256 hash of order with specified parameters. * @param _token_and_EOA_Addresses The addresses of the order, [makerEOA, makerOfferToken, makerWantToken]. * @param _amountsExpirationAndSalt The amount of tokens as well as * the block number at which this order expires and random salt number. * @return Keccak-256 hash of each order. */ function __generateOrderHashes__( address[4] _token_and_EOA_Addresses, uint256[8] _amountsExpirationAndSalt ) private constant returns (bytes32, bytes32) { bytes32 makerOrderHash = keccak256( address(this), _token_and_EOA_Addresses[0], // _makerEOA _token_and_EOA_Addresses[1], // offerToken _amountsExpirationAndSalt[0], // offerTokenAmount _token_and_EOA_Addresses[3], // wantToken _amountsExpirationAndSalt[1], // wantTokenAmount _amountsExpirationAndSalt[4], // expiry _amountsExpirationAndSalt[5] // salt ); bytes32 takerOrderHash = keccak256( address(this), _token_and_EOA_Addresses[2], // _makerEOA _token_and_EOA_Addresses[3], // offerToken _amountsExpirationAndSalt[2], // offerTokenAmount _token_and_EOA_Addresses[1], // wantToken _amountsExpirationAndSalt[3], // wantTokenAmount _amountsExpirationAndSalt[6], // expiry _amountsExpirationAndSalt[7] // salt ); return (makerOrderHash, takerOrderHash); } /** * @dev Returns the price ratio for this order. * The ratio is calculated with the largest value as the numerator, this aids * to significantly reduce rounding errors. * @param _makerOrder The maker order data structure. * @return The ratio to `_decimals` decimal places. */ function __getOrderPriceRatio__(Order _makerOrder, uint256 _decimals) private constant returns (uint256 orderPriceRatio) { if (_makerOrder.offerTokenTotal_ >= _makerOrder.wantTokenTotal_) { orderPriceRatio = _makerOrder.offerTokenTotal_.mul(10**_decimals).div(_makerOrder.wantTokenTotal_); } else { orderPriceRatio = _makerOrder.wantTokenTotal_.mul(10**_decimals).div(_makerOrder.offerTokenTotal_); } } /** * @dev Compute the tradeable amounts of the two verified orders. * Token amount is the min remaining between want and offer of the two orders that isn't ether. * Ether amount is then: etherAmount = tokenAmount * priceRatio, as ratio = eth / token. * @param _makerOrder The maker order data structure. * @param _takerOrder The taker order data structure. * @return The amount moving from makerOfferRemaining to takerWantRemaining and vice versa. * TODO: consider rounding errors, etc */ function __getTradeAmounts__( Order _makerOrder, Order _takerOrder ) private constant returns (uint256 toTakerAmount, uint256 toMakerAmount) { bool ratioIsWeiPerTok = __ratioIsWeiPerTok__(_makerOrder); uint256 decimals = __flooredLog10__(__max__(_makerOrder.offerTokenTotal_, _makerOrder.wantTokenTotal_)) + 1; uint256 priceRatio = __getOrderPriceRatio__(_makerOrder, decimals); // Amount left for order to receive uint256 makerAmountLeftToReceive = _makerOrder.wantTokenTotal_.sub(_makerOrder.wantTokenReceived_); uint256 takerAmountLeftToReceive = _takerOrder.wantTokenTotal_.sub(_takerOrder.wantTokenReceived_); // wei/tok and taker receiving wei or tok/wei and taker receiving tok if ( ratioIsWeiPerTok && _takerOrder.wantToken_ == address(0) || !ratioIsWeiPerTok && _takerOrder.wantToken_ != address(0) ) { // In the case that the maker is offering more than the taker wants for the same quantity being offered // For example: maker offer 20 wei for 10 tokens but taker offers 10 tokens for 10 wei // Taker receives 20 wei for the 10 tokens, both orders filled if ( _makerOrder.offerTokenRemaining_ > takerAmountLeftToReceive && makerAmountLeftToReceive <= _takerOrder.offerTokenRemaining_ ) { toTakerAmount = __max__(_makerOrder.offerTokenRemaining_, takerAmountLeftToReceive); } else { toTakerAmount = __min__(_makerOrder.offerTokenRemaining_, takerAmountLeftToReceive); } toMakerAmount = toTakerAmount.mul(10**decimals).div(priceRatio); // wei/tok and maker receiving wei or tok/wei and maker receiving tok } else { toMakerAmount = __min__(_takerOrder.offerTokenRemaining_, makerAmountLeftToReceive); toTakerAmount = toMakerAmount.mul(10**decimals).div(priceRatio); } } /** * @dev Return the maximum of two uints * @param _a Uint 1 * @param _b Uint 2 * @return The grater value or a if equal */ function __max__(uint256 _a, uint256 _b) private constant returns (uint256) { return _a < _b ? _b : _a; } /** * @dev Return the minimum of two uints * @param _a Uint 1 * @param _b Uint 2 * @return The smallest value or b if equal */ function __min__(uint256 _a, uint256 _b) private constant returns (uint256) { return _a < _b ? _a : _b; } /** * @dev Define if the ratio to be used is wei/tok to tok/wei. Largest uint will * always act as the numerator. * @param _makerOrder The maker order object. * @return If the ratio is wei/tok or not. */ function __ratioIsWeiPerTok__(Order _makerOrder) private constant returns (bool) { bool offerIsWei = _makerOrder.offerToken_ == address(0) ? true : false; // wei/tok if (offerIsWei && _makerOrder.offerTokenTotal_ >= _makerOrder.wantTokenTotal_) { return true; } else if (!offerIsWei && _makerOrder.wantTokenTotal_ >= _makerOrder.offerTokenTotal_) { return true; // tok/wei. otherwise wanting wei && offer > want, OR offer wei && want > offer } else { return false; } } /** * @dev Confirm that the orders do match and are valid. * @param _makerOrder The maker order data structure. * @param _takerOrder The taker order data structure. * @return Bool if the orders passes all checks. */ function __ordersMatch_and_AreVaild__( Order _makerOrder, Order _takerOrder ) private constant returns (bool) { // Orders still active if (!_makerOrder.active_) return error('Maker order is inactive, Exchange.__ordersMatch_and_AreVaild__()'); if (!_takerOrder.active_) return error('Taker order is inactive, Exchange.__ordersMatch_and_AreVaild__()'); // Confirm tokens match // NOTE potentially omit as matching handled upstream? if (_makerOrder.wantToken_ != _takerOrder.offerToken_) return error('Maker wanted token does not match taker offer token, Exchange.__ordersMatch_and_AreVaild__()'); if (_makerOrder.offerToken_ != _takerOrder.wantToken_) return error('Maker offer token does not match taker wanted token, Exchange.__ordersMatch_and_AreVaild__()'); // Price Ratios, to x decimal places hence * decimals, dependent on the size of the denominator. // Ratios are relative to eth, amount of ether for a single token, ie. ETH / GNO == 0.2 Ether per 1 Gnosis uint256 orderPrice; // The price the maker is willing to accept uint256 offeredPrice; // The offer the taker has given uint256 decimals = _makerOrder.offerToken_ == address(0) ? __flooredLog10__(_makerOrder.wantTokenTotal_) : __flooredLog10__(_makerOrder.offerTokenTotal_); // Ratio = larger amount / smaller amount if (_makerOrder.offerTokenTotal_ >= _makerOrder.wantTokenTotal_) { orderPrice = _makerOrder.offerTokenTotal_.mul(10**decimals).div(_makerOrder.wantTokenTotal_); offeredPrice = _takerOrder.wantTokenTotal_.mul(10**decimals).div(_takerOrder.offerTokenTotal_); // ie. Maker is offering 10 ETH for 100 GNO but taker is offering 100 GNO for 20 ETH, no match! // The taker wants more ether than the maker is offering. if (orderPrice < offeredPrice) return error('Taker price is greater than maker price, Exchange.__ordersMatch_and_AreVaild__()'); } else { orderPrice = _makerOrder.wantTokenTotal_.mul(10**decimals).div(_makerOrder.offerTokenTotal_); offeredPrice = _takerOrder.offerTokenTotal_.mul(10**decimals).div(_takerOrder.wantTokenTotal_); // ie. Maker is offering 100 GNO for 10 ETH but taker is offering 5 ETH for 100 GNO, no match! // The taker is not offering enough ether for the maker if (orderPrice > offeredPrice) return error('Taker price is less than maker price, Exchange.__ordersMatch_and_AreVaild__()'); } return true; } /** * @dev Ask each wallet to verify this order. * @param _token_and_EOA_Addresses The addresses of the maker and taker EOAs and offered token contracts. * [makerEOA, makerOfferToken, takerEOA, takerOfferToken] * @param _toMakerAmount The amount of tokens to be sent to the maker. * @param _toTakerAmount The amount of tokens to be sent to the taker. * @param _makerWallet The maker's wallet contract. * @param _takerWallet The taker's wallet contract. * @param _fee The fee to be paid for this trade, paid in full by taker. * @return Success if both wallets verify the order. */ function __ordersVerifiedByWallets__( address[4] _token_and_EOA_Addresses, uint256 _toMakerAmount, uint256 _toTakerAmount, Wallet _makerWallet, Wallet _takerWallet, uint256 _fee ) private constant returns (bool) { // Have the transaction verified by both maker and taker wallets // confirm sufficient balance to transfer, offerToken and offerTokenAmount if(!_makerWallet.verifyOrder(_token_and_EOA_Addresses[1], _toTakerAmount, 0, 0)) return error('Maker wallet could not verify the order, Exchange.__ordersVerifiedByWallets__()'); if(!_takerWallet.verifyOrder(_token_and_EOA_Addresses[3], _toMakerAmount, _fee, edoToken_)) return error('Taker wallet could not verify the order, Exchange.__ordersVerifiedByWallets__()'); return true; } /** * @dev On chain verification of an ECDSA ethereum signature. * @param _signer The EOA address of the account that supposedly signed the message. * @param _orderHash The on-chain generated hash for the order. * @param _v ECDSA signature parameter v. * @param _r ECDSA signature parameter r. * @param _s ECDSA signature parameter s. * @return Bool if the signature is valid or not. */ function __signatureIsValid__( address _signer, bytes32 _orderHash, uint8 _v, bytes32 _r, bytes32 _s ) private constant returns (bool) { address recoveredAddr = ecrecover( keccak256('\x19Ethereum Signed Message:\n32', _orderHash), _v, _r, _s ); return recoveredAddr == _signer; } /** * @dev Confirm wallet local balances and token balances match. * @param _makerWallet Maker wallet address. * @param _takerWallet Taker wallet address. * @param _token Token address to confirm balances match. * @return If the balances do match. */ function __tokenAndWalletBalancesMatch__( address _makerWallet, address _takerWallet, address _token ) private constant returns(bool) { if (Token(_token).balanceOf(_makerWallet) != Wallet(_makerWallet).balanceOf(_token)) return false; if (Token(_token).balanceOf(_takerWallet) != Wallet(_takerWallet).balanceOf(_token)) return false; return true; } /** * @dev Update the order structs. * @param _makerOrder The maker order data structure. * @param _takerOrder The taker order data structure. * @param _toTakerAmount The amount of tokens to be moved to the taker. * @param _toTakerAmount The amount of tokens to be moved to the maker. * @return Success if the update succeeds. */ function __updateOrders__( Order _makerOrder, Order _takerOrder, uint256 _toTakerAmount, uint256 _toMakerAmount ) private { // taker => maker _makerOrder.wantTokenReceived_ = _makerOrder.wantTokenReceived_.add(_toMakerAmount); _takerOrder.offerTokenRemaining_ = _takerOrder.offerTokenRemaining_.sub(_toMakerAmount); // maker => taker _takerOrder.wantTokenReceived_ = _takerOrder.wantTokenReceived_.add(_toTakerAmount); _makerOrder.offerTokenRemaining_ = _makerOrder.offerTokenRemaining_.sub(_toTakerAmount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[{"name":"_eidooWallet","type":"address"}],"name":"setEidooWallet","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"edoPerWeiDecimals_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token_and_EOA_Addresses","type":"address[4][]"},{"name":"_amountsExpirationAndSalt","type":"uint256[8][]"},{"name":"_sig_v","type":"uint8[2][]"},{"name":"_sig_r_and_s","type":"bytes32[4][]"}],"name":"batchExecuteOrder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_account","type":"address"}],"name":"setOrderBookAcount","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_walletBalance","type":"uint256"}],"name":"walletWithdrawal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"edoToken_","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"birthBlock_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"orders_","outputs":[{"name":"active_","type":"bool"},{"name":"offerToken_","type":"address"},{"name":"offerTokenTotal_","type":"uint256"},{"name":"offerTokenRemaining_","type":"uint256"},{"name":"wantToken_","type":"address"},{"name":"wantTokenTotal_","type":"uint256"},{"name":"wantTokenReceived_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_number","type":"uint256"}],"name":"__flooredLog10__","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_edoPerWei","type":"uint256"}],"name":"setEdoRate","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"userAccountToWallet_","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"eidooWallet_","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_userAccount","type":"address"}],"name":"addNewUser","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token_and_EOA_Addresses","type":"address[4]"},{"name":"_amountsExpirationAndSalt","type":"uint256[8]"},{"name":"_sig_v","type":"uint8[2]"},{"name":"_sig_r_and_s","type":"bytes32[4]"}],"name":"executeOrder","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_walletBalance","type":"uint256"}],"name":"walletDeposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_minOrderEthAmount","type":"uint256"}],"name":"setMinOrderEthAmount","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"minOrderEthAmount_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"edoPerWei_","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_bookAccount","type":"address"},{"name":"_minOrderEthAmount","type":"uint256"},{"name":"_edoToken","type":"address"},{"name":"_edoPerWei","type":"uint256"},{"name":"_edoPerWeiDecimals","type":"uint256"},{"name":"_eidooWallet","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"rate","type":"uint256"}],"name":"LogEdoRateSet","type":"event"},{"anonymous":false,"inputs":[],"name":"LogOrderExecutionSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"orderId","type":"bytes32"},{"indexed":false,"name":"fillAmount","type":"uint256"},{"indexed":false,"name":"fillRemaining","type":"uint256"}],"name":"LogOrderFilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"user","type":"address"},{"indexed":false,"name":"walletAddress","type":"address"}],"name":"LogUserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"walletAddress","type":"address"},{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"balance","type":"uint256"}],"name":"LogWalletDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"walletAddress","type":"address"},{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"balance","type":"uint256"}],"name":"LogWalletWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"errorString","type":"string"}],"name":"LogErrorString","type":"event"}]
Contract Creation Code
608060405234801561001057600080fd5b5060405160c080613e1c83398101604090815281516020830151918301516060840151608085015160a09095015160008054600160a060020a03958616600160a060020a0319918216179091556002959095556001805486163317905543600355600480549385169386169390931790925560055560069390935560078054919093169116179055613d75806100a76000396000f300608060405260043610620000f55763ffffffff60e060020a6000350416631d2627bb8114620000f757806332b28b95146200012f5780634983542e14620001595780634a8ef4bd14620001a057806357b394bf14620001c457806363a3d38314620001ee57806369820a8014620002225780636e3706f4146200023a57806384f1b0b8146200029f5780638e5919b614620002ba578063b5f9b5cc14620002d5578063bd09f11714620002f9578063c1d5e84f1462000311578063c825ec971462000335578063cfbe2cb314620003ea578063e7cf514d1462000414578063ef3cbc39146200042f578063f673745a1462000447575b005b3480156200010457600080fd5b506200011b600160a060020a03600435166200045f565b604080519115158252519081900360200190f35b3480156200013c57600080fd5b506200014762000504565b60408051918252519081900360200190f35b3480156200016657600080fd5b506200011b60246004803582810192908201359181358083019290820135916044358083019290820135916064359182019101356200050a565b348015620001ad57600080fd5b506200011b600160a060020a036004351662000625565b348015620001d157600080fd5b50620000f5600160a060020a0360043516602435604435620006c3565b348015620001fb57600080fd5b506200020662000714565b60408051600160a060020a039092168252519081900360200190f35b3480156200022f57600080fd5b506200014762000723565b3480156200024757600080fd5b506200025560043562000729565b604080519715158852600160a060020a0396871660208901528781019590955260608701939093529316608085015260a084019290925260c0830191909152519081900360e00190f35b348015620002ac57600080fd5b506200014760043562000771565b348015620002c757600080fd5b506200011b600435620007a0565b348015620002e257600080fd5b5062000206600160a060020a03600435166200084c565b3480156200030657600080fd5b506200020662000867565b3480156200031e57600080fd5b506200011b600160a060020a036004351662000876565b3480156200034257600080fd5b506040805160808181019092526200011b913691600491608491908390819083908290808284375050604080516101008181019092529497969581810195945092506008915083908390808284375050604080518082018252949796958181019594509250600291508390839080828437505060408051608081810190925294979695818101959450925060049150839083908082843750939650620009c195505050505050565b348015620003f757600080fd5b50620000f5600160a060020a036004351660243560443562001538565b3480156200042157600080fd5b506200011b60043562001589565b3480156200043c57600080fd5b5062000147620015fe565b3480156200045457600080fd5b506200014762001604565b600154600090600160a060020a03163314620004d357620004cb606060405190810160405280602e815260200160008051602062003d2a83398151915281526020017f744569646f6f57616c6c657428290000000000000000000000000000000000008152506200160a565b9050620004ff565b506007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03831617905560015b919050565b60065481565b6000805b868110156200061557620006008a8a838181106200052857fe5b9050608002016004806020026040519081016040528092919082600460200280828437508d93508c9250869150508181106200056057fe5b905061010002016008806020026040519081016040528092919082600860200280828437508c93508b9250879150508181106200059957fe5b9050604002016002806020026040519081016040528092919082600260200280828437508b93508a925088915050818110620005d157fe5b905060800201600480602002604051908101604052809291908260046020028082843750620009c19350505050565b15156200060c57600080fd5b6001016200050e565b5060019998505050505050505050565b600154600090600160a060020a031633146200069157620004cb6060604051908101604052806032815260200160008051602062003d2a83398151915281526020017f744f72646572426f6f6b41636f756e74282900000000000000000000000000008152506200160a565b5060008054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff199091161790556001919050565b60408051600160a060020a038516815260208101849052808201839052905133917fe8d885fd2147a6ac7d644cd3c3a5f2413dbd8e515b61702b1cc1551188176b3c919081900360600190a2505050565b600454600160a060020a031681565b60035481565b60086020526000908152604090208054600182015460028301546003840154600485015460059095015460ff851695610100909504600160a060020a03908116959216919087565b6000805b600a81600a0a848115156200078657fe5b0410620007965760010162000775565b8091505b50919050565b600154600090600160a060020a031633146200080c57620004cb606060405190810160405280602a815260200160008051602062003d2a83398151915281526020017f7445646f526174652829000000000000000000000000000000000000000000008152506200160a565b60058290556040805183815290517f70d645acf6601ac71e11cc9eb4a144e5cbd8f3a9aaa6ce5a83bb1d74cba182359181900360200190a1506001919050565b600960205260009081526040902054600160a060020a031681565b600754600160a060020a031681565b600160a060020a038181166000908152600960205260408120549091829116156200090a5762000902606060405190810160405280602a81526020017f5573657220616c7265616479206578697374732c2045786368616e67652e616481526020017f644e6577557365722829000000000000000000000000000000000000000000008152506200160a565b91506200079a565b8262000915620032fc565b600160a060020a03909116815260405190819003602001906000f08015801562000943573d6000803e3d6000fd5b50600160a060020a03848116600081815260096020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff191694861694851790558151938452905193945090927f341c3eb6378732c9923fd02ea04564f599626c0f9b3fc49526dfd712d7cf7a549281900390910190a250600192915050565b6000620009cd6200330d565b600080620009da62003328565b620009e462003328565b6040805180820182528b51600160a060020a0390811660009081526009602081815285832054841685528f8601518416835290815293812054909116928201839052815191975091829162000a3d918e918e91620016b0565b151562000ab35762000aab606060405190810160405280602981526020017f496e70757420697320696e76616c69642c2045786368616e67652e657865637581526020017f74654f72646572282900000000000000000000000000000000000000000000008152506200160a565b975062001529565b62000abf8c8c62001d9a565b8d518c518c5193995091975062000ae392909189918d60015b602002015162001efb565b151562000b515762000aab606060405190810160405280603381526020017f4d616b6572207369676e617475726520697320696e76616c69642c204578636881526020017f616e67652e657865637574654f726465722829000000000000000000000000008152506200160a565b6040808d015160208c0151918b015162000b709288918d600362000ad8565b151562000bde5762000aab606060405190810160405280603381526020017f54616b6572207369676e617475726520697320696e76616c69642c204578636881526020017f616e67652e657865637574654f726465722829000000000000000000000000008152506200160a565b60086000876000191660001916815260200190815260200160002060e060405190810160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200160018201548152602001600282015481526020016003820160009054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200160048201548152602001600582015481525050935060086000866000191660001916815260200190815260200160002060e060405190810160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200160018201548152602001600282015481526020016003820160009054906101000a9004600160a060020a0316600160a060020a0316600160a060020a031681526020016004820154815260200160058201548152505092508360a001516000141562000dc457600184526020808d0151600160a060020a03908116828701528c5160408701528c516060808801919091528e01511660808601528b015160a0850152600060c08501525b60a0830151151562000e1a57600183526060808d0151600160a060020a0390811660208087019190915260408e810180519188019190915251838701528e01511660808501528b015160a0840152600060c08401525b62000e26848462001fb4565b151562000e945762000aab606060405190810160405280602c81526020017f4f726465727320646f206e6f74206d617463682c2045786368616e67652e657881526020017f65637574654f72646572282900000000000000000000000000000000000000008152506200160a565b62000ea084846200243c565b9092509050600182108062000eb55750600181105b1562000f485762000aab608060405190810160405280605281526020017f546f6b656e20616d6f756e74203c20312c20707269636520726174696f20697381526020017f20696e76616c69642120546f6b656e2076616c7565203c20312c20457863686181526020017f6e67652e657865637574654f72646572282900000000000000000000000000008152506200160a565b6004546020840151600160a060020a0390811691161480156200101a575062000f858162000f78868585620025ac565b9063ffffffff6200261516565b600454600160a060020a03166370a0823189600160200201516040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801562000fea57600080fd5b505af115801562000fff573d6000803e3d6000fd5b505050506040513d60208110156200101657600080fd5b5051105b15620010d35762000aab60a060405190810160405280606381526020017f54616b65722068617320616e20696e73756666696369656e742045444f20746f81526020017f6b656e2062616c616e636520746f20636f766572207468652066656520414e4481526020017f20746865206f666665722c2045786368616e67652e657865637574654f72646581526020017f72282900000000000000000000000000000000000000000000000000000000008152506200160a565b620010e0848383620025ac565b600454600160a060020a03166370a0823189600160200201516040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156200114557600080fd5b505af11580156200115a573d6000803e3d6000fd5b505050506040513d60208110156200117157600080fd5b50511015620012075762000aab608060405190810160405280605581526020017f54616b65722068617320616e20696e73756666696369656e742045444f20746f81526020017f6b656e2062616c616e636520746f20636f76657220746865206665652c20457881526020017f6368616e67652e657865637574654f72646572282900000000000000000000008152506200160a565b865160208801516200122c918e9184918691620012268a8486620025ac565b62002625565b15156200129a5762000aab606060405190810160405280603f81526020017f4f7264657220636f756c64206e6f74206265207665726966696564206279207781526020017f616c6c6574732c2045786368616e67652e657865637574654f726465722829008152506200160a565b620012a884848484620028c3565b60608401511515620012b957600084525b60608301511515620012ca57600083525b8360086000886000191660001916815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a815481600160a060020a030219169083600160a060020a03160217905550604082015181600101556060820151816002015560808201518160030160006101000a815481600160a060020a030219169083600160a060020a0316021790555060a0820151816004015560c082015181600501559050508260086000876000191660001916815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a815481600160a060020a030219169083600160a060020a03160217905550604082015181600101556060820151816002015560808201518160030160006101000a815481600160a060020a030219169083600160a060020a0316021790555060a0820151816004015560c082015181600501559050506200146d8c838362001460888787620025ac565b8b5160208d01516200293c565b15156200147957600080fd5b6060840151604080518481526020810192909252805188927fbc99ec61d80589c90dda14a2b09b9d0ddcdd61292e3745b9967c10bdd131d95292908290030190a26060830151604080518381526020810192909252805187927fbc99ec61d80589c90dda14a2b09b9d0ddcdd61292e3745b9967c10bdd131d95292908290030190a26040517f8fd15f06b064f611e00c3a037950e48f8c637e2a0aab2afca053325afd3e859490600090a1600197505b50505050505050949350505050565b60408051600160a060020a038516815260208101849052808201839052905133917f0ecba04e3ac59da620bc63359f7754b6504cf198bac1987a1ac5123c47cf2a36919081900360600190a2505050565b600154600090600160a060020a03163314620015f557620004cb6060604051908101604052806036815260200160008051602062003d2a83398151915281526020017f744d696e4f726465724574686572416d6f756e742829000000000000000000008152506200160a565b50600255600190565b60025481565b60055481565b60007f551303dd5f39cbfe6daba6b3e27754b8a7d72f519756a2cde2b92c2bbde159a7826040518080602001828103825283818151815260200191508051906020019080838360005b838110156200166d57818101518382015260200162001653565b50505050905090810190601f1680156200169b5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1506000919050565b600080548190600160a060020a031633146200175b5762001753608060405190810160405280604781526020017f6d73672e73656e64657220213d206f72646572426f6f6b4163636f756e742c2081526020017f45786368616e67652e5f5f657865637574654f72646572496e7075744973566181526020017f6c69645f5f2829000000000000000000000000000000000000000000000000008152506200160a565b915062001d91565b6080850151431115620017cf5762001753606060405190810160405280604081526020017f4d616b6572206f726465722068617320657870697265642c2045786368616e6781526020017f652e5f5f657865637574654f72646572496e707574497356616c69645f5f28298152506200160a565b60c0850151431115620018435762001753606060405190810160405280604081526020017f54616b6572206f726465722068617320657870697265642c2045786368616e6781526020017f652e5f5f657865637574654f72646572496e707574497356616c69645f5f28298152506200160a565b600160a060020a0384161515620018e15762001753608060405190810160405280604481526020017f4d616b65722077616c6c657420646f6573206e6f742065786973742c2045786381526020017f68616e67652e5f5f657865637574654f72646572496e707574497356616c696481526020017f5f5f2829000000000000000000000000000000000000000000000000000000008152506200160a565b600160a060020a03831615156200197f5762001753608060405190810160405280604481526020017f54616b65722077616c6c657420646f6573206e6f742065786973742c2045786381526020017f68616e67652e5f5f657865637574654f72646572496e707574497356616c696481526020017f5f5f2829000000000000000000000000000000000000000000000000000000008152506200160a565b6020860151600160a060020a031615801590620019a857506060860151600160a060020a031615155b1562001a61576200175360a060405190810160405280606381526020017f4574686572206f6d697474656421204973206e6f74206f66666572656420627981526020017f20656974686572207468652054616b6572206f72204d616b65722c204578636881526020017f616e67652e5f5f657865637574654f72646572496e707574497356616c69645f81526020017f5f282900000000000000000000000000000000000000000000000000000000008152506200160a565b6020860151600160a060020a031615801562001a8857506060860151600160a060020a0316155b1562001b1b5762001753608060405190810160405280605381526020017f54616b657220616e64204d616b6572206f6666657220746f6b656e206172652081526020017f626f74682065746865722c2045786368616e67652e5f5f657865637574654f7281526020017f646572496e707574497356616c69645f5f2829000000000000000000000000008152506200160a565b8451158062001b2c57506020850151155b8062001b3a57506040850151155b8062001b4857506060850151155b1562001bdb5762001753608060405190810160405280605981526020017f4d6179206e6f74206578656375746520616e206f72646572207768657265207481526020017f6f6b656e20616d6f756e74203d3d20302c2045786368616e67652e5f5f65786581526020017f637574654f72646572496e707574497356616c69645f5f2829000000000000008152506200160a565b506002546020860151600160a060020a031615801562001bfb5750845181115b1562001cb4576200175360a060405190810160405280606281526020017f4d616b6572206f7264657220646f6573206e6f74206d65657420746865206d6981526020017f6e4f72646572457468416d6f756e745f206f662065746865722c20457863686181526020017f6e67652e5f5f657865637574654f72646572496e707574497356616c69645f5f81526020017f28290000000000000000000000000000000000000000000000000000000000008152506200160a565b6060860151600160a060020a031615801562001cd35750604085015181115b1562001d8c576200175360a060405190810160405280606281526020017f54616b6572206f7264657220646f6573206e6f74206d65657420746865206d6981526020017f6e4f72646572457468416d6f756e745f206f662065746865722c20457863686181526020017f6e67652e5f5f657865637574654f72646572496e707574497356616c69645f5f81526020017f28290000000000000000000000000000000000000000000000000000000000008152506200160a565b600191505b50949350505050565b6000808080308682602002015187600160200201518760006020020151896003602002015189600160200201518a600460200201518b60056020020151604080516c01000000000000000000000000600160a060020a039a8b1681028252988a168902601482015296891688026028880152603c87019590955292909616909402605c8401526070830193909352609082019390935260b081019190915290519081900360d0019020915030866002602002015187600360200201518760026020020151896001602002015189600360200201518a600660200201518b60076020020151604080516c01000000000000000000000000600160a060020a039a8b1681028252988a168902601482015296891688026028880152603c87019590955292909616909402605c8401526070830193909352609082019390935260b081019190915290519081900360d0019020919350909150829050509250929050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c8101869052815190819003603c018120600080835260208381018086529290925260ff87168385015260608301869052608083018590529251839260019260a0808301939192601f19830192908190039091019086865af115801562001f8e573d6000803e3d6000fd5b5050604051601f190151600160a060020a03908116981697909714979650505050505050565b6000806000808560000151151562002035576200202d606060405190810160405280604081526020017f4d616b6572206f7264657220697320696e6163746976652c2045786368616e6781526020017f652e5f5f6f72646572734d617463685f616e645f4172655661696c645f5f28298152506200160a565b935062002433565b84511515620020a5576200202d606060405190810160405280604081526020017f54616b6572206f7264657220697320696e6163746976652c2045786368616e6781526020017f652e5f5f6f72646572734d617463685f616e645f4172655661696c645f5f28298152506200160a565b8460200151600160a060020a03168660800151600160a060020a031614151562002156576200202d608060405190810160405280605c81526020017f4d616b65722077616e74656420746f6b656e20646f6573206e6f74206d61746381526020017f682074616b6572206f6666657220746f6b656e2c2045786368616e67652e5f5f81526020017f6f72646572734d617463685f616e645f4172655661696c645f5f2829000000008152506200160a565b8460800151600160a060020a03168660200151600160a060020a031614151562002207576200202d608060405190810160405280605c81526020017f4d616b6572206f6666657220746f6b656e20646f6573206e6f74206d6174636881526020017f2074616b65722077616e74656420746f6b656e2c2045786368616e67652e5f5f81526020017f6f72646572734d617463685f616e645f4172655661696c645f5f2829000000008152506200160a565b6020860151600160a060020a03161562002230576200222a866040015162000771565b6200223f565b6200223f8660a0015162000771565b90508560a0015186604001511015156200234a57620022858660a001516200227883600a0a896040015162002f2d90919063ffffffff16565b9063ffffffff62002f5416565b9250620022ac85604001516200227883600a0a8860a0015162002f2d90919063ffffffff16565b91508183101562002344576200202d608060405190810160405280605081526020017f54616b65722070726963652069732067726561746572207468616e206d616b6581526020017f722070726963652c2045786368616e67652e5f5f6f72646572734d617463685f81526020017f616e645f4172655661696c645f5f2829000000000000000000000000000000008152506200160a565b6200242e565b6200236f86604001516200227883600a0a8960a0015162002f2d90919063ffffffff16565b9250620023968560a001516200227883600a0a886040015162002f2d90919063ffffffff16565b9150818311156200242e576200202d608060405190810160405280604d81526020017f54616b6572207072696365206973206c657373207468616e206d616b6572207081526020017f726963652c2045786368616e67652e5f5f6f72646572734d617463685f616e6481526020017f5f4172655661696c645f5f2829000000000000000000000000000000000000008152506200160a565b600193505b50505092915050565b6000806000806000806000620024528962002f6c565b9450620024726200246c8a604001518b60a0015162002fe9565b62000771565b600101935062002483898562003005565b9250620024a28960c001518a60a001516200306b90919063ffffffff16565b9150620024c18860c001518960a001516200306b90919063ffffffff16565b9050848015620024dc57506080880151600160a060020a0316155b80620024fe575084158015620024fe57506080880151600160a060020a031615155b1562002570578089606001511180156200251c575087606001518211155b156200253a576200253289606001518262002fe9565b96506200254d565b6200254a8960600151826200307e565b96505b62002568836200227889600a88900a63ffffffff62002f2d16565b9550620025a0565b620025808860600151836200307e565b95506200259d836200227888600a88900a63ffffffff62002f2d16565b96505b50505050509250929050565b6020830151600090600160a060020a03161515620025ed57620025e5600654600a0a620022786005548662002f2d90919063ffffffff16565b90506200260e565b620025e5600654600a0a620022786005548562002f2d90919063ffffffff16565b9392505050565b6000828201838110156200260e57fe5b602080870151604080517f4e7343ea000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015260248101889052600060448201819052606482018190529151919392871692634e7343ea9260848084019382900301818787803b158015620026a357600080fd5b505af1158015620026b8573d6000803e3d6000fd5b505050506040513d6020811015620026cf57600080fd5b505115156200276d5762002765608060405190810160405280604f81526020017f4d616b65722077616c6c657420636f756c64206e6f742076657269667920746881526020017f65206f726465722c2045786368616e67652e5f5f6f726465727356657269666981526020017f6564427957616c6c6574735f5f282900000000000000000000000000000000008152506200160a565b9050620028b9565b606087015160048054604080517f4e7343ea000000000000000000000000000000000000000000000000000000008152600160a060020a0394851693810193909352602483018a90526044830186905290831660648301525191851691634e7343ea916084808201926020929091908290030181600087803b158015620027f357600080fd5b505af115801562002808573d6000803e3d6000fd5b505050506040513d60208110156200281f57600080fd5b50511515620028b55762002765608060405190810160405280604f81526020017f54616b65722077616c6c657420636f756c64206e6f742076657269667920746881526020017f65206f726465722c2045786368616e67652e5f5f6f726465727356657269666981526020017f6564427957616c6c6574735f5f282900000000000000000000000000000000008152506200160a565b5060015b9695505050505050565b60c0840151620028da908263ffffffff6200261516565b60c08501526060830151620028f6908263ffffffff6200306b16565b606084015260c083015162002912908363ffffffff6200261516565b60c084015260608401516200292e908363ffffffff6200306b16565b606090940193909352505050565b6020808701516060880151600480546040805160e060020a6341228803028152600160a060020a039283169381019390935260248301899052600160448401525160009591871692634122880392606480830193919282900301818987803b158015620029a857600080fd5b505af1158015620029bd573d6000803e3d6000fd5b505050506040513d6020811015620029d457600080fd5b50511515620029e257600080fd5b60048054600754604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a03898116958201959095529184166024830152604482018a90525192909116916323b872dd916064808201926020929091908290030181600087803b15801562002a6057600080fd5b505af115801562002a75573d6000803e3d6000fd5b505050506040513d602081101562002a8c57600080fd5b5051151562002a9a57600080fd5b6040805160e060020a6341228803028152600160a060020a038481166004830152602482018b9052600160448301529151918716916341228803916064808201926020929091908290030181600087803b15801562002af857600080fd5b505af115801562002b0d573d6000803e3d6000fd5b505050506040513d602081101562002b2457600080fd5b5051151562002b3257600080fd5b6040805160e060020a6341228803028152600160a060020a038481166004830152602482018b9052600060448301819052925190871692634122880392606480820193602093909283900390910190829087803b15801562002b9357600080fd5b505af115801562002ba8573d6000803e3d6000fd5b505050506040513d602081101562002bbf57600080fd5b5051151562002bcd57600080fd5b6040805160e060020a6341228803028152600160a060020a038381166004830152602482018a9052600160448301529151918616916341228803916064808201926020929091908290030181600087803b15801562002c2b57600080fd5b505af115801562002c40573d6000803e3d6000fd5b505050506040513d602081101562002c5757600080fd5b5051151562002c6557600080fd5b6040805160e060020a6341228803028152600160a060020a038381166004830152602482018a9052600060448301819052925190881692634122880392606480820193602093909283900390910190829087803b15801562002cc657600080fd5b505af115801562002cdb573d6000803e3d6000fd5b505050506040513d602081101562002cf257600080fd5b5051151562002d0057600080fd5b600160a060020a038216151562002e1457604051600160a060020a0385169089156108fc02908a906000818181858888f1935050505015801562002d48573d6000803e3d6000fd5b50604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301528781166024830152604482018a90529151918316916323b872dd916064808201926020929091908290030181600087803b15801562002dbe57600080fd5b505af115801562002dd3573d6000803e3d6000fd5b505050506040513d602081101562002dea57600080fd5b5051151562002df857600080fd5b62002e0585858362003096565b151562002e0e57fe5b62002f1e565b600160a060020a038116151562002f1957604051600160a060020a0386169088156108fc029089906000818181858888f1935050505015801562002e5c573d6000803e3d6000fd5b50604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301528681166024830152604482018b90529151918416916323b872dd916064808201926020929091908290030181600087803b15801562002ed257600080fd5b505af115801562002ee7573d6000803e3d6000fd5b505050506040513d602081101562002efe57600080fd5b5051151562002f0c57600080fd5b62002e0585858462003096565b600080fd5b50600198975050505050505050565b600082820283158062002f4b575082848281151562002f4857fe5b04145b15156200260e57fe5b600080828481151562002f6357fe5b04949350505050565b60208101516000908190600160a060020a03161562002f8d57600062002f90565b60015b905080801562002fa857508260a00151836040015110155b1562002fb857600191506200079a565b8015801562002fcf575082604001518360a0015110155b1562002fdf57600191506200079a565b600091506200079a565b600081831062002ffa578262002ffc565b815b90505b92915050565b60008260a00151836040015110151562003046576200303e8360a001516200227884600a0a866040015162002f2d90919063ffffffff16565b905062002fff565b62002ffc83604001516200227884600a0a8660a0015162002f2d90919063ffffffff16565b6000828211156200307857fe5b50900390565b60008183106200308f578162002ffc565b5090919050565b600083600160a060020a03166370a08231836040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015620030f457600080fd5b505af115801562003109573d6000803e3d6000fd5b505050506040513d60208110156200312057600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301529151918516916370a08231916024808201926020929091908290030181600087803b1580156200318857600080fd5b505af11580156200319d573d6000803e3d6000fd5b505050506040513d6020811015620031b457600080fd5b505114620031c5575060006200260e565b82600160a060020a03166370a08231836040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156200322157600080fd5b505af115801562003236573d6000803e3d6000fd5b505050506040513d60208110156200324d57600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301529151918516916370a08231916024808201926020929091908290030181600087803b158015620032b557600080fd5b505af1158015620032ca573d6000803e3d6000fd5b505050506040513d6020811015620032e157600080fd5b505114620032f2575060006200260e565b5060019392505050565b6040516109af806200337b83390190565b60408051808201825290600290829080388339509192915050565b60e0604051908101604052806000151581526020016000600160a060020a0316815260200160008152602001600081526020016000600160a060020a03168152602001600081526020016000815250905600608060405260058054600160a060020a0319167303d6e7b2f48120fd57a89ff0bbd56e9ec39af21c17905534801561003657600080fd5b506040516020806109af833981016040818152915160008054600160a060020a03808416600160a060020a03199283161783556001805490921633179091556005547facfdd2c500000000000000000000000000000000000000000000000000000000855294519294169263acfdd2c59260048083019360209383900390910190829087803b1580156100c857600080fd5b505af11580156100dc573d6000803e3d6000fd5b505050506040513d60208110156100f257600080fd5b505160038054600160a060020a031916600160a060020a039092169190911790555043600455610888806101276000396000f3006080604052600436106100ab5763ffffffff60e060020a6000350416632039d9fd81146100c457806322d40b13146100fc578063412288031461012d5780634e7343ea14610156578063648a0c911461018557806369820a80146101a657806370a08231146101cd57806398ea5fca146101ee578063c0668179146101f6578063d767ee4d1461020b578063e766307914610223578063f3fef3a314610238578063f6b1b18b1461025c575b600154600160a060020a031633146100c257600080fd5b005b3480156100d057600080fd5b506100e8600160a060020a036004351660243561027d565b604080519115158252519081900360200190f35b34801561010857600080fd5b506101116103b7565b60408051600160a060020a039092168252519081900360200190f35b34801561013957600080fd5b506100e8600160a060020a036004351660243560443515156103c6565b34801561016257600080fd5b506100e8600160a060020a036004358116906024359060443590606435166103c6565b34801561019157600080fd5b506100e8600160a060020a03600435166103e0565b3480156101b257600080fd5b506101bb61048e565b60408051918252519081900360200190f35b3480156101d957600080fd5b506101bb600160a060020a0360043516610494565b6100c26104af565b34801561020257600080fd5b5061011161053b565b34801561021757600080fd5b506100e860043561054a565b34801561022f57600080fd5b50610111610708565b34801561024457600080fd5b506100e8600160a060020a0360043516602435610717565b34801561026857600080fd5b506101bb600160a060020a03600435166107a7565b6000600160a060020a03831615156103215761031a608060405190810160405280604181526020017f43616e6e6f74206465706f73697420657468657220766961206465706f73697481526020017f45524332302c2057616c6c65742e6465706f7369744552433230546f6b656e2881526020017f29000000000000000000000000000000000000000000000000000000000000008152506107b9565b90506103b1565b600354604080517f6465706f73697428616464726573732c75696e743235362900000000000000008152815190819003601801812063ffffffff60e060020a918290049081169091028252600160a060020a03878116600484015260248301879052925192909316929160448083019260009291908290030181865af49250505015156103ad57600080fd5b5060015b92915050565b600354600160a060020a031681565b6000366000604037602060003660406003545af460206000f35b60008054600160a060020a0316331461045f57610458606060405190810160405280602d81526020017f6d73672e73656e64657220213d206f776e65725f2c2057616c6c65742e75706481526020017f61746545786368616e67652829000000000000000000000000000000000000008152506107b9565b9050610489565b506001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161781555b919050565b60045481565b600160a060020a031660009081526002602052604090205490565b600354604080517f6465706f73697428616464726573732c75696e743235362900000000000000008152815190819003601801812063ffffffff60e060020a9182900490811690910282526000600483018190523460248401529251600160a060020a039094169390926044808401939192918290030181865af492505050151561053957600080fd5b565b600154600160a060020a031681565b600080548190600160a060020a031633146105cb576105c4606060405190810160405280602a81526020017f6d73672e73656e64657220213d206f776e65725f2c2057616c6c65742e75706481526020017f6174654c6f6769632829000000000000000000000000000000000000000000008152506107b9565b9150610702565b600554604080517fd526d332000000000000000000000000000000000000000000000000000000008152600481018690529051600160a060020a039092169163d526d332916024808201926020929091908290030181600087803b15801561063257600080fd5b505af1158015610646573d6000803e3d6000fd5b505050506040513d602081101561065c57600080fd5b50519050600160a060020a03811615156106d5576105c4606060405190810160405280602581526020017f496e76616c69642076657273696f6e2c2057616c6c65742e7570646174654c6f81526020017f67696328290000000000000000000000000000000000000000000000000000008152506107b9565b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038316179055600191505b50919050565b600054600160a060020a031681565b60008054600160a060020a0316331461078f5761031a606060405190810160405280602681526020017f6d73672e73656e64657220213d206f776e65722c2057616c6c65742e7769746881526020017f64726177282900000000000000000000000000000000000000000000000000008152506107b9565b366000604037602060003660406003545af460206000f35b60026020526000908152604090205481565b60007f551303dd5f39cbfe6daba6b3e27754b8a7d72f519756a2cde2b92c2bbde159a7826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561081a578181015183820152602001610802565b50505050905090810190601f1680156108475780820380516001836020036101000a031916815260200191505b509250505060405180910390a15060009190505600a165627a7a7230582091ab9932f462dc19180e8d269e9c4a96d60c0eb6d96e71ec4fa9987efb568c4600296d73672e73656e64657220213d206f776e65722c2045786368616e67652e7365a165627a7a723058202e8c6def4e35dc85b2d888a268ec9f9557905ed2377f4c87603dd2b758eea80200290000000000000000000000008725e59eef18409273fa50662e7c1b671e368a8600000000000000000000000000000000000000000000000002c68af0bb140000000000000000000000000000ced4e93198734ddaff8492d525bd258d49eb388e00000000000000000000000000000000000000000000000000000000001e8480000000000000000000000000000000000000000000000000000000000000000600000000000000000000000006504d6f4cb6ec9cff5675c515212ebd17c3d83f
Deployed Bytecode
0x608060405260043610620000f55763ffffffff60e060020a6000350416631d2627bb8114620000f757806332b28b95146200012f5780634983542e14620001595780634a8ef4bd14620001a057806357b394bf14620001c457806363a3d38314620001ee57806369820a8014620002225780636e3706f4146200023a57806384f1b0b8146200029f5780638e5919b614620002ba578063b5f9b5cc14620002d5578063bd09f11714620002f9578063c1d5e84f1462000311578063c825ec971462000335578063cfbe2cb314620003ea578063e7cf514d1462000414578063ef3cbc39146200042f578063f673745a1462000447575b005b3480156200010457600080fd5b506200011b600160a060020a03600435166200045f565b604080519115158252519081900360200190f35b3480156200013c57600080fd5b506200014762000504565b60408051918252519081900360200190f35b3480156200016657600080fd5b506200011b60246004803582810192908201359181358083019290820135916044358083019290820135916064359182019101356200050a565b348015620001ad57600080fd5b506200011b600160a060020a036004351662000625565b348015620001d157600080fd5b50620000f5600160a060020a0360043516602435604435620006c3565b348015620001fb57600080fd5b506200020662000714565b60408051600160a060020a039092168252519081900360200190f35b3480156200022f57600080fd5b506200014762000723565b3480156200024757600080fd5b506200025560043562000729565b604080519715158852600160a060020a0396871660208901528781019590955260608701939093529316608085015260a084019290925260c0830191909152519081900360e00190f35b348015620002ac57600080fd5b506200014760043562000771565b348015620002c757600080fd5b506200011b600435620007a0565b348015620002e257600080fd5b5062000206600160a060020a03600435166200084c565b3480156200030657600080fd5b506200020662000867565b3480156200031e57600080fd5b506200011b600160a060020a036004351662000876565b3480156200034257600080fd5b506040805160808181019092526200011b913691600491608491908390819083908290808284375050604080516101008181019092529497969581810195945092506008915083908390808284375050604080518082018252949796958181019594509250600291508390839080828437505060408051608081810190925294979695818101959450925060049150839083908082843750939650620009c195505050505050565b348015620003f757600080fd5b50620000f5600160a060020a036004351660243560443562001538565b3480156200042157600080fd5b506200011b60043562001589565b3480156200043c57600080fd5b5062000147620015fe565b3480156200045457600080fd5b506200014762001604565b600154600090600160a060020a03163314620004d357620004cb606060405190810160405280602e815260200160008051602062003d2a83398151915281526020017f744569646f6f57616c6c657428290000000000000000000000000000000000008152506200160a565b9050620004ff565b506007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03831617905560015b919050565b60065481565b6000805b868110156200061557620006008a8a838181106200052857fe5b9050608002016004806020026040519081016040528092919082600460200280828437508d93508c9250869150508181106200056057fe5b905061010002016008806020026040519081016040528092919082600860200280828437508c93508b9250879150508181106200059957fe5b9050604002016002806020026040519081016040528092919082600260200280828437508b93508a925088915050818110620005d157fe5b905060800201600480602002604051908101604052809291908260046020028082843750620009c19350505050565b15156200060c57600080fd5b6001016200050e565b5060019998505050505050505050565b600154600090600160a060020a031633146200069157620004cb6060604051908101604052806032815260200160008051602062003d2a83398151915281526020017f744f72646572426f6f6b41636f756e74282900000000000000000000000000008152506200160a565b5060008054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff199091161790556001919050565b60408051600160a060020a038516815260208101849052808201839052905133917fe8d885fd2147a6ac7d644cd3c3a5f2413dbd8e515b61702b1cc1551188176b3c919081900360600190a2505050565b600454600160a060020a031681565b60035481565b60086020526000908152604090208054600182015460028301546003840154600485015460059095015460ff851695610100909504600160a060020a03908116959216919087565b6000805b600a81600a0a848115156200078657fe5b0410620007965760010162000775565b8091505b50919050565b600154600090600160a060020a031633146200080c57620004cb606060405190810160405280602a815260200160008051602062003d2a83398151915281526020017f7445646f526174652829000000000000000000000000000000000000000000008152506200160a565b60058290556040805183815290517f70d645acf6601ac71e11cc9eb4a144e5cbd8f3a9aaa6ce5a83bb1d74cba182359181900360200190a1506001919050565b600960205260009081526040902054600160a060020a031681565b600754600160a060020a031681565b600160a060020a038181166000908152600960205260408120549091829116156200090a5762000902606060405190810160405280602a81526020017f5573657220616c7265616479206578697374732c2045786368616e67652e616481526020017f644e6577557365722829000000000000000000000000000000000000000000008152506200160a565b91506200079a565b8262000915620032fc565b600160a060020a03909116815260405190819003602001906000f08015801562000943573d6000803e3d6000fd5b50600160a060020a03848116600081815260096020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff191694861694851790558151938452905193945090927f341c3eb6378732c9923fd02ea04564f599626c0f9b3fc49526dfd712d7cf7a549281900390910190a250600192915050565b6000620009cd6200330d565b600080620009da62003328565b620009e462003328565b6040805180820182528b51600160a060020a0390811660009081526009602081815285832054841685528f8601518416835290815293812054909116928201839052815191975091829162000a3d918e918e91620016b0565b151562000ab35762000aab606060405190810160405280602981526020017f496e70757420697320696e76616c69642c2045786368616e67652e657865637581526020017f74654f72646572282900000000000000000000000000000000000000000000008152506200160a565b975062001529565b62000abf8c8c62001d9a565b8d518c518c5193995091975062000ae392909189918d60015b602002015162001efb565b151562000b515762000aab606060405190810160405280603381526020017f4d616b6572207369676e617475726520697320696e76616c69642c204578636881526020017f616e67652e657865637574654f726465722829000000000000000000000000008152506200160a565b6040808d015160208c0151918b015162000b709288918d600362000ad8565b151562000bde5762000aab606060405190810160405280603381526020017f54616b6572207369676e617475726520697320696e76616c69642c204578636881526020017f616e67652e657865637574654f726465722829000000000000000000000000008152506200160a565b60086000876000191660001916815260200190815260200160002060e060405190810160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200160018201548152602001600282015481526020016003820160009054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200160048201548152602001600582015481525050935060086000866000191660001916815260200190815260200160002060e060405190810160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a9004600160a060020a0316600160a060020a0316600160a060020a0316815260200160018201548152602001600282015481526020016003820160009054906101000a9004600160a060020a0316600160a060020a0316600160a060020a031681526020016004820154815260200160058201548152505092508360a001516000141562000dc457600184526020808d0151600160a060020a03908116828701528c5160408701528c516060808801919091528e01511660808601528b015160a0850152600060c08501525b60a0830151151562000e1a57600183526060808d0151600160a060020a0390811660208087019190915260408e810180519188019190915251838701528e01511660808501528b015160a0840152600060c08401525b62000e26848462001fb4565b151562000e945762000aab606060405190810160405280602c81526020017f4f726465727320646f206e6f74206d617463682c2045786368616e67652e657881526020017f65637574654f72646572282900000000000000000000000000000000000000008152506200160a565b62000ea084846200243c565b9092509050600182108062000eb55750600181105b1562000f485762000aab608060405190810160405280605281526020017f546f6b656e20616d6f756e74203c20312c20707269636520726174696f20697381526020017f20696e76616c69642120546f6b656e2076616c7565203c20312c20457863686181526020017f6e67652e657865637574654f72646572282900000000000000000000000000008152506200160a565b6004546020840151600160a060020a0390811691161480156200101a575062000f858162000f78868585620025ac565b9063ffffffff6200261516565b600454600160a060020a03166370a0823189600160200201516040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b15801562000fea57600080fd5b505af115801562000fff573d6000803e3d6000fd5b505050506040513d60208110156200101657600080fd5b5051105b15620010d35762000aab60a060405190810160405280606381526020017f54616b65722068617320616e20696e73756666696369656e742045444f20746f81526020017f6b656e2062616c616e636520746f20636f766572207468652066656520414e4481526020017f20746865206f666665722c2045786368616e67652e657865637574654f72646581526020017f72282900000000000000000000000000000000000000000000000000000000008152506200160a565b620010e0848383620025ac565b600454600160a060020a03166370a0823189600160200201516040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156200114557600080fd5b505af11580156200115a573d6000803e3d6000fd5b505050506040513d60208110156200117157600080fd5b50511015620012075762000aab608060405190810160405280605581526020017f54616b65722068617320616e20696e73756666696369656e742045444f20746f81526020017f6b656e2062616c616e636520746f20636f76657220746865206665652c20457881526020017f6368616e67652e657865637574654f72646572282900000000000000000000008152506200160a565b865160208801516200122c918e9184918691620012268a8486620025ac565b62002625565b15156200129a5762000aab606060405190810160405280603f81526020017f4f7264657220636f756c64206e6f74206265207665726966696564206279207781526020017f616c6c6574732c2045786368616e67652e657865637574654f726465722829008152506200160a565b620012a884848484620028c3565b60608401511515620012b957600084525b60608301511515620012ca57600083525b8360086000886000191660001916815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a815481600160a060020a030219169083600160a060020a03160217905550604082015181600101556060820151816002015560808201518160030160006101000a815481600160a060020a030219169083600160a060020a0316021790555060a0820151816004015560c082015181600501559050508260086000876000191660001916815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a815481600160a060020a030219169083600160a060020a03160217905550604082015181600101556060820151816002015560808201518160030160006101000a815481600160a060020a030219169083600160a060020a0316021790555060a0820151816004015560c082015181600501559050506200146d8c838362001460888787620025ac565b8b5160208d01516200293c565b15156200147957600080fd5b6060840151604080518481526020810192909252805188927fbc99ec61d80589c90dda14a2b09b9d0ddcdd61292e3745b9967c10bdd131d95292908290030190a26060830151604080518381526020810192909252805187927fbc99ec61d80589c90dda14a2b09b9d0ddcdd61292e3745b9967c10bdd131d95292908290030190a26040517f8fd15f06b064f611e00c3a037950e48f8c637e2a0aab2afca053325afd3e859490600090a1600197505b50505050505050949350505050565b60408051600160a060020a038516815260208101849052808201839052905133917f0ecba04e3ac59da620bc63359f7754b6504cf198bac1987a1ac5123c47cf2a36919081900360600190a2505050565b600154600090600160a060020a03163314620015f557620004cb6060604051908101604052806036815260200160008051602062003d2a83398151915281526020017f744d696e4f726465724574686572416d6f756e742829000000000000000000008152506200160a565b50600255600190565b60025481565b60055481565b60007f551303dd5f39cbfe6daba6b3e27754b8a7d72f519756a2cde2b92c2bbde159a7826040518080602001828103825283818151815260200191508051906020019080838360005b838110156200166d57818101518382015260200162001653565b50505050905090810190601f1680156200169b5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1506000919050565b600080548190600160a060020a031633146200175b5762001753608060405190810160405280604781526020017f6d73672e73656e64657220213d206f72646572426f6f6b4163636f756e742c2081526020017f45786368616e67652e5f5f657865637574654f72646572496e7075744973566181526020017f6c69645f5f2829000000000000000000000000000000000000000000000000008152506200160a565b915062001d91565b6080850151431115620017cf5762001753606060405190810160405280604081526020017f4d616b6572206f726465722068617320657870697265642c2045786368616e6781526020017f652e5f5f657865637574654f72646572496e707574497356616c69645f5f28298152506200160a565b60c0850151431115620018435762001753606060405190810160405280604081526020017f54616b6572206f726465722068617320657870697265642c2045786368616e6781526020017f652e5f5f657865637574654f72646572496e707574497356616c69645f5f28298152506200160a565b600160a060020a0384161515620018e15762001753608060405190810160405280604481526020017f4d616b65722077616c6c657420646f6573206e6f742065786973742c2045786381526020017f68616e67652e5f5f657865637574654f72646572496e707574497356616c696481526020017f5f5f2829000000000000000000000000000000000000000000000000000000008152506200160a565b600160a060020a03831615156200197f5762001753608060405190810160405280604481526020017f54616b65722077616c6c657420646f6573206e6f742065786973742c2045786381526020017f68616e67652e5f5f657865637574654f72646572496e707574497356616c696481526020017f5f5f2829000000000000000000000000000000000000000000000000000000008152506200160a565b6020860151600160a060020a031615801590620019a857506060860151600160a060020a031615155b1562001a61576200175360a060405190810160405280606381526020017f4574686572206f6d697474656421204973206e6f74206f66666572656420627981526020017f20656974686572207468652054616b6572206f72204d616b65722c204578636881526020017f616e67652e5f5f657865637574654f72646572496e707574497356616c69645f81526020017f5f282900000000000000000000000000000000000000000000000000000000008152506200160a565b6020860151600160a060020a031615801562001a8857506060860151600160a060020a0316155b1562001b1b5762001753608060405190810160405280605381526020017f54616b657220616e64204d616b6572206f6666657220746f6b656e206172652081526020017f626f74682065746865722c2045786368616e67652e5f5f657865637574654f7281526020017f646572496e707574497356616c69645f5f2829000000000000000000000000008152506200160a565b8451158062001b2c57506020850151155b8062001b3a57506040850151155b8062001b4857506060850151155b1562001bdb5762001753608060405190810160405280605981526020017f4d6179206e6f74206578656375746520616e206f72646572207768657265207481526020017f6f6b656e20616d6f756e74203d3d20302c2045786368616e67652e5f5f65786581526020017f637574654f72646572496e707574497356616c69645f5f2829000000000000008152506200160a565b506002546020860151600160a060020a031615801562001bfb5750845181115b1562001cb4576200175360a060405190810160405280606281526020017f4d616b6572206f7264657220646f6573206e6f74206d65657420746865206d6981526020017f6e4f72646572457468416d6f756e745f206f662065746865722c20457863686181526020017f6e67652e5f5f657865637574654f72646572496e707574497356616c69645f5f81526020017f28290000000000000000000000000000000000000000000000000000000000008152506200160a565b6060860151600160a060020a031615801562001cd35750604085015181115b1562001d8c576200175360a060405190810160405280606281526020017f54616b6572206f7264657220646f6573206e6f74206d65657420746865206d6981526020017f6e4f72646572457468416d6f756e745f206f662065746865722c20457863686181526020017f6e67652e5f5f657865637574654f72646572496e707574497356616c69645f5f81526020017f28290000000000000000000000000000000000000000000000000000000000008152506200160a565b600191505b50949350505050565b6000808080308682602002015187600160200201518760006020020151896003602002015189600160200201518a600460200201518b60056020020151604080516c01000000000000000000000000600160a060020a039a8b1681028252988a168902601482015296891688026028880152603c87019590955292909616909402605c8401526070830193909352609082019390935260b081019190915290519081900360d0019020915030866002602002015187600360200201518760026020020151896001602002015189600360200201518a600660200201518b60076020020151604080516c01000000000000000000000000600160a060020a039a8b1681028252988a168902601482015296891688026028880152603c87019590955292909616909402605c8401526070830193909352609082019390935260b081019190915290519081900360d0019020919350909150829050509250929050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c8101869052815190819003603c018120600080835260208381018086529290925260ff87168385015260608301869052608083018590529251839260019260a0808301939192601f19830192908190039091019086865af115801562001f8e573d6000803e3d6000fd5b5050604051601f190151600160a060020a03908116981697909714979650505050505050565b6000806000808560000151151562002035576200202d606060405190810160405280604081526020017f4d616b6572206f7264657220697320696e6163746976652c2045786368616e6781526020017f652e5f5f6f72646572734d617463685f616e645f4172655661696c645f5f28298152506200160a565b935062002433565b84511515620020a5576200202d606060405190810160405280604081526020017f54616b6572206f7264657220697320696e6163746976652c2045786368616e6781526020017f652e5f5f6f72646572734d617463685f616e645f4172655661696c645f5f28298152506200160a565b8460200151600160a060020a03168660800151600160a060020a031614151562002156576200202d608060405190810160405280605c81526020017f4d616b65722077616e74656420746f6b656e20646f6573206e6f74206d61746381526020017f682074616b6572206f6666657220746f6b656e2c2045786368616e67652e5f5f81526020017f6f72646572734d617463685f616e645f4172655661696c645f5f2829000000008152506200160a565b8460800151600160a060020a03168660200151600160a060020a031614151562002207576200202d608060405190810160405280605c81526020017f4d616b6572206f6666657220746f6b656e20646f6573206e6f74206d6174636881526020017f2074616b65722077616e74656420746f6b656e2c2045786368616e67652e5f5f81526020017f6f72646572734d617463685f616e645f4172655661696c645f5f2829000000008152506200160a565b6020860151600160a060020a03161562002230576200222a866040015162000771565b6200223f565b6200223f8660a0015162000771565b90508560a0015186604001511015156200234a57620022858660a001516200227883600a0a896040015162002f2d90919063ffffffff16565b9063ffffffff62002f5416565b9250620022ac85604001516200227883600a0a8860a0015162002f2d90919063ffffffff16565b91508183101562002344576200202d608060405190810160405280605081526020017f54616b65722070726963652069732067726561746572207468616e206d616b6581526020017f722070726963652c2045786368616e67652e5f5f6f72646572734d617463685f81526020017f616e645f4172655661696c645f5f2829000000000000000000000000000000008152506200160a565b6200242e565b6200236f86604001516200227883600a0a8960a0015162002f2d90919063ffffffff16565b9250620023968560a001516200227883600a0a886040015162002f2d90919063ffffffff16565b9150818311156200242e576200202d608060405190810160405280604d81526020017f54616b6572207072696365206973206c657373207468616e206d616b6572207081526020017f726963652c2045786368616e67652e5f5f6f72646572734d617463685f616e6481526020017f5f4172655661696c645f5f2829000000000000000000000000000000000000008152506200160a565b600193505b50505092915050565b6000806000806000806000620024528962002f6c565b9450620024726200246c8a604001518b60a0015162002fe9565b62000771565b600101935062002483898562003005565b9250620024a28960c001518a60a001516200306b90919063ffffffff16565b9150620024c18860c001518960a001516200306b90919063ffffffff16565b9050848015620024dc57506080880151600160a060020a0316155b80620024fe575084158015620024fe57506080880151600160a060020a031615155b1562002570578089606001511180156200251c575087606001518211155b156200253a576200253289606001518262002fe9565b96506200254d565b6200254a8960600151826200307e565b96505b62002568836200227889600a88900a63ffffffff62002f2d16565b9550620025a0565b620025808860600151836200307e565b95506200259d836200227888600a88900a63ffffffff62002f2d16565b96505b50505050509250929050565b6020830151600090600160a060020a03161515620025ed57620025e5600654600a0a620022786005548662002f2d90919063ffffffff16565b90506200260e565b620025e5600654600a0a620022786005548562002f2d90919063ffffffff16565b9392505050565b6000828201838110156200260e57fe5b602080870151604080517f4e7343ea000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015260248101889052600060448201819052606482018190529151919392871692634e7343ea9260848084019382900301818787803b158015620026a357600080fd5b505af1158015620026b8573d6000803e3d6000fd5b505050506040513d6020811015620026cf57600080fd5b505115156200276d5762002765608060405190810160405280604f81526020017f4d616b65722077616c6c657420636f756c64206e6f742076657269667920746881526020017f65206f726465722c2045786368616e67652e5f5f6f726465727356657269666981526020017f6564427957616c6c6574735f5f282900000000000000000000000000000000008152506200160a565b9050620028b9565b606087015160048054604080517f4e7343ea000000000000000000000000000000000000000000000000000000008152600160a060020a0394851693810193909352602483018a90526044830186905290831660648301525191851691634e7343ea916084808201926020929091908290030181600087803b158015620027f357600080fd5b505af115801562002808573d6000803e3d6000fd5b505050506040513d60208110156200281f57600080fd5b50511515620028b55762002765608060405190810160405280604f81526020017f54616b65722077616c6c657420636f756c64206e6f742076657269667920746881526020017f65206f726465722c2045786368616e67652e5f5f6f726465727356657269666981526020017f6564427957616c6c6574735f5f282900000000000000000000000000000000008152506200160a565b5060015b9695505050505050565b60c0840151620028da908263ffffffff6200261516565b60c08501526060830151620028f6908263ffffffff6200306b16565b606084015260c083015162002912908363ffffffff6200261516565b60c084015260608401516200292e908363ffffffff6200306b16565b606090940193909352505050565b6020808701516060880151600480546040805160e060020a6341228803028152600160a060020a039283169381019390935260248301899052600160448401525160009591871692634122880392606480830193919282900301818987803b158015620029a857600080fd5b505af1158015620029bd573d6000803e3d6000fd5b505050506040513d6020811015620029d457600080fd5b50511515620029e257600080fd5b60048054600754604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a03898116958201959095529184166024830152604482018a90525192909116916323b872dd916064808201926020929091908290030181600087803b15801562002a6057600080fd5b505af115801562002a75573d6000803e3d6000fd5b505050506040513d602081101562002a8c57600080fd5b5051151562002a9a57600080fd5b6040805160e060020a6341228803028152600160a060020a038481166004830152602482018b9052600160448301529151918716916341228803916064808201926020929091908290030181600087803b15801562002af857600080fd5b505af115801562002b0d573d6000803e3d6000fd5b505050506040513d602081101562002b2457600080fd5b5051151562002b3257600080fd5b6040805160e060020a6341228803028152600160a060020a038481166004830152602482018b9052600060448301819052925190871692634122880392606480820193602093909283900390910190829087803b15801562002b9357600080fd5b505af115801562002ba8573d6000803e3d6000fd5b505050506040513d602081101562002bbf57600080fd5b5051151562002bcd57600080fd5b6040805160e060020a6341228803028152600160a060020a038381166004830152602482018a9052600160448301529151918616916341228803916064808201926020929091908290030181600087803b15801562002c2b57600080fd5b505af115801562002c40573d6000803e3d6000fd5b505050506040513d602081101562002c5757600080fd5b5051151562002c6557600080fd5b6040805160e060020a6341228803028152600160a060020a038381166004830152602482018a9052600060448301819052925190881692634122880392606480820193602093909283900390910190829087803b15801562002cc657600080fd5b505af115801562002cdb573d6000803e3d6000fd5b505050506040513d602081101562002cf257600080fd5b5051151562002d0057600080fd5b600160a060020a038216151562002e1457604051600160a060020a0385169089156108fc02908a906000818181858888f1935050505015801562002d48573d6000803e3d6000fd5b50604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301528781166024830152604482018a90529151918316916323b872dd916064808201926020929091908290030181600087803b15801562002dbe57600080fd5b505af115801562002dd3573d6000803e3d6000fd5b505050506040513d602081101562002dea57600080fd5b5051151562002df857600080fd5b62002e0585858362003096565b151562002e0e57fe5b62002f1e565b600160a060020a038116151562002f1957604051600160a060020a0386169088156108fc029089906000818181858888f1935050505015801562002e5c573d6000803e3d6000fd5b50604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301528681166024830152604482018b90529151918416916323b872dd916064808201926020929091908290030181600087803b15801562002ed257600080fd5b505af115801562002ee7573d6000803e3d6000fd5b505050506040513d602081101562002efe57600080fd5b5051151562002f0c57600080fd5b62002e0585858462003096565b600080fd5b50600198975050505050505050565b600082820283158062002f4b575082848281151562002f4857fe5b04145b15156200260e57fe5b600080828481151562002f6357fe5b04949350505050565b60208101516000908190600160a060020a03161562002f8d57600062002f90565b60015b905080801562002fa857508260a00151836040015110155b1562002fb857600191506200079a565b8015801562002fcf575082604001518360a0015110155b1562002fdf57600191506200079a565b600091506200079a565b600081831062002ffa578262002ffc565b815b90505b92915050565b60008260a00151836040015110151562003046576200303e8360a001516200227884600a0a866040015162002f2d90919063ffffffff16565b905062002fff565b62002ffc83604001516200227884600a0a8660a0015162002f2d90919063ffffffff16565b6000828211156200307857fe5b50900390565b60008183106200308f578162002ffc565b5090919050565b600083600160a060020a03166370a08231836040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015620030f457600080fd5b505af115801562003109573d6000803e3d6000fd5b505050506040513d60208110156200312057600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301529151918516916370a08231916024808201926020929091908290030181600087803b1580156200318857600080fd5b505af11580156200319d573d6000803e3d6000fd5b505050506040513d6020811015620031b457600080fd5b505114620031c5575060006200260e565b82600160a060020a03166370a08231836040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156200322157600080fd5b505af115801562003236573d6000803e3d6000fd5b505050506040513d60208110156200324d57600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301529151918516916370a08231916024808201926020929091908290030181600087803b158015620032b557600080fd5b505af1158015620032ca573d6000803e3d6000fd5b505050506040513d6020811015620032e157600080fd5b505114620032f2575060006200260e565b5060019392505050565b6040516109af806200337b83390190565b60408051808201825290600290829080388339509192915050565b60e0604051908101604052806000151581526020016000600160a060020a0316815260200160008152602001600081526020016000600160a060020a03168152602001600081526020016000815250905600608060405260058054600160a060020a0319167303d6e7b2f48120fd57a89ff0bbd56e9ec39af21c17905534801561003657600080fd5b506040516020806109af833981016040818152915160008054600160a060020a03808416600160a060020a03199283161783556001805490921633179091556005547facfdd2c500000000000000000000000000000000000000000000000000000000855294519294169263acfdd2c59260048083019360209383900390910190829087803b1580156100c857600080fd5b505af11580156100dc573d6000803e3d6000fd5b505050506040513d60208110156100f257600080fd5b505160038054600160a060020a031916600160a060020a039092169190911790555043600455610888806101276000396000f3006080604052600436106100ab5763ffffffff60e060020a6000350416632039d9fd81146100c457806322d40b13146100fc578063412288031461012d5780634e7343ea14610156578063648a0c911461018557806369820a80146101a657806370a08231146101cd57806398ea5fca146101ee578063c0668179146101f6578063d767ee4d1461020b578063e766307914610223578063f3fef3a314610238578063f6b1b18b1461025c575b600154600160a060020a031633146100c257600080fd5b005b3480156100d057600080fd5b506100e8600160a060020a036004351660243561027d565b604080519115158252519081900360200190f35b34801561010857600080fd5b506101116103b7565b60408051600160a060020a039092168252519081900360200190f35b34801561013957600080fd5b506100e8600160a060020a036004351660243560443515156103c6565b34801561016257600080fd5b506100e8600160a060020a036004358116906024359060443590606435166103c6565b34801561019157600080fd5b506100e8600160a060020a03600435166103e0565b3480156101b257600080fd5b506101bb61048e565b60408051918252519081900360200190f35b3480156101d957600080fd5b506101bb600160a060020a0360043516610494565b6100c26104af565b34801561020257600080fd5b5061011161053b565b34801561021757600080fd5b506100e860043561054a565b34801561022f57600080fd5b50610111610708565b34801561024457600080fd5b506100e8600160a060020a0360043516602435610717565b34801561026857600080fd5b506101bb600160a060020a03600435166107a7565b6000600160a060020a03831615156103215761031a608060405190810160405280604181526020017f43616e6e6f74206465706f73697420657468657220766961206465706f73697481526020017f45524332302c2057616c6c65742e6465706f7369744552433230546f6b656e2881526020017f29000000000000000000000000000000000000000000000000000000000000008152506107b9565b90506103b1565b600354604080517f6465706f73697428616464726573732c75696e743235362900000000000000008152815190819003601801812063ffffffff60e060020a918290049081169091028252600160a060020a03878116600484015260248301879052925192909316929160448083019260009291908290030181865af49250505015156103ad57600080fd5b5060015b92915050565b600354600160a060020a031681565b6000366000604037602060003660406003545af460206000f35b60008054600160a060020a0316331461045f57610458606060405190810160405280602d81526020017f6d73672e73656e64657220213d206f776e65725f2c2057616c6c65742e75706481526020017f61746545786368616e67652829000000000000000000000000000000000000008152506107b9565b9050610489565b506001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161781555b919050565b60045481565b600160a060020a031660009081526002602052604090205490565b600354604080517f6465706f73697428616464726573732c75696e743235362900000000000000008152815190819003601801812063ffffffff60e060020a9182900490811690910282526000600483018190523460248401529251600160a060020a039094169390926044808401939192918290030181865af492505050151561053957600080fd5b565b600154600160a060020a031681565b600080548190600160a060020a031633146105cb576105c4606060405190810160405280602a81526020017f6d73672e73656e64657220213d206f776e65725f2c2057616c6c65742e75706481526020017f6174654c6f6769632829000000000000000000000000000000000000000000008152506107b9565b9150610702565b600554604080517fd526d332000000000000000000000000000000000000000000000000000000008152600481018690529051600160a060020a039092169163d526d332916024808201926020929091908290030181600087803b15801561063257600080fd5b505af1158015610646573d6000803e3d6000fd5b505050506040513d602081101561065c57600080fd5b50519050600160a060020a03811615156106d5576105c4606060405190810160405280602581526020017f496e76616c69642076657273696f6e2c2057616c6c65742e7570646174654c6f81526020017f67696328290000000000000000000000000000000000000000000000000000008152506107b9565b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038316179055600191505b50919050565b600054600160a060020a031681565b60008054600160a060020a0316331461078f5761031a606060405190810160405280602681526020017f6d73672e73656e64657220213d206f776e65722c2057616c6c65742e7769746881526020017f64726177282900000000000000000000000000000000000000000000000000008152506107b9565b366000604037602060003660406003545af460206000f35b60026020526000908152604090205481565b60007f551303dd5f39cbfe6daba6b3e27754b8a7d72f519756a2cde2b92c2bbde159a7826040518080602001828103825283818151815260200191508051906020019080838360005b8381101561081a578181015183820152602001610802565b50505050905090810190601f1680156108475780820380516001836020036101000a031916815260200191505b509250505060405180910390a15060009190505600a165627a7a7230582091ab9932f462dc19180e8d269e9c4a96d60c0eb6d96e71ec4fa9987efb568c4600296d73672e73656e64657220213d206f776e65722c2045786368616e67652e7365a165627a7a723058202e8c6def4e35dc85b2d888a268ec9f9557905ed2377f4c87603dd2b758eea8020029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008725e59eef18409273fa50662e7c1b671e368a8600000000000000000000000000000000000000000000000002c68af0bb140000000000000000000000000000ced4e93198734ddaff8492d525bd258d49eb388e00000000000000000000000000000000000000000000000000000000001e8480000000000000000000000000000000000000000000000000000000000000000600000000000000000000000006504d6f4cb6ec9cff5675c515212ebd17c3d83f
-----Decoded View---------------
Arg [0] : _bookAccount (address): 0x8725e59eeF18409273FA50662e7C1b671E368A86
Arg [1] : _minOrderEthAmount (uint256): 200000000000000000
Arg [2] : _edoToken (address): 0xCeD4E93198734dDaFf8492d525Bd258D49eb388E
Arg [3] : _edoPerWei (uint256): 2000000
Arg [4] : _edoPerWeiDecimals (uint256): 6
Arg [5] : _eidooWallet (address): 0x06504D6f4Cb6EC9Cff5675C515212ebD17C3D83F
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000008725e59eef18409273fa50662e7c1b671e368a86
Arg [1] : 00000000000000000000000000000000000000000000000002c68af0bb140000
Arg [2] : 000000000000000000000000ced4e93198734ddaff8492d525bd258d49eb388e
Arg [3] : 00000000000000000000000000000000000000000000000000000000001e8480
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [5] : 00000000000000000000000006504d6f4cb6ec9cff5675c515212ebd17c3d83f
Swarm Source
bzzr://2e8c6def4e35dc85b2d888a268ec9f9557905ed2377f4c87603dd2b758eea802
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $2,283.01 | 0.03 | $68.49 |
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.