ERC-20
Overview
Max Total Supply
1,051,352.007388370815844682 EUR-T
Holders
1,259
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.957805228894307273 EUR-TValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
EuroToken
Compiler Version
v0.4.25+commit.59dbf8f1
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-11-12 */ pragma solidity 0.4.25; /// @title provides subject to role checking logic contract IAccessPolicy { //////////////////////// // Public functions //////////////////////// /// @notice We don't make this function constant to allow for state-updating access controls such as rate limiting. /// @dev checks if subject belongs to requested role for particular object /// @param subject address to be checked against role, typically msg.sender /// @param role identifier of required role /// @param object contract instance context for role checking, typically contract requesting the check /// @param verb additional data, in current AccessControll implementation msg.sig /// @return if subject belongs to a role function allowed( address subject, bytes32 role, address object, bytes4 verb ) public returns (bool); } /// @title enables access control in implementing contract /// @dev see AccessControlled for implementation contract IAccessControlled { //////////////////////// // Events //////////////////////// /// @dev must log on access policy change event LogAccessPolicyChanged( address controller, IAccessPolicy oldPolicy, IAccessPolicy newPolicy ); //////////////////////// // Public functions //////////////////////// /// @dev allows to change access control mechanism for this contract /// this method must be itself access controlled, see AccessControlled implementation and notice below /// @notice it is a huge issue for Solidity that modifiers are not part of function signature /// then interfaces could be used for example to control access semantics /// @param newPolicy new access policy to controll this contract /// @param newAccessController address of ROLE_ACCESS_CONTROLLER of new policy that can set access to this contract function setAccessPolicy(IAccessPolicy newPolicy, address newAccessController) public; function accessPolicy() public constant returns (IAccessPolicy); } contract StandardRoles { //////////////////////// // Constants //////////////////////// // @notice Soldity somehow doesn't evaluate this compile time // @dev role which has rights to change permissions and set new policy in contract, keccak256("AccessController") bytes32 internal constant ROLE_ACCESS_CONTROLLER = 0xac42f8beb17975ed062dcb80c63e6d203ef1c2c335ced149dc5664cc671cb7da; } /// @title Granular code execution permissions /// @notice Intended to replace existing Ownable pattern with more granular permissions set to execute smart contract functions /// for each function where 'only' modifier is applied, IAccessPolicy implementation is called to evaluate if msg.sender belongs to required role for contract being called. /// Access evaluation specific belong to IAccessPolicy implementation, see RoleBasedAccessPolicy for details. /// @dev Should be inherited by a contract requiring such permissions controll. IAccessPolicy must be provided in constructor. Access policy may be replaced to a different one /// by msg.sender with ROLE_ACCESS_CONTROLLER role contract AccessControlled is IAccessControlled, StandardRoles { //////////////////////// // Mutable state //////////////////////// IAccessPolicy private _accessPolicy; //////////////////////// // Modifiers //////////////////////// /// @dev limits function execution only to senders assigned to required 'role' modifier only(bytes32 role) { require(_accessPolicy.allowed(msg.sender, role, this, msg.sig)); _; } //////////////////////// // Constructor //////////////////////// constructor(IAccessPolicy policy) internal { require(address(policy) != 0x0); _accessPolicy = policy; } //////////////////////// // Public functions //////////////////////// // // Implements IAccessControlled // function setAccessPolicy(IAccessPolicy newPolicy, address newAccessController) public only(ROLE_ACCESS_CONTROLLER) { // ROLE_ACCESS_CONTROLLER must be present // under the new policy. This provides some // protection against locking yourself out. require(newPolicy.allowed(newAccessController, ROLE_ACCESS_CONTROLLER, this, msg.sig)); // We can now safely set the new policy without foot shooting. IAccessPolicy oldPolicy = _accessPolicy; _accessPolicy = newPolicy; // Log event emit LogAccessPolicyChanged(msg.sender, oldPolicy, newPolicy); } function accessPolicy() public constant returns (IAccessPolicy) { return _accessPolicy; } } /// @title standard access roles of the Platform /// @dev constants are kept in CODE not in STORAGE so they are comparatively cheap contract AccessRoles { //////////////////////// // Constants //////////////////////// // NOTE: All roles are set to the keccak256 hash of the // CamelCased role name, i.e. // ROLE_LOCKED_ACCOUNT_ADMIN = keccak256("LockedAccountAdmin") // May issue (generate) Neumarks bytes32 internal constant ROLE_NEUMARK_ISSUER = 0x921c3afa1f1fff707a785f953a1e197bd28c9c50e300424e015953cbf120c06c; // May burn Neumarks it owns bytes32 internal constant ROLE_NEUMARK_BURNER = 0x19ce331285f41739cd3362a3ec176edffe014311c0f8075834fdd19d6718e69f; // May create new snapshots on Neumark bytes32 internal constant ROLE_SNAPSHOT_CREATOR = 0x08c1785afc57f933523bc52583a72ce9e19b2241354e04dd86f41f887e3d8174; // May enable/disable transfers on Neumark bytes32 internal constant ROLE_TRANSFER_ADMIN = 0xb6527e944caca3d151b1f94e49ac5e223142694860743e66164720e034ec9b19; // may reclaim tokens/ether from contracts supporting IReclaimable interface bytes32 internal constant ROLE_RECLAIMER = 0x0542bbd0c672578966dcc525b30aa16723bb042675554ac5b0362f86b6e97dc5; // represents legally platform operator in case of forks and contracts with legal agreement attached. keccak256("PlatformOperatorRepresentative") bytes32 internal constant ROLE_PLATFORM_OPERATOR_REPRESENTATIVE = 0xb2b321377653f655206f71514ff9f150d0822d062a5abcf220d549e1da7999f0; // allows to deposit EUR-T and allow addresses to send and receive EUR-T. keccak256("EurtDepositManager") bytes32 internal constant ROLE_EURT_DEPOSIT_MANAGER = 0x7c8ecdcba80ce87848d16ad77ef57cc196c208fc95c5638e4a48c681a34d4fe7; // allows to register identities and change associated claims keccak256("IdentityManager") bytes32 internal constant ROLE_IDENTITY_MANAGER = 0x32964e6bc50f2aaab2094a1d311be8bda920fc4fb32b2fb054917bdb153a9e9e; // allows to replace controller on euro token and to destroy tokens without withdraw kecckak256("EurtLegalManager") bytes32 internal constant ROLE_EURT_LEGAL_MANAGER = 0x4eb6b5806954a48eb5659c9e3982d5e75bfb2913f55199877d877f157bcc5a9b; // allows to change known interfaces in universe kecckak256("UniverseManager") bytes32 internal constant ROLE_UNIVERSE_MANAGER = 0xe8d8f8f9ea4b19a5a4368dbdace17ad71a69aadeb6250e54c7b4c7b446301738; // allows to exchange gas for EUR-T keccak("GasExchange") bytes32 internal constant ROLE_GAS_EXCHANGE = 0x9fe43636e0675246c99e96d7abf9f858f518b9442c35166d87f0934abef8a969; // allows to set token exchange rates keccak("TokenRateOracle") bytes32 internal constant ROLE_TOKEN_RATE_ORACLE = 0xa80c3a0c8a5324136e4c806a778583a2a980f378bdd382921b8d28dcfe965585; } contract IEthereumForkArbiter { //////////////////////// // Events //////////////////////// event LogForkAnnounced( string name, string url, uint256 blockNumber ); event LogForkSigned( uint256 blockNumber, bytes32 blockHash ); //////////////////////// // Public functions //////////////////////// function nextForkName() public constant returns (string); function nextForkUrl() public constant returns (string); function nextForkBlockNumber() public constant returns (uint256); function lastSignedBlockNumber() public constant returns (uint256); function lastSignedBlockHash() public constant returns (bytes32); function lastSignedTimestamp() public constant returns (uint256); } /** * @title legally binding smart contract * @dev General approach to paring legal and smart contracts: * 1. All terms and agreement are between two parties: here between smart conctract legal representation and platform investor. * 2. Parties are represented by public Ethereum addresses. Platform investor is and address that holds and controls funds and receives and controls Neumark token * 3. Legal agreement has immutable part that corresponds to smart contract code and mutable part that may change for example due to changing regulations or other externalities that smart contract does not control. * 4. There should be a provision in legal document that future changes in mutable part cannot change terms of immutable part. * 5. Immutable part links to corresponding smart contract via its address. * 6. Additional provision should be added if smart contract supports it * a. Fork provision * b. Bugfixing provision (unilateral code update mechanism) * c. Migration provision (bilateral code update mechanism) * * Details on Agreement base class: * 1. We bind smart contract to legal contract by storing uri (preferably ipfs or hash) of the legal contract in the smart contract. It is however crucial that such binding is done by smart contract legal representation so transaction establishing the link must be signed by respective wallet ('amendAgreement') * 2. Mutable part of agreement may change. We should be able to amend the uri later. Previous amendments should not be lost and should be retrievable (`amendAgreement` and 'pastAgreement' functions). * 3. It is up to deriving contract to decide where to put 'acceptAgreement' modifier. However situation where there is no cryptographic proof that given address was really acting in the transaction should be avoided, simplest example being 'to' address in `transfer` function of ERC20. * **/ contract IAgreement { //////////////////////// // Events //////////////////////// event LogAgreementAccepted( address indexed accepter ); event LogAgreementAmended( address contractLegalRepresentative, string agreementUri ); /// @dev should have access restrictions so only contractLegalRepresentative may call function amendAgreement(string agreementUri) public; /// returns information on last amendment of the agreement /// @dev MUST revert if no agreements were set function currentAgreement() public constant returns ( address contractLegalRepresentative, uint256 signedBlockTimestamp, string agreementUri, uint256 index ); /// returns information on amendment with index /// @dev MAY revert on non existing amendment, indexing starts from 0 function pastAgreement(uint256 amendmentIndex) public constant returns ( address contractLegalRepresentative, uint256 signedBlockTimestamp, string agreementUri, uint256 index ); /// returns the number of block at wchich `signatory` signed agreement /// @dev MUST return 0 if not signed function agreementSignedAtBlock(address signatory) public constant returns (uint256 blockNo); /// returns number of amendments made by contractLegalRepresentative function amendmentsCount() public constant returns (uint256); } /** * @title legally binding smart contract * @dev read IAgreement for details **/ contract Agreement is IAgreement, AccessControlled, AccessRoles { //////////////////////// // Type declarations //////////////////////// /// @notice agreement with signature of the platform operator representative struct SignedAgreement { address contractLegalRepresentative; uint256 signedBlockTimestamp; string agreementUri; } //////////////////////// // Immutable state //////////////////////// IEthereumForkArbiter private ETHEREUM_FORK_ARBITER; //////////////////////// // Mutable state //////////////////////// // stores all amendments to the agreement, first amendment is the original SignedAgreement[] private _amendments; // stores block numbers of all addresses that signed the agreement (signatory => block number) mapping(address => uint256) private _signatories; //////////////////////// // Modifiers //////////////////////// /// @notice logs that agreement was accepted by platform user /// @dev intended to be added to functions that if used make 'accepter' origin to enter legally binding agreement modifier acceptAgreement(address accepter) { acceptAgreementInternal(accepter); _; } modifier onlyLegalRepresentative(address legalRepresentative) { require(mCanAmend(legalRepresentative)); _; } //////////////////////// // Constructor //////////////////////// constructor(IAccessPolicy accessPolicy, IEthereumForkArbiter forkArbiter) AccessControlled(accessPolicy) internal { require(forkArbiter != IEthereumForkArbiter(0x0)); ETHEREUM_FORK_ARBITER = forkArbiter; } //////////////////////// // Public functions //////////////////////// function amendAgreement(string agreementUri) public onlyLegalRepresentative(msg.sender) { SignedAgreement memory amendment = SignedAgreement({ contractLegalRepresentative: msg.sender, signedBlockTimestamp: block.timestamp, agreementUri: agreementUri }); _amendments.push(amendment); emit LogAgreementAmended(msg.sender, agreementUri); } function ethereumForkArbiter() public constant returns (IEthereumForkArbiter) { return ETHEREUM_FORK_ARBITER; } function currentAgreement() public constant returns ( address contractLegalRepresentative, uint256 signedBlockTimestamp, string agreementUri, uint256 index ) { require(_amendments.length > 0); uint256 last = _amendments.length - 1; SignedAgreement storage amendment = _amendments[last]; return ( amendment.contractLegalRepresentative, amendment.signedBlockTimestamp, amendment.agreementUri, last ); } function pastAgreement(uint256 amendmentIndex) public constant returns ( address contractLegalRepresentative, uint256 signedBlockTimestamp, string agreementUri, uint256 index ) { SignedAgreement storage amendment = _amendments[amendmentIndex]; return ( amendment.contractLegalRepresentative, amendment.signedBlockTimestamp, amendment.agreementUri, amendmentIndex ); } function agreementSignedAtBlock(address signatory) public constant returns (uint256 blockNo) { return _signatories[signatory]; } function amendmentsCount() public constant returns (uint256) { return _amendments.length; } //////////////////////// // Internal functions //////////////////////// /// provides direct access to derived contract function acceptAgreementInternal(address accepter) internal { if(_signatories[accepter] == 0) { require(_amendments.length > 0); _signatories[accepter] = block.number; emit LogAgreementAccepted(accepter); } } // // MAgreement Internal interface (todo: extract) // /// default amend permission goes to ROLE_PLATFORM_OPERATOR_REPRESENTATIVE function mCanAmend(address legalRepresentative) internal returns (bool) { return accessPolicy().allowed(legalRepresentative, ROLE_PLATFORM_OPERATOR_REPRESENTATIVE, this, msg.sig); } } contract IsContract { //////////////////////// // Internal functions //////////////////////// function isContract(address addr) internal constant returns (bool) { uint256 size; // takes 700 gas assembly { size := extcodesize(addr) } return size > 0; } } contract ITokenMetadata { //////////////////////// // Public functions //////////////////////// function symbol() public constant returns (string); function name() public constant returns (string); function decimals() public constant returns (uint8); } /// @title adds token metadata to token contract /// @dev see Neumark for example implementation contract TokenMetadata is ITokenMetadata { //////////////////////// // Immutable state //////////////////////// // The Token's name: e.g. DigixDAO Tokens string private NAME; // An identifier: e.g. REP string private SYMBOL; // Number of decimals of the smallest unit uint8 private DECIMALS; // An arbitrary versioning scheme string private VERSION; //////////////////////// // Constructor //////////////////////// /// @notice Constructor to set metadata /// @param tokenName Name of the new token /// @param decimalUnits Number of decimals of the new token /// @param tokenSymbol Token Symbol for the new token /// @param version Token version ie. when cloning is used constructor( string tokenName, uint8 decimalUnits, string tokenSymbol, string version ) public { NAME = tokenName; // Set the name SYMBOL = tokenSymbol; // Set the symbol DECIMALS = decimalUnits; // Set the decimals VERSION = version; } //////////////////////// // Public functions //////////////////////// function name() public constant returns (string) { return NAME; } function symbol() public constant returns (string) { return SYMBOL; } function decimals() public constant returns (uint8) { return DECIMALS; } function version() public constant returns (string) { return VERSION; } } contract IBasicToken { //////////////////////// // Events //////////////////////// event Transfer( address indexed from, address indexed to, uint256 amount ); //////////////////////// // Public functions //////////////////////// /// @dev This function makes it easy to get the total number of tokens /// @return The total number of tokens function totalSupply() public constant returns (uint256); /// @param owner The address that's balance is being requested /// @return The balance of `owner` at the current block function balanceOf(address owner) public constant returns (uint256 balance); /// @notice Send `amount` tokens to `to` from `msg.sender` /// @param to The address of the recipient /// @param amount The amount of tokens to be transferred /// @return Whether the transfer was successful or not function transfer(address to, uint256 amount) public returns (bool success); } contract IERC20Allowance { //////////////////////// // Events //////////////////////// event Approval( address indexed owner, address indexed spender, uint256 amount ); //////////////////////// // Public functions //////////////////////// /// @dev This function makes it easy to read the `allowed[]` map /// @param owner The address of the account that owns the token /// @param spender The address of the account able to transfer the tokens /// @return Amount of remaining tokens of owner that spender is allowed /// to spend function allowance(address owner, address spender) public constant returns (uint256 remaining); /// @notice `msg.sender` approves `spender` to spend `amount` tokens on /// its behalf. This is a modified version of the ERC20 approve function /// to be a little bit safer /// @param spender The address of the account able to transfer the tokens /// @param amount The amount of tokens to be approved for transfer /// @return True if the approval was successful function approve(address spender, uint256 amount) public returns (bool success); /// @notice Send `amount` tokens to `to` from `from` on the condition it /// is approved by `from` /// @param from The address holding the tokens being transferred /// @param to The address of the recipient /// @param amount The amount of tokens to be transferred /// @return True if the transfer was successful function transferFrom(address from, address to, uint256 amount) public returns (bool success); } contract IERC20Token is IBasicToken, IERC20Allowance { } contract IERC677Callback { //////////////////////// // Public functions //////////////////////// // NOTE: This call can be initiated by anyone. You need to make sure that // it is send by the token (`require(msg.sender == token)`) or make sure // amount is valid (`require(token.allowance(this) >= amount)`). function receiveApproval( address from, uint256 amount, address token, // IERC667Token bytes data ) public returns (bool success); } contract IERC677Allowance is IERC20Allowance { //////////////////////// // Public functions //////////////////////// /// @notice `msg.sender` approves `spender` to send `amount` tokens on /// its behalf, and then a function is triggered in the contract that is /// being approved, `spender`. This allows users to use their tokens to /// interact with contracts in one function call instead of two /// @param spender The address of the contract able to transfer the tokens /// @param amount The amount of tokens to be approved for transfer /// @return True if the function call was successful function approveAndCall(address spender, uint256 amount, bytes extraData) public returns (bool success); } contract IERC677Token is IERC20Token, IERC677Allowance { } contract Math { //////////////////////// // Internal functions //////////////////////// // absolute difference: |v1 - v2| function absDiff(uint256 v1, uint256 v2) internal pure returns(uint256) { return v1 > v2 ? v1 - v2 : v2 - v1; } // divide v by d, round up if remainder is 0.5 or more function divRound(uint256 v, uint256 d) internal pure returns(uint256) { return add(v, d/2) / d; } // computes decimal decimalFraction 'frac' of 'amount' with maximum precision (multiplication first) // both amount and decimalFraction must have 18 decimals precision, frac 10**18 represents a whole (100% of) amount // mind loss of precision as decimal fractions do not have finite binary expansion // do not use instead of division function decimalFraction(uint256 amount, uint256 frac) internal pure returns(uint256) { // it's like 1 ether is 100% proportion return proportion(amount, frac, 10**18); } // computes part/total of amount with maximum precision (multiplication first) // part and total must have the same units function proportion(uint256 amount, uint256 part, uint256 total) internal pure returns(uint256) { return divRound(mul(amount, part), total); } // // Open Zeppelin Math library below // function mul(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a * b; assert(a == 0 || c / a == b); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } } /// @title internal token transfer function /// @dev see BasicSnapshotToken for implementation contract MTokenTransfer { //////////////////////// // Internal functions //////////////////////// /// @dev This is the actual transfer function in the token contract, it can /// only be called by other functions in this contract. /// @param from The address holding the tokens being transferred /// @param to The address of the recipient /// @param amount The amount of tokens to be transferred /// @dev reverts if transfer was not successful function mTransfer( address from, address to, uint256 amount ) internal; } /// @title controls token transfers /// @dev BasicSnapshotToken observes this interface, Neumark contract implements it contract MTokenTransferController { //////////////////////// // Internal functions //////////////////////// /// @notice Notifies the controller about a token transfer allowing the /// controller to react if desired /// @param from The origin of the transfer /// @param to The destination of the transfer /// @param amount The amount of the transfer /// @return False if the controller does not authorize the transfer function mOnTransfer( address from, address to, uint256 amount ) internal returns (bool allow); } /** * @title Basic token * @dev Basic version of StandardToken, with no allowances. */ contract BasicToken is MTokenTransfer, MTokenTransferController, IBasicToken, Math { //////////////////////// // Mutable state //////////////////////// mapping(address => uint256) internal _balances; uint256 internal _totalSupply; //////////////////////// // Public functions //////////////////////// /** * @dev transfer token for a specified address * @param to The address to transfer to. * @param amount The amount to be transferred. */ function transfer(address to, uint256 amount) public returns (bool) { mTransfer(msg.sender, to, amount); return true; } /// @dev This function makes it easy to get the total number of tokens /// @return The total number of tokens function totalSupply() public constant returns (uint256) { return _totalSupply; } /** * @dev Gets the balance of the specified address. * @param owner The address to query the the balance of. * @return An uint256 representing the amount owned by the passed address. */ function balanceOf(address owner) public constant returns (uint256 balance) { return _balances[owner]; } //////////////////////// // Internal functions //////////////////////// // // Implements MTokenTransfer // function mTransfer(address from, address to, uint256 amount) internal { require(to != address(0)); require(mOnTransfer(from, to, amount)); _balances[from] = sub(_balances[from], amount); _balances[to] = add(_balances[to], amount); emit Transfer(from, to, amount); } } /// @title controls spending approvals /// @dev TokenAllowance observes this interface, Neumark contract implements it contract MTokenAllowanceController { //////////////////////// // Internal functions //////////////////////// /// @notice Notifies the controller about an approval allowing the /// controller to react if desired /// @param owner The address that calls `approve()` /// @param spender The spender in the `approve()` call /// @param amount The amount in the `approve()` call /// @return False if the controller does not authorize the approval function mOnApprove( address owner, address spender, uint256 amount ) internal returns (bool allow); /// @notice Allows to override allowance approved by the owner /// Primary role is to enable forced transfers, do not override if you do not like it /// Following behavior is expected in the observer /// approve() - should revert if mAllowanceOverride() > 0 /// allowance() - should return mAllowanceOverride() if set /// transferFrom() - should override allowance if mAllowanceOverride() > 0 /// @param owner An address giving allowance to spender /// @param spender An address getting a right to transfer allowance amount from the owner /// @return current allowance amount function mAllowanceOverride( address owner, address spender ) internal constant returns (uint256 allowance); } /// @title token spending approval and transfer /// @dev implements token approval and transfers and exposes relevant part of ERC20 and ERC677 approveAndCall /// may be mixed in with any basic token (implementing mTransfer) like BasicSnapshotToken or MintableSnapshotToken to add approval mechanism /// observes MTokenAllowanceController interface /// observes MTokenTransfer contract TokenAllowance is MTokenTransfer, MTokenAllowanceController, IERC20Allowance, IERC677Token { //////////////////////// // Mutable state //////////////////////// // `allowed` tracks rights to spends others tokens as per ERC20 // owner => spender => amount mapping (address => mapping (address => uint256)) private _allowed; //////////////////////// // Constructor //////////////////////// constructor() internal { } //////////////////////// // Public functions //////////////////////// // // Implements IERC20Token // /// @dev This function makes it easy to read the `allowed[]` map /// @param owner The address of the account that owns the token /// @param spender The address of the account able to transfer the tokens /// @return Amount of remaining tokens of _owner that _spender is allowed /// to spend function allowance(address owner, address spender) public constant returns (uint256 remaining) { uint256 override = mAllowanceOverride(owner, spender); if (override > 0) { return override; } return _allowed[owner][spender]; } /// @notice `msg.sender` approves `_spender` to spend `_amount` tokens on /// its behalf. This is a modified version of the ERC20 approve function /// where allowance per spender must be 0 to allow change of such allowance /// @param spender The address of the account able to transfer the tokens /// @param amount The amount of tokens to be approved for transfer /// @return True or reverts, False is never returned function approve(address spender, uint256 amount) public returns (bool success) { // Alerts the token controller of the approve function call require(mOnApprove(msg.sender, spender, amount)); // To change the approve amount you first have to reduce the addresses` // allowance to zero by calling `approve(_spender,0)` if it is not // already 0 to mitigate the race condition described here: // https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 require((amount == 0 || _allowed[msg.sender][spender] == 0) && mAllowanceOverride(msg.sender, spender) == 0); _allowed[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } /// @notice Send `_amount` tokens to `_to` from `_from` on the condition it /// is approved by `_from` /// @param from The address holding the tokens being transferred /// @param to The address of the recipient /// @param amount The amount of tokens to be transferred /// @return True if the transfer was successful, reverts in any other case function transferFrom(address from, address to, uint256 amount) public returns (bool success) { uint256 allowed = mAllowanceOverride(from, msg.sender); if (allowed == 0) { // The standard ERC 20 transferFrom functionality allowed = _allowed[from][msg.sender]; // yes this will underflow but then we'll revert. will cost gas however so don't underflow _allowed[from][msg.sender] -= amount; } require(allowed >= amount); mTransfer(from, to, amount); return true; } // // Implements IERC677Token // /// @notice `msg.sender` approves `_spender` to send `_amount` tokens on /// its behalf, and then a function is triggered in the contract that is /// being approved, `_spender`. This allows users to use their tokens to /// interact with contracts in one function call instead of two /// @param spender The address of the contract able to transfer the tokens /// @param amount The amount of tokens to be approved for transfer /// @return True or reverts, False is never returned function approveAndCall( address spender, uint256 amount, bytes extraData ) public returns (bool success) { require(approve(spender, amount)); success = IERC677Callback(spender).receiveApproval( msg.sender, amount, this, extraData ); require(success); return true; } //////////////////////// // Internal functions //////////////////////// // // Implements default MTokenAllowanceController // // no override in default implementation function mAllowanceOverride( address /*owner*/, address /*spender*/ ) internal constant returns (uint256) { return 0; } } /** * @title Standard ERC20 token * * @dev Implementation of the standard token. * @dev https://github.com/ethereum/EIPs/issues/20 */ contract StandardToken is IERC20Token, BasicToken, TokenAllowance { } /// @title uniquely identifies deployable (non-abstract) platform contract /// @notice cheap way of assigning implementations to knownInterfaces which represent system services /// unfortunatelly ERC165 does not include full public interface (ABI) and does not provide way to list implemented interfaces /// EIP820 still in the making /// @dev ids are generated as follows keccak256("neufund-platform:<contract name>") /// ids roughly correspond to ABIs contract IContractId { /// @param id defined as above /// @param version implementation version function contractId() public pure returns (bytes32 id, uint256 version); } /// @title current ERC223 fallback function /// @dev to be used in all future token contract /// @dev NEU and ICBMEtherToken (obsolete) are the only contracts that still uses IERC223LegacyCallback contract IERC223Callback { //////////////////////// // Public functions //////////////////////// function tokenFallback(address from, uint256 amount, bytes data) public; } contract IERC223Token is IERC20Token, ITokenMetadata { /// @dev Departure: We do not log data, it has no advantage over a standard /// log event. By sticking to the standard log event we /// stay compatible with constracts that expect and ERC20 token. // event Transfer( // address indexed from, // address indexed to, // uint256 amount, // bytes data); /// @dev Departure: We do not use the callback on regular transfer calls to /// stay compatible with constracts that expect and ERC20 token. // function transfer(address to, uint256 amount) // public // returns (bool); //////////////////////// // Public functions //////////////////////// function transfer(address to, uint256 amount, bytes data) public returns (bool); } /// @title granular token controller based on MSnapshotToken observer pattern contract ITokenController { //////////////////////// // Public functions //////////////////////// /// @notice see MTokenTransferController /// @dev additionally passes broker that is executing transaction between from and to /// for unbrokered transfer, broker == from function onTransfer(address broker, address from, address to, uint256 amount) public constant returns (bool allow); /// @notice see MTokenAllowanceController function onApprove(address owner, address spender, uint256 amount) public constant returns (bool allow); /// @notice see MTokenMint function onGenerateTokens(address sender, address owner, uint256 amount) public constant returns (bool allow); /// @notice see MTokenMint function onDestroyTokens(address sender, address owner, uint256 amount) public constant returns (bool allow); /// @notice controls if sender can change controller to newController /// @dev for this to succeed TYPICALLY current controller must be already migrated to a new one function onChangeTokenController(address sender, address newController) public constant returns (bool); /// @notice overrides spender allowance /// @dev may be used to implemented forced transfers in which token controller may override approved allowance /// with any > 0 value and then use transferFrom to execute such transfer /// This by definition creates non-trustless token so do not implement this call if you do not need trustless transfers! /// Implementer should not allow approve() to be executed if there is an overrride // Implemented should return allowance() taking into account override function onAllowance(address owner, address spender) public constant returns (uint256 allowanceOverride); } /// @title hooks token controller to token contract and allows to replace it contract ITokenControllerHook { //////////////////////// // Events //////////////////////// event LogChangeTokenController( address oldController, address newController, address by ); //////////////////////// // Public functions //////////////////////// /// @notice replace current token controller /// @dev please note that this process is also controlled by existing controller function changeTokenController(address newController) public; /// @notice returns current controller function tokenController() public constant returns (address currentController); } contract IWithdrawableToken { //////////////////////// // Public functions //////////////////////// /// @notice withdraws from a token holding assets /// @dev amount of asset should be returned to msg.sender and corresponding balance burned function withdraw(uint256 amount) public; } contract EuroToken is Agreement, IERC677Token, StandardToken, IWithdrawableToken, ITokenControllerHook, TokenMetadata, IERC223Token, IsContract, IContractId { //////////////////////// // Constants //////////////////////// string private constant NAME = "Euro Token"; string private constant SYMBOL = "EUR-T"; uint8 private constant DECIMALS = 18; //////////////////////// // Mutable state //////////////////////// ITokenController private _tokenController; //////////////////////// // Events //////////////////////// /// on each deposit (increase of supply) of EUR-T /// 'by' indicates account that executed the deposit function for 'to' (typically bank connector) event LogDeposit( address indexed to, address by, uint256 amount, bytes32 reference ); // proof of requested deposit initiated by token holder event LogWithdrawal( address indexed from, uint256 amount ); // proof of settled deposit event LogWithdrawSettled( address from, address by, // who settled uint256 amount, // settled amount, after fees, negative interest rates etc. uint256 originalAmount, // original amount withdrawn bytes32 withdrawTxHash, // hash of withdraw transaction bytes32 reference // reference number of withdraw operation at deposit manager ); /// on destroying the tokens without withdraw (see `destroyTokens` function below) event LogDestroy( address indexed from, address by, uint256 amount ); //////////////////////// // Modifiers //////////////////////// modifier onlyIfDepositAllowed(address to, uint256 amount) { require(_tokenController.onGenerateTokens(msg.sender, to, amount)); _; } modifier onlyIfWithdrawAllowed(address from, uint256 amount) { require(_tokenController.onDestroyTokens(msg.sender, from, amount)); _; } //////////////////////// // Constructor //////////////////////// constructor( IAccessPolicy accessPolicy, IEthereumForkArbiter forkArbiter, ITokenController tokenController ) Agreement(accessPolicy, forkArbiter) StandardToken() TokenMetadata(NAME, DECIMALS, SYMBOL, "") public { require(tokenController != ITokenController(0x0)); _tokenController = tokenController; } //////////////////////// // Public functions //////////////////////// /// @notice deposit 'amount' of EUR-T to address 'to', attaching correlating `reference` to LogDeposit event /// @dev deposit may happen only in case 'to' can receive transfer in token controller /// by default KYC is required to receive deposits function deposit(address to, uint256 amount, bytes32 reference) public only(ROLE_EURT_DEPOSIT_MANAGER) onlyIfDepositAllowed(to, amount) acceptAgreement(to) { require(to != address(0)); _balances[to] = add(_balances[to], amount); _totalSupply = add(_totalSupply, amount); emit LogDeposit(to, msg.sender, amount, reference); emit Transfer(address(0), to, amount); } /// @notice runs many deposits within one transaction /// @dev deposit may happen only in case 'to' can receive transfer in token controller /// by default KYC is required to receive deposits function depositMany(address[] to, uint256[] amount, bytes32[] reference) public { require(to.length == amount.length); require(to.length == reference.length); for (uint256 i = 0; i < to.length; i++) { deposit(to[i], amount[i], reference[i]); } } /// @notice withdraws 'amount' of EUR-T by burning required amount and providing a proof of whithdrawal /// @dev proof is provided in form of log entry. based on that proof deposit manager will make a bank transfer /// by default controller will check the following: KYC and existence of working bank account function withdraw(uint256 amount) public onlyIfWithdrawAllowed(msg.sender, amount) acceptAgreement(msg.sender) { destroyTokensPrivate(msg.sender, amount); emit LogWithdrawal(msg.sender, amount); } /// @notice issued by deposit manager when withdraw request was settled. typicaly amount that could be settled will be lower /// than amount withdrawn: banks charge negative interest rates and various fees that must be deduced /// reference number is attached that may be used to identify withdraw operation at deposit manager function settleWithdraw(address from, uint256 amount, uint256 originalAmount, bytes32 withdrawTxHash, bytes32 reference) public only(ROLE_EURT_DEPOSIT_MANAGER) { emit LogWithdrawSettled(from, msg.sender, amount, originalAmount, withdrawTxHash, reference); } /// @notice this method allows to destroy EUR-T belonging to any account /// note that EURO is fiat currency and is not trustless, EUR-T is also /// just internal currency of Neufund platform, not general purpose stable coin /// we need to be able to destroy EUR-T if ordered by authorities function destroy(address owner, uint256 amount) public only(ROLE_EURT_LEGAL_MANAGER) { destroyTokensPrivate(owner, amount); emit LogDestroy(owner, msg.sender, amount); } // // Implements ITokenControllerHook // function changeTokenController(address newController) public { require(_tokenController.onChangeTokenController(msg.sender, newController)); _tokenController = ITokenController(newController); emit LogChangeTokenController(_tokenController, newController, msg.sender); } function tokenController() public constant returns (address) { return _tokenController; } // // Implements IERC223Token // function transfer(address to, uint256 amount, bytes data) public returns (bool success) { return ierc223TransferInternal(msg.sender, to, amount, data); } /// @notice convenience function to deposit and immediately transfer amount /// @param depositTo which account to deposit to and then transfer from /// @param transferTo where to transfer after deposit /// @param depositAmount amount to deposit /// @param transferAmount total amount to transfer, must be <= balance after deposit /// @dev intended to deposit from bank account and invest in ETO function depositAndTransfer( address depositTo, address transferTo, uint256 depositAmount, uint256 transferAmount, bytes data, bytes32 reference ) public returns (bool success) { deposit(depositTo, depositAmount, reference); return ierc223TransferInternal(depositTo, transferTo, transferAmount, data); } // // Implements IContractId // function contractId() public pure returns (bytes32 id, uint256 version) { return (0xfb5c7e43558c4f3f5a2d87885881c9b10ff4be37e3308579c178bf4eaa2c29cd, 0); } //////////////////////// // Internal functions //////////////////////// // // Implements MTokenController // function mOnTransfer( address from, address to, uint256 amount ) internal acceptAgreement(from) returns (bool allow) { address broker = msg.sender; if (broker != from) { // if called by the depositor (deposit and send), ignore the broker flag bool isDepositor = accessPolicy().allowed(msg.sender, ROLE_EURT_DEPOSIT_MANAGER, this, msg.sig); // this is not very clean but alternative (give brokerage rights to all depositors) is maintenance hell if (isDepositor) { broker = from; } } return _tokenController.onTransfer(broker, from, to, amount); } function mOnApprove( address owner, address spender, uint256 amount ) internal acceptAgreement(owner) returns (bool allow) { return _tokenController.onApprove(owner, spender, amount); } function mAllowanceOverride( address owner, address spender ) internal constant returns (uint256) { return _tokenController.onAllowance(owner, spender); } // // Observes MAgreement internal interface // /// @notice euro token is legally represented by separate entity ROLE_EURT_LEGAL_MANAGER function mCanAmend(address legalRepresentative) internal returns (bool) { return accessPolicy().allowed(legalRepresentative, ROLE_EURT_LEGAL_MANAGER, this, msg.sig); } //////////////////////// // Private functions //////////////////////// function destroyTokensPrivate(address owner, uint256 amount) private { require(_balances[owner] >= amount); _balances[owner] = sub(_balances[owner], amount); _totalSupply = sub(_totalSupply, amount); emit Transfer(owner, address(0), amount); } /// @notice internal transfer function that checks permissions and calls the tokenFallback function ierc223TransferInternal(address from, address to, uint256 amount, bytes data) private returns (bool success) { BasicToken.mTransfer(from, to, amount); // Notify the receiving contract. if (isContract(to)) { // in case of re-entry (1) transfer is done (2) msg.sender is different IERC223Callback(to).tokenFallback(from, amount, data); } return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"amount","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"amount","type":"uint256"},{"name":"reference","type":"bytes32"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address[]"},{"name":"amount","type":"uint256[]"},{"name":"reference","type":"bytes32[]"}],"name":"depositMany","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"amount","type":"uint256"},{"name":"originalAmount","type":"uint256"},{"name":"withdrawTxHash","type":"bytes32"},{"name":"reference","type":"bytes32"}],"name":"settleWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newPolicy","type":"address"},{"name":"newAccessController","type":"address"}],"name":"setAccessPolicy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"signatory","type":"address"}],"name":"agreementSignedAtBlock","outputs":[{"name":"blockNo","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"amendmentsCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"contractId","outputs":[{"name":"id","type":"bytes32"},{"name":"version","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"amendmentIndex","type":"uint256"}],"name":"pastAgreement","outputs":[{"name":"contractLegalRepresentative","type":"address"},{"name":"signedBlockTimestamp","type":"uint256"},{"name":"agreementUri","type":"string"},{"name":"index","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"},{"name":"amount","type":"uint256"}],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"amount","type":"uint256"},{"name":"data","type":"bytes"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"currentAgreement","outputs":[{"name":"contractLegalRepresentative","type":"address"},{"name":"signedBlockTimestamp","type":"uint256"},{"name":"agreementUri","type":"string"},{"name":"index","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"amount","type":"uint256"},{"name":"extraData","type":"bytes"}],"name":"approveAndCall","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newController","type":"address"}],"name":"changeTokenController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"depositTo","type":"address"},{"name":"transferTo","type":"address"},{"name":"depositAmount","type":"uint256"},{"name":"transferAmount","type":"uint256"},{"name":"data","type":"bytes"},{"name":"reference","type":"bytes32"}],"name":"depositAndTransfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ethereumForkArbiter","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"agreementUri","type":"string"}],"name":"amendAgreement","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokenController","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"accessPolicy","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"accessPolicy","type":"address"},{"name":"forkArbiter","type":"address"},{"name":"tokenController","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"by","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"reference","type":"bytes32"}],"name":"LogDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"LogWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"by","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"originalAmount","type":"uint256"},{"indexed":false,"name":"withdrawTxHash","type":"bytes32"},{"indexed":false,"name":"reference","type":"bytes32"}],"name":"LogWithdrawSettled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"by","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"LogDestroy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldController","type":"address"},{"indexed":false,"name":"newController","type":"address"},{"indexed":false,"name":"by","type":"address"}],"name":"LogChangeTokenController","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"controller","type":"address"},{"indexed":false,"name":"oldPolicy","type":"address"},{"indexed":false,"name":"newPolicy","type":"address"}],"name":"LogAccessPolicyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"accepter","type":"address"}],"name":"LogAgreementAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"contractLegalRepresentative","type":"address"},{"indexed":false,"name":"agreementUri","type":"string"}],"name":"LogAgreementAmended","type":"event"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051606080620024a48339810160408181528251602080850151948301518385018452600a85527f4575726f20546f6b656e000000000000000000000000000000000000000000008286015283518085018552600581527f4555522d54000000000000000000000000000000000000000000000000000000818401528451928301909452600082529194939192601291868681600160a060020a0381161515620000bc57600080fd5b60008054600160a060020a031916600160a060020a0392831617905581161515620000e657600080fd5b60018054600160a060020a031916600160a060020a03929092169190911790555083516200011c9060079060208701906200019b565b508151620001329060089060208501906200019b565b506009805460ff191660ff851617905580516200015790600a9060208401906200019b565b5050505050600160a060020a03811615156200017257600080fd5b600b8054600160a060020a031916600160a060020a039290921691909117905550620002409050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620001de57805160ff19168380011785556200020e565b828001600101855582156200020e579182015b828111156200020e578251825591602001919060010190620001f1565b506200021c92915062000220565b5090565b6200023d91905b808211156200021c576000815560010162000227565b90565b61225480620002506000396000f3006080604052600436106101745763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde038114610179578063095ea7b31461020357806318160ddd1461023b57806323b872dd1461026257806326b3293f1461028c578063290f719a146102b55780632e1a7d4d1461037c578063313ce567146103945780633176aebb146103bf57806354fd4d50146103ec57806357875631146104015780636fa00f071461042857806370a08231146104495780637b1543131461046a5780638291286c1461047f5780638fb29d6c146104ad57806395d89b4114610564578063a24835d114610579578063a9059cbb1461059d578063be45fd62146105c1578063c90f793e1461062a578063cae9ca511461063f578063d6c8976b146106a8578063dd62ed3e146106c9578063e4807e31146106f0578063ea490b8414610769578063eb4e64d61461079a578063eddd9d82146107f3578063f5d60a5114610808575b600080fd5b34801561018557600080fd5b5061018e61081d565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101c85781810151838201526020016101b0565b50505050905090810190601f1680156101f55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561020f57600080fd5b50610227600160a060020a03600435166024356108b4565b604080519115158252519081900360200190f35b34801561024757600080fd5b5061025061097f565b60408051918252519081900360200190f35b34801561026e57600080fd5b50610227600160a060020a0360043581169060243516604435610985565b34801561029857600080fd5b506102b3600160a060020a03600435166024356044356109eb565b005b3480156102c157600080fd5b50604080516020600480358082013583810280860185019096528085526102b395369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750949750610c629650505050505050565b34801561038857600080fd5b506102b3600435610cec565b3480156103a057600080fd5b506103a9610dec565b6040805160ff9092168252519081900360200190f35b3480156103cb57600080fd5b506102b3600160a060020a0360043516602435604435606435608435610df5565b3480156103f857600080fd5b5061018e610f23565b34801561040d57600080fd5b506102b3600160a060020a0360043581169060243516610f84565b34801561043457600080fd5b50610250600160a060020a036004351661118b565b34801561045557600080fd5b50610250600160a060020a03600435166111a6565b34801561047657600080fd5b506102506111c1565b34801561048b57600080fd5b506104946111c7565b6040805192835260208301919091528051918290030190f35b3480156104b957600080fd5b506104c56004356111ee565b6040518085600160a060020a0316600160a060020a0316815260200184815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561052657818101518382015260200161050e565b50505050905090810190601f1680156105535780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b34801561057057600080fd5b5061018e6112e3565b34801561058557600080fd5b506102b3600160a060020a0360043516602435611344565b3480156105a957600080fd5b50610227600160a060020a036004351660243561145f565b3480156105cd57600080fd5b50604080516020600460443581810135601f8101849004840285018401909552848452610227948235600160a060020a03169460248035953695946064949201919081908401838280828437509497506114759650505050505050565b34801561063657600080fd5b506104c561148b565b34801561064b57600080fd5b50604080516020600460443581810135601f8101849004840285018401909552848452610227948235600160a060020a031694602480359536959460649492019190819084018382808284375094975061159b9650505050505050565b3480156106b457600080fd5b506102b3600160a060020a03600435166116d8565b3480156106d557600080fd5b50610250600160a060020a03600435811690602435166117f0565b3480156106fc57600080fd5b50604080516020601f60843560048181013592830184900484028501840190955281845261022794600160a060020a0381358116956024803590921695604435956064359536959460a4949391019190819084018382808284375094975050933594506118409350505050565b34801561077557600080fd5b5061077e611864565b60408051600160a060020a039092168252519081900360200190f35b3480156107a657600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526102b39436949293602493928401919081908401838280828437509497506118739650505050505050565b3480156107ff57600080fd5b5061077e611a2f565b34801561081457600080fd5b5061077e611a3e565b60078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108a95780601f1061087e576101008083540402835291602001916108a9565b820191906000526020600020905b81548152906001019060200180831161088c57829003601f168201915b505050505090505b90565b60006108c1338484611a4d565b15156108cc57600080fd5b8115806108fa5750336000908152600660209081526040808320600160a060020a0387168452909152902054155b801561090d575061090b3384611b05565b155b151561091857600080fd5b336000818152600660209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b60055490565b6000806109928533611b05565b90508015156109c85750600160a060020a0384166000908152600660209081526040808320338452909152902080548381039091555b828110156109d557600080fd5b6109e0858585611bab565b506001949350505050565b600080546040805160e060020a639085b77f0281523360048201527f7c8ecdcba80ce87848d16ad77ef57cc196c208fc95c5638e4a48c681a34d4fe760248201819052306044830152600160e060020a0319853516606483015291519193600160a060020a0390931692639085b77f926084808401936020939083900390910190829087803b158015610a7d57600080fd5b505af1158015610a91573d6000803e3d6000fd5b505050506040513d6020811015610aa757600080fd5b50511515610ab457600080fd5b600b54604080517f7d31c9f0000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a038088166024830152604482018790529151879387931691637d31c9f09160648083019260209291908290030181600087803b158015610b2a57600080fd5b505af1158015610b3e573d6000803e3d6000fd5b505050506040513d6020811015610b5457600080fd5b50511515610b6157600080fd5b85610b6b81611c84565b600160a060020a0387161515610b8057600080fd5b600160a060020a038716600090815260046020526040902054610ba39087611cf7565b600160a060020a038816600090815260046020526040902055600554610bc99087611cf7565b60055560408051338152602081018890528082018790529051600160a060020a038916917f52109d97ec7eabbea368c9c041a0b332e931183f1df705412cc37fbb9fe7ef52919081900360600190a2604080518781529051600160a060020a038916916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350505050505050565b8151835160009114610c7357600080fd5b8151845114610c8157600080fd5b5060005b8351811015610ce657610cde8482815181101515610c9f57fe5b906020019060200201518483815181101515610cb757fe5b906020019060200201518484815181101515610ccf57fe5b906020019060200201516109eb565b600101610c85565b50505050565b600b54604080517f0c36efa000000000000000000000000000000000000000000000000000000000815233600482018190526024820181905260448201859052915191928492600160a060020a0390911691630c36efa09160648083019260209291908290030181600087803b158015610d6557600080fd5b505af1158015610d79573d6000803e3d6000fd5b505050506040513d6020811015610d8f57600080fd5b50511515610d9c57600080fd5b33610da681611c84565b610db03385611d0d565b60408051858152905133917fb4214c8c54fc7442f36d3682f59aebaf09358a4431835b30efb29d52cf9e1e91919081900360200190a250505050565b60095460ff1690565b600080546040805160e060020a639085b77f0281523360048201527f7c8ecdcba80ce87848d16ad77ef57cc196c208fc95c5638e4a48c681a34d4fe760248201819052306044830152600160e060020a0319853516606483015291519193600160a060020a0390931692639085b77f926084808401936020939083900390910190829087803b158015610e8757600080fd5b505af1158015610e9b573d6000803e3d6000fd5b505050506040513d6020811015610eb157600080fd5b50511515610ebe57600080fd5b60408051600160a060020a0388168152336020820152808201879052606081018690526080810185905260a0810184905290517f78c5166236636a4547216bae3443d34c05d93da5ef5f5bdd28d1e45799b6e58e9181900360c00190a1505050505050565b600a8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108a95780601f1061087e576101008083540402835291602001916108a9565b600080546040805160e060020a639085b77f0281523360048201527fac42f8beb17975ed062dcb80c63e6d203ef1c2c335ced149dc5664cc671cb7da60248201819052306044830152600160e060020a0319853516606483015291519192600160a060020a031691639085b77f9160848082019260209290919082900301818887803b15801561101357600080fd5b505af1158015611027573d6000803e3d6000fd5b505050506040513d602081101561103d57600080fd5b5051151561104a57600080fd5b6040805160e060020a639085b77f028152600160a060020a0385811660048301527fac42f8beb17975ed062dcb80c63e6d203ef1c2c335ced149dc5664cc671cb7da602483015230604483015260008035600160e060020a0319166064840152925190871692639085b77f92608480820193602093909283900390910190829087803b1580156110d957600080fd5b505af11580156110ed573d6000803e3d6000fd5b505050506040513d602081101561110357600080fd5b5051151561111057600080fd5b60008054600160a060020a0386811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040805133815291909216602082018190528183019390935290519193507f7d475c32583df95fccc34a6e12df24c1fc9943092cc129b6512013aecba0f136919081900360600190a150505050565b600160a060020a031660009081526003602052604090205490565b600160a060020a031660009081526004602052604090205490565b60025490565b7ffb5c7e43558c4f3f5a2d87885881c9b10ff4be37e3308579c178bf4eaa2c29cd60009091565b600080606060008060028681548110151561120557fe5b906000526020600020906003020190508060000160009054906101000a9004600160a060020a031681600101548260020188818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112cc5780601f106112a1576101008083540402835291602001916112cc565b820191906000526020600020905b8154815290600101906020018083116112af57829003601f168201915b505050505091509450945094509450509193509193565b60088054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108a95780601f1061087e576101008083540402835291602001916108a9565b600080546040805160e060020a639085b77f0281523360048201527f4eb6b5806954a48eb5659c9e3982d5e75bfb2913f55199877d877f157bcc5a9b60248201819052306044830152600160e060020a0319853516606483015291519193600160a060020a0390931692639085b77f926084808401936020939083900390910190829087803b1580156113d657600080fd5b505af11580156113ea573d6000803e3d6000fd5b505050506040513d602081101561140057600080fd5b5051151561140d57600080fd5b6114178383611d0d565b60408051338152602081018490528151600160a060020a038616927fc69971bc8087e5b1c670d301d9b9081003050de468bef149d09b46c54f51e479928290030190a2505050565b600061146c338484611bab565b50600192915050565b600061148333858585611dc3565b949350505050565b60008060606000806000806002805490501115156114a857600080fd5b6002805460001981019350839081106114bd57fe5b906000526020600020906003020190508060000160009054906101000a9004600160a060020a031681600101548260020184818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115845780601f1061155957610100808354040283529160200191611584565b820191906000526020600020905b81548152906001019060200180831161156757829003601f168201915b505050505091509550955095509550505090919293565b60006115a784846108b4565b15156115b257600080fd5b6040517f8f4ffcb10000000000000000000000000000000000000000000000000000000081523360048201818152602483018690523060448401819052608060648501908152865160848601528651600160a060020a038a1695638f4ffcb195948a94938a939192909160a490910190602085019080838360005b8381101561164557818101518382015260200161162d565b50505050905090810190601f1680156116725780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561169457600080fd5b505af11580156116a8573d6000803e3d6000fd5b505050506040513d60208110156116be57600080fd5b505190508015156116ce57600080fd5b5060019392505050565b600b54604080517f307e6661000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a0384811660248301529151919092169163307e66619160448083019260209291908290030181600087803b15801561174657600080fd5b505af115801561175a573d6000803e3d6000fd5b505050506040513d602081101561177057600080fd5b5051151561177d57600080fd5b600b8054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff199092168217928390556040805193909116835260208301919091523382820152517fb8a1f6190887ec2747b0a5d8d1bfc22e005c91c707ce9f3574470735cea727119181900360600190a150565b6000806117fd8484611b05565b9050600081111561181057809150611839565b600160a060020a0380851660009081526006602090815260408083209387168352929052205491505b5092915050565b600061184d8786846109eb565b61185987878686611dc3565b979650505050505050565b600154600160a060020a031690565b61187b612171565b3361188581611ee7565b151561189057600080fd5b60408051606081018252338152426020808301918252928201868152600280546001810180835560009290925284517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace6003909202918201805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0390921691909117815593517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf8201559151805194975090948794611973937f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0019290910190612190565b505050507fe9835ee18f0f0b190604da3474d67a8f29aba2c92e90eee2bdaeca67d40d5a6b33846040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156119ef5781810151838201526020016119d7565b50505050905090810190601f168015611a1c5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a1505050565b600b54600160a060020a031690565b600054600160a060020a031690565b600083611a5981611c84565b600b54604080517fda682aeb000000000000000000000000000000000000000000000000000000008152600160a060020a0388811660048301528781166024830152604482018790529151919092169163da682aeb9160648083019260209291908290030181600087803b158015611ad057600080fd5b505af1158015611ae4573d6000803e3d6000fd5b505050506040513d6020811015611afa57600080fd5b505195945050505050565b600b54604080517fc00d752c000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015284811660248301529151600093929092169163c00d752c9160448082019260209290919082900301818787803b158015611b7857600080fd5b505af1158015611b8c573d6000803e3d6000fd5b505050506040513d6020811015611ba257600080fd5b50519392505050565b600160a060020a0382161515611bc057600080fd5b611bcb838383611fb1565b1515611bd657600080fd5b600160a060020a038316600090815260046020526040902054611bf99082612157565b600160a060020a038085166000908152600460205260408082209390935590841681522054611c289082611cf7565b600160a060020a0380841660008181526004602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600160a060020a0381166000908152600360205260409020541515611cf457600254600010611cb257600080fd5b600160a060020a038116600081815260036020526040808220439055517f8c41d101e4d957423a65fda82dcc88bc6b3e756166d2331f663c10166658ebb89190a25b50565b600082820183811015611d0657fe5b9392505050565b600160a060020a038216600090815260046020526040902054811115611d3257600080fd5b600160a060020a038216600090815260046020526040902054611d559082612157565b600160a060020a038316600090815260046020526040902055600554611d7b9082612157565b600555604080518281529051600091600160a060020a038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000611dd0858585611bab565b611dd984612169565b156109e05783600160a060020a031663c0ee0b8a8685856040518463ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611e76578181015183820152602001611e5e565b50505050905090810190601f168015611ea35780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611ec457600080fd5b505af1158015611ed8573d6000803e3d6000fd5b50505050506001949350505050565b6000611ef1611a3e565b6040805160e060020a639085b77f028152600160a060020a0385811660048301527f4eb6b5806954a48eb5659c9e3982d5e75bfb2913f55199877d877f157bcc5a9b602483015230604483015260008035600160e060020a03191660648401529251931692639085b77f92608480840193602093929083900390910190829087803b158015611f7f57600080fd5b505af1158015611f93573d6000803e3d6000fd5b505050506040513d6020811015611fa957600080fd5b505192915050565b600080600085611fc081611c84565b339250600160a060020a03871683146120a157611fdb611a3e565b6040805160e060020a639085b77f0281523360048201527f7c8ecdcba80ce87848d16ad77ef57cc196c208fc95c5638e4a48c681a34d4fe7602482015230604482015260008035600160e060020a03191660648301529151600160a060020a039390931692639085b77f92608480840193602093929083900390910190829087803b15801561206957600080fd5b505af115801561207d573d6000803e3d6000fd5b505050506040513d602081101561209357600080fd5b5051915081156120a1578692505b600b54604080517f0987df03000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301528a8116602483015289811660448301526064820189905291519190921691630987df039160848083019260209291908290030181600087803b15801561212057600080fd5b505af1158015612134573d6000803e3d6000fd5b505050506040513d602081101561214a57600080fd5b5051979650505050505050565b60008282111561216357fe5b50900390565b6000903b1190565b6040805160608181018352600080835260208301529181019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106121d157805160ff19168380011785556121fe565b828001600101855582156121fe579182015b828111156121fe5782518255916020019190600101906121e3565b5061220a92915061220e565b5090565b6108b191905b8082111561220a57600081556001016122145600a165627a7a72305820c063f1f20bee70e9dd36b4d661436f3694503d414c1fe52a7425a3f437a3c9880029000000000000000000000000ae38c27e646959735ec70d77ed4ecc03a3eff4900000000000000000000000004c688949578b4fd0cb8f8993a0ec608659e05cf10000000000000000000000007b40d0ce14abc2cfa75c96d1ff9bb1085f826e46
Deployed Bytecode
0x6080604052600436106101745763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde038114610179578063095ea7b31461020357806318160ddd1461023b57806323b872dd1461026257806326b3293f1461028c578063290f719a146102b55780632e1a7d4d1461037c578063313ce567146103945780633176aebb146103bf57806354fd4d50146103ec57806357875631146104015780636fa00f071461042857806370a08231146104495780637b1543131461046a5780638291286c1461047f5780638fb29d6c146104ad57806395d89b4114610564578063a24835d114610579578063a9059cbb1461059d578063be45fd62146105c1578063c90f793e1461062a578063cae9ca511461063f578063d6c8976b146106a8578063dd62ed3e146106c9578063e4807e31146106f0578063ea490b8414610769578063eb4e64d61461079a578063eddd9d82146107f3578063f5d60a5114610808575b600080fd5b34801561018557600080fd5b5061018e61081d565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101c85781810151838201526020016101b0565b50505050905090810190601f1680156101f55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561020f57600080fd5b50610227600160a060020a03600435166024356108b4565b604080519115158252519081900360200190f35b34801561024757600080fd5b5061025061097f565b60408051918252519081900360200190f35b34801561026e57600080fd5b50610227600160a060020a0360043581169060243516604435610985565b34801561029857600080fd5b506102b3600160a060020a03600435166024356044356109eb565b005b3480156102c157600080fd5b50604080516020600480358082013583810280860185019096528085526102b395369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750949750610c629650505050505050565b34801561038857600080fd5b506102b3600435610cec565b3480156103a057600080fd5b506103a9610dec565b6040805160ff9092168252519081900360200190f35b3480156103cb57600080fd5b506102b3600160a060020a0360043516602435604435606435608435610df5565b3480156103f857600080fd5b5061018e610f23565b34801561040d57600080fd5b506102b3600160a060020a0360043581169060243516610f84565b34801561043457600080fd5b50610250600160a060020a036004351661118b565b34801561045557600080fd5b50610250600160a060020a03600435166111a6565b34801561047657600080fd5b506102506111c1565b34801561048b57600080fd5b506104946111c7565b6040805192835260208301919091528051918290030190f35b3480156104b957600080fd5b506104c56004356111ee565b6040518085600160a060020a0316600160a060020a0316815260200184815260200180602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561052657818101518382015260200161050e565b50505050905090810190601f1680156105535780820380516001836020036101000a031916815260200191505b509550505050505060405180910390f35b34801561057057600080fd5b5061018e6112e3565b34801561058557600080fd5b506102b3600160a060020a0360043516602435611344565b3480156105a957600080fd5b50610227600160a060020a036004351660243561145f565b3480156105cd57600080fd5b50604080516020600460443581810135601f8101849004840285018401909552848452610227948235600160a060020a03169460248035953695946064949201919081908401838280828437509497506114759650505050505050565b34801561063657600080fd5b506104c561148b565b34801561064b57600080fd5b50604080516020600460443581810135601f8101849004840285018401909552848452610227948235600160a060020a031694602480359536959460649492019190819084018382808284375094975061159b9650505050505050565b3480156106b457600080fd5b506102b3600160a060020a03600435166116d8565b3480156106d557600080fd5b50610250600160a060020a03600435811690602435166117f0565b3480156106fc57600080fd5b50604080516020601f60843560048181013592830184900484028501840190955281845261022794600160a060020a0381358116956024803590921695604435956064359536959460a4949391019190819084018382808284375094975050933594506118409350505050565b34801561077557600080fd5b5061077e611864565b60408051600160a060020a039092168252519081900360200190f35b3480156107a657600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526102b39436949293602493928401919081908401838280828437509497506118739650505050505050565b3480156107ff57600080fd5b5061077e611a2f565b34801561081457600080fd5b5061077e611a3e565b60078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108a95780601f1061087e576101008083540402835291602001916108a9565b820191906000526020600020905b81548152906001019060200180831161088c57829003601f168201915b505050505090505b90565b60006108c1338484611a4d565b15156108cc57600080fd5b8115806108fa5750336000908152600660209081526040808320600160a060020a0387168452909152902054155b801561090d575061090b3384611b05565b155b151561091857600080fd5b336000818152600660209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b60055490565b6000806109928533611b05565b90508015156109c85750600160a060020a0384166000908152600660209081526040808320338452909152902080548381039091555b828110156109d557600080fd5b6109e0858585611bab565b506001949350505050565b600080546040805160e060020a639085b77f0281523360048201527f7c8ecdcba80ce87848d16ad77ef57cc196c208fc95c5638e4a48c681a34d4fe760248201819052306044830152600160e060020a0319853516606483015291519193600160a060020a0390931692639085b77f926084808401936020939083900390910190829087803b158015610a7d57600080fd5b505af1158015610a91573d6000803e3d6000fd5b505050506040513d6020811015610aa757600080fd5b50511515610ab457600080fd5b600b54604080517f7d31c9f0000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a038088166024830152604482018790529151879387931691637d31c9f09160648083019260209291908290030181600087803b158015610b2a57600080fd5b505af1158015610b3e573d6000803e3d6000fd5b505050506040513d6020811015610b5457600080fd5b50511515610b6157600080fd5b85610b6b81611c84565b600160a060020a0387161515610b8057600080fd5b600160a060020a038716600090815260046020526040902054610ba39087611cf7565b600160a060020a038816600090815260046020526040902055600554610bc99087611cf7565b60055560408051338152602081018890528082018790529051600160a060020a038916917f52109d97ec7eabbea368c9c041a0b332e931183f1df705412cc37fbb9fe7ef52919081900360600190a2604080518781529051600160a060020a038916916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a350505050505050565b8151835160009114610c7357600080fd5b8151845114610c8157600080fd5b5060005b8351811015610ce657610cde8482815181101515610c9f57fe5b906020019060200201518483815181101515610cb757fe5b906020019060200201518484815181101515610ccf57fe5b906020019060200201516109eb565b600101610c85565b50505050565b600b54604080517f0c36efa000000000000000000000000000000000000000000000000000000000815233600482018190526024820181905260448201859052915191928492600160a060020a0390911691630c36efa09160648083019260209291908290030181600087803b158015610d6557600080fd5b505af1158015610d79573d6000803e3d6000fd5b505050506040513d6020811015610d8f57600080fd5b50511515610d9c57600080fd5b33610da681611c84565b610db03385611d0d565b60408051858152905133917fb4214c8c54fc7442f36d3682f59aebaf09358a4431835b30efb29d52cf9e1e91919081900360200190a250505050565b60095460ff1690565b600080546040805160e060020a639085b77f0281523360048201527f7c8ecdcba80ce87848d16ad77ef57cc196c208fc95c5638e4a48c681a34d4fe760248201819052306044830152600160e060020a0319853516606483015291519193600160a060020a0390931692639085b77f926084808401936020939083900390910190829087803b158015610e8757600080fd5b505af1158015610e9b573d6000803e3d6000fd5b505050506040513d6020811015610eb157600080fd5b50511515610ebe57600080fd5b60408051600160a060020a0388168152336020820152808201879052606081018690526080810185905260a0810184905290517f78c5166236636a4547216bae3443d34c05d93da5ef5f5bdd28d1e45799b6e58e9181900360c00190a1505050505050565b600a8054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108a95780601f1061087e576101008083540402835291602001916108a9565b600080546040805160e060020a639085b77f0281523360048201527fac42f8beb17975ed062dcb80c63e6d203ef1c2c335ced149dc5664cc671cb7da60248201819052306044830152600160e060020a0319853516606483015291519192600160a060020a031691639085b77f9160848082019260209290919082900301818887803b15801561101357600080fd5b505af1158015611027573d6000803e3d6000fd5b505050506040513d602081101561103d57600080fd5b5051151561104a57600080fd5b6040805160e060020a639085b77f028152600160a060020a0385811660048301527fac42f8beb17975ed062dcb80c63e6d203ef1c2c335ced149dc5664cc671cb7da602483015230604483015260008035600160e060020a0319166064840152925190871692639085b77f92608480820193602093909283900390910190829087803b1580156110d957600080fd5b505af11580156110ed573d6000803e3d6000fd5b505050506040513d602081101561110357600080fd5b5051151561111057600080fd5b60008054600160a060020a0386811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040805133815291909216602082018190528183019390935290519193507f7d475c32583df95fccc34a6e12df24c1fc9943092cc129b6512013aecba0f136919081900360600190a150505050565b600160a060020a031660009081526003602052604090205490565b600160a060020a031660009081526004602052604090205490565b60025490565b7ffb5c7e43558c4f3f5a2d87885881c9b10ff4be37e3308579c178bf4eaa2c29cd60009091565b600080606060008060028681548110151561120557fe5b906000526020600020906003020190508060000160009054906101000a9004600160a060020a031681600101548260020188818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112cc5780601f106112a1576101008083540402835291602001916112cc565b820191906000526020600020905b8154815290600101906020018083116112af57829003601f168201915b505050505091509450945094509450509193509193565b60088054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108a95780601f1061087e576101008083540402835291602001916108a9565b600080546040805160e060020a639085b77f0281523360048201527f4eb6b5806954a48eb5659c9e3982d5e75bfb2913f55199877d877f157bcc5a9b60248201819052306044830152600160e060020a0319853516606483015291519193600160a060020a0390931692639085b77f926084808401936020939083900390910190829087803b1580156113d657600080fd5b505af11580156113ea573d6000803e3d6000fd5b505050506040513d602081101561140057600080fd5b5051151561140d57600080fd5b6114178383611d0d565b60408051338152602081018490528151600160a060020a038616927fc69971bc8087e5b1c670d301d9b9081003050de468bef149d09b46c54f51e479928290030190a2505050565b600061146c338484611bab565b50600192915050565b600061148333858585611dc3565b949350505050565b60008060606000806000806002805490501115156114a857600080fd5b6002805460001981019350839081106114bd57fe5b906000526020600020906003020190508060000160009054906101000a9004600160a060020a031681600101548260020184818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115845780601f1061155957610100808354040283529160200191611584565b820191906000526020600020905b81548152906001019060200180831161156757829003601f168201915b505050505091509550955095509550505090919293565b60006115a784846108b4565b15156115b257600080fd5b6040517f8f4ffcb10000000000000000000000000000000000000000000000000000000081523360048201818152602483018690523060448401819052608060648501908152865160848601528651600160a060020a038a1695638f4ffcb195948a94938a939192909160a490910190602085019080838360005b8381101561164557818101518382015260200161162d565b50505050905090810190601f1680156116725780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561169457600080fd5b505af11580156116a8573d6000803e3d6000fd5b505050506040513d60208110156116be57600080fd5b505190508015156116ce57600080fd5b5060019392505050565b600b54604080517f307e6661000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a0384811660248301529151919092169163307e66619160448083019260209291908290030181600087803b15801561174657600080fd5b505af115801561175a573d6000803e3d6000fd5b505050506040513d602081101561177057600080fd5b5051151561177d57600080fd5b600b8054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff199092168217928390556040805193909116835260208301919091523382820152517fb8a1f6190887ec2747b0a5d8d1bfc22e005c91c707ce9f3574470735cea727119181900360600190a150565b6000806117fd8484611b05565b9050600081111561181057809150611839565b600160a060020a0380851660009081526006602090815260408083209387168352929052205491505b5092915050565b600061184d8786846109eb565b61185987878686611dc3565b979650505050505050565b600154600160a060020a031690565b61187b612171565b3361188581611ee7565b151561189057600080fd5b60408051606081018252338152426020808301918252928201868152600280546001810180835560009290925284517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace6003909202918201805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0390921691909117815593517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf8201559151805194975090948794611973937f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad0019290910190612190565b505050507fe9835ee18f0f0b190604da3474d67a8f29aba2c92e90eee2bdaeca67d40d5a6b33846040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156119ef5781810151838201526020016119d7565b50505050905090810190601f168015611a1c5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a1505050565b600b54600160a060020a031690565b600054600160a060020a031690565b600083611a5981611c84565b600b54604080517fda682aeb000000000000000000000000000000000000000000000000000000008152600160a060020a0388811660048301528781166024830152604482018790529151919092169163da682aeb9160648083019260209291908290030181600087803b158015611ad057600080fd5b505af1158015611ae4573d6000803e3d6000fd5b505050506040513d6020811015611afa57600080fd5b505195945050505050565b600b54604080517fc00d752c000000000000000000000000000000000000000000000000000000008152600160a060020a03858116600483015284811660248301529151600093929092169163c00d752c9160448082019260209290919082900301818787803b158015611b7857600080fd5b505af1158015611b8c573d6000803e3d6000fd5b505050506040513d6020811015611ba257600080fd5b50519392505050565b600160a060020a0382161515611bc057600080fd5b611bcb838383611fb1565b1515611bd657600080fd5b600160a060020a038316600090815260046020526040902054611bf99082612157565b600160a060020a038085166000908152600460205260408082209390935590841681522054611c289082611cf7565b600160a060020a0380841660008181526004602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600160a060020a0381166000908152600360205260409020541515611cf457600254600010611cb257600080fd5b600160a060020a038116600081815260036020526040808220439055517f8c41d101e4d957423a65fda82dcc88bc6b3e756166d2331f663c10166658ebb89190a25b50565b600082820183811015611d0657fe5b9392505050565b600160a060020a038216600090815260046020526040902054811115611d3257600080fd5b600160a060020a038216600090815260046020526040902054611d559082612157565b600160a060020a038316600090815260046020526040902055600554611d7b9082612157565b600555604080518281529051600091600160a060020a038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000611dd0858585611bab565b611dd984612169565b156109e05783600160a060020a031663c0ee0b8a8685856040518463ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611e76578181015183820152602001611e5e565b50505050905090810190601f168015611ea35780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b158015611ec457600080fd5b505af1158015611ed8573d6000803e3d6000fd5b50505050506001949350505050565b6000611ef1611a3e565b6040805160e060020a639085b77f028152600160a060020a0385811660048301527f4eb6b5806954a48eb5659c9e3982d5e75bfb2913f55199877d877f157bcc5a9b602483015230604483015260008035600160e060020a03191660648401529251931692639085b77f92608480840193602093929083900390910190829087803b158015611f7f57600080fd5b505af1158015611f93573d6000803e3d6000fd5b505050506040513d6020811015611fa957600080fd5b505192915050565b600080600085611fc081611c84565b339250600160a060020a03871683146120a157611fdb611a3e565b6040805160e060020a639085b77f0281523360048201527f7c8ecdcba80ce87848d16ad77ef57cc196c208fc95c5638e4a48c681a34d4fe7602482015230604482015260008035600160e060020a03191660648301529151600160a060020a039390931692639085b77f92608480840193602093929083900390910190829087803b15801561206957600080fd5b505af115801561207d573d6000803e3d6000fd5b505050506040513d602081101561209357600080fd5b5051915081156120a1578692505b600b54604080517f0987df03000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301528a8116602483015289811660448301526064820189905291519190921691630987df039160848083019260209291908290030181600087803b15801561212057600080fd5b505af1158015612134573d6000803e3d6000fd5b505050506040513d602081101561214a57600080fd5b5051979650505050505050565b60008282111561216357fe5b50900390565b6000903b1190565b6040805160608181018352600080835260208301529181019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106121d157805160ff19168380011785556121fe565b828001600101855582156121fe579182015b828111156121fe5782518255916020019190600101906121e3565b5061220a92915061220e565b5090565b6108b191905b8082111561220a57600081556001016122145600a165627a7a72305820c063f1f20bee70e9dd36b4d661436f3694503d414c1fe52a7425a3f437a3c9880029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ae38c27e646959735ec70d77ed4ecc03a3eff4900000000000000000000000004c688949578b4fd0cb8f8993a0ec608659e05cf10000000000000000000000007b40d0ce14abc2cfa75c96d1ff9bb1085f826e46
-----Decoded View---------------
Arg [0] : accessPolicy (address): 0xaE38c27E646959735ec70d77ED4eCc03A3EFf490
Arg [1] : forkArbiter (address): 0x4C688949578B4fD0CB8F8993a0Ec608659e05cf1
Arg [2] : tokenController (address): 0x7b40d0cE14ABc2CFa75c96d1fF9BB1085F826e46
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000ae38c27e646959735ec70d77ed4ecc03a3eff490
Arg [1] : 0000000000000000000000004c688949578b4fd0cb8f8993a0ec608659e05cf1
Arg [2] : 0000000000000000000000007b40d0ce14abc2cfa75c96d1ff9bb1085f826e46
Swarm Source
bzzr://c063f1f20bee70e9dd36b4d661436f3694503d414c1fe52a7425a3f437a3c988
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.