Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 121,736 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 21329439 | 25 days ago | IN | 0 ETH | 0.00095811 | ||||
Transfer | 21225483 | 39 days ago | IN | 0 ETH | 0.00068539 | ||||
Transfer | 20940020 | 79 days ago | IN | 0 ETH | 0.00048685 | ||||
Transfer | 20939919 | 79 days ago | IN | 0 ETH | 0.00155048 | ||||
Approve | 20912087 | 83 days ago | IN | 0 ETH | 0.0001965 | ||||
Transfer | 20705011 | 112 days ago | IN | 0 ETH | 0.00028902 | ||||
Transfer | 20685801 | 114 days ago | IN | 0 ETH | 0.00044971 | ||||
Approve | 20306456 | 167 days ago | IN | 0 ETH | 0.00005936 | ||||
Approve | 19806255 | 237 days ago | IN | 0 ETH | 0.00013621 | ||||
Transfer | 18964638 | 355 days ago | IN | 0 ETH | 0.00123263 | ||||
Transfer | 18964609 | 355 days ago | IN | 0 ETH | 0.00312305 | ||||
Transfer | 18842408 | 372 days ago | IN | 0 ETH | 0.0049114 | ||||
Transfer | 18762219 | 384 days ago | IN | 0 ETH | 0.00120686 | ||||
Approve | 18761062 | 384 days ago | IN | 0 ETH | 0.0009905 | ||||
Transfer | 18753143 | 385 days ago | IN | 0 ETH | 0.00256963 | ||||
Transfer | 18663234 | 398 days ago | IN | 0 ETH | 0.00377018 | ||||
Transfer | 18541563 | 415 days ago | IN | 0 ETH | 0.00357543 | ||||
Transfer | 18486646 | 422 days ago | IN | 0 ETH | 0.00359098 | ||||
Transfer | 18485062 | 423 days ago | IN | 0 ETH | 0.00462559 | ||||
Transfer | 18461553 | 426 days ago | IN | 0 ETH | 0.00047171 | ||||
Transfer | 18392214 | 436 days ago | IN | 0 ETH | 0.00163864 | ||||
Transfer | 18392184 | 436 days ago | IN | 0 ETH | 0.00078865 | ||||
Transfer | 18392052 | 436 days ago | IN | 0 ETH | 0.00266232 | ||||
Transfer | 18376421 | 438 days ago | IN | 0 ETH | 0.00070717 | ||||
Transfer | 18369750 | 439 days ago | IN | 0 ETH | 0.00234157 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
11694904 | 1438 days ago | 30.60705735 ETH | ||||
11588247 | 1455 days ago | 170 ETH | ||||
11585330 | 1455 days ago | 290 ETH | ||||
11584167 | 1455 days ago | 350 ETH | ||||
11583942 | 1455 days ago | 200 ETH | ||||
11583898 | 1455 days ago | 400 ETH | ||||
11583505 | 1455 days ago | 1,000 ETH | ||||
11583466 | 1455 days ago | 1.0639 ETH | ||||
6140759 | 2329 days ago | 742 ETH | ||||
6140715 | 2329 days ago | 8,000 ETH | ||||
6140692 | 2329 days ago | 1,000 ETH | ||||
6140594 | 2330 days ago | 100 ETH | ||||
6140412 | 2330 days ago | 1 ETH | ||||
5258963 | 2481 days ago | 189.99 ETH | ||||
5060430 | 2514 days ago | 0.225 ETH | ||||
5005536 | 2524 days ago | 34,260.69397436 ETH | ||||
4928573 | 2537 days ago | 2.3 ETH | ||||
4914451 | 2539 days ago | 0.022021 ETH | ||||
4913591 | 2539 days ago | 0.022021 ETH | ||||
4910727 | 2540 days ago | 0.022021 ETH | ||||
4910486 | 2540 days ago | 0.022021 ETH | ||||
4910238 | 2540 days ago | 0.022021 ETH | ||||
4909994 | 2540 days ago | 0.022021 ETH | ||||
4909771 | 2540 days ago | 0.022021 ETH | ||||
4909556 | 2540 days ago | 0.022021 ETH |
Loading...
Loading
Contract Name:
EVNToken
Compiler Version
v0.4.15+commit.bbb8e64f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2017-12-14 */ pragma solidity ^0.4.15; /** * @title Safe math operations that throw error on overflow. * * Credit: Taking ideas from FirstBlood token */ library SafeMath { /** * @dev Safely add two numbers. * * @param x First operant. * @param y Second operant. * @return The result of x+y. */ function add(uint256 x, uint256 y) internal constant returns(uint256) { uint256 z = x + y; assert((z >= x) && (z >= y)); return z; } /** * @dev Safely substract two numbers. * * @param x First operant. * @param y Second operant. * @return The result of x-y. */ function sub(uint256 x, uint256 y) internal constant returns(uint256) { assert(x >= y); uint256 z = x - y; return z; } /** * @dev Safely multiply two numbers. * * @param x First operant. * @param y Second operant. * @return The result of x*y. */ function mul(uint256 x, uint256 y) internal constant returns(uint256) { uint256 z = x * y; assert((x == 0) || (z/x == y)); return z; } /** * @dev Parse a floating point number from String to uint, e.g. "250.56" to "25056" */ function parse(string s) internal constant returns (uint256) { bytes memory b = bytes(s); uint result = 0; for (uint i = 0; i < b.length; i++) { if (b[i] >= 48 && b[i] <= 57) { result = result * 10 + (uint(b[i]) - 48); } } return result; } } /** * @title The abstract ERC-20 Token Standard definition. * * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md */ contract Token { /// @dev Returns the total token supply. uint256 public totalSupply; function balanceOf(address _owner) public constant returns (uint256 balance); function transfer(address _to, uint256 _value) public returns (bool success); function transferFrom(address _from, address _to, uint256 _value) public returns (bool success); function approve(address _spender, uint256 _value) public returns (bool success); function allowance(address _owner, address _spender) public constant returns (uint256 remaining); /// @dev MUST trigger when tokens are transferred, including zero value transfers. event Transfer(address indexed _from, address indexed _to, uint256 _value); /// @dev MUST trigger on any successful call to approve(address _spender, uint256 _value). event Approval(address indexed _owner, address indexed _spender, uint256 _value); } /** * @title Default implementation of the ERC-20 Token Standard. */ contract StandardToken is Token { mapping (address => uint256) balances; mapping (address => mapping (address => uint256)) allowed; modifier onlyPayloadSize(uint numwords) { assert(msg.data.length == numwords * 32 + 4); _; } /** * @dev Transfers _value amount of tokens to address _to, and MUST fire the Transfer event. * @dev The function SHOULD throw if the _from account balance does not have enough tokens to spend. * * @dev A token contract which creates new tokens SHOULD trigger a Transfer event with the _from address set to 0x0 when tokens are created. * * Note Transfers of 0 values MUST be treated as normal transfers and fire the Transfer event. * * @param _to The receiver of the tokens. * @param _value The amount of tokens to send. * @return True on success, false otherwise. */ function transfer(address _to, uint256 _value) public returns (bool success) { if (balances[msg.sender] >= _value && _value > 0 && balances[_to] + _value > balances[_to]) { balances[msg.sender] = SafeMath.sub(balances[msg.sender], _value); balances[_to] = SafeMath.add(balances[_to], _value); Transfer(msg.sender, _to, _value); return true; } else { return false; } } /** * @dev Transfers _value amount of tokens from address _from to address _to, and MUST fire the Transfer event. * * @dev The transferFrom method is used for a withdraw workflow, allowing contracts to transfer tokens on your behalf. * @dev This can be used for example to allow a contract to transfer tokens on your behalf and/or to charge fees in * @dev sub-currencies. The function SHOULD throw unless the _from account has deliberately authorized the sender of * @dev the message via some mechanism. * * Note Transfers of 0 values MUST be treated as normal transfers and fire the Transfer event. * * @param _from The sender of the tokens. * @param _to The receiver of the tokens. * @param _value The amount of tokens to send. * @return True on success, false otherwise. */ function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && _value > 0 && balances[_to] + _value > balances[_to]) { balances[_to] = SafeMath.add(balances[_to], _value); balances[_from] = SafeMath.sub(balances[_from], _value); allowed[_from][msg.sender] = SafeMath.sub(allowed[_from][msg.sender], _value); Transfer(_from, _to, _value); return true; } else { return false; } } /** * @dev Returns the account balance of another account with address _owner. * * @param _owner The address of the account to check. * @return The account balance. */ function balanceOf(address _owner) public constant returns (uint256 balance) { return balances[_owner]; } /** * @dev Allows _spender to withdraw from your account multiple times, up to the _value amount. * @dev If this function is called again it overwrites the current allowance with _value. * * @dev NOTE: To prevent attack vectors like the one described in [1] and discussed in [2], clients * @dev SHOULD make sure to create user interfaces in such a way that they set the allowance first * @dev to 0 before setting it to another value for the same spender. THOUGH The contract itself * @dev shouldn't enforce it, to allow backwards compatilibilty with contracts deployed before. * @dev [1] https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/ * @dev [2] https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * @param _spender The address which will spend the funds. * @param _value The amount of tokens to be spent. * @return True on success, false otherwise. */ function approve(address _spender, uint256 _value) public onlyPayloadSize(2) returns (bool success) { allowed[msg.sender][_spender] = _value; Approval(msg.sender, _spender, _value); return true; } /** * @dev Returns the amount which _spender is still allowed to withdraw from _owner. * * @param _owner The address of the sender. * @param _spender The address of the receiver. * @return The allowed withdrawal amount. */ function allowance(address _owner, address _spender) public constant onlyPayloadSize(2) returns (uint256 remaining) { return allowed[_owner][_spender]; } } // <ORACLIZE_API> /* Copyright (c) 2015-2016 Oraclize SRL Copyright (c) 2016 Oraclize LTD Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ contract OraclizeI { address public cbAddress; function query(uint _timestamp, string _datasource, string _arg) payable returns (bytes32 _id); function query_withGasLimit(uint _timestamp, string _datasource, string _arg, uint _gaslimit) payable returns (bytes32 _id); function query2(uint _timestamp, string _datasource, string _arg1, string _arg2) payable returns (bytes32 _id); function query2_withGasLimit(uint _timestamp, string _datasource, string _arg1, string _arg2, uint _gaslimit) payable returns (bytes32 _id); function queryN(uint _timestamp, string _datasource, bytes _argN) payable returns (bytes32 _id); function queryN_withGasLimit(uint _timestamp, string _datasource, bytes _argN, uint _gaslimit) payable returns (bytes32 _id); function getPrice(string _datasource) returns (uint _dsprice); function getPrice(string _datasource, uint gaslimit) returns (uint _dsprice); function useCoupon(string _coupon); function setProofType(byte _proofType); function setConfig(bytes32 _config); function setCustomGasPrice(uint _gasPrice); function randomDS_getSessionPubKeyHash() returns(bytes32); } contract OraclizeAddrResolverI { function getAddress() returns (address _addr); } contract usingOraclize { uint constant day = 60*60*24; uint constant week = 60*60*24*7; uint constant month = 60*60*24*30; byte constant proofType_NONE = 0x00; byte constant proofType_TLSNotary = 0x10; byte constant proofType_Android = 0x20; byte constant proofType_Ledger = 0x30; byte constant proofType_Native = 0xF0; byte constant proofStorage_IPFS = 0x01; uint8 constant networkID_auto = 0; uint8 constant networkID_mainnet = 1; uint8 constant networkID_testnet = 2; uint8 constant networkID_morden = 2; uint8 constant networkID_consensys = 161; OraclizeAddrResolverI OAR; OraclizeI oraclize; modifier oraclizeAPI { if((address(OAR)==0)||(getCodeSize(address(OAR))==0)) oraclize_setNetwork(networkID_auto); oraclize = OraclizeI(OAR.getAddress()); _; } modifier coupon(string code){ oraclize = OraclizeI(OAR.getAddress()); oraclize.useCoupon(code); _; } function oraclize_setNetwork(uint8 networkID) internal returns(bool){ if (getCodeSize(0x1d3B2638a7cC9f2CB3D298A3DA7a90B67E5506ed)>0){ //mainnet OAR = OraclizeAddrResolverI(0x1d3B2638a7cC9f2CB3D298A3DA7a90B67E5506ed); oraclize_setNetworkName("eth_mainnet"); return true; } if (getCodeSize(0xc03A2615D5efaf5F49F60B7BB6583eaec212fdf1)>0){ //ropsten testnet OAR = OraclizeAddrResolverI(0xc03A2615D5efaf5F49F60B7BB6583eaec212fdf1); oraclize_setNetworkName("eth_ropsten3"); return true; } if (getCodeSize(0xB7A07BcF2Ba2f2703b24C0691b5278999C59AC7e)>0){ //kovan testnet OAR = OraclizeAddrResolverI(0xB7A07BcF2Ba2f2703b24C0691b5278999C59AC7e); oraclize_setNetworkName("eth_kovan"); return true; } if (getCodeSize(0x146500cfd35B22E4A392Fe0aDc06De1a1368Ed48)>0){ //rinkeby testnet OAR = OraclizeAddrResolverI(0x146500cfd35B22E4A392Fe0aDc06De1a1368Ed48); oraclize_setNetworkName("eth_rinkeby"); return true; } if (getCodeSize(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475)>0){ //ethereum-bridge OAR = OraclizeAddrResolverI(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475); return true; } if (getCodeSize(0x20e12A1F859B3FeaE5Fb2A0A32C18F5a65555bBF)>0){ //ether.camp ide OAR = OraclizeAddrResolverI(0x20e12A1F859B3FeaE5Fb2A0A32C18F5a65555bBF); return true; } if (getCodeSize(0x51efaF4c8B3C9AfBD5aB9F4bbC82784Ab6ef8fAA)>0){ //browser-solidity OAR = OraclizeAddrResolverI(0x51efaF4c8B3C9AfBD5aB9F4bbC82784Ab6ef8fAA); return true; } return false; } function __callback(bytes32 myid, string result) { __callback(myid, result, new bytes(0)); } function __callback(bytes32 myid, string result, bytes proof) { } function oraclize_useCoupon(string code) oraclizeAPI internal { oraclize.useCoupon(code); } function oraclize_getPrice(string datasource) oraclizeAPI internal returns (uint){ return oraclize.getPrice(datasource); } function oraclize_getPrice(string datasource, uint gaslimit) oraclizeAPI internal returns (uint){ return oraclize.getPrice(datasource, gaslimit); } function oraclize_query(string datasource, string arg) oraclizeAPI internal returns (bytes32 id){ uint price = oraclize.getPrice(datasource); if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price return oraclize.query.value(price)(0, datasource, arg); } function oraclize_query(uint timestamp, string datasource, string arg) oraclizeAPI internal returns (bytes32 id){ uint price = oraclize.getPrice(datasource); if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price return oraclize.query.value(price)(timestamp, datasource, arg); } function oraclize_query(uint timestamp, string datasource, string arg, uint gaslimit) oraclizeAPI internal returns (bytes32 id){ uint price = oraclize.getPrice(datasource, gaslimit); if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price return oraclize.query_withGasLimit.value(price)(timestamp, datasource, arg, gaslimit); } function oraclize_query(string datasource, string arg, uint gaslimit) oraclizeAPI internal returns (bytes32 id){ uint price = oraclize.getPrice(datasource, gaslimit); if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price return oraclize.query_withGasLimit.value(price)(0, datasource, arg, gaslimit); } function oraclize_query(string datasource, string arg1, string arg2) oraclizeAPI internal returns (bytes32 id){ uint price = oraclize.getPrice(datasource); if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price return oraclize.query2.value(price)(0, datasource, arg1, arg2); } function oraclize_query(uint timestamp, string datasource, string arg1, string arg2) oraclizeAPI internal returns (bytes32 id){ uint price = oraclize.getPrice(datasource); if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price return oraclize.query2.value(price)(timestamp, datasource, arg1, arg2); } function oraclize_query(uint timestamp, string datasource, string arg1, string arg2, uint gaslimit) oraclizeAPI internal returns (bytes32 id){ uint price = oraclize.getPrice(datasource, gaslimit); if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price return oraclize.query2_withGasLimit.value(price)(timestamp, datasource, arg1, arg2, gaslimit); } function oraclize_query(string datasource, string arg1, string arg2, uint gaslimit) oraclizeAPI internal returns (bytes32 id){ uint price = oraclize.getPrice(datasource, gaslimit); if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price return oraclize.query2_withGasLimit.value(price)(0, datasource, arg1, arg2, gaslimit); } function oraclize_query(string datasource, string[] argN) oraclizeAPI internal returns (bytes32 id){ uint price = oraclize.getPrice(datasource); if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price bytes memory args = stra2cbor(argN); return oraclize.queryN.value(price)(0, datasource, args); } function oraclize_query(uint timestamp, string datasource, string[] argN) oraclizeAPI internal returns (bytes32 id){ uint price = oraclize.getPrice(datasource); if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price bytes memory args = stra2cbor(argN); return oraclize.queryN.value(price)(timestamp, datasource, args); } function oraclize_query(uint timestamp, string datasource, string[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){ uint price = oraclize.getPrice(datasource, gaslimit); if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price bytes memory args = stra2cbor(argN); return oraclize.queryN_withGasLimit.value(price)(timestamp, datasource, args, gaslimit); } function oraclize_query(string datasource, string[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){ uint price = oraclize.getPrice(datasource, gaslimit); if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price bytes memory args = stra2cbor(argN); return oraclize.queryN_withGasLimit.value(price)(0, datasource, args, gaslimit); } function oraclize_query(string datasource, string[1] args) oraclizeAPI internal returns (bytes32 id) { string[] memory dynargs = new string[](1); dynargs[0] = args[0]; return oraclize_query(datasource, dynargs); } function oraclize_query(uint timestamp, string datasource, string[1] args) oraclizeAPI internal returns (bytes32 id) { string[] memory dynargs = new string[](1); dynargs[0] = args[0]; return oraclize_query(timestamp, datasource, dynargs); } function oraclize_query(uint timestamp, string datasource, string[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) { string[] memory dynargs = new string[](1); dynargs[0] = args[0]; return oraclize_query(timestamp, datasource, dynargs, gaslimit); } function oraclize_query(string datasource, string[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) { string[] memory dynargs = new string[](1); dynargs[0] = args[0]; return oraclize_query(datasource, dynargs, gaslimit); } function oraclize_query(string datasource, string[2] args) oraclizeAPI internal returns (bytes32 id) { string[] memory dynargs = new string[](2); dynargs[0] = args[0]; dynargs[1] = args[1]; return oraclize_query(datasource, dynargs); } function oraclize_query(uint timestamp, string datasource, string[2] args) oraclizeAPI internal returns (bytes32 id) { string[] memory dynargs = new string[](2); dynargs[0] = args[0]; dynargs[1] = args[1]; return oraclize_query(timestamp, datasource, dynargs); } function oraclize_query(uint timestamp, string datasource, string[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) { string[] memory dynargs = new string[](2); dynargs[0] = args[0]; dynargs[1] = args[1]; return oraclize_query(timestamp, datasource, dynargs, gaslimit); } function oraclize_query(string datasource, string[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) { string[] memory dynargs = new string[](2); dynargs[0] = args[0]; dynargs[1] = args[1]; return oraclize_query(datasource, dynargs, gaslimit); } function oraclize_query(string datasource, string[3] args) oraclizeAPI internal returns (bytes32 id) { string[] memory dynargs = new string[](3); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; return oraclize_query(datasource, dynargs); } function oraclize_query(uint timestamp, string datasource, string[3] args) oraclizeAPI internal returns (bytes32 id) { string[] memory dynargs = new string[](3); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; return oraclize_query(timestamp, datasource, dynargs); } function oraclize_query(uint timestamp, string datasource, string[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) { string[] memory dynargs = new string[](3); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; return oraclize_query(timestamp, datasource, dynargs, gaslimit); } function oraclize_query(string datasource, string[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) { string[] memory dynargs = new string[](3); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; return oraclize_query(datasource, dynargs, gaslimit); } function oraclize_query(string datasource, string[4] args) oraclizeAPI internal returns (bytes32 id) { string[] memory dynargs = new string[](4); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; dynargs[3] = args[3]; return oraclize_query(datasource, dynargs); } function oraclize_query(uint timestamp, string datasource, string[4] args) oraclizeAPI internal returns (bytes32 id) { string[] memory dynargs = new string[](4); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; dynargs[3] = args[3]; return oraclize_query(timestamp, datasource, dynargs); } function oraclize_query(uint timestamp, string datasource, string[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) { string[] memory dynargs = new string[](4); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; dynargs[3] = args[3]; return oraclize_query(timestamp, datasource, dynargs, gaslimit); } function oraclize_query(string datasource, string[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) { string[] memory dynargs = new string[](4); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; dynargs[3] = args[3]; return oraclize_query(datasource, dynargs, gaslimit); } function oraclize_query(string datasource, string[5] args) oraclizeAPI internal returns (bytes32 id) { string[] memory dynargs = new string[](5); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; dynargs[3] = args[3]; dynargs[4] = args[4]; return oraclize_query(datasource, dynargs); } function oraclize_query(uint timestamp, string datasource, string[5] args) oraclizeAPI internal returns (bytes32 id) { string[] memory dynargs = new string[](5); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; dynargs[3] = args[3]; dynargs[4] = args[4]; return oraclize_query(timestamp, datasource, dynargs); } function oraclize_query(uint timestamp, string datasource, string[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) { string[] memory dynargs = new string[](5); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; dynargs[3] = args[3]; dynargs[4] = args[4]; return oraclize_query(timestamp, datasource, dynargs, gaslimit); } function oraclize_query(string datasource, string[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) { string[] memory dynargs = new string[](5); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; dynargs[3] = args[3]; dynargs[4] = args[4]; return oraclize_query(datasource, dynargs, gaslimit); } function oraclize_query(string datasource, bytes[] argN) oraclizeAPI internal returns (bytes32 id){ uint price = oraclize.getPrice(datasource); if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price bytes memory args = ba2cbor(argN); return oraclize.queryN.value(price)(0, datasource, args); } function oraclize_query(uint timestamp, string datasource, bytes[] argN) oraclizeAPI internal returns (bytes32 id){ uint price = oraclize.getPrice(datasource); if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price bytes memory args = ba2cbor(argN); return oraclize.queryN.value(price)(timestamp, datasource, args); } function oraclize_query(uint timestamp, string datasource, bytes[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){ uint price = oraclize.getPrice(datasource, gaslimit); if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price bytes memory args = ba2cbor(argN); return oraclize.queryN_withGasLimit.value(price)(timestamp, datasource, args, gaslimit); } function oraclize_query(string datasource, bytes[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){ uint price = oraclize.getPrice(datasource, gaslimit); if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price bytes memory args = ba2cbor(argN); return oraclize.queryN_withGasLimit.value(price)(0, datasource, args, gaslimit); } function oraclize_query(string datasource, bytes[1] args) oraclizeAPI internal returns (bytes32 id) { bytes[] memory dynargs = new bytes[](1); dynargs[0] = args[0]; return oraclize_query(datasource, dynargs); } function oraclize_query(uint timestamp, string datasource, bytes[1] args) oraclizeAPI internal returns (bytes32 id) { bytes[] memory dynargs = new bytes[](1); dynargs[0] = args[0]; return oraclize_query(timestamp, datasource, dynargs); } function oraclize_query(uint timestamp, string datasource, bytes[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) { bytes[] memory dynargs = new bytes[](1); dynargs[0] = args[0]; return oraclize_query(timestamp, datasource, dynargs, gaslimit); } function oraclize_query(string datasource, bytes[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) { bytes[] memory dynargs = new bytes[](1); dynargs[0] = args[0]; return oraclize_query(datasource, dynargs, gaslimit); } function oraclize_query(string datasource, bytes[2] args) oraclizeAPI internal returns (bytes32 id) { bytes[] memory dynargs = new bytes[](2); dynargs[0] = args[0]; dynargs[1] = args[1]; return oraclize_query(datasource, dynargs); } function oraclize_query(uint timestamp, string datasource, bytes[2] args) oraclizeAPI internal returns (bytes32 id) { bytes[] memory dynargs = new bytes[](2); dynargs[0] = args[0]; dynargs[1] = args[1]; return oraclize_query(timestamp, datasource, dynargs); } function oraclize_query(uint timestamp, string datasource, bytes[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) { bytes[] memory dynargs = new bytes[](2); dynargs[0] = args[0]; dynargs[1] = args[1]; return oraclize_query(timestamp, datasource, dynargs, gaslimit); } function oraclize_query(string datasource, bytes[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) { bytes[] memory dynargs = new bytes[](2); dynargs[0] = args[0]; dynargs[1] = args[1]; return oraclize_query(datasource, dynargs, gaslimit); } function oraclize_query(string datasource, bytes[3] args) oraclizeAPI internal returns (bytes32 id) { bytes[] memory dynargs = new bytes[](3); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; return oraclize_query(datasource, dynargs); } function oraclize_query(uint timestamp, string datasource, bytes[3] args) oraclizeAPI internal returns (bytes32 id) { bytes[] memory dynargs = new bytes[](3); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; return oraclize_query(timestamp, datasource, dynargs); } function oraclize_query(uint timestamp, string datasource, bytes[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) { bytes[] memory dynargs = new bytes[](3); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; return oraclize_query(timestamp, datasource, dynargs, gaslimit); } function oraclize_query(string datasource, bytes[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) { bytes[] memory dynargs = new bytes[](3); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; return oraclize_query(datasource, dynargs, gaslimit); } function oraclize_query(string datasource, bytes[4] args) oraclizeAPI internal returns (bytes32 id) { bytes[] memory dynargs = new bytes[](4); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; dynargs[3] = args[3]; return oraclize_query(datasource, dynargs); } function oraclize_query(uint timestamp, string datasource, bytes[4] args) oraclizeAPI internal returns (bytes32 id) { bytes[] memory dynargs = new bytes[](4); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; dynargs[3] = args[3]; return oraclize_query(timestamp, datasource, dynargs); } function oraclize_query(uint timestamp, string datasource, bytes[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) { bytes[] memory dynargs = new bytes[](4); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; dynargs[3] = args[3]; return oraclize_query(timestamp, datasource, dynargs, gaslimit); } function oraclize_query(string datasource, bytes[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) { bytes[] memory dynargs = new bytes[](4); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; dynargs[3] = args[3]; return oraclize_query(datasource, dynargs, gaslimit); } function oraclize_query(string datasource, bytes[5] args) oraclizeAPI internal returns (bytes32 id) { bytes[] memory dynargs = new bytes[](5); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; dynargs[3] = args[3]; dynargs[4] = args[4]; return oraclize_query(datasource, dynargs); } function oraclize_query(uint timestamp, string datasource, bytes[5] args) oraclizeAPI internal returns (bytes32 id) { bytes[] memory dynargs = new bytes[](5); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; dynargs[3] = args[3]; dynargs[4] = args[4]; return oraclize_query(timestamp, datasource, dynargs); } function oraclize_query(uint timestamp, string datasource, bytes[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) { bytes[] memory dynargs = new bytes[](5); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; dynargs[3] = args[3]; dynargs[4] = args[4]; return oraclize_query(timestamp, datasource, dynargs, gaslimit); } function oraclize_query(string datasource, bytes[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) { bytes[] memory dynargs = new bytes[](5); dynargs[0] = args[0]; dynargs[1] = args[1]; dynargs[2] = args[2]; dynargs[3] = args[3]; dynargs[4] = args[4]; return oraclize_query(datasource, dynargs, gaslimit); } function oraclize_cbAddress() oraclizeAPI internal returns (address){ return oraclize.cbAddress(); } function oraclize_setProof(byte proofP) oraclizeAPI internal { return oraclize.setProofType(proofP); } function oraclize_setCustomGasPrice(uint gasPrice) oraclizeAPI internal { return oraclize.setCustomGasPrice(gasPrice); } function oraclize_setConfig(bytes32 config) oraclizeAPI internal { return oraclize.setConfig(config); } function oraclize_randomDS_getSessionPubKeyHash() oraclizeAPI internal returns (bytes32){ return oraclize.randomDS_getSessionPubKeyHash(); } function getCodeSize(address _addr) constant internal returns(uint _size) { assembly { _size := extcodesize(_addr) } } function parseAddr(string _a) internal returns (address){ bytes memory tmp = bytes(_a); uint160 iaddr = 0; uint160 b1; uint160 b2; for (uint i=2; i<2+2*20; i+=2){ iaddr *= 256; b1 = uint160(tmp[i]); b2 = uint160(tmp[i+1]); if ((b1 >= 97)&&(b1 <= 102)) b1 -= 87; else if ((b1 >= 65)&&(b1 <= 70)) b1 -= 55; else if ((b1 >= 48)&&(b1 <= 57)) b1 -= 48; if ((b2 >= 97)&&(b2 <= 102)) b2 -= 87; else if ((b2 >= 65)&&(b2 <= 70)) b2 -= 55; else if ((b2 >= 48)&&(b2 <= 57)) b2 -= 48; iaddr += (b1*16+b2); } return address(iaddr); } function strCompare(string _a, string _b) internal returns (int) { bytes memory a = bytes(_a); bytes memory b = bytes(_b); uint minLength = a.length; if (b.length < minLength) minLength = b.length; for (uint i = 0; i < minLength; i ++) if (a[i] < b[i]) return -1; else if (a[i] > b[i]) return 1; if (a.length < b.length) return -1; else if (a.length > b.length) return 1; else return 0; } function indexOf(string _haystack, string _needle) internal returns (int) { bytes memory h = bytes(_haystack); bytes memory n = bytes(_needle); if(h.length < 1 || n.length < 1 || (n.length > h.length)) return -1; else if(h.length > (2**128 -1)) return -1; else { uint subindex = 0; for (uint i = 0; i < h.length; i ++) { if (h[i] == n[0]) { subindex = 1; while(subindex < n.length && (i + subindex) < h.length && h[i + subindex] == n[subindex]) { subindex++; } if(subindex == n.length) return int(i); } } return -1; } } function strConcat(string _a, string _b, string _c, string _d, string _e) internal returns (string) { bytes memory _ba = bytes(_a); bytes memory _bb = bytes(_b); bytes memory _bc = bytes(_c); bytes memory _bd = bytes(_d); bytes memory _be = bytes(_e); string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length); bytes memory babcde = bytes(abcde); uint k = 0; for (uint i = 0; i < _ba.length; i++) babcde[k++] = _ba[i]; for (i = 0; i < _bb.length; i++) babcde[k++] = _bb[i]; for (i = 0; i < _bc.length; i++) babcde[k++] = _bc[i]; for (i = 0; i < _bd.length; i++) babcde[k++] = _bd[i]; for (i = 0; i < _be.length; i++) babcde[k++] = _be[i]; return string(babcde); } function strConcat(string _a, string _b, string _c, string _d) internal returns (string) { return strConcat(_a, _b, _c, _d, ""); } function strConcat(string _a, string _b, string _c) internal returns (string) { return strConcat(_a, _b, _c, "", ""); } function strConcat(string _a, string _b) internal returns (string) { return strConcat(_a, _b, "", "", ""); } // parseInt function parseInt(string _a) internal returns (uint) { return parseInt(_a, 0); } // parseInt(parseFloat*10^_b) function parseInt(string _a, uint _b) internal returns (uint) { bytes memory bresult = bytes(_a); uint mint = 0; bool decimals = false; for (uint i=0; i<bresult.length; i++){ if ((bresult[i] >= 48)&&(bresult[i] <= 57)){ if (decimals){ if (_b == 0) break; else _b--; } mint *= 10; mint += uint(bresult[i]) - 48; } else if (bresult[i] == 46) decimals = true; } if (_b > 0) mint *= 10**_b; return mint; } function uint2str(uint i) internal returns (string){ if (i == 0) return "0"; uint j = i; uint len; while (j != 0){ len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len - 1; while (i != 0){ bstr[k--] = byte(48 + i % 10); i /= 10; } return string(bstr); } function stra2cbor(string[] arr) internal returns (bytes) { uint arrlen = arr.length; // get correct cbor output length uint outputlen = 0; bytes[] memory elemArray = new bytes[](arrlen); for (uint i = 0; i < arrlen; i++) { elemArray[i] = (bytes(arr[i])); outputlen += elemArray[i].length + (elemArray[i].length - 1)/23 + 3; //+3 accounts for paired identifier types } uint ctr = 0; uint cborlen = arrlen + 0x80; outputlen += byte(cborlen).length; bytes memory res = new bytes(outputlen); while (byte(cborlen).length > ctr) { res[ctr] = byte(cborlen)[ctr]; ctr++; } for (i = 0; i < arrlen; i++) { res[ctr] = 0x5F; ctr++; for (uint x = 0; x < elemArray[i].length; x++) { // if there's a bug with larger strings, this may be the culprit if (x % 23 == 0) { uint elemcborlen = elemArray[i].length - x >= 24 ? 23 : elemArray[i].length - x; elemcborlen += 0x40; uint lctr = ctr; while (byte(elemcborlen).length > ctr - lctr) { res[ctr] = byte(elemcborlen)[ctr - lctr]; ctr++; } } res[ctr] = elemArray[i][x]; ctr++; } res[ctr] = 0xFF; ctr++; } return res; } function ba2cbor(bytes[] arr) internal returns (bytes) { uint arrlen = arr.length; // get correct cbor output length uint outputlen = 0; bytes[] memory elemArray = new bytes[](arrlen); for (uint i = 0; i < arrlen; i++) { elemArray[i] = (bytes(arr[i])); outputlen += elemArray[i].length + (elemArray[i].length - 1)/23 + 3; //+3 accounts for paired identifier types } uint ctr = 0; uint cborlen = arrlen + 0x80; outputlen += byte(cborlen).length; bytes memory res = new bytes(outputlen); while (byte(cborlen).length > ctr) { res[ctr] = byte(cborlen)[ctr]; ctr++; } for (i = 0; i < arrlen; i++) { res[ctr] = 0x5F; ctr++; for (uint x = 0; x < elemArray[i].length; x++) { // if there's a bug with larger strings, this may be the culprit if (x % 23 == 0) { uint elemcborlen = elemArray[i].length - x >= 24 ? 23 : elemArray[i].length - x; elemcborlen += 0x40; uint lctr = ctr; while (byte(elemcborlen).length > ctr - lctr) { res[ctr] = byte(elemcborlen)[ctr - lctr]; ctr++; } } res[ctr] = elemArray[i][x]; ctr++; } res[ctr] = 0xFF; ctr++; } return res; } string oraclize_network_name; function oraclize_setNetworkName(string _network_name) internal { oraclize_network_name = _network_name; } function oraclize_getNetworkName() internal returns (string) { return oraclize_network_name; } function oraclize_newRandomDSQuery(uint _delay, uint _nbytes, uint _customGasLimit) internal returns (bytes32){ if ((_nbytes == 0)||(_nbytes > 32)) throw; bytes memory nbytes = new bytes(1); nbytes[0] = byte(_nbytes); bytes memory unonce = new bytes(32); bytes memory sessionKeyHash = new bytes(32); bytes32 sessionKeyHash_bytes32 = oraclize_randomDS_getSessionPubKeyHash(); assembly { mstore(unonce, 0x20) mstore(add(unonce, 0x20), xor(blockhash(sub(number, 1)), xor(coinbase, timestamp))) mstore(sessionKeyHash, 0x20) mstore(add(sessionKeyHash, 0x20), sessionKeyHash_bytes32) } bytes[3] memory args = [unonce, nbytes, sessionKeyHash]; bytes32 queryId = oraclize_query(_delay, "random", args, _customGasLimit); oraclize_randomDS_setCommitment(queryId, sha3(bytes8(_delay), args[1], sha256(args[0]), args[2])); return queryId; } function oraclize_randomDS_setCommitment(bytes32 queryId, bytes32 commitment) internal { oraclize_randomDS_args[queryId] = commitment; } mapping(bytes32=>bytes32) oraclize_randomDS_args; mapping(bytes32=>bool) oraclize_randomDS_sessionKeysHashVerified; function verifySig(bytes32 tosignh, bytes dersig, bytes pubkey) internal returns (bool){ bool sigok; address signer; bytes32 sigr; bytes32 sigs; bytes memory sigr_ = new bytes(32); uint offset = 4+(uint(dersig[3]) - 0x20); sigr_ = copyBytes(dersig, offset, 32, sigr_, 0); bytes memory sigs_ = new bytes(32); offset += 32 + 2; sigs_ = copyBytes(dersig, offset+(uint(dersig[offset-1]) - 0x20), 32, sigs_, 0); assembly { sigr := mload(add(sigr_, 32)) sigs := mload(add(sigs_, 32)) } (sigok, signer) = safer_ecrecover(tosignh, 27, sigr, sigs); if (address(sha3(pubkey)) == signer) return true; else { (sigok, signer) = safer_ecrecover(tosignh, 28, sigr, sigs); return (address(sha3(pubkey)) == signer); } } function oraclize_randomDS_proofVerify__sessionKeyValidity(bytes proof, uint sig2offset) internal returns (bool) { bool sigok; // Step 6: verify the attestation signature, APPKEY1 must sign the sessionKey from the correct ledger app (CODEHASH) bytes memory sig2 = new bytes(uint(proof[sig2offset+1])+2); copyBytes(proof, sig2offset, sig2.length, sig2, 0); bytes memory appkey1_pubkey = new bytes(64); copyBytes(proof, 3+1, 64, appkey1_pubkey, 0); bytes memory tosign2 = new bytes(1+65+32); tosign2[0] = 1; //role copyBytes(proof, sig2offset-65, 65, tosign2, 1); bytes memory CODEHASH = hex"fd94fa71bc0ba10d39d464d0d8f465efeef0a2764e3887fcc9df41ded20f505c"; copyBytes(CODEHASH, 0, 32, tosign2, 1+65); sigok = verifySig(sha256(tosign2), sig2, appkey1_pubkey); if (sigok == false) return false; // Step 7: verify the APPKEY1 provenance (must be signed by Ledger) bytes memory LEDGERKEY = hex"7fb956469c5c9b89840d55b43537e66a98dd4811ea0a27224272c2e5622911e8537a2f8e86a46baec82864e98dd01e9ccc2f8bc5dfc9cbe5a91a290498dd96e4"; bytes memory tosign3 = new bytes(1+65); tosign3[0] = 0xFE; copyBytes(proof, 3, 65, tosign3, 1); bytes memory sig3 = new bytes(uint(proof[3+65+1])+2); copyBytes(proof, 3+65, sig3.length, sig3, 0); sigok = verifySig(sha256(tosign3), sig3, LEDGERKEY); return sigok; } modifier oraclize_randomDS_proofVerify(bytes32 _queryId, string _result, bytes _proof) { // Step 1: the prefix has to match 'LP\x01' (Ledger Proof version 1) if ((_proof[0] != "L")||(_proof[1] != "P")||(_proof[2] != 1)) throw; bool proofVerified = oraclize_randomDS_proofVerify__main(_proof, _queryId, bytes(_result), oraclize_getNetworkName()); if (proofVerified == false) throw; _; } function matchBytes32Prefix(bytes32 content, bytes prefix) internal returns (bool){ bool match_ = true; for (var i=0; i<prefix.length; i++){ if (content[i] != prefix[i]) match_ = false; } return match_; } function oraclize_randomDS_proofVerify__main(bytes proof, bytes32 queryId, bytes result, string context_name) internal returns (bool){ bool checkok; // Step 2: the unique keyhash has to match with the sha256 of (context name + queryId) uint ledgerProofLength = 3+65+(uint(proof[3+65+1])+2)+32; bytes memory keyhash = new bytes(32); copyBytes(proof, ledgerProofLength, 32, keyhash, 0); checkok = (sha3(keyhash) == sha3(sha256(context_name, queryId))); if (checkok == false) return false; bytes memory sig1 = new bytes(uint(proof[ledgerProofLength+(32+8+1+32)+1])+2); copyBytes(proof, ledgerProofLength+(32+8+1+32), sig1.length, sig1, 0); // Step 3: we assume sig1 is valid (it will be verified during step 5) and we verify if 'result' is the prefix of sha256(sig1) checkok = matchBytes32Prefix(sha256(sig1), result); if (checkok == false) return false; // Step 4: commitment match verification, sha3(delay, nbytes, unonce, sessionKeyHash) == commitment in storage. // This is to verify that the computed args match with the ones specified in the query. bytes memory commitmentSlice1 = new bytes(8+1+32); copyBytes(proof, ledgerProofLength+32, 8+1+32, commitmentSlice1, 0); bytes memory sessionPubkey = new bytes(64); uint sig2offset = ledgerProofLength+32+(8+1+32)+sig1.length+65; copyBytes(proof, sig2offset-64, 64, sessionPubkey, 0); bytes32 sessionPubkeyHash = sha256(sessionPubkey); if (oraclize_randomDS_args[queryId] == sha3(commitmentSlice1, sessionPubkeyHash)){ //unonce, nbytes and sessionKeyHash match delete oraclize_randomDS_args[queryId]; } else return false; // Step 5: validity verification for sig1 (keyhash and args signed with the sessionKey) bytes memory tosign1 = new bytes(32+8+1+32); copyBytes(proof, ledgerProofLength, 32+8+1+32, tosign1, 0); checkok = verifySig(sha256(tosign1), sig1, sessionPubkey); if (checkok == false) return false; // verify if sessionPubkeyHash was verified already, if not.. let's do it! if (oraclize_randomDS_sessionKeysHashVerified[sessionPubkeyHash] == false){ oraclize_randomDS_sessionKeysHashVerified[sessionPubkeyHash] = oraclize_randomDS_proofVerify__sessionKeyValidity(proof, sig2offset); } return oraclize_randomDS_sessionKeysHashVerified[sessionPubkeyHash]; } // the following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license function copyBytes(bytes from, uint fromOffset, uint length, bytes to, uint toOffset) internal returns (bytes) { uint minLength = length + toOffset; if (to.length < minLength) { // Buffer too small throw; // Should be a better way? } // NOTE: the offset 32 is added to skip the `size` field of both bytes variables uint i = 32 + fromOffset; uint j = 32 + toOffset; while (i < (32 + fromOffset + length)) { assembly { let tmp := mload(add(from, i)) mstore(add(to, j), tmp) } i += 32; j += 32; } return to; } // the following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license // Duplicate Solidity's ecrecover, but catching the CALL return value function safer_ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal returns (bool, address) { // We do our own memory management here. Solidity uses memory offset // 0x40 to store the current end of memory. We write past it (as // writes are memory extensions), but don't update the offset so // Solidity will reuse it. The memory used here is only needed for // this context. // FIXME: inline assembly can't access return values bool ret; address addr; assembly { let size := mload(0x40) mstore(size, hash) mstore(add(size, 32), v) mstore(add(size, 64), r) mstore(add(size, 96), s) // NOTE: we can reuse the request memory because we deal with // the return code ret := call(3000, 1, 0, size, 128, size, 32) addr := mload(size) } return (ret, addr); } // the following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license function ecrecovery(bytes32 hash, bytes sig) internal returns (bool, address) { bytes32 r; bytes32 s; uint8 v; if (sig.length != 65) return (false, 0); // The signature format is a compact form of: // {bytes32 r}{bytes32 s}{uint8 v} // Compact means, uint8 is not padded to 32 bytes. assembly { r := mload(add(sig, 32)) s := mload(add(sig, 64)) // Here we are loading the last 32 bytes. We exploit the fact that // 'mload' will pad with zeroes if we overread. // There is no 'mload8' to do this, but that would be nicer. v := byte(0, mload(add(sig, 96))) // Alternative solution: // 'byte' is not working due to the Solidity parser, so lets // use the second best option, 'and' // v := and(mload(add(sig, 65)), 255) } // albeit non-transactional signatures are not specified by the YP, one would expect it // to match the YP range of [27, 28] // // geth uses [0, 1] and some clients have followed. This might change, see: // https://github.com/ethereum/go-ethereum/issues/2053 if (v < 27) v += 27; if (v != 27 && v != 28) return (false, 0); return safer_ecrecover(hash, v, r, s); } } // </ORACLIZE_API> /** * @title The EVNToken Token contract. * * Credit: Taking ideas from BAT token and NET token */ /*is StandardToken */ contract EVNToken is StandardToken, usingOraclize { // Token metadata string public constant name = "Envion"; string public constant symbol = "EVN"; uint256 public constant decimals = 18; string public constant version = "0.9"; // Fundraising goals: minimums and maximums uint256 public constant TOKEN_CREATION_CAP = 130 * (10**6) * 10**decimals; // 130 million EVNs uint256 public constant TOKEN_CREATED_MIN = 1 * (10**6) * 10**decimals; // 1 million EVNs uint256 public constant ETH_RECEIVED_CAP = 5333 * (10**2) * 10**decimals; // 533 300 ETH uint256 public constant ETH_RECEIVED_MIN = 1 * (10**3) * 10**decimals; // 1 000 ETH uint256 public constant TOKEN_MIN = 1 * 10**decimals; // 1 EVN // Discount multipliers uint256 public constant TOKEN_FIRST_DISCOUNT_MULTIPLIER = 142857; // later divided by 10^5 to give users 1,42857 times more tokens per ETH == 30% discount uint256 public constant TOKEN_SECOND_DISCOUNT_MULTIPLIER = 125000; // later divided by 10^5 to give users 1,25 more tokens per ETH == 20% discount uint256 public constant TOKEN_THIRD_DISCOUNT_MULTIPLIER = 111111; // later divided by 10^5 to give users 1,11111 more tokens per ETH == 10% discount // Fundraising parameters provided when creating the contract uint256 public fundingStartBlock; // These two blocks need to be chosen to comply with the uint256 public fundingEndBlock; // start date and 31 day duration requirements uint256 public roundTwoBlock; // block number that triggers the second exchange rate change uint256 public roundThreeBlock; // block number that triggers the third exchange rate change uint256 public roundFourBlock; // block number that triggers the fourth exchange rate change uint256 public ccReleaseBlock; // block number that triggers purchases made by CC be transferable address public admin1; // First administrator for multi-sig mechanism address public admin2; // Second administrator for multi-sig mechanism address public tokenVendor; // Account delivering Tokens purchased with credit card // Contracts current state (Fundraising, Finalized, Paused) and the saved state (if currently paused) ContractState public state; // Current state of the contract ContractState private savedState; // State of the contract before pause //@dev Usecase related: Purchasing Tokens with Credit card //@dev Usecase related: Canceling purchases done with credit card mapping (string => Purchase) purchases; // in case CC payments get charged back, admins shall only be allowed to kill the exact amount of tokens associated with this payment mapping (address => uint256) public ccLockedUpBalances; // tracking the total amount of tokens users have bought via CC - locked up until ccReleaseBlock string[] public purchaseArray; // holding the IDs of all CC purchases // Keep track of holders and icoBuyers mapping (address => bool) public isHolder; // track if a user is a known token holder to the smart contract - important for payouts later address[] public holders; // array of all known holders - important for payouts later mapping (address => bool) isIcoBuyer; // for tracking if user has to be kyc verified before being able to transfer tokens // ETH balance per user // Since we have different exchange rates at different stages, we need to keep track // of how much ether each contributed in case that we need to issue a refund mapping (address => uint256) private ethBalances; mapping (address => uint256) private noKycEthBalances; // Total received ETH balances // We need to keep track of how much ether have been contributed, since we have a cap for ETH too uint256 public allReceivedEth; uint256 public allUnKycedEth; // total amount of ETH we have no KYC for yet // store the hashes of admins' msg.data mapping (address => bytes32) private multiSigHashes; // KYC mapping (address => bool) public isKycTeam; // to determine, if a user belongs to the KYC team or not mapping (address => bool) public kycVerified; // to check if user has already undergone KYC or not, to lock up his tokens until then // to track if team members already got their tokens bool public teamTokensDelivered; // Current ETH/USD exchange rate uint256 public ETH_USD_EXCHANGE_RATE_IN_CENTS; // set by oraclize // Everything oraclize related event updatedPrice(string price); event newOraclizeQuery(string description); uint public oraclizeQueryCost; // Events used for logging event LogRefund(address indexed _to, uint256 _value); event LogCreateEVN(address indexed _to, uint256 _value); event LogDeliverEVN(address indexed _to, uint256 _value); event LogCancelDelivery(address indexed _to, string _id); event LogKycRefused(address indexed _user, uint256 _value); event LogTeamTokensDelivered(address indexed distributor, uint256 _value); // Additional helper structs enum ContractState { Fundraising, Finalized, Paused } // Credit Card Purchase Parameters //@dev Usecase related: Purchase Tokens with Credit card //@dev Usecase related: Cancel purchase done with credit card struct Purchase { address buyer; uint256 tokenAmount; bool active; } // Modifiers modifier isFinalized() { require(state == ContractState.Finalized); _; } modifier isFundraising() { require(state == ContractState.Fundraising); _; } modifier isPaused() { require(state == ContractState.Paused); _; } modifier notPaused() { require(state != ContractState.Paused); _; } modifier isFundraisingIgnorePaused() { require(state == ContractState.Fundraising || (state == ContractState.Paused && savedState == ContractState.Fundraising)); _; } modifier onlyKycTeam(){ require(isKycTeam[msg.sender] == true); _; } modifier onlyOwner() { // check if transaction sender is admin. require (msg.sender == admin1 || msg.sender == admin2); // if yes, store his msg.data. multiSigHashes[msg.sender] = keccak256(msg.data); // check if his stored msg.data hash equals to the one of the other admin if ((multiSigHashes[admin1]) == (multiSigHashes[admin2])) { // if yes, both admins agreed - continue. _; // Reset hashes after successful execution multiSigHashes[admin1] = 0x0; multiSigHashes[admin2] = 0x0; } else { // if not (yet), return. return; } } modifier onlyVendor() { require(msg.sender == tokenVendor); _; } modifier minimumReached() { require(allReceivedEth >= ETH_RECEIVED_MIN); require(totalSupply >= TOKEN_CREATED_MIN); _; } modifier isKycVerified(address _user) { // if token transferring user acquired the tokens through the ICO... if (isIcoBuyer[_user] == true) { // ...check if user is already unlocked require (kycVerified[_user] == true); } _; } modifier hasEnoughUnlockedTokens(address _user, uint256 _value) { // check if the user was a CC buyer and if the lockup period is not over, if (ccLockedUpBalances[_user] > 0 && block.number < ccReleaseBlock) { // allow to only transfer the not-locked up tokens require ((SafeMath.sub(balances[_user], _value)) >= ccLockedUpBalances[_user]); } _; } /** * @dev Create a new EVNToken contract. * * _fundingStartBlock The starting block of the fundraiser (has to be in the future). * _fundingEndBlock The end block of the fundraiser (has to be after _fundingStartBlock). * _roundTwoBlock The block that changes the discount rate to 20% (has to be between _fundingStartBlock and _roundThreeBlock). * _roundThreeBlock The block that changes the discount rate to 10% (has to be between _roundTwoBlock and _roundFourBlock). * _roundFourBlock The block that changes the discount rate to 0% (has to be between _roundThreeBlock and _fundingEndBlock). * _admin1 The first admin account that owns this contract. * _admin2 The second admin account that owns this contract. * _tokenVendor The account that creates tokens for credit card / fiat contributers. */ function EVNToken( uint256 _fundingStartBlock, uint256 _fundingEndBlock, uint256 _roundTwoBlock, // block number that triggers the first exchange rate change uint256 _roundThreeBlock, // block number that triggers the second exchange rate change uint256 _roundFourBlock, address _admin1, address _admin2, address _tokenVendor, uint256 _ccReleaseBlock) payable { // Check that the parameters make sense // The start of the fundraising should happen in the future require (block.number <= _fundingStartBlock); // The discount rate changes and ending should follow in their subsequent order require (_fundingStartBlock < _roundTwoBlock); require (_roundTwoBlock < _roundThreeBlock); require (_roundThreeBlock < _roundFourBlock); require (_roundFourBlock < _fundingEndBlock); // block when tokens bought with CC will be released must be in the future require (_fundingEndBlock < _ccReleaseBlock); // admin1 and admin2 address must be set and must be different require (_admin1 != 0x0); require (_admin2 != 0x0); require (_admin1 != _admin2); // tokenVendor must be set and be different from admin1 and admin2 require (_tokenVendor != 0x0); require (_tokenVendor != _admin1); require (_tokenVendor != _admin2); // provide some ETH for oraclize price feed require (msg.value > 0); // Init contract state state = ContractState.Fundraising; savedState = ContractState.Fundraising; fundingStartBlock = _fundingStartBlock; fundingEndBlock = _fundingEndBlock; roundTwoBlock = _roundTwoBlock; roundThreeBlock = _roundThreeBlock; roundFourBlock = _roundFourBlock; ccReleaseBlock = _ccReleaseBlock; totalSupply = 0; admin1 = _admin1; admin2 = _admin2; tokenVendor = _tokenVendor; //oraclize oraclize_setCustomGasPrice(100000000000 wei); // set the gas price a little bit higher, so the pricefeed definitely works updatePrice(); oraclizeQueryCost = oraclize_getPrice("URL"); } //// oraclize START // @dev oraclize is called recursively here - once a callback fetches the newest ETH price, the next callback is scheduled for the next hour again function __callback(bytes32 myid, string result) { require(msg.sender == oraclize_cbAddress()); // setting the token price here ETH_USD_EXCHANGE_RATE_IN_CENTS = SafeMath.parse(result); updatedPrice(result); // fetch the next price updatePrice(); } function updatePrice() payable { // can be left public as a way for replenishing contract's ETH balance, just in case if (msg.sender != oraclize_cbAddress()) { require(msg.value >= 200 finney); } if (oraclize_getPrice("URL") > this.balance) { newOraclizeQuery("Oraclize query was NOT sent, please add some ETH to cover for the query fee"); } else { newOraclizeQuery("Oraclize sent, wait.."); // Schedule query in 1 hour. Set the gas amount to 220000, as parsing in __callback takes around 70000 - we play it safe. oraclize_query(3600, "URL", "json(https://min-api.cryptocompare.com/data/price?fsym=ETH&tsyms=USD).USD", 220000); } } //// oraclize END // Overridden method to check for end of fundraising before allowing transfer of tokens function transfer(address _to, uint256 _value) public isFinalized // Only allow token transfer after the fundraising has ended isKycVerified(msg.sender) hasEnoughUnlockedTokens(msg.sender, _value) onlyPayloadSize(2) returns (bool success) { bool result = super.transfer(_to, _value); if (result) { trackHolder(_to); // track the owner for later payouts } return result; } // Overridden method to check for end of fundraising before allowing transfer of tokens function transferFrom(address _from, address _to, uint256 _value) public isFinalized // Only allow token transfer after the fundraising has ended isKycVerified(msg.sender) hasEnoughUnlockedTokens(msg.sender, _value) onlyPayloadSize(3) returns (bool success) { bool result = super.transferFrom(_from, _to, _value); if (result) { trackHolder(_to); // track the owner for later payouts } return result; } // Allow for easier balance checking function getBalanceOf(address _owner) constant returns (uint256 _balance) { return balances[_owner]; } // getting purchase details by ID - workaround, mappings with dynamically sized keys can't be made public yet. function getPurchaseById(string _id) constant returns (address _buyer, uint256 _tokenAmount, bool _active){ _buyer = purchases[_id].buyer; _tokenAmount = purchases[_id].tokenAmount; _active = purchases[_id].active; } // Allows to figure out the amount of known token holders function getHolderCount() public constant returns (uint256 _holderCount) { return holders.length; } // Allows to figure out the amount of purchases function getPurchaseCount() public constant returns (uint256 _purchaseCount) { return purchaseArray.length; } // Allows for easier retrieval of holder by array index function getHolder(uint256 _index) public constant returns (address _holder) { return holders[_index]; } function trackHolder(address _to) private returns (bool success) { // Check if the recipient is a known token holder if (isHolder[_to] == false) { // if not, add him to the holders array and mark him as a known holder holders.push(_to); isHolder[_to] = true; } return true; } /// @dev Accepts ether and creates new EVN tokens function createTokens() payable external isFundraising { require(block.number >= fundingStartBlock); require(block.number <= fundingEndBlock); require(msg.value > 0); // First we check the ETH cap: would adding this amount to the total unKYCed eth and the already KYCed eth exceed the eth cap? // return the contribution if the cap has been reached already uint256 totalKycedAndUnKycEdEth = SafeMath.add(allUnKycedEth, allReceivedEth); uint256 checkedReceivedEth = SafeMath.add(totalKycedAndUnKycEdEth, msg.value); require(checkedReceivedEth <= ETH_RECEIVED_CAP); // If all is fine with the ETH cap, we continue to check the // minimum amount of tokens and the cap for how many tokens // have been generated so far // calculate the token amount uint256 tokens = SafeMath.mul(msg.value, ETH_USD_EXCHANGE_RATE_IN_CENTS); // divide by 100 to turn ETH_USD_EXCHANGE_RATE_IN_CENTS into full USD tokens = tokens / 100; // apply discount multiplier tokens = safeMulPercentage(tokens, getCurrentDiscountRate()); require(tokens >= TOKEN_MIN); uint256 checkedSupply = SafeMath.add(totalSupply, tokens); require(checkedSupply <= TOKEN_CREATION_CAP); // Only when all the checks have passed, then we check if the address is already KYCEd and then // update the state (noKycEthBalances, allReceivedEth, totalSupply, and balances) of the contract if (kycVerified[msg.sender] == false) { // @dev The unKYCed eth balances are moved to ethBalances in unlockKyc() noKycEthBalances[msg.sender] = SafeMath.add(noKycEthBalances[msg.sender], msg.value); // add the contributed eth to the total unKYCed eth amount allUnKycedEth = SafeMath.add(allUnKycedEth, msg.value); } else { // if buyer is already KYC unlocked... ethBalances[msg.sender] = SafeMath.add(ethBalances[msg.sender], msg.value); allReceivedEth = SafeMath.add(allReceivedEth, msg.value); } totalSupply = checkedSupply; balances[msg.sender] += tokens; // safeAdd not needed; bad semantics to use here trackHolder(msg.sender); // to force the check for KYC Status upon the user when he tries transferring tokens // and exclude every later token owner isIcoBuyer[msg.sender] = true; // Log the creation of these tokens LogCreateEVN(msg.sender, tokens); } //add a user to the KYC team function addToKycTeam(address _teamMember) onlyOwner onlyPayloadSize(1){ isKycTeam[_teamMember] = true; } //remove a user from the KYC team function removeFromKycTeam(address _teamMember) onlyOwner onlyPayloadSize(1){ isKycTeam[_teamMember] = false; } //called by KYC team function unlockKyc(address _owner) external onlyKycTeam { require(kycVerified[_owner] == false); //unlock the owner to allow transfer of tokens kycVerified[_owner] = true; // we leave the ccLockedUpBalances[_owner] as is, because also KYCed users could cancel their CC payments if (noKycEthBalances[_owner] > 0) { // check if the user was an ETH buyer // now move the unKYCed eth balance to the regular ethBalance. ethBalances[_owner] = noKycEthBalances[_owner]; // add the now KYCed eth to the total received eth allReceivedEth = SafeMath.add(allReceivedEth, noKycEthBalances[_owner]); // subtract the now KYCed eth from total amount of unKYCed eth allUnKycedEth = SafeMath.sub(allUnKycedEth, noKycEthBalances[_owner]); // and set the user's unKYCed eth balance to 0 noKycEthBalances[_owner] = 0; // preventing replay attacks } } // Refusing KYC of a user, who only contributed in ETH. // We must pay close attention here for the case that a user contributes in ETH AND(!) CC ! // in this case, he must only kill the tokens he received through ETH, the ones bought in fiat will be // killed by canceling his payments and subsequently calling cancelDelivery() with the according payment id. function refuseKyc(address _user) external onlyKycTeam { // once a user is verified, you can't kick him out. require (kycVerified[_user] == false); // immediately stop, if a user has none or only CC contributions. // we're managing kyc refusing of CC contributors off-chain require(noKycEthBalances[_user]>0); uint256 EVNVal = balances[_user]; require(EVNVal > 0); uint256 ethVal = noKycEthBalances[_user]; // refund un-KYCd eth require(ethVal > 0); // Update the state only after all the checks have passed allUnKycedEth = SafeMath.sub(allUnKycedEth, noKycEthBalances[_user]); // or if there was any unKYCed Eth, subtract it from the total unKYCed eth balance. balances[_user] = ccLockedUpBalances[_user]; // assign user only the token amount he has bought through CC, if there are any. noKycEthBalances[_user] = 0; totalSupply = SafeMath.sub(totalSupply, EVNVal); // Extra safe // Log this refund LogKycRefused(_user, ethVal); // Send the contributions only after we have updated all the balances // If you're using a contract, make sure it works with .transfer() gas limits _user.transfer(ethVal); } // Called in case a buyer cancels his CC payment. // @param The payment ID from payment provider function cancelDelivery(string _purchaseID) external onlyKycTeam{ // CC payments are only cancelable until ccReleaseBlock require (block.number < ccReleaseBlock); // check if the purchase to cancel is still active require (purchases[_purchaseID].active == true); // now withdraw the canceled purchase's token amount from the user's balance balances[purchases[_purchaseID].buyer] = SafeMath.sub(balances[purchases[_purchaseID].buyer], purchases[_purchaseID].tokenAmount); // and withdraw the canceled purchase's token amount from the lockedUp token balance ccLockedUpBalances[purchases[_purchaseID].buyer] = SafeMath.sub(ccLockedUpBalances[purchases[_purchaseID].buyer], purchases[_purchaseID].tokenAmount); // set the purchase's status to inactive purchases[_purchaseID].active = false; //correct th amount of tokens generated totalSupply = SafeMath.sub(totalSupply, purchases[_purchaseID].tokenAmount); LogCancelDelivery(purchases[_purchaseID].buyer, _purchaseID); } // @dev Deliver tokens sold for CC/fiat and BTC // @dev param _tokens in Cents, e.g. 1 Token == 1$, passed as 100 cents // @dev param _btcBuyer Boolean to determine if the delivered tokens need to be locked (not the case for BTC buyers, their payment is final) // @dev discount multipliers are applied off-contract in this case function deliverTokens(address _to, uint256 _tokens, string _purchaseId, bool _btcBuyer) external isFundraising onlyVendor { require(_to != 0x0); require(_tokens > 0); require(bytes(_purchaseId).length>0); require(block.number >= fundingStartBlock); require(block.number <= fundingEndBlock + 168000); // allow delivery of tokens sold for fiat for 28 days after end of ICO for safety reasons // calculate the total amount of tokens and cut out the extra two decimal units, // because _tokens was in cents. uint256 tokens = SafeMath.mul(_tokens, (10**(decimals) / 10**2)); // continue to check for how many tokens // have been generated so far uint256 checkedSupply = SafeMath.add(totalSupply, tokens); require(checkedSupply <= TOKEN_CREATION_CAP); // Only when all the checks have passed, then we update the state (totalSupply, and balances) of the contract totalSupply = checkedSupply; // prevent from adding a delivery multiple times require(purchases[_purchaseId].buyer==0x0); // Log this information in order to be able to cancel token deliveries (on CC refund) by the payment ID purchases[_purchaseId] = Purchase({ buyer: _to, tokenAmount: tokens, active: true }); purchaseArray.push(_purchaseId); // if tokens were not paid with BTC (but credit card), they need to be locked up if (_btcBuyer == false) { ccLockedUpBalances[_to] = SafeMath.add(ccLockedUpBalances[_to], tokens); // update user's locked up token balance } balances[_to] = SafeMath.add(balances[_to], tokens); // safeAdd not needed; bad semantics to use here trackHolder(_to); // log holder's address // to force the check for KYC Status upon the user when he tries transferring tokens // and exclude every later token owner isIcoBuyer[_to] = true; // Log the creation of these tokens LogDeliverEVN(_to, tokens); } /// @dev Returns the current token price function getCurrentDiscountRate() private constant returns (uint256 currentDiscountRate) { // determine which discount to apply if (block.number < roundTwoBlock) { // first round return TOKEN_FIRST_DISCOUNT_MULTIPLIER; } else if (block.number < roundThreeBlock){ // second round return TOKEN_SECOND_DISCOUNT_MULTIPLIER; } else if (block.number < roundFourBlock) { // third round return TOKEN_THIRD_DISCOUNT_MULTIPLIER; } else { // fourth round, no discount return 100000; } } /// @dev Allows to transfer ether from the contract as soon as the minimum is reached function retrieveEth(uint256 _value, address _safe) external minimumReached onlyOwner { require(SafeMath.sub(this.balance, _value) >= allUnKycedEth); // make sure unKYCed eth cannot be withdrawn // make sure a recipient was defined ! require (_safe != 0x0); // send the eth to where admins agree upon _safe.transfer(_value); } /// @dev Ends the fundraising period and sends the ETH to wherever the admins agree upon function finalize(address _safe) external isFundraising minimumReached onlyOwner // Only the admins calling this method exactly the same way can finalize the sale. { // Only allow to finalize the contract before the ending block if we already reached any of the two caps require(block.number > fundingEndBlock || totalSupply >= TOKEN_CREATED_MIN || allReceivedEth >= ETH_RECEIVED_MIN); // make sure a recipient was defined ! require (_safe != 0x0); // Move the contract to Finalized state state = ContractState.Finalized; savedState = ContractState.Finalized; // Send the KYCed ETH to where admins agree upon. _safe.transfer(allReceivedEth); } /// @dev Pauses the contract function pause() external notPaused // Prevent the contract getting stuck in the Paused state onlyOwner // Only both admins calling this method can pause the contract { // Move the contract to Paused state savedState = state; state = ContractState.Paused; } /// @dev Proceeds with the contract function proceed() external isPaused onlyOwner // Only both admins calling this method can proceed with the contract { // Move the contract to the previous state state = savedState; } /// @dev Allows contributors to recover their ether in case the minimum funding goal is not reached function refund() external { // Allow refunds only a week after end of funding to give KYC-team time to verify contributors // and thereby move un-KYC-ed ETH over into allReceivedEth as well as deliver the tokens paid with CC require(block.number > (fundingEndBlock + 42000)); // No refunds if the minimum has been reached or minimum of 1 Million Tokens have been generated require(allReceivedEth < ETH_RECEIVED_MIN || totalSupply < TOKEN_CREATED_MIN); // to prevent CC buyers from accidentally calling refund and burning their tokens require (ethBalances[msg.sender] > 0 || noKycEthBalances[msg.sender] > 0); // Only refund if there are EVN tokens uint256 EVNVal = balances[msg.sender]; require(EVNVal > 0); // refunds either KYCed eth or un-KYCd eth uint256 ethVal = SafeMath.add(ethBalances[msg.sender], noKycEthBalances[msg.sender]); require(ethVal > 0); allReceivedEth = SafeMath.sub(allReceivedEth, ethBalances[msg.sender]); // subtract only the KYCed ETH from allReceivedEth, because the latter is what admins will only be able to withdraw allUnKycedEth = SafeMath.sub(allUnKycedEth, noKycEthBalances[msg.sender]); // or if there was any unKYCed Eth, subtract it from the total unKYCed eth balance. // Update the state only after all the checks have passed. // reset everything to zero, no replay attacks. balances[msg.sender] = 0; ethBalances[msg.sender] = 0; noKycEthBalances[msg.sender] = 0; totalSupply = SafeMath.sub(totalSupply, EVNVal); // Extra safe // Log this refund LogRefund(msg.sender, ethVal); // Send the contributions only after we have updated all the balances // If you're using a contract, make sure it works with .transfer() gas limits msg.sender.transfer(ethVal); } // @dev Deliver tokens to be distributed to team members function deliverTeamTokens(address _to) external isFinalized onlyOwner { require(teamTokensDelivered == false); require(_to != 0x0); // allow delivery of tokens for the company and supporters without vesting, team tokens will be supplied like a CC purchase. // company and supporters gets 7% of a whole final pie, meaning we have to add ~7,5% to the // current totalSupply now, basically stretching it and taking 7% from the result, so the 93% that remain equals the amount of tokens created right now. // e.g. (93 * x = 100, where x amounts to roughly about 1.07526 and 7 would be the team's part) uint256 newTotalSupply = safeMulPercentage(totalSupply, 107526); // give company and supporters their 7% uint256 tokens = SafeMath.sub(newTotalSupply, totalSupply); balances[_to] = tokens; //update state teamTokensDelivered = true; totalSupply = newTotalSupply; trackHolder(_to); // Log the creation of these tokens LogTeamTokensDelivered(_to, tokens); } function safeMulPercentage(uint256 value, uint256 percentage) internal constant returns (uint256 resultValue) { require(percentage >= 100000); require(percentage < 200000); // Multiply with percentage uint256 newValue = SafeMath.mul(value, percentage); // Remove the 5 extra decimals newValue = newValue / 10**5; return newValue; } // customizing the gas price for oraclize calls during "ICO Rush hours" function setOraclizeGas(uint256 _option) external onlyOwner { if (_option <= 30) { oraclize_setCustomGasPrice(30000000000 wei); } else if (_option <= 50) { oraclize_setCustomGasPrice(50000000000 wei); } else if (_option <= 70) { oraclize_setCustomGasPrice(70000000000 wei); } else if (_option <= 100) { oraclize_setCustomGasPrice(100000000000 wei); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[{"name":"_value","type":"uint256"},{"name":"_safe","type":"address"}],"name":"retrieveEth","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"admin2","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_teamMember","type":"address"}],"name":"addToKycTeam","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isKycTeam","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"admin1","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ETH_RECEIVED_MIN","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_teamMember","type":"address"}],"name":"removeFromKycTeam","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"myid","type":"bytes32"},{"name":"result","type":"string"}],"name":"__callback","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"holders","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"proceed","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"ccLockedUpBalances","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"myid","type":"bytes32"},{"name":"result","type":"string"},{"name":"proof","type":"bytes"}],"name":"__callback","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"oraclizeQueryCost","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokens","type":"uint256"},{"name":"_purchaseId","type":"string"},{"name":"_btcBuyer","type":"bool"}],"name":"deliverTokens","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_safe","type":"address"}],"name":"finalize","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"refund","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_purchaseID","type":"string"}],"name":"cancelDelivery","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"updatePrice","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getHolderCount","outputs":[{"name":"_holderCount","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"allReceivedEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ccReleaseBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"fundingEndBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"getBalanceOf","outputs":[{"name":"_balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"tokenVendor","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"kycVerified","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"allUnKycedEth","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"string"}],"name":"getPurchaseById","outputs":[{"name":"_buyer","type":"address"},{"name":"_tokenAmount","type":"uint256"},{"name":"_active","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"createTokens","outputs":[],"payable":true,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"purchaseArray","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"getPurchaseCount","outputs":[{"name":"_purchaseCount","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"deliverTeamTokens","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"state","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_THIRD_DISCOUNT_MULTIPLIER","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ETH_USD_EXCHANGE_RATE_IN_CENTS","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"}],"name":"refuseKyc","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"teamTokensDelivered","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"roundTwoBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isHolder","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"fundingStartBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"ETH_RECEIVED_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_FIRST_DISCOUNT_MULTIPLIER","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"roundFourBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_MIN","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"getHolder","outputs":[{"name":"_holder","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"roundThreeBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_SECOND_DISCOUNT_MULTIPLIER","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_CREATED_MIN","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"unlockKyc","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_CREATION_CAP","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_option","type":"uint256"}],"name":"setOraclizeGas","outputs":[],"payable":false,"type":"function"},{"inputs":[{"name":"_fundingStartBlock","type":"uint256"},{"name":"_fundingEndBlock","type":"uint256"},{"name":"_roundTwoBlock","type":"uint256"},{"name":"_roundThreeBlock","type":"uint256"},{"name":"_roundFourBlock","type":"uint256"},{"name":"_admin1","type":"address"},{"name":"_admin2","type":"address"},{"name":"_tokenVendor","type":"address"},{"name":"_ccReleaseBlock","type":"uint256"}],"payable":true,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"price","type":"string"}],"name":"updatedPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"description","type":"string"}],"name":"newOraclizeQuery","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"LogRefund","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"LogCreateEVN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"LogDeliverEVN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_id","type":"string"}],"name":"LogCancelDelivery","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_user","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"LogKycRefused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"distributor","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"LogTeamTokensDelivered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"}]
Contract Creation Code
606060405260405161012080620054f48339810160405280805191906020018051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519150505b43899011156200006457600080fd5b8689106200007157600080fd5b8587106200007e57600080fd5b8486106200008b57600080fd5b8785106200009857600080fd5b808810620000a557600080fd5b600160a060020a0384161515620000bb57600080fd5b600160a060020a0383161515620000d157600080fd5b600160a060020a038481169084161415620000eb57600080fd5b600160a060020a03821615156200010157600080fd5b600160a060020a0382811690851614156200011b57600080fd5b600160a060020a0382811690841614156200013557600080fd5b600034116200014357600080fd5b601080546000919060a060020a60ff02191674010000000000000000000000000000000000000000835b0217905550601080546000919060a860020a60ff0219167501000000000000000000000000000000000000000000835b021790555060088990556009889055600a879055600b869055600c859055600d81905560008055600e8054600160a060020a03808716600160a060020a031992831617909255600f805486841690831617905560108054928516929091169190911790556200021f64174876e80064010000000062003c086200029682021704565b620002376401000000006200205f6200040082021704565b6200028360408051908101604052600381527f55524c00000000000000000000000000000000000000000000000000000000006020820152640100000000620035d56200067e82021704565b6020555b50505050505050505062001228565b600354600160a060020a03161580620002d15750600354620002cf90600160a060020a031664010000000062003d1a6200086682021704565b155b15620002f357620002f1600064010000000062003d226200086e82021704565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156200035557600080fd5b6102c65a03f115156200036757600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063ca6ad1e4826040517c010000000000000000000000000000000000000000000000000000000063ffffffff84160281526004810191909152602401600060405180830381600087803b1515620003e657600080fd5b6102c65a03f11515620003f857600080fd5b5050505b5b50565b620004186401000000006200333062000c6b82021704565b600160a060020a031633600160a060020a031614151562000449576702c68af0bb1400003410156200044957600080fd5b5b30600160a060020a031631620004a160408051908101604052600381527f55524c00000000000000000000000000000000000000000000000000000000006020820152640100000000620035d56200067e82021704565b11156200054e57600080516020620054d48339815191526040516020808252604b908201527f4f7261636c697a6520717565727920776173204e4f542073656e742c20706c656040808301919091527f6173652061646420736f6d652045544820746f20636f76657220666f7220746860608301527f6520717565727920666565000000000000000000000000000000000000000000608083015260a0909101905180910390a16200067b565b600080516020620054d483398151915260405160208082526015908201527f4f7261636c697a652073656e742c20776169742e2e00000000000000000000006040808301919091526060909101905180910390a1620003fc610e106040805190810160405280600381526020017f55524c000000000000000000000000000000000000000000000000000000000081525060806040519081016040908152604982527f6a736f6e2868747470733a2f2f6d696e2d6170692e63727970746f636f6d706160208301527f72652e636f6d2f646174612f70726963653f6673796d3d455448267473796d73908201527f3d555344292e5553440000000000000000000000000000000000000000000000606082015262035b606401000000006200376262000de082021704565b505b5b565b600354600090600160a060020a03161580620006bc5750600354620006ba90600160a060020a031664010000000062003d1a6200086682021704565b155b15620006de57620006dc600064010000000062003d226200086e82021704565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156200074057600080fd5b6102c65a03f115156200075257600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063524f3889836000604051602001526040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620007f55780820151818401525b602001620007da565b50505050905090810190601f168015620008235780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b15156200084257600080fd5b6102c65a03f115156200085457600080fd5b50505060405180519150505b5b919050565b803b5b919050565b6000806200089e731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed64010000000062003d1a6200086682021704565b1115620009205760038054600160a060020a031916731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed1790556200091760408051908101604052600b81527f6574685f6d61696e6e65740000000000000000000000000000000000000000006020820152640100000000620040616200116482021704565b50600162000860565b60006200094f73c03a2615d5efaf5f49f60b7bb6583eaec212fdf164010000000062003d1a6200086682021704565b1115620009d15760038054600160a060020a03191673c03a2615d5efaf5f49f60b7bb6583eaec212fdf11790556200091760408051908101604052600c81527f6574685f726f707374656e3300000000000000000000000000000000000000006020820152640100000000620040616200116482021704565b50600162000860565b600062000a0073b7a07bcf2ba2f2703b24c0691b5278999c59ac7e64010000000062003d1a6200086682021704565b111562000a825760038054600160a060020a03191673b7a07bcf2ba2f2703b24c0691b5278999c59ac7e1790556200091760408051908101604052600981527f6574685f6b6f76616e00000000000000000000000000000000000000000000006020820152640100000000620040616200116482021704565b50600162000860565b600062000ab173146500cfd35b22e4a392fe0adc06de1a1368ed4864010000000062003d1a6200086682021704565b111562000b335760038054600160a060020a03191673146500cfd35b22e4a392fe0adc06de1a1368ed481790556200091760408051908101604052600b81527f6574685f72696e6b6562790000000000000000000000000000000000000000006020820152640100000000620040616200116482021704565b50600162000860565b600062000b62736f485c8bf6fc43ea212e93bbf8ce046c7f1cb47564010000000062003d1a6200086682021704565b111562000b98575060038054600160a060020a031916736f485c8bf6fc43ea212e93bbf8ce046c7f1cb475179055600162000860565b600062000bc77320e12a1f859b3feae5fb2a0a32c18f5a65555bbf64010000000062003d1a6200086682021704565b111562000bfd575060038054600160a060020a0319167320e12a1f859b3feae5fb2a0a32c18f5a65555bbf179055600162000860565b600062000c2c7351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa64010000000062003d1a6200086682021704565b111562000c62575060038054600160a060020a0319167351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa179055600162000860565b5060005b919050565b600354600090600160a060020a0316158062000ca9575060035462000ca790600160a060020a031664010000000062003d1a6200086682021704565b155b1562000ccb5762000cc9600064010000000062003d226200086e82021704565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151562000d2d57600080fd5b6102c65a03f1151562000d3f57600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063c281d19e6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151562000dbe57600080fd5b6102c65a03f1151562000dd057600080fd5b50505060405180519150505b5b90565b6003546000908190600160a060020a0316158062000e20575060035462000e1e90600160a060020a031664010000000062003d1a6200086682021704565b155b1562000e425762000e40600064010000000062003d226200086e82021704565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151562000ea457600080fd5b6102c65a03f1151562000eb657600080fd5b505050604051805160048054600160a060020a031916600160a060020a039283161790819055169050632ef3accc86856000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b8381101562000f605780820151818401525b60200162000f45565b50505050905090810190601f16801562000f8e5780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b151562000fae57600080fd5b6102c65a03f1151562000fc057600080fd5b5050506040518051915050670de0b6b3a76400003a84020181111562000fea57600091506200115a565b600454600160a060020a031663c51be90f82888888886000604051602001526040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b83811015620010845780820151818401525b60200162001069565b50505050905090810190601f168015620010b25780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b83811015620010eb5780820151818401525b602001620010d0565b50505050905090810190601f168015620011195780820380516001836020036101000a031916815260200191505b5096505050505050506020604051808303818588803b15156200113b57600080fd5b6125ee5a03f115156200114d57600080fd5b5050505060405180519250505b5b50949350505050565b6005818051620011799291602001906200117e565b505b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620011c157805160ff1916838001178555620011f1565b82800160010185558215620011f1579182015b82811115620011f1578251825591602001919060010190620011d4565b5b506200120092915062001204565b5090565b62000ddc91905b808211156200120057600081556001016200120b565b5090565b90565b61429c80620012386000396000f300606060405236156102b95763ffffffff60e060020a60003504166304deaeb581146102be57806306a8f8a2146102e257806306fdde0314610311578063095ea7b31461039c5780630fb7cb1d146103d2578063108e4bdb146103f3578063115976c414610426578063168213491461045557806318160ddd1461047a5780631f305ec71461049f57806323b872dd146104c057806327dc297e146104fc5780632a11ced0146105545780632a33fec6146105865780632ed196bd1461059b578063313ce567146105cc57806338bbfa50146105f15780633ba864651461068b5780633eeda7d3146106b05780634ef39b75146106e657806354fd4d5014610707578063590e1ae314610792578063611ef452146107a7578063673a7e28146107c757806370a08231146107d15780637136982b1461080257806373a1e7f5146108275780638456cb591461084c5780638a957f151461086157806391b43d131461088657806395d89b41146108ab5780639b96eece146107d1578063a3766f8814610967578063a5410a6614610996578063a9059cbb146109c9578063acc99bb7146109ff578063af580d2c14610a24578063b442726314610aa5578063b8b8587314610aaf578063becd283f14610b3d578063bf5f016914610b62578063c19d93fb14610b83578063c5fc98c914610bba578063cf9a60d414610bdf578063d134295814610c04578063d16be71b14610c25578063d25a13b414610c4c578063d4d7b19a14610c71578063d648a64714610ca4578063d8e3074014610cc9578063da9b90c414610cee578063dd62ed3e14610d13578063e5a284f814610d4a578063e74799b414610d6f578063e8a96b4614610d94578063eec7006f14610dc6578063f4ee82ee14610deb578063f5689a8014610e10578063f8db5d0714610e35578063f9fae4f714610e56578063fbf44a1b14610e7b575b600080fd5b34156102c957600080fd5b6102e0600435600160a060020a0360243516610e93565b005b34156102ed57600080fd5b6102f5610ff4565b604051600160a060020a03909116815260200160405180910390f35b341561031c57600080fd5b610324611003565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103615780820151818401525b602001610348565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103a757600080fd5b6103be600160a060020a036004351660243561103a565b604051901515815260200160405180910390f35b34156103dd57600080fd5b6102e0600160a060020a03600435166110b5565b005b34156103fe57600080fd5b6103be600160a060020a03600435166111aa565b604051901515815260200160405180910390f35b341561043157600080fd5b6102f56111bf565b604051600160a060020a03909116815260200160405180910390f35b341561046057600080fd5b6104686111ce565b60405190815260200160405180910390f35b341561048557600080fd5b6104686111db565b60405190815260200160405180910390f35b34156104aa57600080fd5b6102e0600160a060020a03600435166111e1565b005b34156104cb57600080fd5b6103be600160a060020a03600435811690602435166044356112db565b604051901515815260200160405180910390f35b341561050757600080fd5b6102e0600480359060446024803590810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506113ff95505050505050565b005b341561055f57600080fd5b6102f56004356114d8565b604051600160a060020a03909116815260200160405180910390f35b341561059157600080fd5b6102e061150a565b005b34156105a657600080fd5b610468600160a060020a0360043516611643565b60405190815260200160405180910390f35b34156105d757600080fd5b610468611655565b60405190815260200160405180910390f35b34156105fc57600080fd5b6102e0600480359060446024803590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284375094965061165a95505050505050565b005b341561069657600080fd5b610468611660565b60405190815260200160405180910390f35b34156106bb57600080fd5b6102e060048035600160a060020a03169060248035916044359182019101356064351515611666565b005b34156106f157600080fd5b6102e0600160a060020a0360043516611923565b005b341561071257600080fd5b610324611b3d565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103615780820151818401525b602001610348565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561079d57600080fd5b6102e0611b74565b005b34156107b257600080fd5b6102e06004803560248101910135611d6b565b005b6102e061205f565b005b34156107dc57600080fd5b610468600160a060020a03600435166122cc565b60405190815260200160405180910390f35b341561080d57600080fd5b6104686122eb565b60405190815260200160405180910390f35b341561083257600080fd5b6104686122f2565b60405190815260200160405180910390f35b341561085757600080fd5b6102e06122f8565b005b341561086c57600080fd5b61046861246b565b60405190815260200160405180910390f35b341561089157600080fd5b610468612471565b60405190815260200160405180910390f35b34156108b657600080fd5b610324612477565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103615780820151818401525b602001610348565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156107dc57600080fd5b610468600160a060020a03600435166122cc565b60405190815260200160405180910390f35b341561097257600080fd5b6102f56124cd565b604051600160a060020a03909116815260200160405180910390f35b34156109a157600080fd5b6103be600160a060020a03600435166124dc565b604051901515815260200160405180910390f35b34156109d457600080fd5b6103be600160a060020a03600435166024356124f1565b604051901515815260200160405180910390f35b3415610a0a57600080fd5b610468612613565b60405190815260200160405180910390f35b3415610a2f57600080fd5b610a7560046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061261995505050505050565b604051600160a060020a039093168352602083019190915215156040808301919091526060909101905180910390f35b6102e0612775565b005b3415610aba57600080fd5b6103246004356129ab565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103615780820151818401525b602001610348565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610b4857600080fd5b610468612a67565b60405190815260200160405180910390f35b3415610b6d57600080fd5b6102e0600160a060020a0360043516612a6e565b005b3415610b8e57600080fd5b610b96612c1d565b60405180826002811115610ba657fe5b60ff16815260200191505060405180910390f35b3415610bc557600080fd5b610468612c2d565b60405190815260200160405180910390f35b3415610bea57600080fd5b610468612c34565b60405190815260200160405180910390f35b3415610c0f57600080fd5b6102e0600160a060020a0360043516612c3a565b005b3415610c3057600080fd5b6103be612dd5565b604051901515815260200160405180910390f35b3415610c5757600080fd5b610468612dde565b60405190815260200160405180910390f35b3415610c7c57600080fd5b6103be600160a060020a0360043516612de4565b604051901515815260200160405180910390f35b3415610caf57600080fd5b610468612df9565b60405190815260200160405180910390f35b3415610cd457600080fd5b610468612dff565b60405190815260200160405180910390f35b3415610cf957600080fd5b610468612e0d565b60405190815260200160405180910390f35b3415610d1e57600080fd5b610468600160a060020a0360043581169060243516612e14565b60405190815260200160405180910390f35b3415610d5557600080fd5b610468612e53565b60405190815260200160405180910390f35b3415610d7a57600080fd5b610468612e59565b60405190815260200160405180910390f35b3415610d9f57600080fd5b6102f5600435612e65565b604051600160a060020a03909116815260200160405180910390f35b3415610dd157600080fd5b610468612e9e565b60405190815260200160405180910390f35b3415610df657600080fd5b610468612ea4565b60405190815260200160405180910390f35b3415610e1b57600080fd5b610468612eab565b60405190815260200160405180910390f35b3415610e4057600080fd5b6102e0600160a060020a0360043516612eb9565b005b3415610e6157600080fd5b610468612fbc565b60405190815260200160405180910390f35b3415610e8657600080fd5b6102e0600435612fcb565b005b601954683635c9adc5dea00000901015610eac57600080fd5b60005469d3c21bcecceda1000000901015610ec657600080fd5b600e5433600160a060020a0390811691161480610ef15750600f5433600160a060020a039081169116145b1515610efc57600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e54909216815291909120541415610fed57601a54610f6e30600160a060020a03163184613102565b1015610f7957600080fd5b600160a060020a0381161515610f8e57600080fd5b600160a060020a03811682156108fc0283604051600060405180830381858888f193505050501515610fbf57600080fd5b5b600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120555b5b5b5b5050565b600f54600160a060020a031681565b60408051908101604052600681527f456e76696f6e0000000000000000000000000000000000000000000000000000602082015281565b600060023660441461104857fe5b600160a060020a03338116600081815260026020908152604080832094891680845294909152908190208690557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259086905190815260200160405180910390a3600191505b5b5092915050565b600e5433600160a060020a03908116911614806110e05750600f5433600160a060020a039081169116145b15156110eb57600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e549092168152919091205414156111a55760013660241461115257fe5b600160a060020a0382166000908152601c60205260409020805460ff191660011790555b5b50600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120555b5b5b50565b601c6020526000908152604090205460ff1681565b600e54600160a060020a031681565b683635c9adc5dea0000081565b60005481565b600e5433600160a060020a039081169116148061120c5750600f5433600160a060020a039081169116145b151561121757600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e549092168152919091205414156111a55760013660241461127e57fe5b600160a060020a0382166000908152601c60205260409020805460ff191690555b5b50600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120556111a5565b6111a5565b5b50565b60008060015b60105460a060020a900460ff1660028111156112f957fe5b1461130357600080fd5b600160a060020a033390811660009081526016602052604090205460ff1615156001141561135557600160a060020a0381166000908152601d602052604090205460ff16151560011461135557600080fd5b5b33600160a060020a0381166000908152601260205260408120548691901180156113815750600d5443105b156113c057600160a060020a0382166000908152601260209081526040808320546001909252909120546113b59083613102565b10156113c057600080fd5b5b6003366064146113cd57fe5b6113d889898961311d565b945084156113eb576113e9886132a9565b505b8495505b5b505b50505b505b509392505050565b611407613330565b600160a060020a031633600160a060020a031614151561142657600080fd5b61142f8161344d565b601f557f891acff763972fa7f25226caa78556f59bcb130f6f13fd6ab9b9fef99cff9c698160405160208082528190810183818151815260200191508051906020019080838360005b838110156114915780820151818401525b602001611478565b50505050905090810190601f1680156114be5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1610fed61205f565b5b5050565b60158054829081106114e657fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b60025b60105460a060020a900460ff16600281111561152557fe5b1461152f57600080fd5b600e5433600160a060020a039081169116148061155a5750600f5433600160a060020a039081169116145b151561156557600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e5490921681529190912054141561163e576010805460ff7501000000000000000000000000000000000000000000820416919074ff0000000000000000000000000000000000000000191660a060020a83600281111561160b57fe5b02179055505b600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120555b5b5b5b565b60126020526000908152604090205481565b601281565b5b505050565b60205481565b600080805b60105460a060020a900460ff16600281111561168357fe5b1461168d57600080fd5b60105433600160a060020a039081169116146116a857600080fd5b600160a060020a03871615156116bd57600080fd5b600086116116ca57600080fd5b600084116116d757600080fd5b6008544310156116e657600080fd5b60095462029040014311156116fa57600080fd5b611710866064670de0b6b3a76400005b0461357e565b915061171e600054836135ad565b90506a6b88921f0410abc200000081111561173857600080fd5b6000819055601185856040518083838082843782019150509250505090815260200160405190819003902054600160a060020a03161561177757600080fd5b60606040519081016040528088600160a060020a0316815260200183815260200160011515815250601186866040518083838082843782019150509250505090815260200160405190819003902081518154600160a060020a031916600160a060020a0391909116178155602082015181600101556040820151600291909101805460ff19169115159190911790555060138054600181016118198382614079565b916000526020600020900160005b506118339087876140a3565b505082151561187957600160a060020a03871660009081526012602052604090205461185f90836135ad565b600160a060020a0388166000908152601260205260409020555b600160a060020a03871660009081526001602052604090205461189c90836135ad565b600160a060020a0388166000908152600160205260409020556118be876132a9565b50600160a060020a03871660008181526016602052604090819020805460ff191660011790557f1a0e722b7da39e72a59b39f661ef0ce1167fc012eeacb7481feb8b110d7c481e9084905190815260200160405180910390a25b5b5b50505050505050565b60005b60105460a060020a900460ff16600281111561193e57fe5b1461194857600080fd5b601954683635c9adc5dea0000090101561196157600080fd5b60005469d3c21bcecceda100000090101561197b57600080fd5b600e5433600160a060020a03908116911614806119a65750600f5433600160a060020a039081169116145b15156119b157600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e549092168152919091205414156111a557600954431180611a29575060005469d3c21bcecceda10000009010155b80611a405750601954683635c9adc5dea000009010155b1515611a4b57600080fd5b600160a060020a0381161515611a6057600080fd5b601080546001919074ff0000000000000000000000000000000000000000191660a060020a835b0217905550601080546001919075ff00000000000000000000000000000000000000000019167501000000000000000000000000000000000000000000835b021790555080600160a060020a03166108fc6019549081150290604051600060405180830381858888f193505050501515611b0057600080fd5b5b600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120556111a5565b6111a5565b5b5b5b50565b60408051908101604052600381527f302e390000000000000000000000000000000000000000000000000000000000602082015281565b60008060095461a4100143111515611b8b57600080fd5b601954683635c9adc5dea00000901080611bb1575060005469d3c21bcecceda100000090105b1515611bbc57600080fd5b600160a060020a0333166000908152601760205260408120541180611bf75750600160a060020a033316600090815260186020526040812054115b1515611c0257600080fd5b600160a060020a03331660009081526001602052604081205492508211611c2857600080fd5b600160a060020a033316600090815260176020908152604080832054601890925290912054611c5791906135ad565b905060008111611c6657600080fd5b601954600160a060020a033316600090815260176020526040902054611c8c9190613102565b601955601a54600160a060020a033316600090815260186020526040902054611cb59190613102565b601a55600160a060020a0333166000908152600160209081526040808320839055601782528083208390556018909152812081905554611cf59083613102565b600055600160a060020a0333167fb6c0eca8138e097d71e2dd31e19a1266487f0553f170b7260ffe68bcbe9ff8a78260405190815260200160405180910390a2600160a060020a03331681156108fc0282604051600060405180830381858888f193505050501515610fed57600080fd5b5b5050565b600160a060020a0333166000908152601c602052604090205460ff161515600114611d9557600080fd5b600d544310611da357600080fd5b60118282604051808383808284378201915050925050509081526020016040519081900390206002015460ff161515600114611dde57600080fd5b611e5860016000601185856040518083838082843782019150509250505090815260200160405190819003902054600160a060020a03168152602081019190915260409081016000205490601190859085905180838380828437820191505092505050908152602001604051809103902060010154613102565b60016000601185856040518083838082843782019150509250505090815260200160405190819003902054600160a060020a0316815260208101919091526040908101600090812092909255611f1f9160129160119086908690518083838082843782019150509250505090815260200160405190819003902054600160a060020a03168152602081019190915260409081016000205490601190859085905180838380828437820191505092505050908152602001604051809103902060010154613102565b60126000601185856040518083838082843782019150509250505090815260200160405190819003902054600160a060020a0316815260208101919091526040908101600090812092909255601190849084905180838380828437820191505092505050908152602001604051908190039020600201805460ff1916911515919091179055600054611fd9906011848460405180838380828437820191505092505050908152602001604051809103902060010154613102565b600055601182826040518083838082843782019150509250505090815260200160405190819003902054600160a060020a03167f6e9b134e7c6a5f38a62b3b3344b833bb9bda58d3c5556223978ec5273ff4735383836040516020808252810182905280604081018484808284378201915050935050505060405180910390a25b5b5050565b612067613330565b600160a060020a031633600160a060020a0316141515612096576702c68af0bb14000034101561209657600080fd5b5b30600160a060020a0316316120de60408051908101604052600381527f55524c000000000000000000000000000000000000000000000000000000000060208201526135d5565b111561219a577f46cb989ef9cef13e930e3b7f286225a086e716a90d63e0b7da85d310a9db0c9a6040516020808252604b908201527f4f7261636c697a6520717565727920776173204e4f542073656e742c20706c656040808301919091527f6173652061646420736f6d652045544820746f20636f76657220666f7220746860608301527f6520717565727920666565000000000000000000000000000000000000000000608083015260a0909101905180910390a161163e565b7f46cb989ef9cef13e930e3b7f286225a086e716a90d63e0b7da85d310a9db0c9a60405160208082526015908201527f4f7261636c697a652073656e742c20776169742e2e00000000000000000000006040808301919091526060909101905180910390a16111a5610e106040805190810160405280600381526020017f55524c0000000000000000000000000000000000000000000000000000000000815250608060405190810160405280604981526020017f6a736f6e2868747470733a2f2f6d696e2d6170692e63727970746f636f6d706181526020017f72652e636f6d2f646174612f70726963653f6673796d3d455448267473796d7381526020017f3d555344292e555344000000000000000000000000000000000000000000000081525062035b60613762565b505b5b565b600160a060020a0381166000908152600160205260409020545b919050565b6015545b90565b60195481565b60025b60105460a060020a900460ff16600281111561231357fe5b141561231e57600080fd5b600e5433600160a060020a03908116911614806123495750600f5433600160a060020a039081169116145b151561235457600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e5490921681529190912054141561163e576010805460ff60a060020a820416919075ff000000000000000000000000000000000000000000191675010000000000000000000000000000000000000000008360028111156123fb57fe5b0217905550601080546002919074ff0000000000000000000000000000000000000000191660a060020a8361160b565b02179055505b600e54600160a060020a039081166000908152601b6020526040808220829055600f5490921681529081205561163e565b61163e565b5b5b565b600d5481565b60095481565b60408051908101604052600381527f45564e0000000000000000000000000000000000000000000000000000000000602082015281565b600160a060020a0381166000908152600160205260409020545b919050565b601054600160a060020a031681565b601d6020526000908152604090205460ff1681565b60008060015b60105460a060020a900460ff16600281111561250f57fe5b1461251957600080fd5b600160a060020a033390811660009081526016602052604090205460ff1615156001141561256b57600160a060020a0381166000908152601d602052604090205460ff16151560011461256b57600080fd5b5b33600160a060020a0381166000908152601260205260408120548691901180156125975750600d5443105b156125d657600160a060020a0382166000908152601260209081526040808320546001909252909120546125cb9083613102565b10156125d657600080fd5b5b6002366044146125e357fe5b6125ed8888613a68565b94508415612600576125fe886132a9565b505b8495505b5b505b50505b505b5092915050565b601a5481565b60008060006011846040518082805190602001908083835b6020831061265157805182525b601f199092019160209182019101612631565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405190819003902054600160a060020a031692506011846040518082805190602001908083835b602083106126c457805182525b601f1990920191602091820191016126a4565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001015491506011846040518082805190602001908083835b6020831061273057805182525b601f199092019160209182019101612710565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040519081900390206002015460ff1690505b9193909250565b6000808080805b60105460a060020a900460ff16600281111561279457fe5b1461279e57600080fd5b6008544310156127ad57600080fd5b6009544311156127bc57600080fd5b600034116127c957600080fd5b6127d7601a546019546135ad565b93506127e384346135ad565b92506970ee403ce780ac5000008311156127fc57600080fd5b61280834601f5461357e565b91506064825b0491506128228261281d613b78565b613bc6565b9150670de0b6b3a764000082101561283957600080fd5b612845600054836135ad565b90506a6b88921f0410abc200000081111561285f57600080fd5b600160a060020a0333166000908152601d602052604090205460ff1615156128d257600160a060020a0333166000908152601860205260409020546128a490346135ad565b600160a060020a033316600090815260186020526040902055601a546128ca90346135ad565b601a5561291f565b600160a060020a0333166000908152601760205260409020546128f590346135ad565b600160a060020a03331660009081526017602052604090205560195461291b90346135ad565b6019555b600081815533600160a060020a03811682526001602052604090912080548401905561294a906132a9565b50600160a060020a03331660008181526016602052604090819020805460ff191660011790557ff531cc636ac07444c260ab8fbec2dfcfb2e69f62697aa04f6429a3b052c413989084905190815260200160405180910390a25b5b50505050565b60138054829081106129b957fe5b906000526020600020900160005b915090508054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a5f5780601f10612a3457610100808354040283529160200191612a5f565b820191906000526020600020905b815481529060010190602001808311612a4257829003601f168201915b505050505081565b6013545b90565b60008060015b60105460a060020a900460ff166002811115612a8c57fe5b14612a9657600080fd5b600e5433600160a060020a0390811691161480612ac15750600f5433600160a060020a039081169116145b1515612acc57600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e54909216815291909120541415612c1157601e5460ff1615612b3757600080fd5b600160a060020a0383161515612b4c57600080fd5b612b5b6000546201a406613bc6565b9150612b6982600054613102565b600160a060020a03841660009081526001602081905260408220839055601e805460ff191690911790558390559050612ba1836132a9565b5082600160a060020a03167f74c57fa15425b244ab3400bd258037da3499566fe21038ab6e6db4971d1565fa8260405190815260200160405180910390a25b600e54600160a060020a039081166000908152601b6020526040808220829055600f5490921681529081205561165a565b61165a565b5b5b505050565b60105460a060020a900460ff1681565b6201b20781565b601f5481565b600160a060020a0333166000908152601c6020526040812054819060ff161515600114612c6657600080fd5b600160a060020a0383166000908152601d602052604090205460ff1615612c8c57600080fd5b600160a060020a03831660009081526018602052604081205411612caf57600080fd5b600160a060020a03831660009081526001602052604081205492508211612cd557600080fd5b50600160a060020a038216600090815260186020526040812054908111612cfb57600080fd5b601a54600160a060020a038416600090815260186020526040902054612d219190613102565b601a55600160a060020a03831660009081526012602090815260408083205460018352818420556018909152812081905554612d5d9083613102565b600055600160a060020a0383167fa840617fb151e47d5e92a7fd2b59e2aedb6252c5dd8e5656a789e116f5668f038260405190815260200160405180910390a2600160a060020a03831681156108fc0282604051600060405180830381858888f19350505050151561165a57600080fd5b5b5b505050565b601e5460ff1681565b600a5481565b60146020526000908152604090205460ff1681565b60085481565b6970ee403ce780ac50000081565b62022e0981565b6000600236604414612e2257fe5b600160a060020a0380851660009081526002602090815260408083209387168352929052205491505b5b5092915050565b600c5481565b670de0b6b3a764000081565b6000601582815481101515612e7657fe5b906000526020600020900160005b9054906101000a9004600160a060020a031690505b919050565b600b5481565b6201e84881565b69d3c21bcecceda100000081565b600160a060020a0333166000908152601c602052604090205460ff161515600114612ee357600080fd5b600160a060020a0381166000908152601d602052604090205460ff1615612f0957600080fd5b600160a060020a0381166000908152601d60209081526040808320805460ff19166001179055601890915281205411156111a557600160a060020a038116600090815260186020818152604080842054601783529320839055601954919052612f71916135ad565b601955601a54600160a060020a038216600090815260186020526040902054612f9a9190613102565b601a55600160a060020a0381166000908152601860205260408120555b5b5b50565b6a6b88921f0410abc200000081565b600e5433600160a060020a0390811691161480612ff65750600f5433600160a060020a039081169116145b151561300157600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e549092168152919091205414156111a557601e8111613077576130726406fc23ac00613c08565b611b00565b6032811161309257613072640ba43b7400613c08565b611b00565b604681116130ad5761307264104c533c00613c08565b611b00565b60648111611b0057611b0064174876e800613c08565b5b5b5b5b5b600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120556111a5565b6111a5565b5b50565b6000808284101561310f57fe5b5050808203805b5092915050565b600160a060020a03831660009081526001602052604081205482901080159061316d5750600160a060020a0380851660009081526002602090815260408083203390941683529290522054829010155b80156131795750600082115b801561319e5750600160a060020a038316600090815260016020526040902054828101115b1561329d57600160a060020a0383166000908152600160205260409020546131c690836135ad565b600160a060020a0380851660009081526001602052604080822093909355908616815220546131f59083613102565b600160a060020a03808616600090815260016020908152604080832094909455600281528382203390931682529190915220546132329083613102565b600160a060020a03808616600081815260026020908152604080832033861684529091529081902093909355908516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060016132a1565b5060005b5b9392505050565b600160a060020a03811660009081526014602052604081205460ff1615156133275760158054600181016132dd8382614122565b916000526020600020900160005b8154600160a060020a038087166101009390930a838102910219909116179091556000908152601460205260409020805460ff19166001179055505b5060015b919050565b600354600090600160a060020a0316158061335d575060035461335b90600160a060020a0316613d1a565b155b1561336e5761336c6000613d22565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156133b657600080fd5b6102c65a03f115156133c757600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063c281d19e6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561342c57600080fd5b6102c65a03f1151561343d57600080fd5b50505060405180519150505b5b90565b600061345761414c565b50816000805b8251811015613572577f300000000000000000000000000000000000000000000000000000000000000083828151811061349357fe5b016020015160f860020a900460f860020a027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015801561353457507f39000000000000000000000000000000000000000000000000000000000000008382815181106134fd57fe5b016020015160f860020a900460f860020a027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b1561356957603083828151811061354757fe5b016020015160f860020a900460f860020a0260f860020a90040382600a020191505b5b60010161345d565b8193505b505050919050565b600082820283158061359a575082848281151561359757fe5b04145b15156135a257fe5b8091505b5092915050565b600082820183811080159061359a5750828110155b15156135a257fe5b8091505b5092915050565b600354600090600160a060020a03161580613602575060035461360090600160a060020a0316613d1a565b155b15613613576136116000613d22565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561365b57600080fd5b6102c65a03f1151561366c57600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063524f3889836000604051602001526040518263ffffffff1660e060020a0281526004018080602001828103825283818151815260200191508051906020019080838360005b838110156136f45780820151818401525b6020016136db565b50505050905090810190601f1680156137215780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b151561373f57600080fd5b6102c65a03f1151561375057600080fd5b50505060405180519150505b5b919050565b6003546000908190600160a060020a03161580613791575060035461378f90600160a060020a0316613d1a565b155b156137a2576137a06000613d22565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156137ea57600080fd5b6102c65a03f115156137fb57600080fd5b505050604051805160048054600160a060020a031916600160a060020a039283161790819055169050632ef3accc86856000604051602001526040518363ffffffff1660e060020a0281526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561388a5780820151818401525b602001613871565b50505050905090810190601f1680156138b75780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b15156138d657600080fd5b6102c65a03f115156138e757600080fd5b5050506040518051915050670de0b6b3a76400003a84020181111561390f5760009150613a5e565b600454600160a060020a031663c51be90f82888888886000604051602001526040518663ffffffff1660e060020a028152600401808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b8381101561398e5780820151818401525b602001613975565b50505050905090810190601f1680156139bb5780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b838110156139f25780820151818401525b6020016139d9565b50505050905090810190601f168015613a1f5780820380516001836020036101000a031916815260200191505b5096505050505050506020604051808303818588803b1515613a4057600080fd5b6125ee5a03f11515613a5157600080fd5b5050505060405180519250505b5b50949350505050565b600160a060020a033316600090815260016020526040812054829010801590613a915750600082115b8015613ab65750600160a060020a038316600090815260016020526040902054828101115b15613b6d57600160a060020a033316600090815260016020526040902054613ade9083613102565b600160a060020a033381166000908152600160205260408082209390935590851681522054613b0d90836135ad565b600160a060020a0380851660008181526001602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a3506001613b71565b5060005b5b92915050565b6000600a54431015613b8e575062022e096122ef565b600b54431015613ba257506201e8486122ef565b600c54431015613bb657506201b2076122ef565b50620186a06122ef565b5b5b5b90565b600080620186a0831015613bd957600080fd5b62030d408310613be857600080fd5b613bf2848461357e565b9050620186a0815b0490508091505b5092915050565b600354600160a060020a03161580613c325750600354613c3090600160a060020a0316613d1a565b155b15613c4357613c416000613d22565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515613c8b57600080fd5b6102c65a03f11515613c9c57600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063ca6ad1e48260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515613d0157600080fd5b6102c65a03f115156129a457600080fd5b5050505b5b50565b803b5b919050565b600080613d42731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed613d1a565b1115613db25760038054600160a060020a031916731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed179055613daa60408051908101604052600b81527f6574685f6d61696e6e65740000000000000000000000000000000000000000006020820152614061565b5060016122e6565b6000613dd173c03a2615d5efaf5f49f60b7bb6583eaec212fdf1613d1a565b1115613e415760038054600160a060020a03191673c03a2615d5efaf5f49f60b7bb6583eaec212fdf1179055613daa60408051908101604052600c81527f6574685f726f707374656e3300000000000000000000000000000000000000006020820152614061565b5060016122e6565b6000613e6073b7a07bcf2ba2f2703b24c0691b5278999c59ac7e613d1a565b1115613ed05760038054600160a060020a03191673b7a07bcf2ba2f2703b24c0691b5278999c59ac7e179055613daa60408051908101604052600981527f6574685f6b6f76616e00000000000000000000000000000000000000000000006020820152614061565b5060016122e6565b6000613eef73146500cfd35b22e4a392fe0adc06de1a1368ed48613d1a565b1115613f5f5760038054600160a060020a03191673146500cfd35b22e4a392fe0adc06de1a1368ed48179055613daa60408051908101604052600b81527f6574685f72696e6b6562790000000000000000000000000000000000000000006020820152614061565b5060016122e6565b6000613f7e736f485c8bf6fc43ea212e93bbf8ce046c7f1cb475613d1a565b1115613fb2575060038054600160a060020a031916736f485c8bf6fc43ea212e93bbf8ce046c7f1cb47517905560016122e6565b6000613fd17320e12a1f859b3feae5fb2a0a32c18f5a65555bbf613d1a565b1115614005575060038054600160a060020a0319167320e12a1f859b3feae5fb2a0a32c18f5a65555bbf17905560016122e6565b60006140247351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa613d1a565b1115614058575060038054600160a060020a0319167351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa17905560016122e6565b5060005b919050565b6005818051610fed92916020019061415e565b505b50565b81548183558181151161165a5760008381526020902061165a9181019083016141dd565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106140e45782800160ff19823516178555614111565b82800160010185558215614111579182015b828111156141115782358255916020019190600101906140f6565b5b5061411e929150614207565b5090565b81548183558181151161165a5760008381526020902061165a918101908301614207565b5b505050565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061419f57805160ff1916838001178555614111565b82800160010185558215614111579182015b828111156141115782518255916020019190600101906141b1565b5b5061411e929150614207565b5090565b6122ef91905b8082111561411e5760006141f78282614228565b506001016141e3565b5090565b90565b6122ef91905b8082111561411e576000815560010161420d565b5090565b90565b50805460018160011615610100020316600290046000825580601f1061424e57506111a5565b601f0160209004906000526020600020908101906111a59190614207565b5b505600a165627a7a72305820988c73333ac173572010ad58d9556df1d1832dc3572d43e4c9c9322dbcb322ed002946cb989ef9cef13e930e3b7f286225a086e716a90d63e0b7da85d310a9db0c9a00000000000000000000000000000000000000000000000000000000004847d600000000000000000000000000000000000000000000000000000000004b0764000000000000000000000000000000000000000000000000000000000048753a000000000000000000000000000000000000000000000000000000000048b950000000000000000000000000000000000000000000000000000000000049582e0000000000000000000000007e49e51d4e30054915f11bd72c6c02f7423c1f4000000000000000000000000000cc9587a370fc97edcd54c8dcfcc320a56eaa190000000000000000000000002b4c4a1609c367bec8fed57e95df81c1aea5a1100000000000000000000000000000000000000000000000000000000000598613
Deployed Bytecode
0x606060405236156102b95763ffffffff60e060020a60003504166304deaeb581146102be57806306a8f8a2146102e257806306fdde0314610311578063095ea7b31461039c5780630fb7cb1d146103d2578063108e4bdb146103f3578063115976c414610426578063168213491461045557806318160ddd1461047a5780631f305ec71461049f57806323b872dd146104c057806327dc297e146104fc5780632a11ced0146105545780632a33fec6146105865780632ed196bd1461059b578063313ce567146105cc57806338bbfa50146105f15780633ba864651461068b5780633eeda7d3146106b05780634ef39b75146106e657806354fd4d5014610707578063590e1ae314610792578063611ef452146107a7578063673a7e28146107c757806370a08231146107d15780637136982b1461080257806373a1e7f5146108275780638456cb591461084c5780638a957f151461086157806391b43d131461088657806395d89b41146108ab5780639b96eece146107d1578063a3766f8814610967578063a5410a6614610996578063a9059cbb146109c9578063acc99bb7146109ff578063af580d2c14610a24578063b442726314610aa5578063b8b8587314610aaf578063becd283f14610b3d578063bf5f016914610b62578063c19d93fb14610b83578063c5fc98c914610bba578063cf9a60d414610bdf578063d134295814610c04578063d16be71b14610c25578063d25a13b414610c4c578063d4d7b19a14610c71578063d648a64714610ca4578063d8e3074014610cc9578063da9b90c414610cee578063dd62ed3e14610d13578063e5a284f814610d4a578063e74799b414610d6f578063e8a96b4614610d94578063eec7006f14610dc6578063f4ee82ee14610deb578063f5689a8014610e10578063f8db5d0714610e35578063f9fae4f714610e56578063fbf44a1b14610e7b575b600080fd5b34156102c957600080fd5b6102e0600435600160a060020a0360243516610e93565b005b34156102ed57600080fd5b6102f5610ff4565b604051600160a060020a03909116815260200160405180910390f35b341561031c57600080fd5b610324611003565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103615780820151818401525b602001610348565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103a757600080fd5b6103be600160a060020a036004351660243561103a565b604051901515815260200160405180910390f35b34156103dd57600080fd5b6102e0600160a060020a03600435166110b5565b005b34156103fe57600080fd5b6103be600160a060020a03600435166111aa565b604051901515815260200160405180910390f35b341561043157600080fd5b6102f56111bf565b604051600160a060020a03909116815260200160405180910390f35b341561046057600080fd5b6104686111ce565b60405190815260200160405180910390f35b341561048557600080fd5b6104686111db565b60405190815260200160405180910390f35b34156104aa57600080fd5b6102e0600160a060020a03600435166111e1565b005b34156104cb57600080fd5b6103be600160a060020a03600435811690602435166044356112db565b604051901515815260200160405180910390f35b341561050757600080fd5b6102e0600480359060446024803590810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506113ff95505050505050565b005b341561055f57600080fd5b6102f56004356114d8565b604051600160a060020a03909116815260200160405180910390f35b341561059157600080fd5b6102e061150a565b005b34156105a657600080fd5b610468600160a060020a0360043516611643565b60405190815260200160405180910390f35b34156105d757600080fd5b610468611655565b60405190815260200160405180910390f35b34156105fc57600080fd5b6102e0600480359060446024803590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284375094965061165a95505050505050565b005b341561069657600080fd5b610468611660565b60405190815260200160405180910390f35b34156106bb57600080fd5b6102e060048035600160a060020a03169060248035916044359182019101356064351515611666565b005b34156106f157600080fd5b6102e0600160a060020a0360043516611923565b005b341561071257600080fd5b610324611b3d565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103615780820151818401525b602001610348565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561079d57600080fd5b6102e0611b74565b005b34156107b257600080fd5b6102e06004803560248101910135611d6b565b005b6102e061205f565b005b34156107dc57600080fd5b610468600160a060020a03600435166122cc565b60405190815260200160405180910390f35b341561080d57600080fd5b6104686122eb565b60405190815260200160405180910390f35b341561083257600080fd5b6104686122f2565b60405190815260200160405180910390f35b341561085757600080fd5b6102e06122f8565b005b341561086c57600080fd5b61046861246b565b60405190815260200160405180910390f35b341561089157600080fd5b610468612471565b60405190815260200160405180910390f35b34156108b657600080fd5b610324612477565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103615780820151818401525b602001610348565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156107dc57600080fd5b610468600160a060020a03600435166122cc565b60405190815260200160405180910390f35b341561097257600080fd5b6102f56124cd565b604051600160a060020a03909116815260200160405180910390f35b34156109a157600080fd5b6103be600160a060020a03600435166124dc565b604051901515815260200160405180910390f35b34156109d457600080fd5b6103be600160a060020a03600435166024356124f1565b604051901515815260200160405180910390f35b3415610a0a57600080fd5b610468612613565b60405190815260200160405180910390f35b3415610a2f57600080fd5b610a7560046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061261995505050505050565b604051600160a060020a039093168352602083019190915215156040808301919091526060909101905180910390f35b6102e0612775565b005b3415610aba57600080fd5b6103246004356129ab565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156103615780820151818401525b602001610348565b50505050905090810190601f16801561038e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610b4857600080fd5b610468612a67565b60405190815260200160405180910390f35b3415610b6d57600080fd5b6102e0600160a060020a0360043516612a6e565b005b3415610b8e57600080fd5b610b96612c1d565b60405180826002811115610ba657fe5b60ff16815260200191505060405180910390f35b3415610bc557600080fd5b610468612c2d565b60405190815260200160405180910390f35b3415610bea57600080fd5b610468612c34565b60405190815260200160405180910390f35b3415610c0f57600080fd5b6102e0600160a060020a0360043516612c3a565b005b3415610c3057600080fd5b6103be612dd5565b604051901515815260200160405180910390f35b3415610c5757600080fd5b610468612dde565b60405190815260200160405180910390f35b3415610c7c57600080fd5b6103be600160a060020a0360043516612de4565b604051901515815260200160405180910390f35b3415610caf57600080fd5b610468612df9565b60405190815260200160405180910390f35b3415610cd457600080fd5b610468612dff565b60405190815260200160405180910390f35b3415610cf957600080fd5b610468612e0d565b60405190815260200160405180910390f35b3415610d1e57600080fd5b610468600160a060020a0360043581169060243516612e14565b60405190815260200160405180910390f35b3415610d5557600080fd5b610468612e53565b60405190815260200160405180910390f35b3415610d7a57600080fd5b610468612e59565b60405190815260200160405180910390f35b3415610d9f57600080fd5b6102f5600435612e65565b604051600160a060020a03909116815260200160405180910390f35b3415610dd157600080fd5b610468612e9e565b60405190815260200160405180910390f35b3415610df657600080fd5b610468612ea4565b60405190815260200160405180910390f35b3415610e1b57600080fd5b610468612eab565b60405190815260200160405180910390f35b3415610e4057600080fd5b6102e0600160a060020a0360043516612eb9565b005b3415610e6157600080fd5b610468612fbc565b60405190815260200160405180910390f35b3415610e8657600080fd5b6102e0600435612fcb565b005b601954683635c9adc5dea00000901015610eac57600080fd5b60005469d3c21bcecceda1000000901015610ec657600080fd5b600e5433600160a060020a0390811691161480610ef15750600f5433600160a060020a039081169116145b1515610efc57600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e54909216815291909120541415610fed57601a54610f6e30600160a060020a03163184613102565b1015610f7957600080fd5b600160a060020a0381161515610f8e57600080fd5b600160a060020a03811682156108fc0283604051600060405180830381858888f193505050501515610fbf57600080fd5b5b600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120555b5b5b5b5050565b600f54600160a060020a031681565b60408051908101604052600681527f456e76696f6e0000000000000000000000000000000000000000000000000000602082015281565b600060023660441461104857fe5b600160a060020a03338116600081815260026020908152604080832094891680845294909152908190208690557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259086905190815260200160405180910390a3600191505b5b5092915050565b600e5433600160a060020a03908116911614806110e05750600f5433600160a060020a039081169116145b15156110eb57600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e549092168152919091205414156111a55760013660241461115257fe5b600160a060020a0382166000908152601c60205260409020805460ff191660011790555b5b50600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120555b5b5b50565b601c6020526000908152604090205460ff1681565b600e54600160a060020a031681565b683635c9adc5dea0000081565b60005481565b600e5433600160a060020a039081169116148061120c5750600f5433600160a060020a039081169116145b151561121757600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e549092168152919091205414156111a55760013660241461127e57fe5b600160a060020a0382166000908152601c60205260409020805460ff191690555b5b50600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120556111a5565b6111a5565b5b50565b60008060015b60105460a060020a900460ff1660028111156112f957fe5b1461130357600080fd5b600160a060020a033390811660009081526016602052604090205460ff1615156001141561135557600160a060020a0381166000908152601d602052604090205460ff16151560011461135557600080fd5b5b33600160a060020a0381166000908152601260205260408120548691901180156113815750600d5443105b156113c057600160a060020a0382166000908152601260209081526040808320546001909252909120546113b59083613102565b10156113c057600080fd5b5b6003366064146113cd57fe5b6113d889898961311d565b945084156113eb576113e9886132a9565b505b8495505b5b505b50505b505b509392505050565b611407613330565b600160a060020a031633600160a060020a031614151561142657600080fd5b61142f8161344d565b601f557f891acff763972fa7f25226caa78556f59bcb130f6f13fd6ab9b9fef99cff9c698160405160208082528190810183818151815260200191508051906020019080838360005b838110156114915780820151818401525b602001611478565b50505050905090810190601f1680156114be5780820380516001836020036101000a031916815260200191505b509250505060405180910390a1610fed61205f565b5b5050565b60158054829081106114e657fe5b906000526020600020900160005b915054906101000a9004600160a060020a031681565b60025b60105460a060020a900460ff16600281111561152557fe5b1461152f57600080fd5b600e5433600160a060020a039081169116148061155a5750600f5433600160a060020a039081169116145b151561156557600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e5490921681529190912054141561163e576010805460ff7501000000000000000000000000000000000000000000820416919074ff0000000000000000000000000000000000000000191660a060020a83600281111561160b57fe5b02179055505b600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120555b5b5b5b565b60126020526000908152604090205481565b601281565b5b505050565b60205481565b600080805b60105460a060020a900460ff16600281111561168357fe5b1461168d57600080fd5b60105433600160a060020a039081169116146116a857600080fd5b600160a060020a03871615156116bd57600080fd5b600086116116ca57600080fd5b600084116116d757600080fd5b6008544310156116e657600080fd5b60095462029040014311156116fa57600080fd5b611710866064670de0b6b3a76400005b0461357e565b915061171e600054836135ad565b90506a6b88921f0410abc200000081111561173857600080fd5b6000819055601185856040518083838082843782019150509250505090815260200160405190819003902054600160a060020a03161561177757600080fd5b60606040519081016040528088600160a060020a0316815260200183815260200160011515815250601186866040518083838082843782019150509250505090815260200160405190819003902081518154600160a060020a031916600160a060020a0391909116178155602082015181600101556040820151600291909101805460ff19169115159190911790555060138054600181016118198382614079565b916000526020600020900160005b506118339087876140a3565b505082151561187957600160a060020a03871660009081526012602052604090205461185f90836135ad565b600160a060020a0388166000908152601260205260409020555b600160a060020a03871660009081526001602052604090205461189c90836135ad565b600160a060020a0388166000908152600160205260409020556118be876132a9565b50600160a060020a03871660008181526016602052604090819020805460ff191660011790557f1a0e722b7da39e72a59b39f661ef0ce1167fc012eeacb7481feb8b110d7c481e9084905190815260200160405180910390a25b5b5b50505050505050565b60005b60105460a060020a900460ff16600281111561193e57fe5b1461194857600080fd5b601954683635c9adc5dea0000090101561196157600080fd5b60005469d3c21bcecceda100000090101561197b57600080fd5b600e5433600160a060020a03908116911614806119a65750600f5433600160a060020a039081169116145b15156119b157600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e549092168152919091205414156111a557600954431180611a29575060005469d3c21bcecceda10000009010155b80611a405750601954683635c9adc5dea000009010155b1515611a4b57600080fd5b600160a060020a0381161515611a6057600080fd5b601080546001919074ff0000000000000000000000000000000000000000191660a060020a835b0217905550601080546001919075ff00000000000000000000000000000000000000000019167501000000000000000000000000000000000000000000835b021790555080600160a060020a03166108fc6019549081150290604051600060405180830381858888f193505050501515611b0057600080fd5b5b600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120556111a5565b6111a5565b5b5b5b50565b60408051908101604052600381527f302e390000000000000000000000000000000000000000000000000000000000602082015281565b60008060095461a4100143111515611b8b57600080fd5b601954683635c9adc5dea00000901080611bb1575060005469d3c21bcecceda100000090105b1515611bbc57600080fd5b600160a060020a0333166000908152601760205260408120541180611bf75750600160a060020a033316600090815260186020526040812054115b1515611c0257600080fd5b600160a060020a03331660009081526001602052604081205492508211611c2857600080fd5b600160a060020a033316600090815260176020908152604080832054601890925290912054611c5791906135ad565b905060008111611c6657600080fd5b601954600160a060020a033316600090815260176020526040902054611c8c9190613102565b601955601a54600160a060020a033316600090815260186020526040902054611cb59190613102565b601a55600160a060020a0333166000908152600160209081526040808320839055601782528083208390556018909152812081905554611cf59083613102565b600055600160a060020a0333167fb6c0eca8138e097d71e2dd31e19a1266487f0553f170b7260ffe68bcbe9ff8a78260405190815260200160405180910390a2600160a060020a03331681156108fc0282604051600060405180830381858888f193505050501515610fed57600080fd5b5b5050565b600160a060020a0333166000908152601c602052604090205460ff161515600114611d9557600080fd5b600d544310611da357600080fd5b60118282604051808383808284378201915050925050509081526020016040519081900390206002015460ff161515600114611dde57600080fd5b611e5860016000601185856040518083838082843782019150509250505090815260200160405190819003902054600160a060020a03168152602081019190915260409081016000205490601190859085905180838380828437820191505092505050908152602001604051809103902060010154613102565b60016000601185856040518083838082843782019150509250505090815260200160405190819003902054600160a060020a0316815260208101919091526040908101600090812092909255611f1f9160129160119086908690518083838082843782019150509250505090815260200160405190819003902054600160a060020a03168152602081019190915260409081016000205490601190859085905180838380828437820191505092505050908152602001604051809103902060010154613102565b60126000601185856040518083838082843782019150509250505090815260200160405190819003902054600160a060020a0316815260208101919091526040908101600090812092909255601190849084905180838380828437820191505092505050908152602001604051908190039020600201805460ff1916911515919091179055600054611fd9906011848460405180838380828437820191505092505050908152602001604051809103902060010154613102565b600055601182826040518083838082843782019150509250505090815260200160405190819003902054600160a060020a03167f6e9b134e7c6a5f38a62b3b3344b833bb9bda58d3c5556223978ec5273ff4735383836040516020808252810182905280604081018484808284378201915050935050505060405180910390a25b5b5050565b612067613330565b600160a060020a031633600160a060020a0316141515612096576702c68af0bb14000034101561209657600080fd5b5b30600160a060020a0316316120de60408051908101604052600381527f55524c000000000000000000000000000000000000000000000000000000000060208201526135d5565b111561219a577f46cb989ef9cef13e930e3b7f286225a086e716a90d63e0b7da85d310a9db0c9a6040516020808252604b908201527f4f7261636c697a6520717565727920776173204e4f542073656e742c20706c656040808301919091527f6173652061646420736f6d652045544820746f20636f76657220666f7220746860608301527f6520717565727920666565000000000000000000000000000000000000000000608083015260a0909101905180910390a161163e565b7f46cb989ef9cef13e930e3b7f286225a086e716a90d63e0b7da85d310a9db0c9a60405160208082526015908201527f4f7261636c697a652073656e742c20776169742e2e00000000000000000000006040808301919091526060909101905180910390a16111a5610e106040805190810160405280600381526020017f55524c0000000000000000000000000000000000000000000000000000000000815250608060405190810160405280604981526020017f6a736f6e2868747470733a2f2f6d696e2d6170692e63727970746f636f6d706181526020017f72652e636f6d2f646174612f70726963653f6673796d3d455448267473796d7381526020017f3d555344292e555344000000000000000000000000000000000000000000000081525062035b60613762565b505b5b565b600160a060020a0381166000908152600160205260409020545b919050565b6015545b90565b60195481565b60025b60105460a060020a900460ff16600281111561231357fe5b141561231e57600080fd5b600e5433600160a060020a03908116911614806123495750600f5433600160a060020a039081169116145b151561235457600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e5490921681529190912054141561163e576010805460ff60a060020a820416919075ff000000000000000000000000000000000000000000191675010000000000000000000000000000000000000000008360028111156123fb57fe5b0217905550601080546002919074ff0000000000000000000000000000000000000000191660a060020a8361160b565b02179055505b600e54600160a060020a039081166000908152601b6020526040808220829055600f5490921681529081205561163e565b61163e565b5b5b565b600d5481565b60095481565b60408051908101604052600381527f45564e0000000000000000000000000000000000000000000000000000000000602082015281565b600160a060020a0381166000908152600160205260409020545b919050565b601054600160a060020a031681565b601d6020526000908152604090205460ff1681565b60008060015b60105460a060020a900460ff16600281111561250f57fe5b1461251957600080fd5b600160a060020a033390811660009081526016602052604090205460ff1615156001141561256b57600160a060020a0381166000908152601d602052604090205460ff16151560011461256b57600080fd5b5b33600160a060020a0381166000908152601260205260408120548691901180156125975750600d5443105b156125d657600160a060020a0382166000908152601260209081526040808320546001909252909120546125cb9083613102565b10156125d657600080fd5b5b6002366044146125e357fe5b6125ed8888613a68565b94508415612600576125fe886132a9565b505b8495505b5b505b50505b505b5092915050565b601a5481565b60008060006011846040518082805190602001908083835b6020831061265157805182525b601f199092019160209182019101612631565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405190819003902054600160a060020a031692506011846040518082805190602001908083835b602083106126c457805182525b601f1990920191602091820191016126a4565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206001015491506011846040518082805190602001908083835b6020831061273057805182525b601f199092019160209182019101612710565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040519081900390206002015460ff1690505b9193909250565b6000808080805b60105460a060020a900460ff16600281111561279457fe5b1461279e57600080fd5b6008544310156127ad57600080fd5b6009544311156127bc57600080fd5b600034116127c957600080fd5b6127d7601a546019546135ad565b93506127e384346135ad565b92506970ee403ce780ac5000008311156127fc57600080fd5b61280834601f5461357e565b91506064825b0491506128228261281d613b78565b613bc6565b9150670de0b6b3a764000082101561283957600080fd5b612845600054836135ad565b90506a6b88921f0410abc200000081111561285f57600080fd5b600160a060020a0333166000908152601d602052604090205460ff1615156128d257600160a060020a0333166000908152601860205260409020546128a490346135ad565b600160a060020a033316600090815260186020526040902055601a546128ca90346135ad565b601a5561291f565b600160a060020a0333166000908152601760205260409020546128f590346135ad565b600160a060020a03331660009081526017602052604090205560195461291b90346135ad565b6019555b600081815533600160a060020a03811682526001602052604090912080548401905561294a906132a9565b50600160a060020a03331660008181526016602052604090819020805460ff191660011790557ff531cc636ac07444c260ab8fbec2dfcfb2e69f62697aa04f6429a3b052c413989084905190815260200160405180910390a25b5b50505050565b60138054829081106129b957fe5b906000526020600020900160005b915090508054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612a5f5780601f10612a3457610100808354040283529160200191612a5f565b820191906000526020600020905b815481529060010190602001808311612a4257829003601f168201915b505050505081565b6013545b90565b60008060015b60105460a060020a900460ff166002811115612a8c57fe5b14612a9657600080fd5b600e5433600160a060020a0390811691161480612ac15750600f5433600160a060020a039081169116145b1515612acc57600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e54909216815291909120541415612c1157601e5460ff1615612b3757600080fd5b600160a060020a0383161515612b4c57600080fd5b612b5b6000546201a406613bc6565b9150612b6982600054613102565b600160a060020a03841660009081526001602081905260408220839055601e805460ff191690911790558390559050612ba1836132a9565b5082600160a060020a03167f74c57fa15425b244ab3400bd258037da3499566fe21038ab6e6db4971d1565fa8260405190815260200160405180910390a25b600e54600160a060020a039081166000908152601b6020526040808220829055600f5490921681529081205561165a565b61165a565b5b5b505050565b60105460a060020a900460ff1681565b6201b20781565b601f5481565b600160a060020a0333166000908152601c6020526040812054819060ff161515600114612c6657600080fd5b600160a060020a0383166000908152601d602052604090205460ff1615612c8c57600080fd5b600160a060020a03831660009081526018602052604081205411612caf57600080fd5b600160a060020a03831660009081526001602052604081205492508211612cd557600080fd5b50600160a060020a038216600090815260186020526040812054908111612cfb57600080fd5b601a54600160a060020a038416600090815260186020526040902054612d219190613102565b601a55600160a060020a03831660009081526012602090815260408083205460018352818420556018909152812081905554612d5d9083613102565b600055600160a060020a0383167fa840617fb151e47d5e92a7fd2b59e2aedb6252c5dd8e5656a789e116f5668f038260405190815260200160405180910390a2600160a060020a03831681156108fc0282604051600060405180830381858888f19350505050151561165a57600080fd5b5b5b505050565b601e5460ff1681565b600a5481565b60146020526000908152604090205460ff1681565b60085481565b6970ee403ce780ac50000081565b62022e0981565b6000600236604414612e2257fe5b600160a060020a0380851660009081526002602090815260408083209387168352929052205491505b5b5092915050565b600c5481565b670de0b6b3a764000081565b6000601582815481101515612e7657fe5b906000526020600020900160005b9054906101000a9004600160a060020a031690505b919050565b600b5481565b6201e84881565b69d3c21bcecceda100000081565b600160a060020a0333166000908152601c602052604090205460ff161515600114612ee357600080fd5b600160a060020a0381166000908152601d602052604090205460ff1615612f0957600080fd5b600160a060020a0381166000908152601d60209081526040808320805460ff19166001179055601890915281205411156111a557600160a060020a038116600090815260186020818152604080842054601783529320839055601954919052612f71916135ad565b601955601a54600160a060020a038216600090815260186020526040902054612f9a9190613102565b601a55600160a060020a0381166000908152601860205260408120555b5b5b50565b6a6b88921f0410abc200000081565b600e5433600160a060020a0390811691161480612ff65750600f5433600160a060020a039081169116145b151561300157600080fd5b60003660405180838380828437820191505092505050604051908190039020600160a060020a033381166000908152601b602052604080822093909355600f548216815282812054600e549092168152919091205414156111a557601e8111613077576130726406fc23ac00613c08565b611b00565b6032811161309257613072640ba43b7400613c08565b611b00565b604681116130ad5761307264104c533c00613c08565b611b00565b60648111611b0057611b0064174876e800613c08565b5b5b5b5b5b600e54600160a060020a039081166000908152601b6020526040808220829055600f549092168152908120556111a5565b6111a5565b5b50565b6000808284101561310f57fe5b5050808203805b5092915050565b600160a060020a03831660009081526001602052604081205482901080159061316d5750600160a060020a0380851660009081526002602090815260408083203390941683529290522054829010155b80156131795750600082115b801561319e5750600160a060020a038316600090815260016020526040902054828101115b1561329d57600160a060020a0383166000908152600160205260409020546131c690836135ad565b600160a060020a0380851660009081526001602052604080822093909355908616815220546131f59083613102565b600160a060020a03808616600090815260016020908152604080832094909455600281528382203390931682529190915220546132329083613102565b600160a060020a03808616600081815260026020908152604080832033861684529091529081902093909355908516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060016132a1565b5060005b5b9392505050565b600160a060020a03811660009081526014602052604081205460ff1615156133275760158054600181016132dd8382614122565b916000526020600020900160005b8154600160a060020a038087166101009390930a838102910219909116179091556000908152601460205260409020805460ff19166001179055505b5060015b919050565b600354600090600160a060020a0316158061335d575060035461335b90600160a060020a0316613d1a565b155b1561336e5761336c6000613d22565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156133b657600080fd5b6102c65a03f115156133c757600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063c281d19e6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561342c57600080fd5b6102c65a03f1151561343d57600080fd5b50505060405180519150505b5b90565b600061345761414c565b50816000805b8251811015613572577f300000000000000000000000000000000000000000000000000000000000000083828151811061349357fe5b016020015160f860020a900460f860020a027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015801561353457507f39000000000000000000000000000000000000000000000000000000000000008382815181106134fd57fe5b016020015160f860020a900460f860020a027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b1561356957603083828151811061354757fe5b016020015160f860020a900460f860020a0260f860020a90040382600a020191505b5b60010161345d565b8193505b505050919050565b600082820283158061359a575082848281151561359757fe5b04145b15156135a257fe5b8091505b5092915050565b600082820183811080159061359a5750828110155b15156135a257fe5b8091505b5092915050565b600354600090600160a060020a03161580613602575060035461360090600160a060020a0316613d1a565b155b15613613576136116000613d22565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561365b57600080fd5b6102c65a03f1151561366c57600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063524f3889836000604051602001526040518263ffffffff1660e060020a0281526004018080602001828103825283818151815260200191508051906020019080838360005b838110156136f45780820151818401525b6020016136db565b50505050905090810190601f1680156137215780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b151561373f57600080fd5b6102c65a03f1151561375057600080fd5b50505060405180519150505b5b919050565b6003546000908190600160a060020a03161580613791575060035461378f90600160a060020a0316613d1a565b155b156137a2576137a06000613d22565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156137ea57600080fd5b6102c65a03f115156137fb57600080fd5b505050604051805160048054600160a060020a031916600160a060020a039283161790819055169050632ef3accc86856000604051602001526040518363ffffffff1660e060020a0281526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561388a5780820151818401525b602001613871565b50505050905090810190601f1680156138b75780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b15156138d657600080fd5b6102c65a03f115156138e757600080fd5b5050506040518051915050670de0b6b3a76400003a84020181111561390f5760009150613a5e565b600454600160a060020a031663c51be90f82888888886000604051602001526040518663ffffffff1660e060020a028152600401808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b8381101561398e5780820151818401525b602001613975565b50505050905090810190601f1680156139bb5780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b838110156139f25780820151818401525b6020016139d9565b50505050905090810190601f168015613a1f5780820380516001836020036101000a031916815260200191505b5096505050505050506020604051808303818588803b1515613a4057600080fd5b6125ee5a03f11515613a5157600080fd5b5050505060405180519250505b5b50949350505050565b600160a060020a033316600090815260016020526040812054829010801590613a915750600082115b8015613ab65750600160a060020a038316600090815260016020526040902054828101115b15613b6d57600160a060020a033316600090815260016020526040902054613ade9083613102565b600160a060020a033381166000908152600160205260408082209390935590851681522054613b0d90836135ad565b600160a060020a0380851660008181526001602052604090819020939093559133909116907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a3506001613b71565b5060005b5b92915050565b6000600a54431015613b8e575062022e096122ef565b600b54431015613ba257506201e8486122ef565b600c54431015613bb657506201b2076122ef565b50620186a06122ef565b5b5b5b90565b600080620186a0831015613bd957600080fd5b62030d408310613be857600080fd5b613bf2848461357e565b9050620186a0815b0490508091505b5092915050565b600354600160a060020a03161580613c325750600354613c3090600160a060020a0316613d1a565b155b15613c4357613c416000613d22565b505b600354600160a060020a03166338cc48316000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515613c8b57600080fd5b6102c65a03f11515613c9c57600080fd5b505050604051805160048054600160a060020a031916600160a060020a03928316179081905516905063ca6ad1e48260405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515613d0157600080fd5b6102c65a03f115156129a457600080fd5b5050505b5b50565b803b5b919050565b600080613d42731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed613d1a565b1115613db25760038054600160a060020a031916731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed179055613daa60408051908101604052600b81527f6574685f6d61696e6e65740000000000000000000000000000000000000000006020820152614061565b5060016122e6565b6000613dd173c03a2615d5efaf5f49f60b7bb6583eaec212fdf1613d1a565b1115613e415760038054600160a060020a03191673c03a2615d5efaf5f49f60b7bb6583eaec212fdf1179055613daa60408051908101604052600c81527f6574685f726f707374656e3300000000000000000000000000000000000000006020820152614061565b5060016122e6565b6000613e6073b7a07bcf2ba2f2703b24c0691b5278999c59ac7e613d1a565b1115613ed05760038054600160a060020a03191673b7a07bcf2ba2f2703b24c0691b5278999c59ac7e179055613daa60408051908101604052600981527f6574685f6b6f76616e00000000000000000000000000000000000000000000006020820152614061565b5060016122e6565b6000613eef73146500cfd35b22e4a392fe0adc06de1a1368ed48613d1a565b1115613f5f5760038054600160a060020a03191673146500cfd35b22e4a392fe0adc06de1a1368ed48179055613daa60408051908101604052600b81527f6574685f72696e6b6562790000000000000000000000000000000000000000006020820152614061565b5060016122e6565b6000613f7e736f485c8bf6fc43ea212e93bbf8ce046c7f1cb475613d1a565b1115613fb2575060038054600160a060020a031916736f485c8bf6fc43ea212e93bbf8ce046c7f1cb47517905560016122e6565b6000613fd17320e12a1f859b3feae5fb2a0a32c18f5a65555bbf613d1a565b1115614005575060038054600160a060020a0319167320e12a1f859b3feae5fb2a0a32c18f5a65555bbf17905560016122e6565b60006140247351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa613d1a565b1115614058575060038054600160a060020a0319167351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa17905560016122e6565b5060005b919050565b6005818051610fed92916020019061415e565b505b50565b81548183558181151161165a5760008381526020902061165a9181019083016141dd565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106140e45782800160ff19823516178555614111565b82800160010185558215614111579182015b828111156141115782358255916020019190600101906140f6565b5b5061411e929150614207565b5090565b81548183558181151161165a5760008381526020902061165a918101908301614207565b5b505050565b60206040519081016040526000815290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061419f57805160ff1916838001178555614111565b82800160010185558215614111579182015b828111156141115782518255916020019190600101906141b1565b5b5061411e929150614207565b5090565b6122ef91905b8082111561411e5760006141f78282614228565b506001016141e3565b5090565b90565b6122ef91905b8082111561411e576000815560010161420d565b5090565b90565b50805460018160011615610100020316600290046000825580601f1061424e57506111a5565b601f0160209004906000526020600020908101906111a59190614207565b5b505600a165627a7a72305820988c73333ac173572010ad58d9556df1d1832dc3572d43e4c9c9322dbcb322ed0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000004847d600000000000000000000000000000000000000000000000000000000004b0764000000000000000000000000000000000000000000000000000000000048753a000000000000000000000000000000000000000000000000000000000048b950000000000000000000000000000000000000000000000000000000000049582e0000000000000000000000007e49e51d4e30054915f11bd72c6c02f7423c1f4000000000000000000000000000cc9587a370fc97edcd54c8dcfcc320a56eaa190000000000000000000000002b4c4a1609c367bec8fed57e95df81c1aea5a1100000000000000000000000000000000000000000000000000000000000598613
-----Decoded View---------------
Arg [0] : _fundingStartBlock (uint256): 4736982
Arg [1] : _fundingEndBlock (uint256): 4917092
Arg [2] : _roundTwoBlock (uint256): 4748602
Arg [3] : _roundThreeBlock (uint256): 4766032
Arg [4] : _roundFourBlock (uint256): 4806702
Arg [5] : _admin1 (address): 0x7e49E51D4E30054915F11BD72c6C02F7423C1F40
Arg [6] : _admin2 (address): 0x00cc9587A370fc97edCD54C8DCfCC320A56eAA19
Arg [7] : _tokenVendor (address): 0x2B4C4a1609C367BEc8FeD57E95DF81C1aEa5A110
Arg [8] : _ccReleaseBlock (uint256): 5867027
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000004847d6
Arg [1] : 00000000000000000000000000000000000000000000000000000000004b0764
Arg [2] : 000000000000000000000000000000000000000000000000000000000048753a
Arg [3] : 000000000000000000000000000000000000000000000000000000000048b950
Arg [4] : 000000000000000000000000000000000000000000000000000000000049582e
Arg [5] : 0000000000000000000000007e49e51d4e30054915f11bd72c6c02f7423c1f40
Arg [6] : 00000000000000000000000000cc9587a370fc97edcd54c8dcfcc320a56eaa19
Arg [7] : 0000000000000000000000002b4c4a1609c367bec8fed57e95df81c1aea5a110
Arg [8] : 0000000000000000000000000000000000000000000000000000000000598613
Swarm Source
bzzr://988c73333ac173572010ad58d9556df1d1832dc3572d43e4c9c9322dbcb322ed
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
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.