Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,126 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Add Funds | 6179586 | 2261 days ago | IN | 0.01 ETH | 0.00005353 | ||||
Delete Teller Mo... | 6104436 | 2273 days ago | IN | 0 ETH | 0.0028822 | ||||
Delete Teller Mo... | 6104427 | 2273 days ago | IN | 0 ETH | 0.0028822 | ||||
Delete Teller Mo... | 6104426 | 2273 days ago | IN | 0 ETH | 0.0028822 | ||||
Delete Teller Mo... | 6104424 | 2273 days ago | IN | 0 ETH | 0.0028822 | ||||
Delete Teller Mo... | 6104422 | 2273 days ago | IN | 0 ETH | 0.00101112 | ||||
Delete Teller Mo... | 6104420 | 2273 days ago | IN | 0 ETH | 0.0028822 | ||||
Delete Teller Mo... | 6104418 | 2273 days ago | IN | 0 ETH | 0.00288092 | ||||
Delete Teller Mo... | 6104417 | 2273 days ago | IN | 0 ETH | 0.0028822 | ||||
Delete Teller Mo... | 6104412 | 2273 days ago | IN | 0 ETH | 0.0028822 | ||||
Set Teller Moder... | 6104400 | 2273 days ago | IN | 0 ETH | 0.00179656 | ||||
Delete Shop Mods | 6103988 | 2273 days ago | IN | 0 ETH | 0.00102262 | ||||
Delete Shop Mods | 6103986 | 2273 days ago | IN | 0 ETH | 0.00102262 | ||||
Delete Shop Mods | 6103986 | 2273 days ago | IN | 0 ETH | 0.00102262 | ||||
Delete Shop Mods | 6103984 | 2273 days ago | IN | 0 ETH | 0.00102262 | ||||
Delete Shop Mods | 6103984 | 2273 days ago | IN | 0 ETH | 0.00102262 | ||||
Delete Shop Mods | 6103984 | 2273 days ago | IN | 0 ETH | 0.00102262 | ||||
Delete Shop Mods | 6103981 | 2273 days ago | IN | 0 ETH | 0.00102262 | ||||
Delete Shop Mods | 6103979 | 2273 days ago | IN | 0 ETH | 0.00102262 | ||||
Delete Shop Mods | 6103977 | 2273 days ago | IN | 0 ETH | 0.00102262 | ||||
Delete Shop Mods | 6103977 | 2273 days ago | IN | 0 ETH | 0.00102262 | ||||
Delete Shop Mods | 6103977 | 2273 days ago | IN | 0 ETH | 0.00102262 | ||||
Delete Shop Mods | 6103977 | 2273 days ago | IN | 0 ETH | 0.00102262 | ||||
Delete Shop Mods | 6103977 | 2273 days ago | IN | 0 ETH | 0.00102262 | ||||
Delete Shop Mods | 6103975 | 2273 days ago | IN | 0 ETH | 0.00102262 |
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers. Name tag integration is not available in advanced view.
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | ||||
---|---|---|---|---|---|---|---|
6269641 | 2245 days ago | 0 ETH | |||||
6269641 | 2245 days ago | 0 ETH | |||||
6269629 | 2245 days ago | 0 ETH | |||||
6269629 | 2245 days ago | 0 ETH | |||||
6179586 | 2261 days ago | 0.01 ETH | |||||
6167485 | 2263 days ago | 0 ETH | |||||
6167485 | 2263 days ago | 0 ETH | |||||
6167485 | 2263 days ago | 0 ETH | |||||
6167485 | 2263 days ago | 0 ETH | |||||
6104436 | 2273 days ago | 0 ETH | |||||
6104436 | 2273 days ago | 0 ETH | |||||
6104427 | 2273 days ago | 0 ETH | |||||
6104427 | 2273 days ago | 0 ETH | |||||
6104426 | 2273 days ago | 0 ETH | |||||
6104426 | 2273 days ago | 0 ETH | |||||
6104424 | 2273 days ago | 0 ETH | |||||
6104424 | 2273 days ago | 0 ETH | |||||
6104420 | 2273 days ago | 0 ETH | |||||
6104420 | 2273 days ago | 0 ETH | |||||
6104418 | 2273 days ago | 0 ETH | |||||
6104418 | 2273 days ago | 0 ETH | |||||
6104417 | 2273 days ago | 0 ETH | |||||
6104417 | 2273 days ago | 0 ETH | |||||
6104412 | 2273 days ago | 0 ETH | |||||
6104412 | 2273 days ago | 0 ETH |
Loading...
Loading
Contract Name:
DetherCore
Compiler Version
v0.4.23+commit.124ca40d
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2018-06-17 */ contract Certifier { event Confirmed(address indexed who); event Revoked(address indexed who); function certified(address _who) view public returns (bool); } /// @title Contract that supports the receival of ERC223 tokens. contract ERC223ReceivingContract { /// @dev Standard ERC223 function that will handle incoming token transfers. /// @param _from Token sender address. /// @param _value Amount of tokens. /// @param _data Transaction metadata. function tokenFallback(address _from, uint _value, bytes _data) public; } contract 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; } } 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); } contract ERC223Basic is ERC20Basic { /** * @dev Transfer the specified amount of tokens to the specified address. * Now with a new parameter _data. * * @param _to Receiver address. * @param _value Amount of tokens that will be transferred. * @param _data Transaction metadata. */ function transfer(address _to, uint _value, bytes _data) public returns (bool); /** * @dev triggered when transfer is successfully called. * * @param _from Sender address. * @param _to Receiver address. * @param _value Amount of tokens that will be transferred. * @param _data Transaction metadata. */ event Transfer(address indexed _from, address indexed _to, uint256 indexed _value, bytes _data); } contract DetherAccessControl { // This facet controls access control for Dether. There are four roles managed here: // // - The CEO: The CEO can reassign other roles and change the addresses of our dependent smart // contracts. It is also the only role that can unpause the smart contract. // // - The CMO: The CMO is in charge to open or close activity in zone // // It should be noted that these roles are distinct without overlap in their access abilities, the // abilities listed for each role above are exhaustive. In particular, while the CEO can assign any // address to any role, the CEO address itself doesn't have the ability to act in those roles. This // restriction is intentional so that we aren't tempted to use the CEO address frequently out of // convenience. The less we use an address, the less likely it is that we somehow compromise the // account. /// @dev Emited when contract is upgraded event ContractUpgrade(address newContract); // The addresses of the accounts (or contracts) that can execute actions within each roles. address public ceoAddress; address public cmoAddress; address public csoAddress; // CHIEF SHOP OFFICER address public cfoAddress; // CHIEF FINANCIAL OFFICER mapping (address => bool) public shopModerators; // centralised moderator, would become decentralised mapping (address => bool) public tellerModerators; // centralised moderator, would become decentralised // @dev Keeps track whether the contract is paused. When that is true, most actions are blocked bool public paused = false; /// @dev Access modifier for CEO-only functionality modifier onlyCEO() { require(msg.sender == ceoAddress); _; } /// @dev Access modifier for CMO-only functionality modifier onlyCMO() { require(msg.sender == cmoAddress); _; } modifier onlyCSO() { require(msg.sender == csoAddress); _; } modifier onlyCFO() { require(msg.sender == cfoAddress); _; } modifier isShopModerator(address _user) { require(shopModerators[_user]); _; } modifier isTellerModerator(address _user) { require(tellerModerators[_user]); _; } /// @dev Assigns a new address to act as the CEO. Only available to the current CEO. /// @param _newCEO The address of the new CEO function setCEO(address _newCEO) external onlyCEO { require(_newCEO != address(0)); ceoAddress = _newCEO; } /// @dev Assigns a new address to act as the CMO. Only available to the current CEO. /// @param _newCMO The address of the new CMO function setCMO(address _newCMO) external onlyCEO { require(_newCMO != address(0)); cmoAddress = _newCMO; } function setCSO(address _newCSO) external onlyCEO { require(_newCSO != address(0)); csoAddress = _newCSO; } function setCFO(address _newCFO) external onlyCEO { require(_newCFO != address(0)); cfoAddress = _newCFO; } function setShopModerator(address _moderator) external onlyCEO { require(_moderator != address(0)); shopModerators[_moderator] = true; } function removeShopModerator(address _moderator) external onlyCEO { shopModerators[_moderator] = false; } function setTellerModerator(address _moderator) external onlyCEO { require(_moderator != address(0)); tellerModerators[_moderator] = true; } function removeTellerModerator(address _moderator) external onlyCEO { tellerModerators[_moderator] = false; } /*** Pausable functionality adapted from OpenZeppelin ***/ /// @dev Modifier to allow actions only when the contract IS NOT paused modifier whenNotPaused() { require(!paused); _; } /// @dev Modifier to allow actions only when the contract IS paused modifier whenPaused { require(paused); _; } /// @dev Called by any "C-level" role to pause the contract. Used only when /// a bug or exploit is detected and we need to limit damage. function pause() external onlyCEO whenNotPaused { paused = true; } /// @dev Unpauses the smart contract. Can only be called by the CEO, since /// one reason we may pause the contract is when CMO account are /// compromised. /// @notice This is public rather than external so it can be called by /// derived contracts. function unpause() public onlyCEO whenPaused { // can't unpause if contract was upgraded paused = false; } } contract DetherSetup is DetherAccessControl { bool public run1 = false; bool public run2 = false; // -Need to be whitelisted to be able to register in the contract as a shop or // teller, there is two level of identification. // -This identification method are now centralised and processed by dether, but // will be decentralised soon Certifier public smsCertifier; Certifier public kycCertifier; // Zone need to be open by the CMO before accepting registration // The bytes2 parameter wait for a country ID (ex: FR (0x4652 in hex) for france cf:README) mapping(bytes2 => bool) public openedCountryShop; mapping(bytes2 => bool) public openedCountryTeller; // For registering in a zone you need to stake DTH // The price can differ by country // Uts now a fixed price by the CMO but the price will adjusted automatically // regarding different factor in the futur smart contract mapping(bytes2 => uint) public licenceShop; mapping(bytes2 => uint) public licenceTeller; modifier tier1(address _user) { require(smsCertifier.certified(_user)); _; } modifier tier2(address _user) { require(kycCertifier.certified(_user)); _; } modifier isZoneShopOpen(bytes2 _country) { require(openedCountryShop[_country]); _; } modifier isZoneTellerOpen(bytes2 _country) { require(openedCountryTeller[_country]); _; } function isTier1(address _user) public view returns(bool) { return smsCertifier.certified(_user); } function isTier2(address _user) public view returns(bool) { return kycCertifier.certified(_user); } /** * INIT */ function setSmsCertifier (address _smsCertifier) external onlyCEO { require(!run1); smsCertifier = Certifier(_smsCertifier); run1 = true; } /** * CORE FUNCTION */ function setKycCertifier (address _kycCertifier) external onlyCEO { require(!run2); kycCertifier = Certifier(_kycCertifier); run2 = true; } function setLicenceShopPrice(bytes2 country, uint price) external onlyCMO { licenceShop[country] = price; } function setLicenceTellerPrice(bytes2 country, uint price) external onlyCMO { licenceTeller[country] = price; } function openZoneShop(bytes2 _country) external onlyCMO { openedCountryShop[_country] = true; } function closeZoneShop(bytes2 _country) external onlyCMO { openedCountryShop[_country] = false; } function openZoneTeller(bytes2 _country) external onlyCMO { openedCountryTeller[_country] = true; } function closeZoneTeller(bytes2 _country) external onlyCMO { openedCountryTeller[_country] = false; } } library BytesLib { function concat(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bytes) { bytes memory tempBytes; assembly { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // Store the length of the first bytes array at the beginning of // the memory for tempBytes. let length := mload(_preBytes) mstore(tempBytes, length) // Maintain a memory counter for the current write location in the // temp bytes array by adding the 32 bytes for the array length to // the starting location. let mc := add(tempBytes, 0x20) // Stop copying when the memory counter reaches the length of the // first bytes array. let end := add(mc, length) for { // Initialize a copy counter to the start of the _preBytes data, // 32 bytes into its memory. let cc := add(_preBytes, 0x20) } lt(mc, end) { // Increase both counters by 32 bytes each iteration. mc := add(mc, 0x20) cc := add(cc, 0x20) } { // Write the _preBytes data into the tempBytes memory 32 bytes // at a time. mstore(mc, mload(cc)) } // Add the length of _postBytes to the current length of tempBytes // and store it as the new length in the first 32 bytes of the // tempBytes memory. length := mload(_postBytes) mstore(tempBytes, add(length, mload(tempBytes))) // Move the memory counter back from a multiple of 0x20 to the // actual end of the _preBytes data. mc := end // Stop copying when the memory counter reaches the new combined // length of the arrays. end := add(mc, length) for { let cc := add(_postBytes, 0x20) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } // Update the free-memory pointer by padding our last write location // to 32 bytes: add 31 bytes to the end of tempBytes to move to the // next 32 byte block, then round down to the nearest multiple of // 32. If the sum of the length of the two arrays is zero then add // one before rounding down to leave a blank 32 bytes (the length block with 0). mstore(0x40, and( add(add(end, iszero(add(length, mload(_preBytes)))), 31), not(31) // Round down to the nearest 32 bytes. )) } return tempBytes; } function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal { assembly { // Read the first 32 bytes of _preBytes storage, which is the length // of the array. (We don't need to use the offset into the slot // because arrays use the entire slot.) let fslot := sload(_preBytes_slot) // Arrays of 31 bytes or less have an even value in their slot, // while longer arrays have an odd value. The actual length is // the slot divided by two for odd values, and the lowest order // byte divided by two for even values. // If the slot is even, bitwise and the slot with 255 and divide by // two to get the length. If the slot is odd, bitwise and the slot // with -1 and divide by two. let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2) let mlength := mload(_postBytes) let newlength := add(slength, mlength) // slength can contain both the length and contents of the array // if length < 32 bytes so let's prepare for that // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage switch add(lt(slength, 32), lt(newlength, 32)) case 2 { // Since the new array still fits in the slot, we just need to // update the contents of the slot. // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length sstore( _preBytes_slot, // all the modifications to the slot are inside this // next block add( // we can just add to the slot contents because the // bytes we want to change are the LSBs fslot, add( mul( div( // load the bytes from memory mload(add(_postBytes, 0x20)), // zero all bytes to the right exp(0x100, sub(32, mlength)) ), // and now shift left the number of bytes to // leave space for the length in the slot exp(0x100, sub(32, newlength)) ), // increase length by the double of the memory // bytes length mul(mlength, 2) ) ) ) } case 1 { // The stored value fits in the slot, but the combined value // will exceed it. // get the keccak hash to get the contents of the array mstore(0x0, _preBytes_slot) let sc := add(keccak256(0x0, 0x20), div(slength, 32)) // save new length sstore(_preBytes_slot, add(mul(newlength, 2), 1)) // The contents of the _postBytes array start 32 bytes into // the structure. Our first read should obtain the `submod` // bytes that can fit into the unused space in the last word // of the stored array. To get this, we read 32 bytes starting // from `submod`, so the data we read overlaps with the array // contents by `submod` bytes. Masking the lowest-order // `submod` bytes allows us to add that value directly to the // stored value. let submod := sub(32, slength) let mc := add(_postBytes, submod) let end := add(_postBytes, mlength) let mask := sub(exp(0x100, submod), 1) sstore( sc, add( and( fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00 ), and(mload(mc), mask) ) ) for { mc := add(mc, 0x20) sc := add(sc, 1) } lt(mc, end) { sc := add(sc, 1) mc := add(mc, 0x20) } { sstore(sc, mload(mc)) } mask := exp(0x100, sub(mc, end)) sstore(sc, mul(div(mload(mc), mask), mask)) } default { // get the keccak hash to get the contents of the array mstore(0x0, _preBytes_slot) // Start copying to the last used word of the stored array. let sc := add(keccak256(0x0, 0x20), div(slength, 32)) // save new length sstore(_preBytes_slot, add(mul(newlength, 2), 1)) // Copy over the first `submod` bytes of the new data as in // case 1 above. let slengthmod := mod(slength, 32) let mlengthmod := mod(mlength, 32) let submod := sub(32, slengthmod) let mc := add(_postBytes, submod) let end := add(_postBytes, mlength) let mask := sub(exp(0x100, submod), 1) sstore(sc, add(sload(sc), and(mload(mc), mask))) for { sc := add(sc, 1) mc := add(mc, 0x20) } lt(mc, end) { sc := add(sc, 1) mc := add(mc, 0x20) } { sstore(sc, mload(mc)) } mask := exp(0x100, sub(mc, end)) sstore(sc, mul(div(mload(mc), mask), mask)) } } } function slice(bytes _bytes, uint _start, uint _length) internal pure returns (bytes) { require(_bytes.length >= (_start + _length)); bytes memory tempBytes; assembly { switch iszero(_length) case 0 { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // The first word of the slice result is potentially a partial // word read from the original array. To read it, we calculate // the length of that partial word and start copying that many // bytes into the array. The first word we copy will start with // data we don't care about, but the last `lengthmod` bytes will // land at the beginning of the contents of the new array. When // we're done copying, we overwrite the full first word with // the actual length of the slice. let lengthmod := and(_length, 31) // The multiplication in the next line is necessary // because when slicing multiples of 32 bytes (lengthmod == 0) // the following copy loop was copying the origin's length // and then ending prematurely not copying everything it should. let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod))) let end := add(mc, _length) for { // The multiplication in the next line has the same exact purpose // as the one above. let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } mstore(tempBytes, _length) //update free-memory pointer //allocating the array padded to 32 bytes like the compiler does now mstore(0x40, and(add(mc, 31), not(31))) } //if we want a zero-length slice let's just return a zero-length array default { tempBytes := mload(0x40) mstore(0x40, add(tempBytes, 0x20)) } } return tempBytes; } function toAddress(bytes _bytes, uint _start) internal pure returns (address) { require(_bytes.length >= (_start + 20)); address tempAddress; assembly { tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000) } return tempAddress; } function toUint(bytes _bytes, uint _start) internal pure returns (uint256) { require(_bytes.length >= (_start + 32)); uint256 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x20), _start)) } return tempUint; } function toBytes32(bytes _bytes, uint _start) internal pure returns (bytes32) { require(_bytes.length >= (_start + 32)); bytes32 tempBytes32; assembly { tempBytes32 := mload(add(add(_bytes, 0x20), _start)) } return tempBytes32; } function toBytes16(bytes _bytes, uint _start) internal pure returns (bytes16) { require(_bytes.length >= (_start + 16)); bytes16 tempBytes16; assembly { tempBytes16 := mload(add(add(_bytes, 0x20), _start)) } return tempBytes16; } function toBytes2(bytes _bytes, uint _start) internal pure returns (bytes2) { require(_bytes.length >= (_start + 2)); bytes2 tempBytes2; assembly { tempBytes2 := mload(add(add(_bytes, 0x20), _start)) } return tempBytes2; } function toBytes4(bytes _bytes, uint _start) internal pure returns (bytes4) { require(_bytes.length >= (_start + 4)); bytes4 tempBytes4; assembly { tempBytes4 := mload(add(add(_bytes, 0x20), _start)) } return tempBytes4; } function toBytes1(bytes _bytes, uint _start) internal pure returns (bytes1) { require(_bytes.length >= (_start + 1)); bytes1 tempBytes1; assembly { tempBytes1 := mload(add(add(_bytes, 0x20), _start)) } return tempBytes1; } function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) { bool success = true; assembly { let length := mload(_preBytes) // if lengths don't match the arrays are not equal switch eq(length, mload(_postBytes)) case 1 { // cb is a circuit breaker in the for loop since there's // no said feature for inline assembly loops // cb = 1 - don't breaker // cb = 0 - break let cb := 1 let mc := add(_preBytes, 0x20) let end := add(mc, length) for { let cc := add(_postBytes, 0x20) // the next line is the loop condition: // while(uint(mc < end) + cb == 2) } eq(add(lt(mc, end), cb), 2) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { // if any of these checks fails then arrays are not equal if iszero(eq(mload(mc), mload(cc))) { // unsuccess: success := 0 cb := 0 } } } default { // unsuccess: success := 0 } } return success; } function equalStorage(bytes storage _preBytes, bytes memory _postBytes) internal view returns (bool) { bool success = true; assembly { // we know _preBytes_offset is 0 let fslot := sload(_preBytes_slot) // Decode the length of the stored array like in concatStorage(). let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2) let mlength := mload(_postBytes) // if lengths don't match the arrays are not equal switch eq(slength, mlength) case 1 { // slength can contain both the length and contents of the array // if length < 32 bytes so let's prepare for that // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage if iszero(iszero(slength)) { switch lt(slength, 32) case 1 { // blank the last byte which is the length fslot := mul(div(fslot, 0x100), 0x100) if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) { // unsuccess: success := 0 } } default { // cb is a circuit breaker in the for loop since there's // no said feature for inline assembly loops // cb = 1 - don't breaker // cb = 0 - break let cb := 1 // get the keccak hash to get the contents of the array mstore(0x0, _preBytes_slot) let sc := keccak256(0x0, 0x20) let mc := add(_postBytes, 0x20) let end := add(mc, mlength) // the next line is the loop condition: // while(uint(mc < end) + cb == 2) for {} eq(add(lt(mc, end), cb), 2) { sc := add(sc, 1) mc := add(mc, 0x20) } { if iszero(eq(sload(sc), mload(mc))) { // unsuccess: success := 0 cb := 0 } } } } } default { // unsuccess: success := 0 } } return success; } } contract ExchangeRateOracle { function getWeiPriceOneUsd() external view returns(uint256); } // only interface to save gas contract DetherBank { function withdrawDthTeller(address _receiver) external; function withdrawDthShop(address _receiver) external; function withdrawDthShopAdmin(address _from, address _receiver) external; function addTokenShop(address _from, uint _value) external; function addTokenTeller(address _from, uint _value) external; function addEthTeller(address _from, uint _value) external payable returns (bool); function withdrawEth(address _from, address _to, uint _amount) external; function refundEth(address _from) external; function getDthTeller(address _user) public view returns (uint); function getDthShop(address _user) public view returns (uint); function getEthBalTeller(address _user) public view returns (uint); function getWeiSoldToday(address _user) public view returns (uint256 weiSoldToday); function transferOwnership(address newOwner) public; } contract DetherCore is DetherSetup, ERC223ReceivingContract, SafeMath { using BytesLib for bytes; /** * Event */ // when a Teller is registered event RegisterTeller(address indexed tellerAddress); // when a teller is deleted event DeleteTeller(address indexed tellerAddress); // when teller update event UpdateTeller(address indexed tellerAddress); // when a teller send to a buyer event Sent(address indexed _from, address indexed _to, uint amount); // when a shop register event RegisterShop(address shopAddress); // when a shop delete event DeleteShop(address shopAddress); // when a moderator delete a shop event DeleteShopModerator(address indexed moderator, address shopAddress); // when a moderator delete a teller event DeleteTellerModerator(address indexed moderator, address tellerAddress); /** * Modifier */ // if teller has staked enough dth to modifier tellerHasStaked(uint amount) { require(bank.getDthTeller(msg.sender) >= amount); _; } // if shop has staked enough dth to modifier shopHasStaked(uint amount) { require(bank.getDthShop(msg.sender) >= amount); _; } /* * External contract */ // DTH contract ERC223Basic public dth; // bank contract where are stored ETH and DTH DetherBank public bank; ExchangeRateOracle public priceOracle; // teller struct struct Teller { int32 lat; // Latitude int32 lng; // Longitude bytes2 countryId; // countryID (in hexa), ISO ALPHA 2 https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 bytes16 postalCode; // postalCode if present, in Hexa https://en.wikipedia.org/wiki/List_of_postal_codes int8 currencyId; // 1 - 100 , cf README bytes16 messenger; // telegrame nickname int8 avatarId; // 1 - 100 , regarding the front-end app you use int16 rates; // margin of tellers , -999 - +9999 , corresponding to -99,9% x 10 , 999,9% x 10 bool buyer; // appear as a buyer as well on the map int16 buyRates; // margin of tellers of uint zoneIndex; // index of the zone mapping uint generalIndex; // index of general mapping bool online; // switch online/offline, if the tellers want to be inactive without deleting his point } mapping(address => mapping(address => uint)) internal pairSellsLoyaltyPerc; // from to percentage of loyalty points from gets /* * Reputation field V0.1 * Reputation is based on volume sell, volume buy, and number of transaction */ mapping(address => uint) volumeBuy; mapping(address => uint) volumeSell; mapping(address => uint) nbTrade; mapping(address => uint256) loyaltyPoints; // general mapping of teller mapping(address => Teller) teller; // mappoing of teller by COUNTRYCODE => POSTALCODE mapping(bytes2 => mapping(bytes16 => address[])) tellerInZone; // teller array currently registered address[] public tellerIndex; // unordered list of teller register on it bool isStarted = false; // shop struct struct Shop { int32 lat; // latitude int32 lng; // longitude bytes2 countryId; // countryID (in hexa char), ISO ALPHA 2 https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 bytes16 postalCode; // postalCode if present (in hexa char), in Hexa https://en.wikipedia.org/wiki/List_of_postal_codes bytes16 cat; // Category of the shop (in hex char), will be used later for search engine and auction by zone bytes16 name; // name of the shop (in hex char) bytes32 description; // description of the shop bytes16 opening; // opening hours, cf README for the format uint zoneIndex; // index of the zone mapping uint generalIndex; // index of general mapping bool detherShop; // bool if shop is registered by dether as business partnership (still required DTH) } // general mapping of shop mapping(address => Shop) shop; // mapping of teller by COUNTRYCODE => POSTALCODE mapping(bytes2 => mapping(bytes16 => address[])) shopInZone; // shop array currently registered address[] public shopIndex; // unordered list of shop register on it /* * Instanciation */ function DetherCore() { ceoAddress = msg.sender; } function initContract (address _dth, address _bank) external onlyCEO { require(!isStarted); dth = ERC223Basic(_dth); bank = DetherBank(_bank); isStarted = true; } function setPriceOracle (address _priceOracle) external onlyCFO { priceOracle = ExchangeRateOracle(_priceOracle); } /** * Core fonction */ /** * @dev Standard ERC223 function that will handle incoming token transfers. * This is the main function to register SHOP or TELLER, its calling when you * send token to the DTH contract and by passing data as bytes on the third * parameter. * Its not supposed to be use on its own but will only handle incoming DTH * transaction. * The _data will wait for * [1st byte] 1 (0x31) for shop OR 2 (0x32) for teller * FOR SHOP AND TELLER: * 2sd to 5th bytes lat * 6th to 9th bytes lng * ... * Modifier tier1: Check if address is whitelisted with the sms verification */ function tokenFallback(address _from, uint _value, bytes _data) whenNotPaused tier1(_from ) { // require than the token fallback is triggered from the dth token contract require(msg.sender == address(dth)); // check first byte to know if its shop or teller registration // 1 / 0x31 = shop // 2 / 0x32 = teller bytes1 _func = _data.toBytes1(0); int32 posLat = _data.toBytes1(1) == bytes1(0x01) ? int32(_data.toBytes4(2)) * -1 : int32(_data.toBytes4(2)); int32 posLng = _data.toBytes1(6) == bytes1(0x01) ? int32(_data.toBytes4(7)) * -1 : int32(_data.toBytes4(7)); if (_func == bytes1(0x31)) { // shop registration // GAS USED 311000 // require staked greater than licence price require(_value >= licenceShop[_data.toBytes2(11)]); // require its not already shop require(!isShop(_from)); // require zone is open require(openedCountryShop[_data.toBytes2(11)]); shop[_from].lat = posLat; shop[_from].lng = posLng; shop[_from].countryId = _data.toBytes2(11); shop[_from].postalCode = _data.toBytes16(13); shop[_from].cat = _data.toBytes16(29); shop[_from].name = _data.toBytes16(45); shop[_from].description = _data.toBytes32(61); shop[_from].opening = _data.toBytes16(93); shop[_from].generalIndex = shopIndex.push(_from) - 1; shop[_from].zoneIndex = shopInZone[_data.toBytes2(11)][_data.toBytes16(13)].push(_from) - 1; emit RegisterShop(_from); bank.addTokenShop(_from,_value); dth.transfer(address(bank), _value); } else if (_func == bytes1(0x32)) { // teller registration -- GAS USED 310099 // require staked greater than licence price require(_value >= licenceTeller[_data.toBytes2(11)]); // require is not already a teller require(!isTeller(_from)); // require zone is open require(openedCountryTeller[_data.toBytes2(11)]); teller[_from].lat = posLat; teller[_from].lng = posLng; teller[_from].countryId = _data.toBytes2(11); teller[_from].postalCode = _data.toBytes16(13); teller[_from].avatarId = int8(_data.toBytes1(29)); teller[_from].currencyId = int8(_data.toBytes1(30)); teller[_from].messenger = _data.toBytes16(31); teller[_from].rates = int16(_data.toBytes2(47)); teller[_from].buyer = _data.toBytes1(49) == bytes1(0x01) ? true : false; teller[_from].buyRates = int16(_data.toBytes2(50)); teller[_from].generalIndex = tellerIndex.push(_from) - 1; teller[_from].zoneIndex = tellerInZone[_data.toBytes2(11)][_data.toBytes16(13)].push(_from) - 1; teller[_from].online = true; emit RegisterTeller(_from); bank.addTokenTeller(_from, _value); dth.transfer(address(bank), _value); } else if (_func == bytes1(0x33)) { // shop bulk registration // We need to have the possibility to register in bulk some shop // For big retailer company willing to be listed on dether, we need to have a way to add // all their shop from one address // This functionnality will become available for anyone willing to list multiple shop // in the futures contract // Only the CSO should be able to register shop in bulk require(_from == csoAddress); // Each shop still need his own staking require(_value >= licenceShop[_data.toBytes2(11)]); // require the addresses not already registered require(!isShop(address(_data.toAddress(109)))); // require zone is open require(openedCountryShop[_data.toBytes2(11)]); address newShopAddress = _data.toAddress(109); shop[newShopAddress].lat = posLat; shop[newShopAddress].lng = posLng; shop[newShopAddress].countryId = _data.toBytes2(11); shop[newShopAddress].postalCode = _data.toBytes16(13); shop[newShopAddress].cat = _data.toBytes16(29); shop[newShopAddress].name = _data.toBytes16(45); shop[newShopAddress].description = _data.toBytes32(61); shop[newShopAddress].opening = _data.toBytes16(93); shop[newShopAddress].generalIndex = shopIndex.push(newShopAddress) - 1; shop[newShopAddress].zoneIndex = shopInZone[_data.toBytes2(11)][_data.toBytes16(13)].push(newShopAddress) - 1; shop[newShopAddress].detherShop = true; emit RegisterShop(newShopAddress); bank.addTokenShop(newShopAddress, _value); dth.transfer(address(bank), _value); } } /** * a teller can update his profile * If a teller want to change his location, he would need to delete and recreate * a new point */ function updateTeller( int8 currencyId, bytes16 messenger, int8 avatarId, int16 rates, bool online ) public payable { require(isTeller(msg.sender)); if (currencyId != teller[msg.sender].currencyId) teller[msg.sender].currencyId = currencyId; if (teller[msg.sender].messenger != messenger) teller[msg.sender].messenger = messenger; if (teller[msg.sender].avatarId != avatarId) teller[msg.sender].avatarId = avatarId; if (teller[msg.sender].rates != rates) teller[msg.sender].rates = rates; if (teller[msg.sender].online != online) teller[msg.sender].online = online; if (msg.value > 0) { bank.addEthTeller.value(msg.value)(msg.sender, msg.value); } emit UpdateTeller(msg.sender); } // mapping for limiting the sell amount // tier countryId usdDailyLimit mapping(uint => mapping (bytes2 => uint)) limitTier; function setSellDailyLimit(uint _tier, bytes2 _countryId, uint256 _limitUsd) public onlyCFO { limitTier[_tier][_countryId] = _limitUsd; } function getSellDailyLimit(uint _tier, bytes2 _countryId) public view returns(uint256 limitUsd) { limitUsd = limitTier[_tier][_countryId]; } modifier doesNotExceedDailySellLimit(address _teller, uint256 _weiSellAmount) { // limits are set per country bytes2 countryId = teller[_teller].countryId; // user is always tier1, and could be tier2 uint256 usdDailyLimit = getSellDailyLimit(isTier2(_teller) ? 2 : 1, countryId); // weiPriceOneUsd is set by the oracle (which runs every day at midnight) uint256 weiDailyLimit = SafeMath.mul(priceOracle.getWeiPriceOneUsd(), usdDailyLimit); // with each sell we update wei sold today for that user inside the Bank contract uint256 weiSoldToday = bank.getWeiSoldToday(_teller); uint256 newWeiSoldToday = SafeMath.add(weiSoldToday, _weiSellAmount); // we may not exceed the daily wei limit with this sell require(newWeiSoldToday <= weiDailyLimit); _; } function getPairSellLoyaltyPerc(address _from, address _to) public view returns(uint256) { return pairSellsLoyaltyPerc[_from][_to]; } function getLoyaltyPoints(address who) public view returns (uint256) { return loyaltyPoints[who]; } /** * SellEth * average gas cost: 123173 * @param _to -> the address for the receiver * @param _amount -> the amount to send */ function sellEth(address _to, uint _amount) whenNotPaused doesNotExceedDailySellLimit(msg.sender, _amount) external { require(isTeller(msg.sender)); require(_to != msg.sender); // send eth to the receiver from the bank contract // this will also update eth amount sold 'today' by msg.sender bank.withdrawEth(msg.sender, _to, _amount); // increase reput for the buyer and the seller Only if the buyer is also whitelisted, // It's a way to incentive user to trade on the system if (smsCertifier.certified(_to)) { uint currentSellerLoyaltyPointsPerc = pairSellsLoyaltyPerc[msg.sender][_to]; if (currentSellerLoyaltyPointsPerc == 0) { // this is the first sell between seller and buyer, set to 100% pairSellsLoyaltyPerc[msg.sender][_to] = 10000; currentSellerLoyaltyPointsPerc = 10000; } // add percentage of loyaltyPoints of this sell to seller's loyaltyPoints loyaltyPoints[msg.sender] = SafeMath.add(loyaltyPoints[msg.sender], SafeMath.mul(_amount, currentSellerLoyaltyPointsPerc) / 10000); // update the loyaltyPoints percentage of the seller, there will be a 21% decrease with every sell to the same buyer (100 - 21 = 79) pairSellsLoyaltyPerc[msg.sender][_to] = SafeMath.mul(currentSellerLoyaltyPointsPerc, 79) / 100; volumeBuy[_to] = SafeMath.add(volumeBuy[_to], _amount); volumeSell[msg.sender] = SafeMath.add(volumeSell[msg.sender], _amount); nbTrade[msg.sender] += 1; } emit Sent(msg.sender, _to, _amount); } /** * switchStatus * Turn status teller on/off */ function switchStatus(bool _status) external { if (teller[msg.sender].online != _status) teller[msg.sender].online = _status; } /** * addFunds * teller can add more funds on his sellpoint */ function addFunds() external payable { require(isTeller(msg.sender)); require(bank.addEthTeller.value(msg.value)(msg.sender, msg.value)); } // gas used 67841 // a teller can delete a sellpoint function deleteTeller() external { require(isTeller(msg.sender)); uint rowToDelete1 = teller[msg.sender].zoneIndex; address keyToMove1 = tellerInZone[teller[msg.sender].countryId][teller[msg.sender].postalCode][tellerInZone[teller[msg.sender].countryId][teller[msg.sender].postalCode].length - 1]; tellerInZone[teller[msg.sender].countryId][teller[msg.sender].postalCode][rowToDelete1] = keyToMove1; teller[keyToMove1].zoneIndex = rowToDelete1; tellerInZone[teller[msg.sender].countryId][teller[msg.sender].postalCode].length--; uint rowToDelete2 = teller[msg.sender].generalIndex; address keyToMove2 = tellerIndex[tellerIndex.length - 1]; tellerIndex[rowToDelete2] = keyToMove2; teller[keyToMove2].generalIndex = rowToDelete2; tellerIndex.length--; delete teller[msg.sender]; bank.withdrawDthTeller(msg.sender); bank.refundEth(msg.sender); emit DeleteTeller(msg.sender); } // gas used 67841 // A moderator can delete a sellpoint function deleteTellerMods(address _toDelete) isTellerModerator(msg.sender) external { require(isTeller(_toDelete)); uint rowToDelete1 = teller[_toDelete].zoneIndex; address keyToMove1 = tellerInZone[teller[_toDelete].countryId][teller[_toDelete].postalCode][tellerInZone[teller[_toDelete].countryId][teller[_toDelete].postalCode].length - 1]; tellerInZone[teller[_toDelete].countryId][teller[_toDelete].postalCode][rowToDelete1] = keyToMove1; teller[keyToMove1].zoneIndex = rowToDelete1; tellerInZone[teller[_toDelete].countryId][teller[_toDelete].postalCode].length--; uint rowToDelete2 = teller[_toDelete].generalIndex; address keyToMove2 = tellerIndex[tellerIndex.length - 1]; tellerIndex[rowToDelete2] = keyToMove2; teller[keyToMove2].generalIndex = rowToDelete2; tellerIndex.length--; delete teller[_toDelete]; bank.withdrawDthTeller(_toDelete); bank.refundEth(_toDelete); emit DeleteTellerModerator(msg.sender, _toDelete); } // gas used 67841 // A shop owner can delete his point. function deleteShop() external { require(isShop(msg.sender)); uint rowToDelete1 = shop[msg.sender].zoneIndex; address keyToMove1 = shopInZone[shop[msg.sender].countryId][shop[msg.sender].postalCode][shopInZone[shop[msg.sender].countryId][shop[msg.sender].postalCode].length - 1]; shopInZone[shop[msg.sender].countryId][shop[msg.sender].postalCode][rowToDelete1] = keyToMove1; shop[keyToMove1].zoneIndex = rowToDelete1; shopInZone[shop[msg.sender].countryId][shop[msg.sender].postalCode].length--; uint rowToDelete2 = shop[msg.sender].generalIndex; address keyToMove2 = shopIndex[shopIndex.length - 1]; shopIndex[rowToDelete2] = keyToMove2; shop[keyToMove2].generalIndex = rowToDelete2; shopIndex.length--; delete shop[msg.sender]; bank.withdrawDthShop(msg.sender); emit DeleteShop(msg.sender); } // gas used 67841 // Moderator can delete a shop point function deleteShopMods(address _toDelete) isShopModerator(msg.sender) external { uint rowToDelete1 = shop[_toDelete].zoneIndex; address keyToMove1 = shopInZone[shop[_toDelete].countryId][shop[_toDelete].postalCode][shopInZone[shop[_toDelete].countryId][shop[_toDelete].postalCode].length - 1]; shopInZone[shop[_toDelete].countryId][shop[_toDelete].postalCode][rowToDelete1] = keyToMove1; shop[keyToMove1].zoneIndex = rowToDelete1; shopInZone[shop[_toDelete].countryId][shop[_toDelete].postalCode].length--; uint rowToDelete2 = shop[_toDelete].generalIndex; address keyToMove2 = shopIndex[shopIndex.length - 1]; shopIndex[rowToDelete2] = keyToMove2; shop[keyToMove2].generalIndex = rowToDelete2; shopIndex.length--; if (!shop[_toDelete].detherShop) bank.withdrawDthShop(_toDelete); else bank.withdrawDthShopAdmin(_toDelete, csoAddress); delete shop[_toDelete]; emit DeleteShopModerator(msg.sender, _toDelete); } /** * GETTER */ // get teller // return teller info function getTeller(address _teller) public view returns ( int32 lat, int32 lng, bytes2 countryId, bytes16 postalCode, int8 currencyId, bytes16 messenger, int8 avatarId, int16 rates, uint balance, bool online, bool buyer, int16 buyRates ) { Teller storage theTeller = teller[_teller]; lat = theTeller.lat; lng = theTeller.lng; countryId = theTeller.countryId; postalCode = theTeller.postalCode; currencyId = theTeller.currencyId; messenger = theTeller.messenger; avatarId = theTeller.avatarId; rates = theTeller.rates; online = theTeller.online; buyer = theTeller.buyer; buyRates = theTeller.buyRates; balance = bank.getEthBalTeller(_teller); } /* * Shop ---------------------------------- * return Shop value */ function getShop(address _shop) public view returns ( int32 lat, int32 lng, bytes2 countryId, bytes16 postalCode, bytes16 cat, bytes16 name, bytes32 description, bytes16 opening ) { Shop storage theShop = shop[_shop]; lat = theShop.lat; lng = theShop.lng; countryId = theShop.countryId; postalCode = theShop.postalCode; cat = theShop.cat; name = theShop.name; description = theShop.description; opening = theShop.opening; } // get reput // return reputation data from teller function getReput(address _teller) public view returns ( uint buyVolume, uint sellVolume, uint numTrade, uint256 loyaltyPoints_ ) { buyVolume = volumeBuy[_teller]; sellVolume = volumeSell[_teller]; numTrade = nbTrade[_teller]; loyaltyPoints_ = loyaltyPoints[_teller]; } // return balance of teller put in escrow function getTellerBalance(address _teller) public view returns (uint) { return bank.getEthBalTeller(_teller); } // return an array of address of all zone present on a zone // zone is a mapping COUNTRY => POSTALCODE function getZoneShop(bytes2 _country, bytes16 _postalcode) public view returns (address[]) { return shopInZone[_country][_postalcode]; } // return array of address of all shop function getAllShops() public view returns (address[]) { return shopIndex; } function isShop(address _shop) public view returns (bool ){ return (shop[_shop].countryId != bytes2(0x0)); } // return an array of address of all teller present on a zone // zone is a mapping COUNTRY => POSTALCODE function getZoneTeller(bytes2 _country, bytes16 _postalcode) public view returns (address[]) { return tellerInZone[_country][_postalcode]; } // return array of address of all teller function getAllTellers() public view returns (address[]) { return tellerIndex; } // return if teller or not function isTeller(address _teller) public view returns (bool ){ return (teller[_teller].countryId != bytes2(0x0)); } /* * misc */ // return info about how much DTH the shop has staked function getStakedShop(address _shop) public view returns (uint) { return bank.getDthShop(_shop); } // return info about how much DTH the teller has staked function getStakedTeller(address _teller) public view returns (uint) { return bank.getDthTeller(_teller); } // give ownership to the bank contract function transferBankOwnership(address _newbankowner) external onlyCEO whenPaused { bank.transferOwnership(_newbankowner); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"dth","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cfoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ceoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"kycCertifier","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes2"}],"name":"licenceShop","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_shop","type":"address"}],"name":"getShop","outputs":[{"name":"lat","type":"int32"},{"name":"lng","type":"int32"},{"name":"countryId","type":"bytes2"},{"name":"postalCode","type":"bytes16"},{"name":"cat","type":"bytes16"},{"name":"name","type":"bytes16"},{"name":"description","type":"bytes32"},{"name":"opening","type":"bytes16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_teller","type":"address"}],"name":"getStakedTeller","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_shop","type":"address"}],"name":"isShop","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_country","type":"bytes2"}],"name":"openZoneTeller","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCMO","type":"address"}],"name":"setCMO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCSO","type":"address"}],"name":"setCSO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"csoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_teller","type":"address"}],"name":"getReput","outputs":[{"name":"buyVolume","type":"uint256"},{"name":"sellVolume","type":"uint256"},{"name":"numTrade","type":"uint256"},{"name":"loyaltyPoints_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_dth","type":"address"},{"name":"_bank","type":"address"}],"name":"initContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"priceOracle","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newCEO","type":"address"}],"name":"setCEO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"}],"name":"isTier2","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"smsCertifier","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_status","type":"bool"}],"name":"switchStatus","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"currencyId","type":"int8"},{"name":"messenger","type":"bytes16"},{"name":"avatarId","type":"int8"},{"name":"rates","type":"int16"},{"name":"online","type":"bool"}],"name":"updateTeller","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"deleteShop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tier","type":"uint256"},{"name":"_countryId","type":"bytes2"},{"name":"_limitUsd","type":"uint256"}],"name":"setSellDailyLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_shop","type":"address"}],"name":"getStakedShop","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newCFO","type":"address"}],"name":"setCFO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAllTellers","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_moderator","type":"address"}],"name":"removeShopModerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_priceOracle","type":"address"}],"name":"setPriceOracle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_teller","type":"address"}],"name":"getTellerBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_country","type":"bytes2"}],"name":"openZoneShop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"shopModerators","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newbankowner","type":"address"}],"name":"transferBankOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes2"}],"name":"openedCountryShop","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bank","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"}],"name":"isTier1","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_moderator","type":"address"}],"name":"setShopModerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tier","type":"uint256"},{"name":"_countryId","type":"bytes2"}],"name":"getSellDailyLimit","outputs":[{"name":"limitUsd","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"shopIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"deleteTeller","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cmoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tellerIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"country","type":"bytes2"},{"name":"price","type":"uint256"}],"name":"setLicenceShopPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_country","type":"bytes2"}],"name":"closeZoneTeller","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"addFunds","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_moderator","type":"address"}],"name":"removeTellerModerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_toDelete","type":"address"}],"name":"deleteShopMods","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_country","type":"bytes2"},{"name":"_postalcode","type":"bytes16"}],"name":"getZoneShop","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_country","type":"bytes2"}],"name":"closeZoneShop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"tokenFallback","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"tellerModerators","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes2"}],"name":"openedCountryTeller","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"getLoyaltyPoints","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_moderator","type":"address"}],"name":"setTellerModerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"run2","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAllShops","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"sellEth","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_kycCertifier","type":"address"}],"name":"setKycCertifier","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_toDelete","type":"address"}],"name":"deleteTellerMods","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"country","type":"bytes2"},{"name":"price","type":"uint256"}],"name":"setLicenceTellerPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes2"}],"name":"licenceTeller","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_teller","type":"address"}],"name":"getTeller","outputs":[{"name":"lat","type":"int32"},{"name":"lng","type":"int32"},{"name":"countryId","type":"bytes2"},{"name":"postalCode","type":"bytes16"},{"name":"currencyId","type":"int8"},{"name":"messenger","type":"bytes16"},{"name":"avatarId","type":"int8"},{"name":"rates","type":"int16"},{"name":"balance","type":"uint256"},{"name":"online","type":"bool"},{"name":"buyer","type":"bool"},{"name":"buyRates","type":"int16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"run1","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_country","type":"bytes2"},{"name":"_postalcode","type":"bytes16"}],"name":"getZoneTeller","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_teller","type":"address"}],"name":"isTeller","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_smsCertifier","type":"address"}],"name":"setSmsCertifier","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"getPairSellLoyaltyPerc","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tellerAddress","type":"address"}],"name":"RegisterTeller","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tellerAddress","type":"address"}],"name":"DeleteTeller","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tellerAddress","type":"address"}],"name":"UpdateTeller","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Sent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"shopAddress","type":"address"}],"name":"RegisterShop","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"shopAddress","type":"address"}],"name":"DeleteShop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"moderator","type":"address"},{"indexed":false,"name":"shopAddress","type":"address"}],"name":"DeleteShopModerator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"moderator","type":"address"},{"indexed":false,"name":"tellerAddress","type":"address"}],"name":"DeleteTellerModerator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContract","type":"address"}],"name":"ContractUpgrade","type":"event"}]
Contract Creation Code
60806040526006805462ffffff191690556017805460ff1916905534801561002657600080fd5b5060008054600160a060020a033316600160a060020a03199091161790556148f8806100536000396000f3006080604052600436106103085763ffffffff60e060020a60003504166301e57a37811461030d5780630519ce791461033e5780630a0f8168146103535780630d46f91a146103685780630d926f7a1461037d5780630e479dc7146103b157806319f1cded146104325780631d0e8a4d146104535780631d32f106146104885780632072863b146104ac5780632105c049146104cd5780632272b0af146104ee5780632314a5c81461050357806325ba0f511461054a5780632630c12f1461057157806327d7874c146105865780632e3a4def146105a757806330a55316146105c85780633b23a5ca146105dd5780633f4ba83a146105f75780633fa198041461060c57806343579fe81461063b5780634a9f0110146106505780634b0ad8fa146106785780634e0a3379146106995780634f4cd650146106ba578063529e65e11461071f578063530e784f1461074057806359b17b43146107615780635c975abb1461078257806366d5eb9b1461079757806367bb15ad146107b9578063681e3356146107da578063744955a9146107fb57806376cdb03b1461081d57806378843a9514610832578063809ffb20146108535780638456cb59146108745780638620084214610889578063878127c8146108ae5780638bd1b610146108c65780638c267b97146108db57806395d43eea146108f05780639a8061e8146109085780639ae120dd1461092d578063a26759cb1461094f578063aa5a11c514610957578063b0547d8c14610978578063b5c4147f14610999578063ba2a98f2146109c8578063c0ee0b8a146109ea578063c640ee3d14610a53578063ca34333b14610a74578063d04c911514610a96578063d0a4a81b14610ab7578063d4f639ea14610ad8578063d5c9b23914610aed578063dd955c4414610b02578063e019ac2914610b26578063f002467714610b47578063f2d15c4814610b68578063f3943ca914610b8d578063f554567f14610baf578063f983c0fa14610c65578063fa1d9cf814610c7a578063fac8a80014610ca9578063fcf3438c14610cca578063fdff31ed14610ceb575b600080fd5b34801561031957600080fd5b50610322610d12565b60408051600160a060020a039092168252519081900360200190f35b34801561034a57600080fd5b50610322610d21565b34801561035f57600080fd5b50610322610d30565b34801561037457600080fd5b50610322610d3f565b34801561038957600080fd5b5061039f600160f060020a031960043516610d4e565b60408051918252519081900360200190f35b3480156103bd57600080fd5b506103d2600160a060020a0360043516610d60565b604080516003998a0b8a0b815297890b90980b6020880152600160f060020a0319909516868801526001608060020a031993841660608701529183166080860152821660a085015260c08401521660e08201529051908190036101000190f35b34801561043e57600080fd5b5061039f600160a060020a0360043516610dc9565b34801561045f57600080fd5b50610474600160a060020a0360043516610e66565b604080519115158252519081900360200190f35b34801561049457600080fd5b506104aa600160f060020a031960043516610e9d565b005b3480156104b857600080fd5b506104aa600160a060020a0360043516610edd565b3480156104d957600080fd5b506104aa600160a060020a0360043516610f2f565b3480156104fa57600080fd5b50610322610f81565b34801561050f57600080fd5b50610524600160a060020a0360043516610f90565b604080519485526020850193909352838301919091526060830152519081900360800190f35b34801561055657600080fd5b506104aa600160a060020a0360043581169060243516610fcc565b34801561057d57600080fd5b50610322611032565b34801561059257600080fd5b506104aa600160a060020a0360043516611041565b3480156105b357600080fd5b50610474600160a060020a0360043516611093565b3480156105d457600080fd5b506103226110e8565b3480156105e957600080fd5b506104aa60043515156110fe565b34801561060357600080fd5b506104aa611152565b6104aa600435600090810b906001608060020a03196024351690604435900b60643560010b608435151561118a565b34801561064757600080fd5b506104aa6114c4565b34801561065c57600080fd5b506104aa600435600160f060020a03196024351660443561183a565b34801561068457600080fd5b5061039f600160a060020a036004351661187c565b3480156106a557600080fd5b506104aa600160a060020a03600435166118e7565b3480156106c657600080fd5b506106cf611939565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561070b5781810151838201526020016106f3565b505050509050019250505060405180910390f35b34801561072b57600080fd5b506104aa600160a060020a036004351661199c565b34801561074c57600080fd5b506104aa600160a060020a03600435166119d8565b34801561076d57600080fd5b5061039f600160a060020a0360043516611a15565b34801561078e57600080fd5b50610474611a80565b3480156107a357600080fd5b506104aa600160f060020a031960043516611a89565b3480156107c557600080fd5b50610474600160a060020a0360043516611ac9565b3480156107e657600080fd5b506104aa600160a060020a0360043516611ade565b34801561080757600080fd5b50610474600160f060020a031960043516611b8c565b34801561082957600080fd5b50610322611ba1565b34801561083e57600080fd5b50610474600160a060020a0360043516611bb0565b34801561085f57600080fd5b506104aa600160a060020a0360043516611c0b565b34801561088057600080fd5b506104aa611c5f565b34801561089557600080fd5b5061039f600435600160f060020a031960243516611c99565b3480156108ba57600080fd5b50610322600435611cc1565b3480156108d257600080fd5b506104aa611ce9565b3480156108e757600080fd5b506103226120d6565b3480156108fc57600080fd5b506103226004356120e5565b34801561091457600080fd5b506104aa600160f060020a0319600435166024356120f3565b34801561093957600080fd5b506104aa600160f060020a03196004351661212b565b6104aa612168565b34801561096357600080fd5b506104aa600160a060020a0360043516612225565b34801561098457600080fd5b506104aa600160a060020a0360043516612261565b3480156109a557600080fd5b506106cf600160f060020a0319600435166001608060020a0319602435166126ad565b3480156109d457600080fd5b506104aa600160f060020a031960043516612737565b3480156109f657600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526104aa948235600160a060020a03169460248035953695946064949201919081908401838280828437509497506127749650505050505050565b348015610a5f57600080fd5b50610474600160a060020a03600435166139fd565b348015610a8057600080fd5b50610474600160f060020a031960043516613a12565b348015610aa257600080fd5b5061039f600160a060020a0360043516613a27565b348015610ac357600080fd5b506104aa600160a060020a0360043516613a42565b348015610ae457600080fd5b50610474613a96565b348015610af957600080fd5b506106cf613aa5565b348015610b0e57600080fd5b506104aa600160a060020a0360043516602435613b05565b348015610b3257600080fd5b506104aa600160a060020a0360043516613fee565b348015610b5357600080fd5b506104aa600160a060020a0360043516614053565b348015610b7457600080fd5b506104aa600160f060020a03196004351660243561447a565b348015610b9957600080fd5b5061039f600160f060020a0319600435166144b2565b348015610bbb57600080fd5b50610bd0600160a060020a03600435166144c4565b6040805160039d8e0b8e0b81529b8d0b909c0b60208c0152600160f060020a03199099168a8c01526001608060020a031997881660608b0152600096870b870b60808b01529490961660a089015291840b90930b60c0870152600192830b830b60e087015261010086015291151561012085015290151561014084015290810b900b6101608201529051908190036101800190f35b348015610c7157600080fd5b5061047461462a565b348015610c8657600080fd5b506106cf600160f060020a0319600435166001608060020a031960243516614638565b348015610cb557600080fd5b50610474600160a060020a03600435166146c0565b348015610cd657600080fd5b506104aa600160a060020a03600435166146f7565b348015610cf757600080fd5b5061039f600160a060020a0360043581169060243516614769565b600c54600160a060020a031681565b600354600160a060020a031681565b600054600160a060020a031681565b600754600160a060020a031681565b600a6020526000908152604090205481565b600160a060020a0316600090815260186020526040902080546001820154600283015460039384015483850b95640100000000850490950b9460f060020a604060020a86040294608060020a605060020a90910481029480820294908290048202939092910290565b600d54604080517f78d0a415000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152915160009392909216916378d0a4159160248082019260209290919082900301818787803b158015610e3457600080fd5b505af1158015610e48573d6000803e3d6000fd5b505050506040513d6020811015610e5e57600080fd5b505192915050565b600160a060020a038116600090815260186020526040902054604060020a900460f060020a02600160f060020a0319161515919050565b60015433600160a060020a03908116911614610eb857600080fd5b600160f060020a0319166000908152600960205260409020805460ff19166001179055565b60005433600160a060020a03908116911614610ef857600080fd5b600160a060020a0381161515610f0d57600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a03908116911614610f4a57600080fd5b600160a060020a0381161515610f5f57600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b600254600160a060020a031681565b600160a060020a031660009081526010602090815260408083205460118352818420546012845282852054601390945291909320549293909290565b60005433600160a060020a03908116911614610fe757600080fd5b60175460ff1615610ff757600080fd5b600c8054600160a060020a03938416600160a060020a031991821617909155600d80549290931691161790556017805460ff19166001179055565b600e54600160a060020a031681565b60005433600160a060020a0390811691161461105c57600080fd5b600160a060020a038116151561107157600080fd5b60008054600160a060020a031916600160a060020a0392909216919091179055565b6007546040805160e160020a63660ea601028152600160a060020a0384811660048301529151600093929092169163cc1d4c029160248082019260209290919082900301818787803b158015610e3457600080fd5b60065463010000009004600160a060020a031681565b600160a060020a03331660009081526014602052604090206004015460ff1615158115151461114f5733600160a060020a03166000908152601460205260409020600401805460ff19168215151790555b50565b60005433600160a060020a0390811691161461116d57600080fd5b60065460ff16151561117e57600080fd5b6006805460ff19169055565b611193336146c0565b151561119e57600080fd5b33600160a060020a031660009081526014602052604081205460d060020a9004810b810b9086900b1461121957600160a060020a033316600090815260146020526040812080549187900b60ff1660d060020a027aff0000000000000000000000000000000000000000000000000000199092169190911790555b600160a060020a033316600090815260146020526040902060010154608060020a026001608060020a0319908116908516146112815733600160a060020a0316600090815260146020526040902060010180546001608060020a031916608060020a86041790555b600160a060020a033316600090815260146020526040812060010154608060020a9004810b810b9084900b146112f857600160a060020a033316600090815260146020526040812060010180549185900b60ff16608060020a0270ff00000000000000000000000000000000199092169190911790555b600160a060020a0333166000908152601460205260409020600190810154710100000000000000000000000000000000009004810b810b9083900b1461139257600160a060020a0333166000908152601460205260409020600190810180549184900b61ffff16710100000000000000000000000000000000000272ffff0000000000000000000000000000000000199092169190911790555b600160a060020a03331660009081526014602052604090206004015460ff161515811515146113e35733600160a060020a03166000908152601460205260409020600401805460ff19168215151790555b600034111561148957600d54604080517fe4651465000000000000000000000000000000000000000000000000000000008152600160a060020a0333811660048301523460248301819052925193169263e4651465929160448082019260209290919082900301818588803b15801561145b57600080fd5b505af115801561146f573d6000803e3d6000fd5b50505050506040513d602081101561148657600080fd5b50505b604051600160a060020a033316907fe3df84c3ca6a90f0e6485beae08e7bd034695356bec32910a3d62559ff33fbc890600090a25050505050565b6000806000806114d333610e66565b15156114de57600080fd5b33600160a060020a0316600090815260186020908152604080832060048101549054604060020a810460f060020a02600160f060020a031916855260198452828520605060020a909104608060020a026001608060020a0319168552909252909120805491955090600019810190811061155457fe5b600091825260208083209190910154600160a060020a03338116845260188352604080852054604060020a810460f060020a02600160f060020a031916865260198552818620605060020a909104608060020a026001608060020a0319168652909352919092208054919092169450849190869081106115d057fe5b60009182526020808320919091018054600160a060020a031916600160a060020a03948516179055858316825260188152604080832060040188905533909316825282822054604060020a810460f060020a02600160f060020a031916835260198252838320605060020a909104608060020a026001608060020a0319168352905220805490611664906000198301614885565b50600160a060020a033316600090815260186020526040902060050154601a805491935090600019810190811061169757fe5b600091825260209091200154601a8054600160a060020a0390921692508291849081106116c057fe5b60009182526020808320919091018054600160a060020a031916600160a060020a039485161790559183168152601890915260409020600501829055601a80549061170f906000198301614885565b50600160a060020a03338116600081815260186020526040808220805479ffffffffffffffffffffffffffffffffffffffffffffffffffff1916815560018101839055600281018390556003810180546001608060020a03191690556004808201849055600582018490556006909101805460ff19169055600d5482517f3716f65d0000000000000000000000000000000000000000000000000000000081529182019490945290519290931692633716f65d926024808301939282900301818387803b1580156117df57600080fd5b505af11580156117f3573d6000803e3d6000fd5b505060408051600160a060020a033316815290517fe607eb1578eec3de556aa2d57f7ff9365c1706069a8959e794883eba60b043e39350908190036020019150a150505050565b60035433600160a060020a0390811691161461185557600080fd5b6000928352601b60209081526040808520600160f060020a03199094168552929052912055565b600d54604080517fa96b3ab8000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151600093929092169163a96b3ab89160248082019260209290919082900301818787803b158015610e3457600080fd5b60005433600160a060020a0390811691161461190257600080fd5b600160a060020a038116151561191757600080fd5b60038054600160a060020a031916600160a060020a0392909216919091179055565b6060601680548060200260200160405190810160405280929190818152602001828054801561199157602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611973575b505050505090505b90565b60005433600160a060020a039081169116146119b757600080fd5b600160a060020a03166000908152600460205260409020805460ff19169055565b60035433600160a060020a039081169116146119f357600080fd5b600e8054600160a060020a031916600160a060020a0392909216919091179055565b600d54604080517f8d837f38000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015291516000939290921691638d837f389160248082019260209290919082900301818787803b158015610e3457600080fd5b60065460ff1681565b60015433600160a060020a03908116911614611aa457600080fd5b600160f060020a0319166000908152600860205260409020805460ff19166001179055565b60046020526000908152604090205460ff1681565b60005433600160a060020a03908116911614611af957600080fd5b60065460ff161515611b0a57600080fd5b600d54604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151919092169163f2fde38b91602480830192600092919082900301818387803b158015611b7157600080fd5b505af1158015611b85573d6000803e3d6000fd5b5050505050565b60086020526000908152604090205460ff1681565b600d54600160a060020a031681565b6006546040805160e160020a63660ea601028152600160a060020a0384811660048301529151600093630100000090049092169163cc1d4c029160248082019260209290919082900301818787803b158015610e3457600080fd5b60005433600160a060020a03908116911614611c2657600080fd5b600160a060020a0381161515611c3b57600080fd5b600160a060020a03166000908152600460205260409020805460ff19166001179055565b60005433600160a060020a03908116911614611c7a57600080fd5b60065460ff1615611c8a57600080fd5b6006805460ff19166001179055565b6000918252601b60209081526040808420600160f060020a0319909316845291905290205490565b601a805482908110611ccf57fe5b600091825260209091200154600160a060020a0316905081565b600080600080611cf8336146c0565b1515611d0357600080fd5b33600160a060020a0316600090815260146020908152604080832060028101549054604060020a810460f060020a02600160f060020a031916855260158452828520605060020a909104608060020a026001608060020a03191685529092529091208054919550906000198101908110611d7957fe5b600091825260208083209190910154600160a060020a03338116845260148352604080852054604060020a810460f060020a02600160f060020a031916865260158552818620605060020a909104608060020a026001608060020a031916865290935291909220805491909216945084919086908110611df557fe5b60009182526020808320919091018054600160a060020a031916600160a060020a03948516179055858316825260148152604080832060020188905533909316825282822054604060020a810460f060020a02600160f060020a031916835260158252838320605060020a909104608060020a026001608060020a0319168352905220805490611e89906000198301614885565b50600160a060020a03331660009081526014602052604090206003015460168054919350906000198101908110611ebc57fe5b60009182526020909120015460168054600160a060020a039092169250829184908110611ee557fe5b60009182526020808320919091018054600160a060020a031916600160a060020a0394851617905591831681526014909152604090206003018290556016805490611f34906000198301614885565b50600160a060020a0333811660008181526014602052604080822080547affffffffffffffffffffffffffffffffffffffffffffffffffffff1916815560018101805475ffffffffffffffffffffffffffffffffffffffffffff1916905560028101839055600381018390556004908101805460ff19169055600d5482517fb71738f1000000000000000000000000000000000000000000000000000000008152918201949094529051929093169263b71738f1926024808301939282900301818387803b15801561200557600080fd5b505af1158015612019573d6000803e3d6000fd5b5050600d54604080517fd83edd70000000000000000000000000000000000000000000000000000000008152600160a060020a033381166004830152915191909216935063d83edd709250602480830192600092919082900301818387803b15801561208457600080fd5b505af1158015612098573d6000803e3d6000fd5b5050604051600160a060020a03331692507fb1e40dcb43d26b3a6cb20da12c333af5a0de0bcd6264eddca5fbacf3e31d4f949150600090a250505050565b600154600160a060020a031681565b6016805482908110611ccf57fe5b60015433600160a060020a0390811691161461210e57600080fd5b600160f060020a03199091166000908152600a6020526040902055565b60015433600160a060020a0390811691161461214657600080fd5b600160f060020a0319166000908152600960205260409020805460ff19169055565b612171336146c0565b151561217c57600080fd5b600d54604080517fe4651465000000000000000000000000000000000000000000000000000000008152600160a060020a0333811660048301523460248301819052925193169263e4651465929160448082019260209290919082900301818588803b1580156121eb57600080fd5b505af11580156121ff573d6000803e3d6000fd5b50505050506040513d602081101561221657600080fd5b5051151561222357600080fd5b565b60005433600160a060020a0390811691161461224057600080fd5b600160a060020a03166000908152600560205260409020805460ff19169055565b33600160a060020a038116600090815260046020526040812054909182918291829160ff16151561229157600080fd5b600160a060020a038616600090815260186020908152604080832060048101549054604060020a810460f060020a02600160f060020a031916855260198452828520605060020a909104608060020a026001608060020a0319168552909252909120805491965090600019810190811061230757fe5b600091825260208083209190910154600160a060020a03898116845260188352604080852054604060020a810460f060020a02600160f060020a031916865260198552818620605060020a909104608060020a026001608060020a03191686529093529190922080549190921695508591908790811061238357fe5b60009182526020808320919091018054600160a060020a031916600160a060020a039485161790558683168252601881526040808320600401899055928916825282822054604060020a810460f060020a02600160f060020a031916835260198252838320605060020a909104608060020a026001608060020a0319168352905220805490612416906000198301614885565b50600160a060020a038616600090815260186020526040902060050154601a805491945090600019810190811061244957fe5b600091825260209091200154601a8054600160a060020a03909216935083918590811061247257fe5b60009182526020808320919091018054600160a060020a031916600160a060020a039485161790559184168152601890915260409020600501839055601a8054906124c1906000198301614885565b50600160a060020a03861660009081526018602052604090206006015460ff16151561256b57600d54604080517f3716f65d000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015291519190921691633716f65d91602480830192600092919082900301818387803b15801561254e57600080fd5b505af1158015612562573d6000803e3d6000fd5b505050506125f6565b600d54600254604080517f7139b595000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152928316602482015290519190921691637139b59591604480830192600092919082900301818387803b1580156125dd57600080fd5b505af11580156125f1573d6000803e3d6000fd5b505050505b600160a060020a038087166000818152601860209081526040808320805479ffffffffffffffffffffffffffffffffffffffffffffffffffff1916815560018101849055600281018490556003810180546001608060020a03191690556004810184905560058101939093556006909201805460ff191690558151928352905133909316927f34fe9e989d541054eb508f79a2e9b0bc3aa3d7ff2f2ded4f1f6b2819aaec86a39281900390910190a2505050505050565b600160f060020a0319821660009081526019602090815260408083206001608060020a03198516845282529182902080548351818402810184019094528084526060939283018282801561272a57602002820191906000526020600020905b8154600160a060020a0316815260019091019060200180831161270c575b5050505050905092915050565b60015433600160a060020a0390811691161461275257600080fd5b600160f060020a0319166000908152600860205260409020805460ff19169055565b60065460009081908190819060ff161561278d57600080fd5b6006546040805160e160020a63660ea601028152600160a060020a038a8116600483015291518a93630100000090049092169163cc1d4c02916024808201926020929091908290030181600087803b1580156127e857600080fd5b505af11580156127fc573d6000803e3d6000fd5b505050506040513d602081101561281257600080fd5b5051151561281f57600080fd5b600c5433600160a060020a0390811691161461283a57600080fd5b61284b86600063ffffffff61479416565b945060f860020a61286387600163ffffffff61479416565b600160f860020a0319161461288f5761288386600263ffffffff6147bc16565b60e060020a90046128ac565b6128a086600263ffffffff6147bc16565b60e060020a9004600019025b935060f860020a6128c487600663ffffffff61479416565b600160f860020a031916146128f0576128e486600763ffffffff6147bc16565b60e060020a900461290d565b61290186600763ffffffff6147bc16565b60e060020a9004600019025b9250600160f860020a031985167f31000000000000000000000000000000000000000000000000000000000000001415612e6d57600a600061295688600b63ffffffff6147d216565b600160f060020a031916815260208101919091526040016000205487101561297d57600080fd5b61298688610e66565b1561299057600080fd5b600860006129a588600b63ffffffff6147d216565b600160f060020a031916815260208101919091526040016000205460ff1615156129ce57600080fd5b600160a060020a0388166000908152601860205260409020805463ffffffff1916600386810b63ffffffff9081169290921767ffffffff0000000019166401000000009187900b83169190910217909155612a2e908790600b906147d216565b600160a060020a0389166000908152601860205260409020805460f060020a909204604060020a0269ffff000000000000000019909216919091179055612a7c86600d63ffffffff6147e816565b600160a060020a03891660009081526018602052604090208054608060020a909204605060020a0279ffffffffffffffffffffffffffffffff0000000000000000000019909216919091179055612ada86601d63ffffffff6147e816565b600160a060020a038916600090815260186020526040902060010180546001608060020a031916608060020a909204919091179055612b1a86602d6147e8565b600160a060020a038916600090815260186020526040902060010180546fffffffffffffffffffffffffffffffff16608060020a92839004909202919091179055612b6686603d6147fe565b600160a060020a038916600090815260186020526040902060020155612b9386605d63ffffffff6147e816565b600160a060020a03891660008181526018602052604081206003810180546001608060020a031916608060020a90950494909417909355601a805460018181019092557f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e81018054600160a060020a031916909417909355600590930191909155601990612c2289600b6147d2565b600160f060020a03191681526020810191909152604001600090812090612c5089600d63ffffffff6147e816565b6fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff191681526020019081526020016000208990806001815401808255809150509060018203906000526020600020016000909192909190916101000a815481600160a060020a030219169083600160a060020a0316021790555003601860008a600160a060020a0316600160a060020a03168152602001908152602001600020600401819055507ff45ad76a8c4c14053708bfd052607c5e35446beb04fbdff6f2f3c9dde8e83b37886040518082600160a060020a0316600160a060020a0316815260200191505060405180910390a1600d54604080517fd4d84da5000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152602482018b90529151919092169163d4d84da591604480830192600092919082900301818387803b158015612db157600080fd5b505af1158015612dc5573d6000803e3d6000fd5b5050600c54600d54604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018d9052905191909216935063a9059cbb925060448083019260209291908290030181600087803b158015612e3b57600080fd5b505af1158015612e4f573d6000803e3d6000fd5b505050506040513d6020811015612e6557600080fd5b506139f39050565b600160f860020a031985167f320000000000000000000000000000000000000000000000000000000000000014156134ad57600b6000612eb3888363ffffffff6147d216565b600160f060020a0319168152602081019190915260400160002054871015612eda57600080fd5b612ee3886146c0565b15612eed57600080fd5b60096000612f0288600b63ffffffff6147d216565b600160f060020a031916815260208101919091526040016000205460ff161515612f2b57600080fd5b600160a060020a0388166000908152601460205260409020805463ffffffff1916600386810b63ffffffff9081169290921767ffffffff0000000019166401000000009187900b83169190910217909155612f8b908790600b906147d216565b600160a060020a0389166000908152601460205260409020805460f060020a909204604060020a0269ffff000000000000000019909216919091179055612fd986600d63ffffffff6147e816565b600160a060020a03891660009081526014602052604090208054608060020a909204605060020a0279ffffffffffffffffffffffffffffffff000000000000000000001990921691909117905561303786601d63ffffffff61479416565b600160a060020a0389166000908152601460205260408120600101805460f860020a90930490910b60ff16608060020a0270ff000000000000000000000000000000001990921691909117905561309586601e63ffffffff61479416565b600160a060020a0389166000908152601460205260408120805460f860020a90930490910b60ff1660d060020a027aff0000000000000000000000000000000000000000000000000000199092169190911790556130fa86601f63ffffffff6147e816565b600160a060020a038916600090815260146020526040902060010180546001608060020a031916608060020a90920491909117905561313a86602f6147d2565b600160a060020a03891660009081526014602052604090206001908101805460f060020a90930490910b61ffff16710100000000000000000000000000000000000272ffff00000000000000000000000000000000001990921691909117905560f860020a6131b087603163ffffffff61479416565b600160f860020a031916146131c65760006131c9565b60015b600160a060020a038916600090815260146020526040902060010180549115157301000000000000000000000000000000000000000273ff000000000000000000000000000000000000001990921691909117905561322f86603263ffffffff6147d216565b600160a060020a03891660008181526014602052604081206001808201805460f060020a909604820b61ffff16740100000000000000000000000000000000000000000275ffff00000000000000000000000000000000000000001990961695909517909455601680548086019091557fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428981018054600160a060020a03191685179055928252600301919091556015906132f089600b63ffffffff6147d216565b600160f060020a0319168152602081019190915260400160009081209061331e89600d63ffffffff6147e816565b6fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff191681526020019081526020016000208990806001815401808255809150509060018203906000526020600020016000909192909190916101000a815481600160a060020a030219169083600160a060020a0316021790555003601460008a600160a060020a0316600160a060020a03168152602001908152602001600020600201819055506001601460008a600160a060020a0316600160a060020a0316815260200190815260200160002060040160006101000a81548160ff02191690831515021790555087600160a060020a03167fdc94eebf39359cb097be68bd4890a58fce65c66d2d284d4349f666013dc8a43d60405160405180910390a2600d54604080517f18a6d58b000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152602482018b9052915191909216916318a6d58b91604480830192600092919082900301818387803b158015612db157600080fd5b600160f860020a031985167f330000000000000000000000000000000000000000000000000000000000000014156139f357600254600160a060020a038981169116146134f957600080fd5b600a600061350e88600b63ffffffff6147d216565b600160f060020a031916815260208101919091526040016000205487101561353557600080fd5b61354e61354987606d63ffffffff61481416565b610e66565b1561355857600080fd5b6008600061356d88600b63ffffffff6147d216565b600160f060020a031916815260208101919091526040016000205460ff16151561359657600080fd5b6135a786606d63ffffffff61481416565b600160a060020a0381166000908152601860205260409020805463ffffffff1916600387810b63ffffffff9081169290921767ffffffff0000000019166401000000009188900b8316919091021790915590925061360a908790600b906147d216565b600160a060020a0383166000908152601860205260409020805460f060020a909204604060020a0269ffff00000000000000001990921691909117905561365886600d63ffffffff6147e816565b600160a060020a03831660009081526018602052604090208054608060020a909204605060020a0279ffffffffffffffffffffffffffffffff00000000000000000000199092169190911790556136b686601d63ffffffff6147e816565b600160a060020a038316600090815260186020526040902060010180546001608060020a031916608060020a9092049190911790556136f686602d6147e8565b600160a060020a038316600090815260186020526040902060010180546fffffffffffffffffffffffffffffffff16608060020a9283900490920291909117905561374286603d6147fe565b600160a060020a03831660009081526018602052604090206002015561376f86605d63ffffffff6147e816565b600160a060020a03831660008181526018602052604081206003810180546001608060020a031916608060020a90950494909417909355601a805460018181019092557f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e81018054600160a060020a0319169094179093556005909301919091556019906137fe89600b6147d2565b600160f060020a0319168152602081019190915260400160009081209061382c89600d63ffffffff6147e816565b6001608060020a03191681526020808201929092526040908101600090812080546001808201835591835284832081018054600160a060020a031916600160a060020a038a169081179091558084526018865292849020959003810160048601556006909401805460ff19169094179093558051928352517ff45ad76a8c4c14053708bfd052607c5e35446beb04fbdff6f2f3c9dde8e83b379281900390910190a1600d54604080517fd4d84da5000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018b90529151919092169163d4d84da591604480830192600092919082900301818387803b15801561393c57600080fd5b505af1158015613950573d6000803e3d6000fd5b5050600c54600d54604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018d9052905191909216935063a9059cbb925060448083019260209291908290030181600087803b1580156139c657600080fd5b505af11580156139da573d6000803e3d6000fd5b505050506040513d60208110156139f057600080fd5b50505b5050505050505050565b60056020526000908152604090205460ff1681565b60096020526000908152604090205460ff1681565b600160a060020a031660009081526013602052604090205490565b60005433600160a060020a03908116911614613a5d57600080fd5b600160a060020a0381161515613a7257600080fd5b600160a060020a03166000908152600560205260409020805460ff19166001179055565b60065462010000900460ff1681565b6060601a80548060200260200160405190810160405280929190818152602001828054801561199157602002820191906000526020600020908154600160a060020a03168152600190910190602001808311611973575050505050905090565b60065460009060ff1615613b1857600080fd5b33600160a060020a0381166000908152601460205260408120548491604060020a90910460f060020a0290808080613b69613b5288611093565b613b5d576001613b60565b60025b60ff1686611c99565b9350613bf3600e60009054906101000a9004600160a060020a0316600160a060020a03166350ccf36b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015613bc157600080fd5b505af1158015613bd5573d6000803e3d6000fd5b505050506040513d6020811015613beb57600080fd5b505185614844565b600d54604080517fad71766e000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152915193965091169163ad71766e916024808201926020929091908290030181600087803b158015613c5d57600080fd5b505af1158015613c71573d6000803e3d6000fd5b505050506040513d6020811015613c8757600080fd5b50519150613c958287614876565b905082811115613ca457600080fd5b613cad336146c0565b1515613cb857600080fd5b33600160a060020a03168a600160a060020a031614151515613cd957600080fd5b600d54604080517ff5923a6e000000000000000000000000000000000000000000000000000000008152600160a060020a0333811660048301528d81166024830152604482018d90529151919092169163f5923a6e91606480830192600092919082900301818387803b158015613d4f57600080fd5b505af1158015613d63573d6000803e3d6000fd5b50506006546040805160e160020a63660ea601028152600160a060020a038f8116600483015291516301000000909304909116935063cc1d4c0292506024808201926020929091908290030181600087803b158015613dc157600080fd5b505af1158015613dd5573d6000803e3d6000fd5b505050506040513d6020811015613deb57600080fd5b505115613f9757600160a060020a033381166000908152600f60209081526040808320938e16835292905220549750871515613e5057600160a060020a033381166000908152600f60209081526040808320938e168352929052206127109081905597505b600160a060020a033316600090815260136020526040902054613e8990612710613e7a8c8c614844565b811515613e8357fe5b04614876565b600160a060020a0333166000908152601360205260409020556064613eaf89604f614844565b811515613eb857fe5b04600f600033600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002081905550613f34601060008c600160a060020a0316600160a060020a03168152602001908152602001600020548a614876565b600160a060020a03808c1660009081526010602090815260408083209490945533909216815260119091522054613f6b908a614876565b600160a060020a0333166000908152601160209081526040808320939093556012905220805460010190555b89600160a060020a031633600160a060020a03167f3990db2d31862302a685e8086b5755072a6e2b5b780af1ee81ece35ee3cd33458b6040518082815260200191505060405180910390a350505050505050505050565b60005433600160a060020a0390811691161461400957600080fd5b60065462010000900460ff161561401f57600080fd5b60078054600160a060020a03909216600160a060020a03199092169190911790556006805462ff0000191662010000179055565b33600160a060020a038116600090815260056020526040812054909182918291829160ff16151561408357600080fd5b61408c866146c0565b151561409757600080fd5b600160a060020a038616600090815260146020908152604080832060028101549054604060020a810460f060020a02600160f060020a031916855260158452828520605060020a909104608060020a026001608060020a0319168552909252909120805491965090600019810190811061410d57fe5b600091825260208083209190910154600160a060020a03898116845260148352604080852054604060020a810460f060020a02600160f060020a031916865260158552818620605060020a909104608060020a026001608060020a03191686529093529190922080549190921695508591908790811061418957fe5b60009182526020808320919091018054600160a060020a031916600160a060020a039485161790558683168252601481526040808320600201899055928916825282822054604060020a810460f060020a02600160f060020a031916835260158252838320605060020a909104608060020a026001608060020a031916835290522080549061421c906000198301614885565b50600160a060020a0386166000908152601460205260409020600301546016805491945090600019810190811061424f57fe5b60009182526020909120015460168054600160a060020a03909216935083918590811061427857fe5b60009182526020808320919091018054600160a060020a031916600160a060020a03948516179055918416815260149091526040902060030183905560168054906142c7906000198301614885565b50600160a060020a0380871660008181526014602052604080822080547affffffffffffffffffffffffffffffffffffffffffffffffffffff1916815560018101805475ffffffffffffffffffffffffffffffffffffffffffff1916905560028101839055600381018390556004908101805460ff19169055600d5482517fb71738f1000000000000000000000000000000000000000000000000000000008152918201949094529051929093169263b71738f1926024808301939282900301818387803b15801561439857600080fd5b505af11580156143ac573d6000803e3d6000fd5b5050600d54604080517fd83edd70000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152915191909216935063d83edd709250602480830192600092919082900301818387803b15801561441757600080fd5b505af115801561442b573d6000803e3d6000fd5b505060408051600160a060020a038a811682529151339290921693507fcf9fc954c975d15bad8f5fa3c1cd94f55105a98b1ecf33021ebb059122277f8f925081900360200190a2505050505050565b60015433600160a060020a0390811691161461449557600080fd5b600160f060020a03199091166000908152600b6020526040902055565b600b6020526000908152604090205481565b600160a060020a0380821660008181526014602090815260408083208054600180830154600480850154600d5487517f8d837f380000000000000000000000000000000000000000000000000000000081529283019a909a529551600385810b9b640100000000870490910b9a60f060020a604060020a8804029a608060020a605060020a890481029b60d060020a909904820b9a8782029a918804830b997101000000000000000000000000000000000089048a0b99939860ff928316987301000000000000000000000000000000000000008204909316977401000000000000000000000000000000000000000090910490940b95929490921692638d837f389260248084019391929182900301818b87803b1580156145e557600080fd5b505af11580156145f9573d6000803e3d6000fd5b505050506040513d602081101561460f57600080fd5b50519c9e9b9d50999b989a9799509597949693959193909250565b600654610100900460ff1681565b600160f060020a0319821660009081526015602090815260408083206001608060020a03198516845282529182902080548351818402810184019094528084526060939283018282801561272a57602002820191906000526020600020908154600160a060020a0316815260019091019060200180831161270c575050505050905092915050565b600160a060020a038116600090815260146020526040902054604060020a900460f060020a02600160f060020a0319161515919050565b60005433600160a060020a0390811691161461471257600080fd5b600654610100900460ff161561472757600080fd5b6006805461ff0019600160a060020a0390931663010000000276ffffffffffffffffffffffffffffffffffffffff000000199091161791909116610100179055565b600160a060020a039182166000908152600f6020908152604080832093909416825291909152205490565b600080826001018451101515156147aa57600080fd5b505081810160200151805b5092915050565b600080826004018451101515156147aa57600080fd5b600080826002018451101515156147aa57600080fd5b600080826010018451101515156147aa57600080fd5b600080826020018451101515156147aa57600080fd5b6000808260140184511015151561482a57600080fd5b505001602001516c01000000000000000000000000900490565b60008083151561485757600091506147b5565b5082820282848281151561486757fe5b041461486f57fe5b9392505050565b60008282018381101561486f57fe5b8154818355818111156148a9576000838152602090206148a99181019083016148ae565b505050565b61199991905b808211156148c857600081556001016148b4565b50905600a165627a7a72305820a34ae3cd5140b74ce2a7d0f03a58b2ebb2d2566d167b4e095d48a2d884b47db10029
Deployed Bytecode
0x6080604052600436106103085763ffffffff60e060020a60003504166301e57a37811461030d5780630519ce791461033e5780630a0f8168146103535780630d46f91a146103685780630d926f7a1461037d5780630e479dc7146103b157806319f1cded146104325780631d0e8a4d146104535780631d32f106146104885780632072863b146104ac5780632105c049146104cd5780632272b0af146104ee5780632314a5c81461050357806325ba0f511461054a5780632630c12f1461057157806327d7874c146105865780632e3a4def146105a757806330a55316146105c85780633b23a5ca146105dd5780633f4ba83a146105f75780633fa198041461060c57806343579fe81461063b5780634a9f0110146106505780634b0ad8fa146106785780634e0a3379146106995780634f4cd650146106ba578063529e65e11461071f578063530e784f1461074057806359b17b43146107615780635c975abb1461078257806366d5eb9b1461079757806367bb15ad146107b9578063681e3356146107da578063744955a9146107fb57806376cdb03b1461081d57806378843a9514610832578063809ffb20146108535780638456cb59146108745780638620084214610889578063878127c8146108ae5780638bd1b610146108c65780638c267b97146108db57806395d43eea146108f05780639a8061e8146109085780639ae120dd1461092d578063a26759cb1461094f578063aa5a11c514610957578063b0547d8c14610978578063b5c4147f14610999578063ba2a98f2146109c8578063c0ee0b8a146109ea578063c640ee3d14610a53578063ca34333b14610a74578063d04c911514610a96578063d0a4a81b14610ab7578063d4f639ea14610ad8578063d5c9b23914610aed578063dd955c4414610b02578063e019ac2914610b26578063f002467714610b47578063f2d15c4814610b68578063f3943ca914610b8d578063f554567f14610baf578063f983c0fa14610c65578063fa1d9cf814610c7a578063fac8a80014610ca9578063fcf3438c14610cca578063fdff31ed14610ceb575b600080fd5b34801561031957600080fd5b50610322610d12565b60408051600160a060020a039092168252519081900360200190f35b34801561034a57600080fd5b50610322610d21565b34801561035f57600080fd5b50610322610d30565b34801561037457600080fd5b50610322610d3f565b34801561038957600080fd5b5061039f600160f060020a031960043516610d4e565b60408051918252519081900360200190f35b3480156103bd57600080fd5b506103d2600160a060020a0360043516610d60565b604080516003998a0b8a0b815297890b90980b6020880152600160f060020a0319909516868801526001608060020a031993841660608701529183166080860152821660a085015260c08401521660e08201529051908190036101000190f35b34801561043e57600080fd5b5061039f600160a060020a0360043516610dc9565b34801561045f57600080fd5b50610474600160a060020a0360043516610e66565b604080519115158252519081900360200190f35b34801561049457600080fd5b506104aa600160f060020a031960043516610e9d565b005b3480156104b857600080fd5b506104aa600160a060020a0360043516610edd565b3480156104d957600080fd5b506104aa600160a060020a0360043516610f2f565b3480156104fa57600080fd5b50610322610f81565b34801561050f57600080fd5b50610524600160a060020a0360043516610f90565b604080519485526020850193909352838301919091526060830152519081900360800190f35b34801561055657600080fd5b506104aa600160a060020a0360043581169060243516610fcc565b34801561057d57600080fd5b50610322611032565b34801561059257600080fd5b506104aa600160a060020a0360043516611041565b3480156105b357600080fd5b50610474600160a060020a0360043516611093565b3480156105d457600080fd5b506103226110e8565b3480156105e957600080fd5b506104aa60043515156110fe565b34801561060357600080fd5b506104aa611152565b6104aa600435600090810b906001608060020a03196024351690604435900b60643560010b608435151561118a565b34801561064757600080fd5b506104aa6114c4565b34801561065c57600080fd5b506104aa600435600160f060020a03196024351660443561183a565b34801561068457600080fd5b5061039f600160a060020a036004351661187c565b3480156106a557600080fd5b506104aa600160a060020a03600435166118e7565b3480156106c657600080fd5b506106cf611939565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561070b5781810151838201526020016106f3565b505050509050019250505060405180910390f35b34801561072b57600080fd5b506104aa600160a060020a036004351661199c565b34801561074c57600080fd5b506104aa600160a060020a03600435166119d8565b34801561076d57600080fd5b5061039f600160a060020a0360043516611a15565b34801561078e57600080fd5b50610474611a80565b3480156107a357600080fd5b506104aa600160f060020a031960043516611a89565b3480156107c557600080fd5b50610474600160a060020a0360043516611ac9565b3480156107e657600080fd5b506104aa600160a060020a0360043516611ade565b34801561080757600080fd5b50610474600160f060020a031960043516611b8c565b34801561082957600080fd5b50610322611ba1565b34801561083e57600080fd5b50610474600160a060020a0360043516611bb0565b34801561085f57600080fd5b506104aa600160a060020a0360043516611c0b565b34801561088057600080fd5b506104aa611c5f565b34801561089557600080fd5b5061039f600435600160f060020a031960243516611c99565b3480156108ba57600080fd5b50610322600435611cc1565b3480156108d257600080fd5b506104aa611ce9565b3480156108e757600080fd5b506103226120d6565b3480156108fc57600080fd5b506103226004356120e5565b34801561091457600080fd5b506104aa600160f060020a0319600435166024356120f3565b34801561093957600080fd5b506104aa600160f060020a03196004351661212b565b6104aa612168565b34801561096357600080fd5b506104aa600160a060020a0360043516612225565b34801561098457600080fd5b506104aa600160a060020a0360043516612261565b3480156109a557600080fd5b506106cf600160f060020a0319600435166001608060020a0319602435166126ad565b3480156109d457600080fd5b506104aa600160f060020a031960043516612737565b3480156109f657600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526104aa948235600160a060020a03169460248035953695946064949201919081908401838280828437509497506127749650505050505050565b348015610a5f57600080fd5b50610474600160a060020a03600435166139fd565b348015610a8057600080fd5b50610474600160f060020a031960043516613a12565b348015610aa257600080fd5b5061039f600160a060020a0360043516613a27565b348015610ac357600080fd5b506104aa600160a060020a0360043516613a42565b348015610ae457600080fd5b50610474613a96565b348015610af957600080fd5b506106cf613aa5565b348015610b0e57600080fd5b506104aa600160a060020a0360043516602435613b05565b348015610b3257600080fd5b506104aa600160a060020a0360043516613fee565b348015610b5357600080fd5b506104aa600160a060020a0360043516614053565b348015610b7457600080fd5b506104aa600160f060020a03196004351660243561447a565b348015610b9957600080fd5b5061039f600160f060020a0319600435166144b2565b348015610bbb57600080fd5b50610bd0600160a060020a03600435166144c4565b6040805160039d8e0b8e0b81529b8d0b909c0b60208c0152600160f060020a03199099168a8c01526001608060020a031997881660608b0152600096870b870b60808b01529490961660a089015291840b90930b60c0870152600192830b830b60e087015261010086015291151561012085015290151561014084015290810b900b6101608201529051908190036101800190f35b348015610c7157600080fd5b5061047461462a565b348015610c8657600080fd5b506106cf600160f060020a0319600435166001608060020a031960243516614638565b348015610cb557600080fd5b50610474600160a060020a03600435166146c0565b348015610cd657600080fd5b506104aa600160a060020a03600435166146f7565b348015610cf757600080fd5b5061039f600160a060020a0360043581169060243516614769565b600c54600160a060020a031681565b600354600160a060020a031681565b600054600160a060020a031681565b600754600160a060020a031681565b600a6020526000908152604090205481565b600160a060020a0316600090815260186020526040902080546001820154600283015460039384015483850b95640100000000850490950b9460f060020a604060020a86040294608060020a605060020a90910481029480820294908290048202939092910290565b600d54604080517f78d0a415000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152915160009392909216916378d0a4159160248082019260209290919082900301818787803b158015610e3457600080fd5b505af1158015610e48573d6000803e3d6000fd5b505050506040513d6020811015610e5e57600080fd5b505192915050565b600160a060020a038116600090815260186020526040902054604060020a900460f060020a02600160f060020a0319161515919050565b60015433600160a060020a03908116911614610eb857600080fd5b600160f060020a0319166000908152600960205260409020805460ff19166001179055565b60005433600160a060020a03908116911614610ef857600080fd5b600160a060020a0381161515610f0d57600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b60005433600160a060020a03908116911614610f4a57600080fd5b600160a060020a0381161515610f5f57600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b600254600160a060020a031681565b600160a060020a031660009081526010602090815260408083205460118352818420546012845282852054601390945291909320549293909290565b60005433600160a060020a03908116911614610fe757600080fd5b60175460ff1615610ff757600080fd5b600c8054600160a060020a03938416600160a060020a031991821617909155600d80549290931691161790556017805460ff19166001179055565b600e54600160a060020a031681565b60005433600160a060020a0390811691161461105c57600080fd5b600160a060020a038116151561107157600080fd5b60008054600160a060020a031916600160a060020a0392909216919091179055565b6007546040805160e160020a63660ea601028152600160a060020a0384811660048301529151600093929092169163cc1d4c029160248082019260209290919082900301818787803b158015610e3457600080fd5b60065463010000009004600160a060020a031681565b600160a060020a03331660009081526014602052604090206004015460ff1615158115151461114f5733600160a060020a03166000908152601460205260409020600401805460ff19168215151790555b50565b60005433600160a060020a0390811691161461116d57600080fd5b60065460ff16151561117e57600080fd5b6006805460ff19169055565b611193336146c0565b151561119e57600080fd5b33600160a060020a031660009081526014602052604081205460d060020a9004810b810b9086900b1461121957600160a060020a033316600090815260146020526040812080549187900b60ff1660d060020a027aff0000000000000000000000000000000000000000000000000000199092169190911790555b600160a060020a033316600090815260146020526040902060010154608060020a026001608060020a0319908116908516146112815733600160a060020a0316600090815260146020526040902060010180546001608060020a031916608060020a86041790555b600160a060020a033316600090815260146020526040812060010154608060020a9004810b810b9084900b146112f857600160a060020a033316600090815260146020526040812060010180549185900b60ff16608060020a0270ff00000000000000000000000000000000199092169190911790555b600160a060020a0333166000908152601460205260409020600190810154710100000000000000000000000000000000009004810b810b9083900b1461139257600160a060020a0333166000908152601460205260409020600190810180549184900b61ffff16710100000000000000000000000000000000000272ffff0000000000000000000000000000000000199092169190911790555b600160a060020a03331660009081526014602052604090206004015460ff161515811515146113e35733600160a060020a03166000908152601460205260409020600401805460ff19168215151790555b600034111561148957600d54604080517fe4651465000000000000000000000000000000000000000000000000000000008152600160a060020a0333811660048301523460248301819052925193169263e4651465929160448082019260209290919082900301818588803b15801561145b57600080fd5b505af115801561146f573d6000803e3d6000fd5b50505050506040513d602081101561148657600080fd5b50505b604051600160a060020a033316907fe3df84c3ca6a90f0e6485beae08e7bd034695356bec32910a3d62559ff33fbc890600090a25050505050565b6000806000806114d333610e66565b15156114de57600080fd5b33600160a060020a0316600090815260186020908152604080832060048101549054604060020a810460f060020a02600160f060020a031916855260198452828520605060020a909104608060020a026001608060020a0319168552909252909120805491955090600019810190811061155457fe5b600091825260208083209190910154600160a060020a03338116845260188352604080852054604060020a810460f060020a02600160f060020a031916865260198552818620605060020a909104608060020a026001608060020a0319168652909352919092208054919092169450849190869081106115d057fe5b60009182526020808320919091018054600160a060020a031916600160a060020a03948516179055858316825260188152604080832060040188905533909316825282822054604060020a810460f060020a02600160f060020a031916835260198252838320605060020a909104608060020a026001608060020a0319168352905220805490611664906000198301614885565b50600160a060020a033316600090815260186020526040902060050154601a805491935090600019810190811061169757fe5b600091825260209091200154601a8054600160a060020a0390921692508291849081106116c057fe5b60009182526020808320919091018054600160a060020a031916600160a060020a039485161790559183168152601890915260409020600501829055601a80549061170f906000198301614885565b50600160a060020a03338116600081815260186020526040808220805479ffffffffffffffffffffffffffffffffffffffffffffffffffff1916815560018101839055600281018390556003810180546001608060020a03191690556004808201849055600582018490556006909101805460ff19169055600d5482517f3716f65d0000000000000000000000000000000000000000000000000000000081529182019490945290519290931692633716f65d926024808301939282900301818387803b1580156117df57600080fd5b505af11580156117f3573d6000803e3d6000fd5b505060408051600160a060020a033316815290517fe607eb1578eec3de556aa2d57f7ff9365c1706069a8959e794883eba60b043e39350908190036020019150a150505050565b60035433600160a060020a0390811691161461185557600080fd5b6000928352601b60209081526040808520600160f060020a03199094168552929052912055565b600d54604080517fa96b3ab8000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151600093929092169163a96b3ab89160248082019260209290919082900301818787803b158015610e3457600080fd5b60005433600160a060020a0390811691161461190257600080fd5b600160a060020a038116151561191757600080fd5b60038054600160a060020a031916600160a060020a0392909216919091179055565b6060601680548060200260200160405190810160405280929190818152602001828054801561199157602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611973575b505050505090505b90565b60005433600160a060020a039081169116146119b757600080fd5b600160a060020a03166000908152600460205260409020805460ff19169055565b60035433600160a060020a039081169116146119f357600080fd5b600e8054600160a060020a031916600160a060020a0392909216919091179055565b600d54604080517f8d837f38000000000000000000000000000000000000000000000000000000008152600160a060020a03848116600483015291516000939290921691638d837f389160248082019260209290919082900301818787803b158015610e3457600080fd5b60065460ff1681565b60015433600160a060020a03908116911614611aa457600080fd5b600160f060020a0319166000908152600860205260409020805460ff19166001179055565b60046020526000908152604090205460ff1681565b60005433600160a060020a03908116911614611af957600080fd5b60065460ff161515611b0a57600080fd5b600d54604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a0384811660048301529151919092169163f2fde38b91602480830192600092919082900301818387803b158015611b7157600080fd5b505af1158015611b85573d6000803e3d6000fd5b5050505050565b60086020526000908152604090205460ff1681565b600d54600160a060020a031681565b6006546040805160e160020a63660ea601028152600160a060020a0384811660048301529151600093630100000090049092169163cc1d4c029160248082019260209290919082900301818787803b158015610e3457600080fd5b60005433600160a060020a03908116911614611c2657600080fd5b600160a060020a0381161515611c3b57600080fd5b600160a060020a03166000908152600460205260409020805460ff19166001179055565b60005433600160a060020a03908116911614611c7a57600080fd5b60065460ff1615611c8a57600080fd5b6006805460ff19166001179055565b6000918252601b60209081526040808420600160f060020a0319909316845291905290205490565b601a805482908110611ccf57fe5b600091825260209091200154600160a060020a0316905081565b600080600080611cf8336146c0565b1515611d0357600080fd5b33600160a060020a0316600090815260146020908152604080832060028101549054604060020a810460f060020a02600160f060020a031916855260158452828520605060020a909104608060020a026001608060020a03191685529092529091208054919550906000198101908110611d7957fe5b600091825260208083209190910154600160a060020a03338116845260148352604080852054604060020a810460f060020a02600160f060020a031916865260158552818620605060020a909104608060020a026001608060020a031916865290935291909220805491909216945084919086908110611df557fe5b60009182526020808320919091018054600160a060020a031916600160a060020a03948516179055858316825260148152604080832060020188905533909316825282822054604060020a810460f060020a02600160f060020a031916835260158252838320605060020a909104608060020a026001608060020a0319168352905220805490611e89906000198301614885565b50600160a060020a03331660009081526014602052604090206003015460168054919350906000198101908110611ebc57fe5b60009182526020909120015460168054600160a060020a039092169250829184908110611ee557fe5b60009182526020808320919091018054600160a060020a031916600160a060020a0394851617905591831681526014909152604090206003018290556016805490611f34906000198301614885565b50600160a060020a0333811660008181526014602052604080822080547affffffffffffffffffffffffffffffffffffffffffffffffffffff1916815560018101805475ffffffffffffffffffffffffffffffffffffffffffff1916905560028101839055600381018390556004908101805460ff19169055600d5482517fb71738f1000000000000000000000000000000000000000000000000000000008152918201949094529051929093169263b71738f1926024808301939282900301818387803b15801561200557600080fd5b505af1158015612019573d6000803e3d6000fd5b5050600d54604080517fd83edd70000000000000000000000000000000000000000000000000000000008152600160a060020a033381166004830152915191909216935063d83edd709250602480830192600092919082900301818387803b15801561208457600080fd5b505af1158015612098573d6000803e3d6000fd5b5050604051600160a060020a03331692507fb1e40dcb43d26b3a6cb20da12c333af5a0de0bcd6264eddca5fbacf3e31d4f949150600090a250505050565b600154600160a060020a031681565b6016805482908110611ccf57fe5b60015433600160a060020a0390811691161461210e57600080fd5b600160f060020a03199091166000908152600a6020526040902055565b60015433600160a060020a0390811691161461214657600080fd5b600160f060020a0319166000908152600960205260409020805460ff19169055565b612171336146c0565b151561217c57600080fd5b600d54604080517fe4651465000000000000000000000000000000000000000000000000000000008152600160a060020a0333811660048301523460248301819052925193169263e4651465929160448082019260209290919082900301818588803b1580156121eb57600080fd5b505af11580156121ff573d6000803e3d6000fd5b50505050506040513d602081101561221657600080fd5b5051151561222357600080fd5b565b60005433600160a060020a0390811691161461224057600080fd5b600160a060020a03166000908152600560205260409020805460ff19169055565b33600160a060020a038116600090815260046020526040812054909182918291829160ff16151561229157600080fd5b600160a060020a038616600090815260186020908152604080832060048101549054604060020a810460f060020a02600160f060020a031916855260198452828520605060020a909104608060020a026001608060020a0319168552909252909120805491965090600019810190811061230757fe5b600091825260208083209190910154600160a060020a03898116845260188352604080852054604060020a810460f060020a02600160f060020a031916865260198552818620605060020a909104608060020a026001608060020a03191686529093529190922080549190921695508591908790811061238357fe5b60009182526020808320919091018054600160a060020a031916600160a060020a039485161790558683168252601881526040808320600401899055928916825282822054604060020a810460f060020a02600160f060020a031916835260198252838320605060020a909104608060020a026001608060020a0319168352905220805490612416906000198301614885565b50600160a060020a038616600090815260186020526040902060050154601a805491945090600019810190811061244957fe5b600091825260209091200154601a8054600160a060020a03909216935083918590811061247257fe5b60009182526020808320919091018054600160a060020a031916600160a060020a039485161790559184168152601890915260409020600501839055601a8054906124c1906000198301614885565b50600160a060020a03861660009081526018602052604090206006015460ff16151561256b57600d54604080517f3716f65d000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015291519190921691633716f65d91602480830192600092919082900301818387803b15801561254e57600080fd5b505af1158015612562573d6000803e3d6000fd5b505050506125f6565b600d54600254604080517f7139b595000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152928316602482015290519190921691637139b59591604480830192600092919082900301818387803b1580156125dd57600080fd5b505af11580156125f1573d6000803e3d6000fd5b505050505b600160a060020a038087166000818152601860209081526040808320805479ffffffffffffffffffffffffffffffffffffffffffffffffffff1916815560018101849055600281018490556003810180546001608060020a03191690556004810184905560058101939093556006909201805460ff191690558151928352905133909316927f34fe9e989d541054eb508f79a2e9b0bc3aa3d7ff2f2ded4f1f6b2819aaec86a39281900390910190a2505050505050565b600160f060020a0319821660009081526019602090815260408083206001608060020a03198516845282529182902080548351818402810184019094528084526060939283018282801561272a57602002820191906000526020600020905b8154600160a060020a0316815260019091019060200180831161270c575b5050505050905092915050565b60015433600160a060020a0390811691161461275257600080fd5b600160f060020a0319166000908152600860205260409020805460ff19169055565b60065460009081908190819060ff161561278d57600080fd5b6006546040805160e160020a63660ea601028152600160a060020a038a8116600483015291518a93630100000090049092169163cc1d4c02916024808201926020929091908290030181600087803b1580156127e857600080fd5b505af11580156127fc573d6000803e3d6000fd5b505050506040513d602081101561281257600080fd5b5051151561281f57600080fd5b600c5433600160a060020a0390811691161461283a57600080fd5b61284b86600063ffffffff61479416565b945060f860020a61286387600163ffffffff61479416565b600160f860020a0319161461288f5761288386600263ffffffff6147bc16565b60e060020a90046128ac565b6128a086600263ffffffff6147bc16565b60e060020a9004600019025b935060f860020a6128c487600663ffffffff61479416565b600160f860020a031916146128f0576128e486600763ffffffff6147bc16565b60e060020a900461290d565b61290186600763ffffffff6147bc16565b60e060020a9004600019025b9250600160f860020a031985167f31000000000000000000000000000000000000000000000000000000000000001415612e6d57600a600061295688600b63ffffffff6147d216565b600160f060020a031916815260208101919091526040016000205487101561297d57600080fd5b61298688610e66565b1561299057600080fd5b600860006129a588600b63ffffffff6147d216565b600160f060020a031916815260208101919091526040016000205460ff1615156129ce57600080fd5b600160a060020a0388166000908152601860205260409020805463ffffffff1916600386810b63ffffffff9081169290921767ffffffff0000000019166401000000009187900b83169190910217909155612a2e908790600b906147d216565b600160a060020a0389166000908152601860205260409020805460f060020a909204604060020a0269ffff000000000000000019909216919091179055612a7c86600d63ffffffff6147e816565b600160a060020a03891660009081526018602052604090208054608060020a909204605060020a0279ffffffffffffffffffffffffffffffff0000000000000000000019909216919091179055612ada86601d63ffffffff6147e816565b600160a060020a038916600090815260186020526040902060010180546001608060020a031916608060020a909204919091179055612b1a86602d6147e8565b600160a060020a038916600090815260186020526040902060010180546fffffffffffffffffffffffffffffffff16608060020a92839004909202919091179055612b6686603d6147fe565b600160a060020a038916600090815260186020526040902060020155612b9386605d63ffffffff6147e816565b600160a060020a03891660008181526018602052604081206003810180546001608060020a031916608060020a90950494909417909355601a805460018181019092557f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e81018054600160a060020a031916909417909355600590930191909155601990612c2289600b6147d2565b600160f060020a03191681526020810191909152604001600090812090612c5089600d63ffffffff6147e816565b6fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff191681526020019081526020016000208990806001815401808255809150509060018203906000526020600020016000909192909190916101000a815481600160a060020a030219169083600160a060020a0316021790555003601860008a600160a060020a0316600160a060020a03168152602001908152602001600020600401819055507ff45ad76a8c4c14053708bfd052607c5e35446beb04fbdff6f2f3c9dde8e83b37886040518082600160a060020a0316600160a060020a0316815260200191505060405180910390a1600d54604080517fd4d84da5000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152602482018b90529151919092169163d4d84da591604480830192600092919082900301818387803b158015612db157600080fd5b505af1158015612dc5573d6000803e3d6000fd5b5050600c54600d54604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018d9052905191909216935063a9059cbb925060448083019260209291908290030181600087803b158015612e3b57600080fd5b505af1158015612e4f573d6000803e3d6000fd5b505050506040513d6020811015612e6557600080fd5b506139f39050565b600160f860020a031985167f320000000000000000000000000000000000000000000000000000000000000014156134ad57600b6000612eb3888363ffffffff6147d216565b600160f060020a0319168152602081019190915260400160002054871015612eda57600080fd5b612ee3886146c0565b15612eed57600080fd5b60096000612f0288600b63ffffffff6147d216565b600160f060020a031916815260208101919091526040016000205460ff161515612f2b57600080fd5b600160a060020a0388166000908152601460205260409020805463ffffffff1916600386810b63ffffffff9081169290921767ffffffff0000000019166401000000009187900b83169190910217909155612f8b908790600b906147d216565b600160a060020a0389166000908152601460205260409020805460f060020a909204604060020a0269ffff000000000000000019909216919091179055612fd986600d63ffffffff6147e816565b600160a060020a03891660009081526014602052604090208054608060020a909204605060020a0279ffffffffffffffffffffffffffffffff000000000000000000001990921691909117905561303786601d63ffffffff61479416565b600160a060020a0389166000908152601460205260408120600101805460f860020a90930490910b60ff16608060020a0270ff000000000000000000000000000000001990921691909117905561309586601e63ffffffff61479416565b600160a060020a0389166000908152601460205260408120805460f860020a90930490910b60ff1660d060020a027aff0000000000000000000000000000000000000000000000000000199092169190911790556130fa86601f63ffffffff6147e816565b600160a060020a038916600090815260146020526040902060010180546001608060020a031916608060020a90920491909117905561313a86602f6147d2565b600160a060020a03891660009081526014602052604090206001908101805460f060020a90930490910b61ffff16710100000000000000000000000000000000000272ffff00000000000000000000000000000000001990921691909117905560f860020a6131b087603163ffffffff61479416565b600160f860020a031916146131c65760006131c9565b60015b600160a060020a038916600090815260146020526040902060010180549115157301000000000000000000000000000000000000000273ff000000000000000000000000000000000000001990921691909117905561322f86603263ffffffff6147d216565b600160a060020a03891660008181526014602052604081206001808201805460f060020a909604820b61ffff16740100000000000000000000000000000000000000000275ffff00000000000000000000000000000000000000001990961695909517909455601680548086019091557fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b512428981018054600160a060020a03191685179055928252600301919091556015906132f089600b63ffffffff6147d216565b600160f060020a0319168152602081019190915260400160009081209061331e89600d63ffffffff6147e816565b6fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff191681526020019081526020016000208990806001815401808255809150509060018203906000526020600020016000909192909190916101000a815481600160a060020a030219169083600160a060020a0316021790555003601460008a600160a060020a0316600160a060020a03168152602001908152602001600020600201819055506001601460008a600160a060020a0316600160a060020a0316815260200190815260200160002060040160006101000a81548160ff02191690831515021790555087600160a060020a03167fdc94eebf39359cb097be68bd4890a58fce65c66d2d284d4349f666013dc8a43d60405160405180910390a2600d54604080517f18a6d58b000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152602482018b9052915191909216916318a6d58b91604480830192600092919082900301818387803b158015612db157600080fd5b600160f860020a031985167f330000000000000000000000000000000000000000000000000000000000000014156139f357600254600160a060020a038981169116146134f957600080fd5b600a600061350e88600b63ffffffff6147d216565b600160f060020a031916815260208101919091526040016000205487101561353557600080fd5b61354e61354987606d63ffffffff61481416565b610e66565b1561355857600080fd5b6008600061356d88600b63ffffffff6147d216565b600160f060020a031916815260208101919091526040016000205460ff16151561359657600080fd5b6135a786606d63ffffffff61481416565b600160a060020a0381166000908152601860205260409020805463ffffffff1916600387810b63ffffffff9081169290921767ffffffff0000000019166401000000009188900b8316919091021790915590925061360a908790600b906147d216565b600160a060020a0383166000908152601860205260409020805460f060020a909204604060020a0269ffff00000000000000001990921691909117905561365886600d63ffffffff6147e816565b600160a060020a03831660009081526018602052604090208054608060020a909204605060020a0279ffffffffffffffffffffffffffffffff00000000000000000000199092169190911790556136b686601d63ffffffff6147e816565b600160a060020a038316600090815260186020526040902060010180546001608060020a031916608060020a9092049190911790556136f686602d6147e8565b600160a060020a038316600090815260186020526040902060010180546fffffffffffffffffffffffffffffffff16608060020a9283900490920291909117905561374286603d6147fe565b600160a060020a03831660009081526018602052604090206002015561376f86605d63ffffffff6147e816565b600160a060020a03831660008181526018602052604081206003810180546001608060020a031916608060020a90950494909417909355601a805460018181019092557f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e81018054600160a060020a0319169094179093556005909301919091556019906137fe89600b6147d2565b600160f060020a0319168152602081019190915260400160009081209061382c89600d63ffffffff6147e816565b6001608060020a03191681526020808201929092526040908101600090812080546001808201835591835284832081018054600160a060020a031916600160a060020a038a169081179091558084526018865292849020959003810160048601556006909401805460ff19169094179093558051928352517ff45ad76a8c4c14053708bfd052607c5e35446beb04fbdff6f2f3c9dde8e83b379281900390910190a1600d54604080517fd4d84da5000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018b90529151919092169163d4d84da591604480830192600092919082900301818387803b15801561393c57600080fd5b505af1158015613950573d6000803e3d6000fd5b5050600c54600d54604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018d9052905191909216935063a9059cbb925060448083019260209291908290030181600087803b1580156139c657600080fd5b505af11580156139da573d6000803e3d6000fd5b505050506040513d60208110156139f057600080fd5b50505b5050505050505050565b60056020526000908152604090205460ff1681565b60096020526000908152604090205460ff1681565b600160a060020a031660009081526013602052604090205490565b60005433600160a060020a03908116911614613a5d57600080fd5b600160a060020a0381161515613a7257600080fd5b600160a060020a03166000908152600560205260409020805460ff19166001179055565b60065462010000900460ff1681565b6060601a80548060200260200160405190810160405280929190818152602001828054801561199157602002820191906000526020600020908154600160a060020a03168152600190910190602001808311611973575050505050905090565b60065460009060ff1615613b1857600080fd5b33600160a060020a0381166000908152601460205260408120548491604060020a90910460f060020a0290808080613b69613b5288611093565b613b5d576001613b60565b60025b60ff1686611c99565b9350613bf3600e60009054906101000a9004600160a060020a0316600160a060020a03166350ccf36b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015613bc157600080fd5b505af1158015613bd5573d6000803e3d6000fd5b505050506040513d6020811015613beb57600080fd5b505185614844565b600d54604080517fad71766e000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152915193965091169163ad71766e916024808201926020929091908290030181600087803b158015613c5d57600080fd5b505af1158015613c71573d6000803e3d6000fd5b505050506040513d6020811015613c8757600080fd5b50519150613c958287614876565b905082811115613ca457600080fd5b613cad336146c0565b1515613cb857600080fd5b33600160a060020a03168a600160a060020a031614151515613cd957600080fd5b600d54604080517ff5923a6e000000000000000000000000000000000000000000000000000000008152600160a060020a0333811660048301528d81166024830152604482018d90529151919092169163f5923a6e91606480830192600092919082900301818387803b158015613d4f57600080fd5b505af1158015613d63573d6000803e3d6000fd5b50506006546040805160e160020a63660ea601028152600160a060020a038f8116600483015291516301000000909304909116935063cc1d4c0292506024808201926020929091908290030181600087803b158015613dc157600080fd5b505af1158015613dd5573d6000803e3d6000fd5b505050506040513d6020811015613deb57600080fd5b505115613f9757600160a060020a033381166000908152600f60209081526040808320938e16835292905220549750871515613e5057600160a060020a033381166000908152600f60209081526040808320938e168352929052206127109081905597505b600160a060020a033316600090815260136020526040902054613e8990612710613e7a8c8c614844565b811515613e8357fe5b04614876565b600160a060020a0333166000908152601360205260409020556064613eaf89604f614844565b811515613eb857fe5b04600f600033600160a060020a0316600160a060020a0316815260200190815260200160002060008c600160a060020a0316600160a060020a0316815260200190815260200160002081905550613f34601060008c600160a060020a0316600160a060020a03168152602001908152602001600020548a614876565b600160a060020a03808c1660009081526010602090815260408083209490945533909216815260119091522054613f6b908a614876565b600160a060020a0333166000908152601160209081526040808320939093556012905220805460010190555b89600160a060020a031633600160a060020a03167f3990db2d31862302a685e8086b5755072a6e2b5b780af1ee81ece35ee3cd33458b6040518082815260200191505060405180910390a350505050505050505050565b60005433600160a060020a0390811691161461400957600080fd5b60065462010000900460ff161561401f57600080fd5b60078054600160a060020a03909216600160a060020a03199092169190911790556006805462ff0000191662010000179055565b33600160a060020a038116600090815260056020526040812054909182918291829160ff16151561408357600080fd5b61408c866146c0565b151561409757600080fd5b600160a060020a038616600090815260146020908152604080832060028101549054604060020a810460f060020a02600160f060020a031916855260158452828520605060020a909104608060020a026001608060020a0319168552909252909120805491965090600019810190811061410d57fe5b600091825260208083209190910154600160a060020a03898116845260148352604080852054604060020a810460f060020a02600160f060020a031916865260158552818620605060020a909104608060020a026001608060020a03191686529093529190922080549190921695508591908790811061418957fe5b60009182526020808320919091018054600160a060020a031916600160a060020a039485161790558683168252601481526040808320600201899055928916825282822054604060020a810460f060020a02600160f060020a031916835260158252838320605060020a909104608060020a026001608060020a031916835290522080549061421c906000198301614885565b50600160a060020a0386166000908152601460205260409020600301546016805491945090600019810190811061424f57fe5b60009182526020909120015460168054600160a060020a03909216935083918590811061427857fe5b60009182526020808320919091018054600160a060020a031916600160a060020a03948516179055918416815260149091526040902060030183905560168054906142c7906000198301614885565b50600160a060020a0380871660008181526014602052604080822080547affffffffffffffffffffffffffffffffffffffffffffffffffffff1916815560018101805475ffffffffffffffffffffffffffffffffffffffffffff1916905560028101839055600381018390556004908101805460ff19169055600d5482517fb71738f1000000000000000000000000000000000000000000000000000000008152918201949094529051929093169263b71738f1926024808301939282900301818387803b15801561439857600080fd5b505af11580156143ac573d6000803e3d6000fd5b5050600d54604080517fd83edd70000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152915191909216935063d83edd709250602480830192600092919082900301818387803b15801561441757600080fd5b505af115801561442b573d6000803e3d6000fd5b505060408051600160a060020a038a811682529151339290921693507fcf9fc954c975d15bad8f5fa3c1cd94f55105a98b1ecf33021ebb059122277f8f925081900360200190a2505050505050565b60015433600160a060020a0390811691161461449557600080fd5b600160f060020a03199091166000908152600b6020526040902055565b600b6020526000908152604090205481565b600160a060020a0380821660008181526014602090815260408083208054600180830154600480850154600d5487517f8d837f380000000000000000000000000000000000000000000000000000000081529283019a909a529551600385810b9b640100000000870490910b9a60f060020a604060020a8804029a608060020a605060020a890481029b60d060020a909904820b9a8782029a918804830b997101000000000000000000000000000000000089048a0b99939860ff928316987301000000000000000000000000000000000000008204909316977401000000000000000000000000000000000000000090910490940b95929490921692638d837f389260248084019391929182900301818b87803b1580156145e557600080fd5b505af11580156145f9573d6000803e3d6000fd5b505050506040513d602081101561460f57600080fd5b50519c9e9b9d50999b989a9799509597949693959193909250565b600654610100900460ff1681565b600160f060020a0319821660009081526015602090815260408083206001608060020a03198516845282529182902080548351818402810184019094528084526060939283018282801561272a57602002820191906000526020600020908154600160a060020a0316815260019091019060200180831161270c575050505050905092915050565b600160a060020a038116600090815260146020526040902054604060020a900460f060020a02600160f060020a0319161515919050565b60005433600160a060020a0390811691161461471257600080fd5b600654610100900460ff161561472757600080fd5b6006805461ff0019600160a060020a0390931663010000000276ffffffffffffffffffffffffffffffffffffffff000000199091161791909116610100179055565b600160a060020a039182166000908152600f6020908152604080832093909416825291909152205490565b600080826001018451101515156147aa57600080fd5b505081810160200151805b5092915050565b600080826004018451101515156147aa57600080fd5b600080826002018451101515156147aa57600080fd5b600080826010018451101515156147aa57600080fd5b600080826020018451101515156147aa57600080fd5b6000808260140184511015151561482a57600080fd5b505001602001516c01000000000000000000000000900490565b60008083151561485757600091506147b5565b5082820282848281151561486757fe5b041461486f57fe5b9392505050565b60008282018381101561486f57fe5b8154818355818111156148a9576000838152602090206148a99181019083016148ae565b505050565b61199991905b808211156148c857600081556001016148b4565b50905600a165627a7a72305820a34ae3cd5140b74ce2a7d0f03a58b2ebb2d2566d167b4e095d48a2d884b47db10029
Swarm Source
bzzr://a34ae3cd5140b74ce2a7d0f03a58b2ebb2d2566d167b4e095d48a2d884b47db1
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.