Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 7024698 | 2150 days ago | IN | 0 ETH | 0.01098129 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ForeignBridge
Compiler Version
v0.4.24+commit.e67f0147
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-01-07 */ pragma solidity 0.4.24; // File: contracts/ERC677Receiver.sol contract ERC677Receiver { function onTokenTransfer(address _from, uint _value, bytes _data) external returns(bool); } // File: openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol /** * @title ERC20Basic * @dev Simpler version of ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/179 */ contract ERC20Basic { function totalSupply() public view returns (uint256); function balanceOf(address who) public view returns (uint256); function transfer(address to, uint256 value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } // File: openzeppelin-solidity/contracts/token/ERC20/ERC20.sol /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ contract ERC20 is ERC20Basic { function allowance(address owner, address spender) public view returns (uint256); function transferFrom(address from, address to, uint256 value) public returns (bool); function approve(address spender, uint256 value) public returns (bool); event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/ERC677.sol contract ERC677 is ERC20 { event Transfer(address indexed from, address indexed to, uint value, bytes data); function transferAndCall(address, uint, bytes) external returns (bool); } // File: contracts/IBurnableMintableERC677Token.sol contract IBurnableMintableERC677Token is ERC677 { function mint(address, uint256) public returns (bool); function burn(uint256 _value) public; function claimTokens(address _token, address _to) public; } // File: contracts/IBridgeValidators.sol interface IBridgeValidators { function isValidator(address _validator) public view returns(bool); function requiredSignatures() public view returns(uint256); function owner() public view returns(address); } // File: contracts/libraries/Message.sol library Message { // function uintToString(uint256 inputValue) internal pure returns (string) { // // figure out the length of the resulting string // uint256 length = 0; // uint256 currentValue = inputValue; // do { // length++; // currentValue /= 10; // } while (currentValue != 0); // // allocate enough memory // bytes memory result = new bytes(length); // // construct the string backwards // uint256 i = length - 1; // currentValue = inputValue; // do { // result[i--] = byte(48 + currentValue % 10); // currentValue /= 10; // } while (currentValue != 0); // return string(result); // } function addressArrayContains(address[] array, address value) internal pure returns (bool) { for (uint256 i = 0; i < array.length; i++) { if (array[i] == value) { return true; } } return false; } // layout of message :: bytes: // offset 0: 32 bytes :: uint256 - message length // offset 32: 20 bytes :: address - recipient address // offset 52: 32 bytes :: uint256 - value // offset 84: 32 bytes :: bytes32 - transaction hash // offset 116: 32 bytes :: uint256 - home gas price // bytes 1 to 32 are 0 because message length is stored as little endian. // mload always reads 32 bytes. // so we can and have to start reading recipient at offset 20 instead of 32. // if we were to read at 32 the address would contain part of value and be corrupted. // when reading from offset 20 mload will read 12 zero bytes followed // by the 20 recipient address bytes and correctly convert it into an address. // this saves some storage/gas over the alternative solution // which is padding address to 32 bytes and reading recipient at offset 32. // for more details see discussion in: // https://github.com/paritytech/parity-bridge/issues/61 function parseMessage(bytes message) internal pure returns(address recipient, uint256 amount, bytes32 txHash) { require(isMessageValid(message)); assembly { recipient := and(mload(add(message, 20)), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) amount := mload(add(message, 52)) txHash := mload(add(message, 84)) } } function isMessageValid(bytes _msg) internal pure returns(bool) { return _msg.length == 116; } function recoverAddressFromSignedMessage(bytes signature, bytes message) internal pure returns (address) { require(signature.length == 65); bytes32 r; bytes32 s; bytes1 v; // solium-disable-next-line security/no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := mload(add(signature, 0x60)) } return ecrecover(hashMessage(message), uint8(v), r, s); } function hashMessage(bytes message) internal pure returns (bytes32) { bytes memory prefix = "\x19Ethereum Signed Message:\n"; // message is always 116 length string memory msgLength = "116"; return keccak256(prefix, msgLength, message); } function hasEnoughValidSignatures( bytes _message, uint8[] _vs, bytes32[] _rs, bytes32[] _ss, IBridgeValidators _validatorContract) internal view { require(isMessageValid(_message)); uint256 requiredSignatures = _validatorContract.requiredSignatures(); require(_vs.length >= requiredSignatures); bytes32 hash = hashMessage(_message); address[] memory encounteredAddresses = new address[](requiredSignatures); for (uint256 i = 0; i < requiredSignatures; i++) { address recoveredAddress = ecrecover(hash, _vs[i], _rs[i], _ss[i]); require(_validatorContract.isValidator(recoveredAddress)); if (addressArrayContains(encounteredAddresses, recoveredAddress)) { revert(); } encounteredAddresses[i] = recoveredAddress; } } } // File: contracts/libraries/SafeMath.sol /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } } // File: contracts/IOwnedUpgradeabilityProxy.sol interface IOwnedUpgradeabilityProxy { function proxyOwner() public view returns (address); } // File: contracts/upgradeable_contracts/OwnedUpgradeability.sol contract OwnedUpgradeability { function upgradeabilityAdmin() public view returns (address) { return IOwnedUpgradeabilityProxy(this).proxyOwner(); } // Avoid using onlyProxyOwner name to prevent issues with implementation from proxy contract modifier onlyIfOwnerOfProxy() { require(msg.sender == upgradeabilityAdmin()); _; } } // File: contracts/upgradeability/EternalStorage.sol /** * @title EternalStorage * @dev This contract holds all the necessary state variables to carry out the storage of any contract. */ contract EternalStorage { mapping(bytes32 => uint256) internal uintStorage; mapping(bytes32 => string) internal stringStorage; mapping(bytes32 => address) internal addressStorage; mapping(bytes32 => bytes) internal bytesStorage; mapping(bytes32 => bool) internal boolStorage; mapping(bytes32 => int256) internal intStorage; } // File: contracts/upgradeable_contracts/Ownable.sol /** * @title Ownable * @dev This contract has an owner address providing basic authorization control */ contract Ownable is EternalStorage { /** * @dev Event to show ownership has been transferred * @param previousOwner representing the address of the previous owner * @param newOwner representing the address of the new owner */ event OwnershipTransferred(address previousOwner, address newOwner); /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner()); _; } /** * @dev Tells the address of the owner * @return the address of the owner */ function owner() public view returns (address) { return addressStorage[keccak256("owner")]; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner the address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { require(newOwner != address(0)); setOwner(newOwner); } /** * @dev Sets a new owner address */ function setOwner(address newOwner) internal { emit OwnershipTransferred(owner(), newOwner); addressStorage[keccak256("owner")] = newOwner; } } // File: contracts/upgradeable_contracts/Validatable.sol contract Validatable is EternalStorage { function validatorContract() public view returns(IBridgeValidators) { return IBridgeValidators(addressStorage[keccak256("validatorContract")]); } modifier onlyValidator() { require(validatorContract().isValidator(msg.sender)); _; } } // File: contracts/upgradeable_contracts/U_BasicBridge.sol contract BasicBridge is EternalStorage, Validatable, Ownable { event GasPriceChanged(uint256 gasPrice); event RequiredBlockConfirmationChanged(uint256 requiredBlockConfirmations); function setGasPrice(uint256 _gasPrice) public onlyOwner { require(_gasPrice > 0); uintStorage[keccak256("gasPrice")] = _gasPrice; emit GasPriceChanged(_gasPrice); } function gasPrice() public view returns(uint256) { return uintStorage[keccak256("gasPrice")]; } function setRequiredBlockConfirmations(uint256 _blockConfirmations) public onlyOwner { require(_blockConfirmations > 0); uintStorage[keccak256("requiredBlockConfirmations")] = _blockConfirmations; emit RequiredBlockConfirmationChanged(_blockConfirmations); } function requiredBlockConfirmations() public view returns(uint256) { return uintStorage[keccak256("requiredBlockConfirmations")]; } } // File: contracts/upgradeable_contracts/U_ForeignBridge.sol contract ForeignBridge is ERC677Receiver, BasicBridge, OwnedUpgradeability { using SafeMath for uint256; /// triggered when relay of deposit from HomeBridge is complete event Deposit(address recipient, uint value, bytes32 transactionHash); /// Event created on money withdraw. event Withdraw(address recipient, uint256 value, uint256 homeGasPrice); /// Collected signatures which should be relayed to home chain. event CollectedSignatures(address authorityResponsibleForRelay, bytes32 messageHash); event GasConsumptionLimitsUpdated(uint256 gasLimitDepositRelay, uint256 gasLimitWithdrawConfirm); event SignedForDeposit(address indexed signer, bytes32 transactionHash); event SignedForWithdraw(address indexed signer, bytes32 messageHash); event DailyLimit(uint256 newLimit); event HomeDailyLimit(uint256 newLimit); function initialize( address _validatorContract, address _erc677token, uint256 _foreignDailyLimit, uint256 _maxPerTx, uint256 _minPerTx, uint256 _foreignGasPrice, uint256 _requiredBlockConfirmations ) public returns(bool) { require(!isInitialized()); require(_validatorContract != address(0)); require(_minPerTx > 0 && _maxPerTx > _minPerTx && _foreignDailyLimit > _maxPerTx); require(_foreignGasPrice > 0); addressStorage[keccak256("validatorContract")] = _validatorContract; setErc677token(_erc677token); uintStorage[keccak256("foreignDailyLimit")] = _foreignDailyLimit; uintStorage[keccak256("deployedAtBlock")] = block.number; uintStorage[keccak256("maxPerTx")] = _maxPerTx; uintStorage[keccak256("minPerTx")] = _minPerTx; uintStorage[keccak256("gasPrice")] = _foreignGasPrice; uintStorage[keccak256("requiredBlockConfirmations")] = _requiredBlockConfirmations; setInitialize(true); return isInitialized(); } function upgradeFrom2To3() public { require(owner() == address(0)); setOwner(validatorContract().owner()); } function onTokenTransfer(address _from, uint256 _value, bytes /*_data*/) external returns(bool) { require(msg.sender == address(erc677token())); require(withinLimit(_value)); setTotalSpentPerDay(getCurrentDay(), totalSpentPerDay(getCurrentDay()).add(_value)); erc677token().burn(_value); emit Withdraw(_from, _value, gasPriceForCompensationAtHomeSide()); return true; } function setMaxPerTx(uint256 _maxPerTx) external onlyOwner { require(_maxPerTx < foreignDailyLimit()); uintStorage[keccak256("maxPerTx")] = _maxPerTx; } function setHomeMaxPerTx(uint256 _maxPerTx) external onlyOwner { require(_maxPerTx < homeDailyLimit()); uintStorage[keccak256("homeMaxPerTx")] = _maxPerTx; } function setMinPerTx(uint256 _minPerTx) external onlyOwner { require(_minPerTx < foreignDailyLimit() && _minPerTx < maxPerTx()); uintStorage[keccak256("minPerTx")] = _minPerTx; } function claimTokens(address _token, address _to) external onlyIfOwnerOfProxy { require(_to != address(0)); if (_token == address(0)) { _to.transfer(address(this).balance); return; } ERC20Basic token = ERC20Basic(_token); uint256 balance = token.balanceOf(this); require(token.transfer(_to, balance)); } function claimTokensFromErc677(address _token, address _to) external onlyIfOwnerOfProxy { erc677token().claimTokens(_token, _to); } function minPerTx() public view returns(uint256) { return uintStorage[keccak256("minPerTx")]; } function maxPerTx() public view returns(uint256) { return uintStorage[keccak256("maxPerTx")]; } function homeMaxPerTx() public view returns(uint256) { return uintStorage[keccak256("homeMaxPerTx")]; } function totalSpentPerDay(uint256 _day) public view returns(uint256) { return uintStorage[keccak256("totalSpentPerDay", _day)]; } function totalExecutedPerDay(uint256 _day) public view returns(uint256) { return uintStorage[keccak256("totalExecutedPerDay", _day)]; } function deployedAtBlock() public view returns(uint256) { return uintStorage[keccak256("deployedAtBlock")]; } function gasLimitDepositRelay() public view returns(uint256) { return uintStorage[keccak256("gasLimitDepositRelay")]; } function gasLimitWithdrawConfirm() public view returns(uint256) { return uintStorage[keccak256("gasLimitWithdrawConfirm")]; } function foreignDailyLimit() public view returns(uint256) { return uintStorage[keccak256("foreignDailyLimit")]; } function homeDailyLimit() public view returns(uint256) { return uintStorage[keccak256("homeDailyLimit")]; } function erc677token() public view returns(IBurnableMintableERC677Token) { return IBurnableMintableERC677Token(addressStorage[keccak256("erc677token")]); } function setGasLimits(uint256 _gasLimitDepositRelay, uint256 _gasLimitWithdrawConfirm) external onlyOwner { uintStorage[keccak256("gasLimitDepositRelay")] = _gasLimitDepositRelay; uintStorage[keccak256("gasLimitWithdrawConfirm")] = _gasLimitWithdrawConfirm; emit GasConsumptionLimitsUpdated(gasLimitDepositRelay(), gasLimitWithdrawConfirm()); } function deposit(address recipient, uint256 value, bytes32 transactionHash) external onlyValidator { bytes32 hashMsg = keccak256(recipient, value, transactionHash); bytes32 hashSender = keccak256(msg.sender, hashMsg); require(withinHomeLimit(value)); // Duplicated deposits require(!depositsSigned(hashSender)); setDepositsSigned(hashSender, true); uint256 signed = numDepositsSigned(hashMsg); require(!isAlreadyProcessed(signed)); // the check above assumes that the case when the value could be overflew will not happen in the addition operation below signed = signed + 1; setNumDepositsSigned(hashMsg, signed); emit SignedForDeposit(msg.sender, transactionHash); if (signed >= validatorContract().requiredSignatures()) { // If the bridge contract does not own enough tokens to transfer // it will couse funds lock on the home side of the bridge setTotalExecutedPerDay(getCurrentDay(), totalExecutedPerDay(getCurrentDay()).add(value)); setNumDepositsSigned(hashMsg, markAsProcessed(signed)); erc677token().mint(recipient, value); emit Deposit(recipient, value, transactionHash); } } /// Should be used as sync tool /// /// Message is a message that should be relayed to main chain once authorities sign it. /// /// for withdraw message contains: /// withdrawal recipient (bytes20) /// withdrawal value (uint) /// foreign transaction hash (bytes32) // to avoid transaction duplication function submitSignature(bytes signature, bytes message) external onlyValidator { // ensure that `signature` is really `message` signed by `msg.sender` require(Message.isMessageValid(message)); require(msg.sender == Message.recoverAddressFromSignedMessage(signature, message)); bytes32 hashMsg = keccak256(message); bytes32 hashSender = keccak256(msg.sender, hashMsg); uint256 signed = numMessagesSigned(hashMsg); require(!isAlreadyProcessed(signed)); // the check above assumes that the case when the value could be overflew will not happen in the addition operation below signed = signed + 1; if (signed > 1) { // Duplicated signatures require(!messagesSigned(hashSender)); } else { setMessages(hashMsg, message); } setMessagesSigned(hashSender, true); bytes32 signIdx = keccak256(hashMsg, (signed-1)); setSignatures(signIdx, signature); setNumMessagesSigned(hashMsg, signed); emit SignedForWithdraw(msg.sender, hashMsg); if (signed >= validatorContract().requiredSignatures()) { setNumMessagesSigned(hashMsg, markAsProcessed(signed)); emit CollectedSignatures(msg.sender, hashMsg); } } function gasPriceForCompensationAtHomeSide() public pure returns(uint256) { return 1000000000 wei; } function isAlreadyProcessed(uint256 _number) public pure returns(bool) { return _number & 2**255 == 2**255; } function signature(bytes32 _hash, uint256 _index) public view returns (bytes) { bytes32 signIdx = keccak256(_hash, _index); return signatures(signIdx); } /// Get message function message(bytes32 _hash) public view returns (bytes) { return messages(_hash); } function getCurrentDay() public view returns(uint256) { return now / 1 days; } function setForeignDailyLimit(uint256 _foreignDailyLimit) public onlyOwner { uintStorage[keccak256("foreignDailyLimit")] = _foreignDailyLimit; emit DailyLimit(_foreignDailyLimit); } function setHomeDailyLimit(uint256 _homeDailyLimit) external onlyOwner { uintStorage[keccak256("homeDailyLimit")] = _homeDailyLimit; emit HomeDailyLimit(_homeDailyLimit); } function withinLimit(uint256 _amount) public view returns(bool) { uint256 nextLimit = totalSpentPerDay(getCurrentDay()).add(_amount); return foreignDailyLimit() >= nextLimit && _amount <= maxPerTx() && _amount >= minPerTx(); } function withinHomeLimit(uint256 _amount) public view returns(bool) { uint256 nextLimit = totalExecutedPerDay(getCurrentDay()).add(_amount); return homeDailyLimit() >= nextLimit && _amount <= homeMaxPerTx(); } function isInitialized() public view returns(bool) { return boolStorage[keccak256("isInitialized")]; } function messages(bytes32 _hash) private view returns(bytes) { return bytesStorage[keccak256("messages", _hash)]; } function setMessages(bytes32 _hash, bytes _message) private { bytesStorage[keccak256("messages", _hash)] = _message; } function signatures(bytes32 _hash) private view returns(bytes) { return bytesStorage[keccak256("signatures", _hash)]; } function setSignatures(bytes32 _hash, bytes _signature) private { bytesStorage[keccak256("signatures", _hash)] = _signature; } function messagesSigned(bytes32 _message) public view returns(bool) { return boolStorage[keccak256("messagesSigned", _message)]; } function depositsSigned(bytes32 _deposit) public view returns(bool) { return boolStorage[keccak256("depositsSigned", _deposit)]; } function markAsProcessed(uint256 _v) private pure returns(uint256) { return _v | 2 ** 255; } function numMessagesSigned(bytes32 _message) private view returns(uint256) { return uintStorage[keccak256("numMessagesSigned", _message)]; } function numDepositsSigned(bytes32 _deposit) private view returns(uint256) { return uintStorage[keccak256("numDepositsSigned", _deposit)]; } function setMessagesSigned(bytes32 _hash, bool _status) private { boolStorage[keccak256("messagesSigned", _hash)] = _status; } function setDepositsSigned(bytes32 _deposit, bool _status) private { boolStorage[keccak256("depositsSigned", _deposit)] = _status; } function setNumMessagesSigned(bytes32 _message, uint256 _number) private { uintStorage[keccak256("numMessagesSigned", _message)] = _number; } function setNumDepositsSigned(bytes32 _deposit, uint256 _number) private { uintStorage[keccak256("numDepositsSigned", _deposit)] = _number; } function setTotalSpentPerDay(uint256 _day, uint256 _value) private { uintStorage[keccak256("totalSpentPerDay", _day)] = _value; } function setTotalExecutedPerDay(uint256 _day, uint256 _value) private { uintStorage[keccak256("totalExecutedPerDay", _day)] = _value; } function setErc677token(address _token) private { require(_token != address(0)); addressStorage[keccak256("erc677token")] = _token; } function setInitialize(bool _status) private { boolStorage[keccak256("isInitialized")] = _status; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"_hash","type":"bytes32"},{"name":"_index","type":"uint256"}],"name":"signature","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"erc677token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"value","type":"uint256"},{"name":"transactionHash","type":"bytes32"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"homeMaxPerTx","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_day","type":"uint256"}],"name":"totalSpentPerDay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isInitialized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentDay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"requiredBlockConfirmations","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_hash","type":"bytes32"}],"name":"message","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_day","type":"uint256"}],"name":"totalExecutedPerDay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gasLimitDepositRelay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"signature","type":"bytes"},{"name":"message","type":"bytes"}],"name":"submitSignature","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_maxPerTx","type":"uint256"}],"name":"setHomeMaxPerTx","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_to","type":"address"}],"name":"claimTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_deposit","type":"bytes32"}],"name":"depositsSigned","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_gasLimitDepositRelay","type":"uint256"},{"name":"_gasLimitWithdrawConfirm","type":"uint256"}],"name":"setGasLimits","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"homeDailyLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"foreignDailyLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_message","type":"bytes32"}],"name":"messagesSigned","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_to","type":"address"}],"name":"claimTokensFromErc677","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"validatorContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"deployedAtBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_minPerTx","type":"uint256"}],"name":"setMinPerTx","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_value","type":"uint256"},{"name":"","type":"bytes"}],"name":"onTokenTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_blockConfirmations","type":"uint256"}],"name":"setRequiredBlockConfirmations","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_homeDailyLimit","type":"uint256"}],"name":"setHomeDailyLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"gasPriceForCompensationAtHomeSide","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_gasPrice","type":"uint256"}],"name":"setGasPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"gasLimitWithdrawConfirm","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_maxPerTx","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_foreignDailyLimit","type":"uint256"}],"name":"setForeignDailyLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"upgradeabilityAdmin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minPerTx","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_amount","type":"uint256"}],"name":"withinLimit","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_validatorContract","type":"address"},{"name":"_erc677token","type":"address"},{"name":"_foreignDailyLimit","type":"uint256"},{"name":"_maxPerTx","type":"uint256"},{"name":"_minPerTx","type":"uint256"},{"name":"_foreignGasPrice","type":"uint256"},{"name":"_requiredBlockConfirmations","type":"uint256"}],"name":"initialize","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_amount","type":"uint256"}],"name":"withinHomeLimit","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"upgradeFrom2To3","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxPerTx","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gasPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_number","type":"uint256"}],"name":"isAlreadyProcessed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"recipient","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"transactionHash","type":"bytes32"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"recipient","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"homeGasPrice","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"authorityResponsibleForRelay","type":"address"},{"indexed":false,"name":"messageHash","type":"bytes32"}],"name":"CollectedSignatures","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"gasLimitDepositRelay","type":"uint256"},{"indexed":false,"name":"gasLimitWithdrawConfirm","type":"uint256"}],"name":"GasConsumptionLimitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"signer","type":"address"},{"indexed":false,"name":"transactionHash","type":"bytes32"}],"name":"SignedForDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"signer","type":"address"},{"indexed":false,"name":"messageHash","type":"bytes32"}],"name":"SignedForWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newLimit","type":"uint256"}],"name":"DailyLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newLimit","type":"uint256"}],"name":"HomeDailyLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"gasPrice","type":"uint256"}],"name":"GasPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"requiredBlockConfirmations","type":"uint256"}],"name":"RequiredBlockConfirmationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"previousOwner","type":"address"},{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
608060405234801561001057600080fd5b50612871806100206000396000f3006080604052600436106101ea5763ffffffff60e060020a6000350416631812d99681146101ef57806318d8f9c91461027f57806326b3293f146102b0578063288b7ad8146102d95780632bd0bb0514610300578063392e53cd146103185780633e6968b6146103415780633f0a9f6514610356578063490a32c61461036b5780634fb3fef71461038357806359292ef31461039b578063630cea8e146103b057806363258462146103dc57806369ffa08a146103f4578063793040631461041b57806379f9cc7214610433578063857cfff91461044e5780638a2a60ef146104635780638da5cb5b146104785780638f4b4b981461048d5780639313dc43146104a557806399439089146104cc5780639a454b99146104e1578063a2a6ca27146104f6578063a4c0ed361461050e578063acf5c6891461053f578063b2355b4214610557578063bea7c13a1461056f578063bf1fe42014610584578063c4a1ee371461059c578063c6f6f216146105b1578063cbbc8a51146105c9578063df0ad3de146105e1578063df25f3f0146105f6578063ea9f49681461060b578063edbf4ac214610623578063f2fde38b14610659578063f426d8ac1461067a578063f91b853b14610692578063f968adbe146106a7578063fe173b97146106bc578063ffd19e8c146106d1575b600080fd5b3480156101fb57600080fd5b5061020a6004356024356106e9565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561024457818101518382015260200161022c565b50505050905090810190601f1680156102715780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561028b57600080fd5b50610294610716565b60408051600160a060020a039092168252519081900360200190f35b3480156102bc57600080fd5b506102d7600160a060020a0360043516602435604435610761565b005b3480156102e557600080fd5b506102ee610a8a565b60408051918252519081900360200190f35b34801561030c57600080fd5b506102ee600435610acb565b34801561032457600080fd5b5061032d610b15565b604080519115158252519081900360200190f35b34801561034d57600080fd5b506102ee610b59565b34801561036257600080fd5b506102ee610b62565b34801561037757600080fd5b5061020a600435610ba3565b34801561038f57600080fd5b506102ee600435610bb4565b3480156103a757600080fd5b506102ee610bfe565b3480156103bc57600080fd5b506102d76024600480358281019290820135918135918201910135610c3f565b3480156103e857600080fd5b506102d7600435610fd1565b34801561040057600080fd5b506102d7600160a060020a0360043581169060243516611040565b34801561042757600080fd5b5061032d6004356111fc565b34801561043f57600080fd5b506102d7600435602435611249565b34801561045a57600080fd5b506102ee61132d565b34801561046f57600080fd5b506102ee61136e565b34801561048457600080fd5b506102946113af565b34801561049957600080fd5b5061032d6004356113f9565b3480156104b157600080fd5b506102d7600160a060020a0360043581169060243516611446565b3480156104d857600080fd5b506102946114eb565b3480156104ed57600080fd5b506102ee611535565b34801561050257600080fd5b506102d7600435611576565b34801561051a57600080fd5b5061032d60048035600160a060020a03169060248035916044359182019101356115f9565b34801561054b57600080fd5b506102d7600435611714565b34801561056357600080fd5b506102d76004356117b3565b34801561057b57600080fd5b506102ee611845565b34801561059057600080fd5b506102d760043561184d565b3480156105a857600080fd5b506102ee6118ec565b3480156105bd57600080fd5b506102d760043561192d565b3480156105d557600080fd5b506102d760043561199c565b3480156105ed57600080fd5b50610294611a2e565b34801561060257600080fd5b506102ee611a9f565b34801561061757600080fd5b5061032d600435611ae0565b34801561062f57600080fd5b5061032d600160a060020a036004358116906024351660443560643560843560a43560c435611b2c565b34801561066557600080fd5b506102d7600160a060020a0360043516611d71565b34801561068657600080fd5b5061032d600435611dae565b34801561069e57600080fd5b506102d7611de6565b3480156106b357600080fd5b506102ee611e7e565b3480156106c857600080fd5b506102ee611ebf565b3480156106dd57600080fd5b5061032d600435611f00565b6040805183815260208101839052815190819003909101902060609061070e81611f28565b949350505050565b604080517f657263363737746f6b656e0000000000000000000000000000000000000000008152815190819003600b019020600090815260026020522054600160a060020a03165b90565b600080600061076e6114eb565b600160a060020a031663facd743b336040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156107c857600080fd5b505af11580156107dc573d6000803e3d6000fd5b505050506040513d60208110156107f257600080fd5b505115156107ff57600080fd5b604080516c01000000000000000000000000600160a060020a038916810282526014808301899052603480840189905284519384900360540184203390930284529083018290529251918290039092019020909350915061085f85611dae565b151561086a57600080fd5b610873826111fc565b1561087d57600080fd5b610888826001611ffe565b6108918361205a565b905061089c81611f00565b156108a657600080fd5b6001016108b383826120a4565b60408051858152905133917f6a09111cb1bbfc898f36504afb4d5411d0dbef45f2c43fac5781e6b640b86a32919081900360200190a26108f16114eb565b600160a060020a0316638d0680436040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561092e57600080fd5b505af1158015610942573d6000803e3d6000fd5b505050506040513d602081101561095857600080fd5b50518110610a825761099061096b610b59565b61098b8761097f61097a610b59565b610bb4565b9063ffffffff6120f016565b6120ff565b6109a28361099d8361214b565b6120a4565b6109aa610716565b600160a060020a03166340c10f1987876040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015610a0c57600080fd5b505af1158015610a20573d6000803e3d6000fd5b505050506040513d6020811015610a3657600080fd5b505060408051600160a060020a03881681526020810187905280820186905290517f1a771fe656018364a9369da21954bb3081cb08b0196c27e43ca59c7cae8727379181900360600190a15b505050505050565b604080517f686f6d654d6178506572547800000000000000000000000000000000000000008152815190819003600c01902060009081526020819052205490565b604080517f746f74616c5370656e74506572446179000000000000000000000000000000008152601081018390528151908190036030019020600090815260208190522054919050565b604080517f6973496e697469616c697a6564000000000000000000000000000000000000008152815190819003600d01902060009081526004602052205460ff1690565b62015180420490565b604080517f7265717569726564426c6f636b436f6e6669726d6174696f6e730000000000008152815190819003601a01902060009081526020819052205490565b6060610bae82612170565b92915050565b604080517f746f74616c4578656375746564506572446179000000000000000000000000008152601381018390528151908190036033019020600090815260208190522054919050565b604080517f6761734c696d69744465706f73697452656c61790000000000000000000000008152815190819003601401902060009081526020819052205490565b600080600080610c4d6114eb565b600160a060020a031663facd743b336040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610ca757600080fd5b505af1158015610cbb573d6000803e3d6000fd5b505050506040513d6020811015610cd157600080fd5b50511515610cde57600080fd5b610d1786868080601f0160208091040260200160405190810160405280939291908181526020018383808284375061220f945050505050565b1515610d2257600080fd5b610d8988888080601f0160208091040260200160405190810160405280939291908181526020018383808284375050604080516020601f8e018190048102820181019092528c815294508c93508b9250829150840183828082843750612216945050505050565b600160a060020a03163314610d9d57600080fd5b858560405180838380828437604080519190930181900381206c0100000000000000000000000033028252601482018190529251908190036034019020919850909650610df093508792506122d6915050565b9150610dfb82611f00565b15610e0557600080fd5b600191820191821115610e2a57610e1b836113f9565b15610e2557600080fd5b610e64565b610e648487878080601f01602080910402602001604051908101604052809392919081815260200183838082843750612320945050505050565b610e6f83600161237b565b5060408051848152600019830160208083019190915282519182900383018220601f8a01829004820283018201909352888252610ec29183918b908b9081908401838280828437506123d7945050505050565b610ecc848361242d565b60408051858152905133917f962f785fc9b91edbed2fdad62c075258ee14d39bd29cd1e83c298a7bf26d5a65919081900360200190a2610f0a6114eb565b600160a060020a0316638d0680436040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610f4757600080fd5b505af1158015610f5b573d6000803e3d6000fd5b505050506040513d6020811015610f7157600080fd5b50518210610fc757610f8b84610f868461214b565b61242d565b604080513381526020810186905281517feb043d149eedb81369bec43d4c3a3a53087debc88d2525f13bfaa3eecda28b5c929181900390910190a15b5050505050505050565b610fd96113af565b600160a060020a03163314610fed57600080fd5b610ff561132d565b811061100057600080fd5b604080517f686f6d654d6178506572547800000000000000000000000000000000000000008152815190819003600c019020600090815260208190522055565b60008061104b611a2e565b600160a060020a0316331461105f57600080fd5b600160a060020a038316151561107457600080fd5b600160a060020a03841615156110c057604051600160a060020a03841690303180156108fc02916000818181858888f193505050501580156110ba573d6000803e3d6000fd5b506111f6565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051859350600160a060020a038416916370a082319160248083019260209291908290030181600087803b15801561112457600080fd5b505af1158015611138573d6000803e3d6000fd5b505050506040513d602081101561114e57600080fd5b5051604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301526024820184905291519293509084169163a9059cbb916044808201926020929091908290030181600087803b1580156111bf57600080fd5b505af11580156111d3573d6000803e3d6000fd5b505050506040513d60208110156111e957600080fd5b505115156111f657600080fd5b50505050565b604080517f6465706f736974735369676e65640000000000000000000000000000000000008152600e8101839052815190819003602e01902060009081526004602052205460ff16919050565b6112516113af565b600160a060020a0316331461126557600080fd5b604080517f6761734c696d69744465706f73697452656c617900000000000000000000000081528151908190036014018120600090815260208181528382208690557f6761734c696d69745769746864726177436f6e6669726d0000000000000000008352835192839003601701909220815290819052208190557f3b49a33ec45179ab3408f6f29a2b208c909ab1460e94af7558808ea22854c106611309610bfe565b6113116118ec565b6040805192835260208301919091528051918290030190a15050565b604080517f686f6d654461696c794c696d69740000000000000000000000000000000000008152815190819003600e01902060009081526020819052205490565b604080517f666f726569676e4461696c794c696d69740000000000000000000000000000008152815190819003601101902060009081526020819052205490565b604080517f6f776e657200000000000000000000000000000000000000000000000000000081528151908190036005019020600090815260026020522054600160a060020a031690565b604080517f6d657373616765735369676e65640000000000000000000000000000000000008152600e8101839052815190819003602e01902060009081526004602052205460ff16919050565b61144e611a2e565b600160a060020a0316331461146257600080fd5b61146a610716565b604080517f69ffa08a000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301528481166024830152915192909116916369ffa08a9160448082019260009290919082900301818387803b1580156114d757600080fd5b505af1158015610a82573d6000803e3d6000fd5b604080517f76616c696461746f72436f6e747261637400000000000000000000000000000081528151908190036011019020600090815260026020522054600160a060020a031690565b604080517f6465706c6f7965644174426c6f636b00000000000000000000000000000000008152815190819003600f01902060009081526020819052205490565b61157e6113af565b600160a060020a0316331461159257600080fd5b61159a61136e565b811080156115ae57506115ab611e7e565b81105b15156115b957600080fd5b604080517f6d696e506572547800000000000000000000000000000000000000000000000081528151908190036008019020600090815260208190522055565b6000611603610716565b600160a060020a0316331461161757600080fd5b61162084611ae0565b151561162b57600080fd5b61164f611636610b59565b61164a8661097f611645610b59565b610acb565b612479565b611657610716565b600160a060020a03166342966c68856040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561169f57600080fd5b505af11580156116b3573d6000803e3d6000fd5b505050507ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56885856116e2611845565b60408051600160a060020a039094168452602084019290925282820152519081900360600190a1506001949350505050565b61171c6113af565b600160a060020a0316331461173057600080fd5b6000811161173d57600080fd5b604080517f7265717569726564426c6f636b436f6e6669726d6174696f6e730000000000008152815190819003601a018120600090815260208181529083902084905583825291517f4fb76205cd57c896b21511d2114137d8e901b4ccd659e1a0f97d6306795264fb929181900390910190a150565b6117bb6113af565b600160a060020a031633146117cf57600080fd5b604080517f686f6d654461696c794c696d69740000000000000000000000000000000000008152815190819003600e018120600090815260208181529083902084905583825291517f7cbf6a47cd79c6fef9f0a89db1e9cdca2a3e93d84eae02a0232897b24524089e929181900390910190a150565b633b9aca0090565b6118556113af565b600160a060020a0316331461186957600080fd5b6000811161187657600080fd5b604080517f676173507269636500000000000000000000000000000000000000000000000081528151908190036008018120600090815260208181529083902084905583825291517f52264b89e0fceafb26e79fd49ef8a366eb6297483bf4035b027f0c99a7ad512e929181900390910190a150565b604080517f6761734c696d69745769746864726177436f6e6669726d0000000000000000008152815190819003601701902060009081526020819052205490565b6119356113af565b600160a060020a0316331461194957600080fd5b61195161136e565b811061195c57600080fd5b604080517f6d6178506572547800000000000000000000000000000000000000000000000081528151908190036008019020600090815260208190522055565b6119a46113af565b600160a060020a031633146119b857600080fd5b604080517f666f726569676e4461696c794c696d697400000000000000000000000000000081528151908190036011018120600090815260208181529083902084905583825291517f8d797628d21ca877e321aa59bc2d55eba59ae001c5294d433797019caebab2ab929181900390910190a150565b600030600160a060020a031663025313a26040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611a6e57600080fd5b505af1158015611a82573d6000803e3d6000fd5b505050506040513d6020811015611a9857600080fd5b5051905090565b604080517f6d696e50657254780000000000000000000000000000000000000000000000008152815190819003600801902060009081526020819052205490565b600080611af28361097f611645610b59565b905080611afd61136e565b10158015611b125750611b0e611e7e565b8311155b8015611b255750611b21611a9f565b8310155b9392505050565b6000611b36610b15565b15611b4057600080fd5b600160a060020a0388161515611b5557600080fd5b600084118015611b6457508385115b8015611b6f57508486115b1515611b7a57600080fd5b60008311611b8757600080fd5b604080517f76616c696461746f72436f6e74726163740000000000000000000000000000008152815190819003601101902060009081526002602052208054600160a060020a038a1673ffffffffffffffffffffffffffffffffffffffff19909116179055611bf5876124c5565b604080517f666f726569676e4461696c794c696d697400000000000000000000000000000081528151908190036011018120600090815260208181528382208a90557f6465706c6f7965644174426c6f636b00000000000000000000000000000000008352835192839003600f01832082528181528382204390557f6d6178506572547800000000000000000000000000000000000000000000000083528351928390036008908101842083528282528483208a90557f6d696e506572547800000000000000000000000000000000000000000000000084528451938490038101842083528282528483208990557f6761735072696365000000000000000000000000000000000000000000000000845284519384900301832082528181528382208790557f7265717569726564426c6f636b436f6e6669726d6174696f6e730000000000008352835192839003601a0190922081529081905220829055611d5d6001612545565b611d65610b15565b98975050505050505050565b611d796113af565b600160a060020a03163314611d8d57600080fd5b600160a060020a0381161515611da257600080fd5b611dab81612595565b50565b600080611dc08361097f61097a610b59565b905080611dcb61132d565b10158015611b255750611ddc610a8a565b9092111592915050565b6000611df06113af565b600160a060020a031614611e0357600080fd5b611e7c611e0e6114eb565b600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611e4b57600080fd5b505af1158015611e5f573d6000803e3d6000fd5b505050506040513d6020811015611e7557600080fd5b5051612595565b565b604080517f6d617850657254780000000000000000000000000000000000000000000000008152815190819003600801902060009081526020819052205490565b604080517f67617350726963650000000000000000000000000000000000000000000000008152815190819003600801902060009081526020819052205490565b7f80000000000000000000000000000000000000000000000000000000000000009081161490565b604080517f7369676e617475726573000000000000000000000000000000000000000000008152600a81018390528151602a9181900391909101812060009081526003602090815290839020805460026000196001831615610100020190911604601f81018390048302840183019094528383526060939091830182828015611ff25780601f10611fc757610100808354040283529160200191611ff2565b820191906000526020600020905b815481529060010190602001808311611fd557829003601f168201915b50505050509050919050565b604080517f6465706f736974735369676e65640000000000000000000000000000000000008152600e810193909352805192839003602e019092206000908152600460205291909120805491151560ff19909216919091179055565b604080517f6e756d4465706f736974735369676e65640000000000000000000000000000008152601181018390528151908190036031019020600090815260208190522054919050565b604080517f6e756d4465706f736974735369676e656400000000000000000000000000000081526011810193909352805192839003603101909220600090815260208190529190912055565b600082820183811015611b2557fe5b604080517f746f74616c45786563757465645065724461790000000000000000000000000081526013810193909352805192839003603301909220600090815260208190529190912055565b7f80000000000000000000000000000000000000000000000000000000000000001790565b604080517f6d65737361676573000000000000000000000000000000000000000000000000815260088101839052815160289181900391909101812060009081526003602090815290839020805460026000196001831615610100020190911604601f81018390048302840183019094528383526060939091830182828015611ff25780601f10611fc757610100808354040283529160200191611ff2565b5160741490565b6000806000808551604114151561222c57600080fd5b50505060208301516040840151606085015160016122498661264b565b60408051600080825260208083018085529490945260ff7f0100000000000000000000000000000000000000000000000000000000000000870416828401526060820188905260808201879052915160a08083019493601f198301938390039091019190865af11580156122c1573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b604080517f6e756d4d657373616765735369676e65640000000000000000000000000000008152601181018390528151908190036031019020600090815260208190522054919050565b604080517f6d6573736167657300000000000000000000000000000000000000000000000081526008810184905281519081900360280190206000908152600360209081529190208251612376928401906127ad565b505050565b604080517f6d657373616765735369676e65640000000000000000000000000000000000008152600e810193909352805192839003602e019092206000908152600460205291909120805491151560ff19909216919091179055565b604080517f7369676e617475726573000000000000000000000000000000000000000000008152600a8101849052815190819003602a0190206000908152600360209081529190208251612376928401906127ad565b604080517f6e756d4d657373616765735369676e656400000000000000000000000000000081526011810193909352805192839003603101909220600090815260208190529190912055565b604080517f746f74616c5370656e745065724461790000000000000000000000000000000081526010810193909352805192839003603001909220600090815260208190529190912055565b600160a060020a03811615156124da57600080fd5b604080517f657263363737746f6b656e0000000000000000000000000000000000000000008152815190819003600b01902060009081526002602052208054600160a060020a0390921673ffffffffffffffffffffffffffffffffffffffff19909216919091179055565b604080517f6973496e697469616c697a6564000000000000000000000000000000000000008152815190819003600d0190206000908152600460205220805491151560ff19909216919091179055565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06125be6113af565b60408051600160a060020a03928316815291841660208301528051918290030190a1604080517f6f776e65720000000000000000000000000000000000000000000000000000008152815190819003600501902060009081526002602052208054600160a060020a0390921673ffffffffffffffffffffffffffffffffffffffff19909216919091179055565b604080518082018252601a81527f19457468657265756d205369676e6564204d6573736167653a0a000000000000602080830191825283518085018552600381527f313136000000000000000000000000000000000000000000000000000000000091810191909152925182516000949284928492889282918083835b602083106126e75780518252601f1990920191602091820191016126c8565b51815160209384036101000a600019018019909216911617905286519190930192860191508083835b6020831061272f5780518252601f199092019160209182019101612710565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106127775780518252601f199092019160209182019101612758565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091209998505050505050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106127ee57805160ff191683800117855561281b565b8280016001018555821561281b579182015b8281111561281b578251825591602001919060010190612800565b5061282792915061282b565b5090565b61075e91905b8082111561282757600081556001016128315600a165627a7a7230582046a0cb3f75064bf56812f8f85a0564750a42554114188239e2481349e90bba7f0029
Deployed Bytecode
0x6080604052600436106101ea5763ffffffff60e060020a6000350416631812d99681146101ef57806318d8f9c91461027f57806326b3293f146102b0578063288b7ad8146102d95780632bd0bb0514610300578063392e53cd146103185780633e6968b6146103415780633f0a9f6514610356578063490a32c61461036b5780634fb3fef71461038357806359292ef31461039b578063630cea8e146103b057806363258462146103dc57806369ffa08a146103f4578063793040631461041b57806379f9cc7214610433578063857cfff91461044e5780638a2a60ef146104635780638da5cb5b146104785780638f4b4b981461048d5780639313dc43146104a557806399439089146104cc5780639a454b99146104e1578063a2a6ca27146104f6578063a4c0ed361461050e578063acf5c6891461053f578063b2355b4214610557578063bea7c13a1461056f578063bf1fe42014610584578063c4a1ee371461059c578063c6f6f216146105b1578063cbbc8a51146105c9578063df0ad3de146105e1578063df25f3f0146105f6578063ea9f49681461060b578063edbf4ac214610623578063f2fde38b14610659578063f426d8ac1461067a578063f91b853b14610692578063f968adbe146106a7578063fe173b97146106bc578063ffd19e8c146106d1575b600080fd5b3480156101fb57600080fd5b5061020a6004356024356106e9565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561024457818101518382015260200161022c565b50505050905090810190601f1680156102715780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561028b57600080fd5b50610294610716565b60408051600160a060020a039092168252519081900360200190f35b3480156102bc57600080fd5b506102d7600160a060020a0360043516602435604435610761565b005b3480156102e557600080fd5b506102ee610a8a565b60408051918252519081900360200190f35b34801561030c57600080fd5b506102ee600435610acb565b34801561032457600080fd5b5061032d610b15565b604080519115158252519081900360200190f35b34801561034d57600080fd5b506102ee610b59565b34801561036257600080fd5b506102ee610b62565b34801561037757600080fd5b5061020a600435610ba3565b34801561038f57600080fd5b506102ee600435610bb4565b3480156103a757600080fd5b506102ee610bfe565b3480156103bc57600080fd5b506102d76024600480358281019290820135918135918201910135610c3f565b3480156103e857600080fd5b506102d7600435610fd1565b34801561040057600080fd5b506102d7600160a060020a0360043581169060243516611040565b34801561042757600080fd5b5061032d6004356111fc565b34801561043f57600080fd5b506102d7600435602435611249565b34801561045a57600080fd5b506102ee61132d565b34801561046f57600080fd5b506102ee61136e565b34801561048457600080fd5b506102946113af565b34801561049957600080fd5b5061032d6004356113f9565b3480156104b157600080fd5b506102d7600160a060020a0360043581169060243516611446565b3480156104d857600080fd5b506102946114eb565b3480156104ed57600080fd5b506102ee611535565b34801561050257600080fd5b506102d7600435611576565b34801561051a57600080fd5b5061032d60048035600160a060020a03169060248035916044359182019101356115f9565b34801561054b57600080fd5b506102d7600435611714565b34801561056357600080fd5b506102d76004356117b3565b34801561057b57600080fd5b506102ee611845565b34801561059057600080fd5b506102d760043561184d565b3480156105a857600080fd5b506102ee6118ec565b3480156105bd57600080fd5b506102d760043561192d565b3480156105d557600080fd5b506102d760043561199c565b3480156105ed57600080fd5b50610294611a2e565b34801561060257600080fd5b506102ee611a9f565b34801561061757600080fd5b5061032d600435611ae0565b34801561062f57600080fd5b5061032d600160a060020a036004358116906024351660443560643560843560a43560c435611b2c565b34801561066557600080fd5b506102d7600160a060020a0360043516611d71565b34801561068657600080fd5b5061032d600435611dae565b34801561069e57600080fd5b506102d7611de6565b3480156106b357600080fd5b506102ee611e7e565b3480156106c857600080fd5b506102ee611ebf565b3480156106dd57600080fd5b5061032d600435611f00565b6040805183815260208101839052815190819003909101902060609061070e81611f28565b949350505050565b604080517f657263363737746f6b656e0000000000000000000000000000000000000000008152815190819003600b019020600090815260026020522054600160a060020a03165b90565b600080600061076e6114eb565b600160a060020a031663facd743b336040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b1580156107c857600080fd5b505af11580156107dc573d6000803e3d6000fd5b505050506040513d60208110156107f257600080fd5b505115156107ff57600080fd5b604080516c01000000000000000000000000600160a060020a038916810282526014808301899052603480840189905284519384900360540184203390930284529083018290529251918290039092019020909350915061085f85611dae565b151561086a57600080fd5b610873826111fc565b1561087d57600080fd5b610888826001611ffe565b6108918361205a565b905061089c81611f00565b156108a657600080fd5b6001016108b383826120a4565b60408051858152905133917f6a09111cb1bbfc898f36504afb4d5411d0dbef45f2c43fac5781e6b640b86a32919081900360200190a26108f16114eb565b600160a060020a0316638d0680436040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561092e57600080fd5b505af1158015610942573d6000803e3d6000fd5b505050506040513d602081101561095857600080fd5b50518110610a825761099061096b610b59565b61098b8761097f61097a610b59565b610bb4565b9063ffffffff6120f016565b6120ff565b6109a28361099d8361214b565b6120a4565b6109aa610716565b600160a060020a03166340c10f1987876040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b158015610a0c57600080fd5b505af1158015610a20573d6000803e3d6000fd5b505050506040513d6020811015610a3657600080fd5b505060408051600160a060020a03881681526020810187905280820186905290517f1a771fe656018364a9369da21954bb3081cb08b0196c27e43ca59c7cae8727379181900360600190a15b505050505050565b604080517f686f6d654d6178506572547800000000000000000000000000000000000000008152815190819003600c01902060009081526020819052205490565b604080517f746f74616c5370656e74506572446179000000000000000000000000000000008152601081018390528151908190036030019020600090815260208190522054919050565b604080517f6973496e697469616c697a6564000000000000000000000000000000000000008152815190819003600d01902060009081526004602052205460ff1690565b62015180420490565b604080517f7265717569726564426c6f636b436f6e6669726d6174696f6e730000000000008152815190819003601a01902060009081526020819052205490565b6060610bae82612170565b92915050565b604080517f746f74616c4578656375746564506572446179000000000000000000000000008152601381018390528151908190036033019020600090815260208190522054919050565b604080517f6761734c696d69744465706f73697452656c61790000000000000000000000008152815190819003601401902060009081526020819052205490565b600080600080610c4d6114eb565b600160a060020a031663facd743b336040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610ca757600080fd5b505af1158015610cbb573d6000803e3d6000fd5b505050506040513d6020811015610cd157600080fd5b50511515610cde57600080fd5b610d1786868080601f0160208091040260200160405190810160405280939291908181526020018383808284375061220f945050505050565b1515610d2257600080fd5b610d8988888080601f0160208091040260200160405190810160405280939291908181526020018383808284375050604080516020601f8e018190048102820181019092528c815294508c93508b9250829150840183828082843750612216945050505050565b600160a060020a03163314610d9d57600080fd5b858560405180838380828437604080519190930181900381206c0100000000000000000000000033028252601482018190529251908190036034019020919850909650610df093508792506122d6915050565b9150610dfb82611f00565b15610e0557600080fd5b600191820191821115610e2a57610e1b836113f9565b15610e2557600080fd5b610e64565b610e648487878080601f01602080910402602001604051908101604052809392919081815260200183838082843750612320945050505050565b610e6f83600161237b565b5060408051848152600019830160208083019190915282519182900383018220601f8a01829004820283018201909352888252610ec29183918b908b9081908401838280828437506123d7945050505050565b610ecc848361242d565b60408051858152905133917f962f785fc9b91edbed2fdad62c075258ee14d39bd29cd1e83c298a7bf26d5a65919081900360200190a2610f0a6114eb565b600160a060020a0316638d0680436040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610f4757600080fd5b505af1158015610f5b573d6000803e3d6000fd5b505050506040513d6020811015610f7157600080fd5b50518210610fc757610f8b84610f868461214b565b61242d565b604080513381526020810186905281517feb043d149eedb81369bec43d4c3a3a53087debc88d2525f13bfaa3eecda28b5c929181900390910190a15b5050505050505050565b610fd96113af565b600160a060020a03163314610fed57600080fd5b610ff561132d565b811061100057600080fd5b604080517f686f6d654d6178506572547800000000000000000000000000000000000000008152815190819003600c019020600090815260208190522055565b60008061104b611a2e565b600160a060020a0316331461105f57600080fd5b600160a060020a038316151561107457600080fd5b600160a060020a03841615156110c057604051600160a060020a03841690303180156108fc02916000818181858888f193505050501580156110ba573d6000803e3d6000fd5b506111f6565b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051859350600160a060020a038416916370a082319160248083019260209291908290030181600087803b15801561112457600080fd5b505af1158015611138573d6000803e3d6000fd5b505050506040513d602081101561114e57600080fd5b5051604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301526024820184905291519293509084169163a9059cbb916044808201926020929091908290030181600087803b1580156111bf57600080fd5b505af11580156111d3573d6000803e3d6000fd5b505050506040513d60208110156111e957600080fd5b505115156111f657600080fd5b50505050565b604080517f6465706f736974735369676e65640000000000000000000000000000000000008152600e8101839052815190819003602e01902060009081526004602052205460ff16919050565b6112516113af565b600160a060020a0316331461126557600080fd5b604080517f6761734c696d69744465706f73697452656c617900000000000000000000000081528151908190036014018120600090815260208181528382208690557f6761734c696d69745769746864726177436f6e6669726d0000000000000000008352835192839003601701909220815290819052208190557f3b49a33ec45179ab3408f6f29a2b208c909ab1460e94af7558808ea22854c106611309610bfe565b6113116118ec565b6040805192835260208301919091528051918290030190a15050565b604080517f686f6d654461696c794c696d69740000000000000000000000000000000000008152815190819003600e01902060009081526020819052205490565b604080517f666f726569676e4461696c794c696d69740000000000000000000000000000008152815190819003601101902060009081526020819052205490565b604080517f6f776e657200000000000000000000000000000000000000000000000000000081528151908190036005019020600090815260026020522054600160a060020a031690565b604080517f6d657373616765735369676e65640000000000000000000000000000000000008152600e8101839052815190819003602e01902060009081526004602052205460ff16919050565b61144e611a2e565b600160a060020a0316331461146257600080fd5b61146a610716565b604080517f69ffa08a000000000000000000000000000000000000000000000000000000008152600160a060020a0385811660048301528481166024830152915192909116916369ffa08a9160448082019260009290919082900301818387803b1580156114d757600080fd5b505af1158015610a82573d6000803e3d6000fd5b604080517f76616c696461746f72436f6e747261637400000000000000000000000000000081528151908190036011019020600090815260026020522054600160a060020a031690565b604080517f6465706c6f7965644174426c6f636b00000000000000000000000000000000008152815190819003600f01902060009081526020819052205490565b61157e6113af565b600160a060020a0316331461159257600080fd5b61159a61136e565b811080156115ae57506115ab611e7e565b81105b15156115b957600080fd5b604080517f6d696e506572547800000000000000000000000000000000000000000000000081528151908190036008019020600090815260208190522055565b6000611603610716565b600160a060020a0316331461161757600080fd5b61162084611ae0565b151561162b57600080fd5b61164f611636610b59565b61164a8661097f611645610b59565b610acb565b612479565b611657610716565b600160a060020a03166342966c68856040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561169f57600080fd5b505af11580156116b3573d6000803e3d6000fd5b505050507ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56885856116e2611845565b60408051600160a060020a039094168452602084019290925282820152519081900360600190a1506001949350505050565b61171c6113af565b600160a060020a0316331461173057600080fd5b6000811161173d57600080fd5b604080517f7265717569726564426c6f636b436f6e6669726d6174696f6e730000000000008152815190819003601a018120600090815260208181529083902084905583825291517f4fb76205cd57c896b21511d2114137d8e901b4ccd659e1a0f97d6306795264fb929181900390910190a150565b6117bb6113af565b600160a060020a031633146117cf57600080fd5b604080517f686f6d654461696c794c696d69740000000000000000000000000000000000008152815190819003600e018120600090815260208181529083902084905583825291517f7cbf6a47cd79c6fef9f0a89db1e9cdca2a3e93d84eae02a0232897b24524089e929181900390910190a150565b633b9aca0090565b6118556113af565b600160a060020a0316331461186957600080fd5b6000811161187657600080fd5b604080517f676173507269636500000000000000000000000000000000000000000000000081528151908190036008018120600090815260208181529083902084905583825291517f52264b89e0fceafb26e79fd49ef8a366eb6297483bf4035b027f0c99a7ad512e929181900390910190a150565b604080517f6761734c696d69745769746864726177436f6e6669726d0000000000000000008152815190819003601701902060009081526020819052205490565b6119356113af565b600160a060020a0316331461194957600080fd5b61195161136e565b811061195c57600080fd5b604080517f6d6178506572547800000000000000000000000000000000000000000000000081528151908190036008019020600090815260208190522055565b6119a46113af565b600160a060020a031633146119b857600080fd5b604080517f666f726569676e4461696c794c696d697400000000000000000000000000000081528151908190036011018120600090815260208181529083902084905583825291517f8d797628d21ca877e321aa59bc2d55eba59ae001c5294d433797019caebab2ab929181900390910190a150565b600030600160a060020a031663025313a26040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611a6e57600080fd5b505af1158015611a82573d6000803e3d6000fd5b505050506040513d6020811015611a9857600080fd5b5051905090565b604080517f6d696e50657254780000000000000000000000000000000000000000000000008152815190819003600801902060009081526020819052205490565b600080611af28361097f611645610b59565b905080611afd61136e565b10158015611b125750611b0e611e7e565b8311155b8015611b255750611b21611a9f565b8310155b9392505050565b6000611b36610b15565b15611b4057600080fd5b600160a060020a0388161515611b5557600080fd5b600084118015611b6457508385115b8015611b6f57508486115b1515611b7a57600080fd5b60008311611b8757600080fd5b604080517f76616c696461746f72436f6e74726163740000000000000000000000000000008152815190819003601101902060009081526002602052208054600160a060020a038a1673ffffffffffffffffffffffffffffffffffffffff19909116179055611bf5876124c5565b604080517f666f726569676e4461696c794c696d697400000000000000000000000000000081528151908190036011018120600090815260208181528382208a90557f6465706c6f7965644174426c6f636b00000000000000000000000000000000008352835192839003600f01832082528181528382204390557f6d6178506572547800000000000000000000000000000000000000000000000083528351928390036008908101842083528282528483208a90557f6d696e506572547800000000000000000000000000000000000000000000000084528451938490038101842083528282528483208990557f6761735072696365000000000000000000000000000000000000000000000000845284519384900301832082528181528382208790557f7265717569726564426c6f636b436f6e6669726d6174696f6e730000000000008352835192839003601a0190922081529081905220829055611d5d6001612545565b611d65610b15565b98975050505050505050565b611d796113af565b600160a060020a03163314611d8d57600080fd5b600160a060020a0381161515611da257600080fd5b611dab81612595565b50565b600080611dc08361097f61097a610b59565b905080611dcb61132d565b10158015611b255750611ddc610a8a565b9092111592915050565b6000611df06113af565b600160a060020a031614611e0357600080fd5b611e7c611e0e6114eb565b600160a060020a0316638da5cb5b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611e4b57600080fd5b505af1158015611e5f573d6000803e3d6000fd5b505050506040513d6020811015611e7557600080fd5b5051612595565b565b604080517f6d617850657254780000000000000000000000000000000000000000000000008152815190819003600801902060009081526020819052205490565b604080517f67617350726963650000000000000000000000000000000000000000000000008152815190819003600801902060009081526020819052205490565b7f80000000000000000000000000000000000000000000000000000000000000009081161490565b604080517f7369676e617475726573000000000000000000000000000000000000000000008152600a81018390528151602a9181900391909101812060009081526003602090815290839020805460026000196001831615610100020190911604601f81018390048302840183019094528383526060939091830182828015611ff25780601f10611fc757610100808354040283529160200191611ff2565b820191906000526020600020905b815481529060010190602001808311611fd557829003601f168201915b50505050509050919050565b604080517f6465706f736974735369676e65640000000000000000000000000000000000008152600e810193909352805192839003602e019092206000908152600460205291909120805491151560ff19909216919091179055565b604080517f6e756d4465706f736974735369676e65640000000000000000000000000000008152601181018390528151908190036031019020600090815260208190522054919050565b604080517f6e756d4465706f736974735369676e656400000000000000000000000000000081526011810193909352805192839003603101909220600090815260208190529190912055565b600082820183811015611b2557fe5b604080517f746f74616c45786563757465645065724461790000000000000000000000000081526013810193909352805192839003603301909220600090815260208190529190912055565b7f80000000000000000000000000000000000000000000000000000000000000001790565b604080517f6d65737361676573000000000000000000000000000000000000000000000000815260088101839052815160289181900391909101812060009081526003602090815290839020805460026000196001831615610100020190911604601f81018390048302840183019094528383526060939091830182828015611ff25780601f10611fc757610100808354040283529160200191611ff2565b5160741490565b6000806000808551604114151561222c57600080fd5b50505060208301516040840151606085015160016122498661264b565b60408051600080825260208083018085529490945260ff7f0100000000000000000000000000000000000000000000000000000000000000870416828401526060820188905260808201879052915160a08083019493601f198301938390039091019190865af11580156122c1573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b604080517f6e756d4d657373616765735369676e65640000000000000000000000000000008152601181018390528151908190036031019020600090815260208190522054919050565b604080517f6d6573736167657300000000000000000000000000000000000000000000000081526008810184905281519081900360280190206000908152600360209081529190208251612376928401906127ad565b505050565b604080517f6d657373616765735369676e65640000000000000000000000000000000000008152600e810193909352805192839003602e019092206000908152600460205291909120805491151560ff19909216919091179055565b604080517f7369676e617475726573000000000000000000000000000000000000000000008152600a8101849052815190819003602a0190206000908152600360209081529190208251612376928401906127ad565b604080517f6e756d4d657373616765735369676e656400000000000000000000000000000081526011810193909352805192839003603101909220600090815260208190529190912055565b604080517f746f74616c5370656e745065724461790000000000000000000000000000000081526010810193909352805192839003603001909220600090815260208190529190912055565b600160a060020a03811615156124da57600080fd5b604080517f657263363737746f6b656e0000000000000000000000000000000000000000008152815190819003600b01902060009081526002602052208054600160a060020a0390921673ffffffffffffffffffffffffffffffffffffffff19909216919091179055565b604080517f6973496e697469616c697a6564000000000000000000000000000000000000008152815190819003600d0190206000908152600460205220805491151560ff19909216919091179055565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e06125be6113af565b60408051600160a060020a03928316815291841660208301528051918290030190a1604080517f6f776e65720000000000000000000000000000000000000000000000000000008152815190819003600501902060009081526002602052208054600160a060020a0390921673ffffffffffffffffffffffffffffffffffffffff19909216919091179055565b604080518082018252601a81527f19457468657265756d205369676e6564204d6573736167653a0a000000000000602080830191825283518085018552600381527f313136000000000000000000000000000000000000000000000000000000000091810191909152925182516000949284928492889282918083835b602083106126e75780518252601f1990920191602091820191016126c8565b51815160209384036101000a600019018019909216911617905286519190930192860191508083835b6020831061272f5780518252601f199092019160209182019101612710565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106127775780518252601f199092019160209182019101612758565b5181516020939093036101000a600019018019909116921691909117905260405192018290039091209998505050505050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106127ee57805160ff191683800117855561281b565b8280016001018555821561281b579182015b8281111561281b578251825591602001919060010190612800565b5061282792915061282b565b5090565b61075e91905b8082111561282757600081556001016128315600a165627a7a7230582046a0cb3f75064bf56812f8f85a0564750a42554114188239e2481349e90bba7f0029
Swarm Source
bzzr://46a0cb3f75064bf56812f8f85a0564750a42554114188239e2481349e90bba7f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.