Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Read Proxy
Write Contract
Write Proxy
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- EthernityRegistry
- Optimization enabled
- true
- Compiler version
- v0.5.17+commit.d19bba13
- Optimization runs
- 200
- EVM Version
- istanbul
- Verified at
- 2024-10-04T11:32:15.474002Z
Contract source code
// File: pox-smart-contract/Models.sol
pragma solidity ^0.5.17;
/**
* Copyright (C) 2018, 2019, 2020 Ethernity HODL UG
*
* This file is part of ETHERNITY PoX SC.
*
* ETHERNITY PoE SC is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
library Models {
/*
* used for storing multiple data
*/
struct Metadata {
string key;
string value;
}
struct Order {
uint8 instance;
address dproc;
address downer;
address processor;
address placedBy;
uint dpRequest;
uint doRequest;
uint timeout;
mapping(uint => Metadata) metadata;
uint metadataSize;
string result;
uint price;
OrderStatus status;
}
struct DPRequest {
address dproc;
uint8 cpuRequest;
uint8 memoryRequest;
uint8 storageRequest;
uint8 bandwidthRequest;
uint16 duration; //--timeout
uint8 minPrice;
uint32 createdAt;
uint8 price;
string Metadata1;
string Metadata2;
string Metadata3;
string Metadata4;
mapping(uint => Metadata) metadata;
uint metadataSize;
RequestStatus status;
}
struct DORequest {
address downer;
// CPU number
uint8 cpuRequest;
// Memory in GB
uint8 memoryRequest;
// Storage in GB
uint8 storageRequest;
uint8 bandwidthRequest;
uint16 duration;
uint8 instances;
uint8 bookedInstances;
uint32 createdAt;
uint8 maxPrice;
uint32 tokens;
string Metadata1;
string Metadata2;
string Metadata3;
string Metadata4;
mapping(uint => Metadata) metadata;
uint metadataSize;
RequestStatus status;
}
enum OrderStatus{
OPEN,
PROCESSING,
CLOSED,
CANCELED
}
enum RequestStatus{
AVAILABLE,
BOOKED,
CANCELED
}
}
// File: pox-smart-contract/Owned.sol
pragma solidity ^0.5.17;
// ----------------------------------------------------------------------------
// 'FIXED' 'Example Fixed Supply Token' token contract
//
// Symbol : FIXED
// Name : Example Fixed Supply Token
// Total supply: 1,000,000.000000000000000000
// Decimals : 18
//
// Enjoy.
//
// (c) BokkyPooBah / Bok Consulting Pty Ltd 2017. The MIT Licence.
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// Owned contract
// ----------------------------------------------------------------------------
contract Owned {
address public owner;
address public newOwner;
event OwnershipTransferred(address indexed _from, address indexed _to);
constructor() public {
owner = msg.sender;
}
modifier onlyOwner {
require(msg.sender == owner);
_;
}
function transferOwnership(address _newOwner) public onlyOwner {
newOwner = _newOwner;
}
function acceptOwnership() public {
require(msg.sender == newOwner);
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
newOwner = address(0);
}
}
// File: pox-smart-contract/Delegated.sol
pragma solidity ^0.5.17;
/**
* Copyright (C) 2018, 2019, 2020 Ethernity HODL UG
*
* This file is part of ETHERNITY PoX SC.
*
* ETHERNITY PoE SC is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
contract Delegated is Owned {
address public callerAddress;
event ProxyTransferred(address indexed _from, address indexed _to);
constructor() public {
callerAddress = msg.sender;
}
modifier onlyDelegate {
require(msg.sender == callerAddress);
_;
}
function transferProxy(address _newProxy) public onlyOwner {
callerAddress = _newProxy;
}
}
// File: pox-smart-contract/StandardToken.sol
pragma solidity ^0.5.17;
// ----------------------------------------------------------------------------
// 'FIXED' 'Example Fixed Supply Token' token contract
//
// Symbol : FIXED
// Name : Example Fixed Supply Token
// Total supply: 1,000,000.000000000000000000
// Decimals : 18
//
// Enjoy.
//
// (c) BokkyPooBah / Bok Consulting Pty Ltd 2017. The MIT Licence.
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// Safe maths
// ----------------------------------------------------------------------------
library SafeMath {
function add(uint a, uint b) internal pure returns (uint c) {
c = a + b;
require(c >= a);
}
function sub(uint a, uint b) internal pure returns (uint c) {
require(b <= a);
c = a - b;
}
function mul(uint a, uint b) internal pure returns (uint c) {
c = a * b;
require(a == 0 || c / a == b);
}
function div(uint a, uint b) internal pure returns (uint c) {
require(b > 0);
c = a / b;
}
}
// ----------------------------------------------------------------------------
// ERC Token Standard #20 Interface
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md
// ----------------------------------------------------------------------------
contract ERC20Interface {
function totalSupply() public view returns (uint);
function balanceOf(address tokenOwner) public view returns (uint balance);
function allowance(address tokenOwner, address spender) public view returns (uint remaining);
function transfer(address to, uint tokens) public returns (bool success);
function approve(address spender, uint tokens) public returns (bool success);
function transferFrom(address from, address to, uint tokens) public returns (bool success);
event Transfer(address indexed from, address indexed to, uint tokens);
event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}
// ----------------------------------------------------------------------------
// Contract function to receive approval and execute function in one call
//
// Borrowed from MiniMeToken
// ----------------------------------------------------------------------------
contract ApproveAndCallFallBack {
function receiveApproval(address from, uint256 tokens, address token, bytes memory data) public;
}
// ----------------------------------------------------------------------------
// ERC20 Token, with the addition of symbol, name and decimals and an
// initial fixed supply
// ----------------------------------------------------------------------------
contract StandardToken is ERC20Interface, Delegated {
using SafeMath for uint;
string public symbol;
string public name;
uint8 public decimals;
uint public _totalSupply;
mapping(address => uint) balances;
mapping(address => mapping(address => uint)) allowed;
// ------------------------------------------------------------------------
// Constructor
// ------------------------------------------------------------------------
constructor() public {
symbol = "FIXED";
name = "Example Fixed Supply Token";
decimals = 18;
_totalSupply = 1000000 * 10**uint(decimals);
balances[owner] = _totalSupply;
emit Transfer(address(0), owner, _totalSupply);
}
// ------------------------------------------------------------------------
// Total supply
// ------------------------------------------------------------------------
function totalSupply() public view returns (uint) {
return _totalSupply - balances[address(0)];
}
// ------------------------------------------------------------------------
// Get the token balance for account `tokenOwner`
// ------------------------------------------------------------------------
function balanceOf(address tokenOwner) public view returns (uint balance) {
return balances[tokenOwner];
}
// ------------------------------------------------------------------------
// Transfer the balance from token owner's account to `to` account
// - Owner's account must have sufficient balance to transfer
// - 0 value transfers are allowed
// ------------------------------------------------------------------------
function transfer(address to, uint tokens) public returns (bool success) {
balances[msg.sender] = balances[msg.sender].sub(tokens);
balances[to] = balances[to].add(tokens);
emit Transfer(msg.sender, to, tokens);
return true;
}
// ------------------------------------------------------------------------
// Token owner can approve for `spender` to transferFrom(...) `tokens`
// from the token owner's account
//
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md
// recommends that there are no checks for the approval double-spend attack
// as this should be implemented in user interfaces
// ------------------------------------------------------------------------
function approve(address spender, uint tokens) public returns (bool success) {
allowed[msg.sender][spender] = tokens;
emit Approval(msg.sender, spender, tokens);
return true;
}
// ------------------------------------------------------------------------
// Transfer `tokens` from the `from` account to the `to` account
//
// The calling account must already have sufficient tokens approve(...)-d
// for spending from the `from` account and
// - From account must have sufficient balance to transfer
// - Spender must have sufficient allowance to transfer
// - 0 value transfers are allowed
// ------------------------------------------------------------------------
function transferFrom(address from, address to, uint tokens) public returns (bool success) {
balances[from] = balances[from].sub(tokens);
allowed[from][msg.sender] = allowed[from][msg.sender].sub(tokens);
balances[to] = balances[to].add(tokens);
emit Transfer(from, to, tokens);
return true;
}
// ------------------------------------------------------------------------
// Returns the amount of tokens approved by the owner that can be
// transferred to the spender's account
// ------------------------------------------------------------------------
function allowance(address tokenOwner, address spender) public view returns (uint remaining) {
return allowed[tokenOwner][spender];
}
// ------------------------------------------------------------------------
// Token owner can approve for `spender` to transferFrom(...) `tokens`
// from the token owner's account. The `spender` contract function
// `receiveApproval(...)` is then executed
// ------------------------------------------------------------------------
function approveAndCall(address spender, uint tokens, bytes memory data) public returns (bool success) {
allowed[msg.sender][spender] = tokens;
emit Approval(msg.sender, spender, tokens);
ApproveAndCallFallBack(spender).receiveApproval(msg.sender, tokens, address(this), data);
return true;
}
// ------------------------------------------------------------------------
// Don't accept ETH
// ------------------------------------------------------------------------
function () external payable {
revert();
}
// ------------------------------------------------------------------------
// Owner can transfer out any accidentally sent ERC20 tokens
// ------------------------------------------------------------------------
function transferAnyERC20Token(address tokenAddress, uint tokens) public onlyOwner returns (bool success) {
return ERC20Interface(tokenAddress).transfer(owner, tokens);
}
}
// File: pox-smart-contract/EthernityStorage.sol
pragma solidity ^0.5.17;
/**
* Copyright (C) 2018, 2019, 2020 Ethernity HODL UG
*
* This file is part of ETHERNITY PoX SC.
*
* ETHERNITY PoE SC is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
contract EthernityStorage is StandardToken {
constructor() public{
name = "Ethernity Token TestNet";
symbol = "tETNY";
decimals = 18;
_totalSupply = 1000000000 * 10 ** uint(decimals);
balances[owner] = _totalSupply;
emit Transfer(address(0), owner, _totalSupply);
}
modifier onlyOwner() {
require(
msg.sender == owner,
"Only owner can call this function."
);
_;
}
address public implementation;
address public implementationPro;
address[] internal versions;
address[] internal versionsPro;
mapping(address => bool) usersPro;
uint128 internal baseLockDate = 1688169599; // Fri Jun 30 2023 23:59:59 GMT+0000
uint128 constant internal twoYears = 63072000;
uint128 constant internal oneYear = 31536000;
uint128 constant internal sixMonths = 15780000;
mapping(address => uint128) lockTime;
mapping(address => uint256) attestation;
mapping(address => uint256) aggregation;
mapping(address => uint256) proposal;
uint16 constant internal HOURS_IN_SECONDS = 3600;
uint8 constant internal MAX_CPU = 255;
uint8 constant internal MAX_MEMORY = 255;
uint8 constant internal MAX_STORAGE = 255;
uint8 constant internal MAX_BANDWIDTH = 255;
uint8 constant internal MAX_INSTANCES = 10;
Models.DORequest[] internal doRequestsList;
Models.DPRequest[] internal dpRequestsList;
Models.Order[] internal orders;
mapping(address => uint256[]) usersDORequests;
mapping(address => uint256[]) usersDPRequests;
mapping(address => uint256[]) usersOrders;
}
// File: pox-smart-contract/EthernityRegistry.sol
pragma solidity ^0.5.17;
/**
* Copyright (C) 2018, 2019, 2020 Ethernity HODL UG
*
* This file is part of ETHERNITY PoX SC.
*
* ETHERNITY PoE SC is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
contract EthernityRegistry is EthernityStorage {
constructor() public {
versions.push(address(0));
versionsPro.push(address(0));
}
/**
* @dev Upgrades the implementation address
* @param _newImplementation address of the new implementation
*/
function upgradeTo(address _newImplementation) public onlyOwner returns (bool success){
require(implementation != _newImplementation);
_setImplementation(_newImplementation);
return true;
}
/**
* @dev Upgrades the implementation address
* @param _newImplementation address of the new implementation
*/
function upgradeToPro(address _newImplementation) public onlyOwner returns (bool success){
require(implementationPro != _newImplementation);
_setImplementationPro(_newImplementation);
return true;
}
/**
* @dev Fallback function allowing to perform a delegatecall
* to the given implementation. This function will return
* whatever the implementation call returns
*/
function _fallback() internal {
address target = address(0);
if (usersPro[msg.sender] == true) {
target = implementationPro;
} else {
target = implementation;
}
require(target != address(0));
callerAddress = msg.sender;
assembly {
let ptr := mload(0x40)
let size := and(add(calldatasize, 0x1f), not(0x1f))
mstore(0x40, add(ptr, size))
calldatacopy(ptr, 0, calldatasize)
let result := delegatecall(gas, target, ptr, calldatasize, 0, 0)
switch result
case 0 {
revert(0, 0)
} default {
let retptr := mload(0x40)
mstore(0x40, add(retptr, returndatasize))
returndatacopy(retptr, 0x0, returndatasize)
return (retptr, returndatasize)
}
}
}
function() payable external {
_fallback();
}
function transfer(address to, uint tokens) public returns (bool success) {
_fallback();
}
function transferFrom(address from, address to, uint tokens) public returns (bool success) {
_fallback();
}
function approve(address spender, uint tokens) public returns (bool success) {
_fallback();
}
function approveAndCall(address spender, uint tokens, bytes memory data) public returns (bool success) {
_fallback();
}
function _addProUser(address userPro) public onlyOwner returns (bool){
usersPro[userPro] = true;
return true;
}
function _removeProUser(address userPro) public onlyOwner returns (bool){
usersPro[userPro] = false;
return true;
}
function _checkProUser(address userPro) public onlyOwner view returns (bool){
return usersPro[userPro];
}
/**
* @dev Sets the address of the current implementation
* @param _newImp address of the new implementation
*/
function _setImplementation(address _newImp) internal onlyOwner {
implementation = _newImp;
versions.push(_newImp);
}
function _setImplementationPro(address _newImp) internal onlyOwner {
implementationPro = _newImp;
versionsPro.push(_newImp);
}
/**
* returns true for pro users | false for community
*/
function _checkSubscription() public view returns (bool){
return usersPro[msg.sender];
}
}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","payable":false,"inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"tokenOwner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"tokens","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"_from","internalType":"address","indexed":true},{"type":"address","name":"_to","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"ProxyTransferred","inputs":[{"type":"address","name":"_from","internalType":"address","indexed":true},{"type":"address","name":"_to","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"tokens","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"fallback","stateMutability":"payable","payable":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_addProUser","inputs":[{"type":"address","name":"userPro","internalType":"address"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_checkProUser","inputs":[{"type":"address","name":"userPro","internalType":"address"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_checkSubscription","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_removeProUser","inputs":[{"type":"address","name":"userPro","internalType":"address"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_totalSupply","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"acceptOwnership","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"remaining","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"tokenOwner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"tokens","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"approveAndCall","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"tokens","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"balance","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"tokenOwner","internalType":"address"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"address"}],"name":"callerAddress","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"address"}],"name":"implementation","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"address"}],"name":"implementationPro","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"address"}],"name":"newOwner","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokens","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"transferAnyERC20Token","inputs":[{"type":"address","name":"tokenAddress","internalType":"address"},{"type":"uint256","name":"tokens","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokens","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"_newOwner","internalType":"address"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"transferProxy","inputs":[{"type":"address","name":"_newProxy","internalType":"address"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"upgradeTo","inputs":[{"type":"address","name":"_newImplementation","internalType":"address"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"upgradeToPro","inputs":[{"type":"address","name":"_newImplementation","internalType":"address"}],"constant":false}]
Contract Creation Code
0x6080604052600e80546001600160801b03191663649f6c7f1790553480156200002757600080fd5b5060008054336001600160a01b0319918216811790925560028054909116909117905560408051808201909152600580825264119256115160da1b6020909201918252620000789160039162000281565b5060408051808201909152601a8082527f4578616d706c6520466978656420537570706c7920546f6b656e0000000000006020909201918252620000bf9160049162000281565b5060058054601260ff19909116179081905560ff16600a0a620f4240026006819055600080546001600160a01b03908116825260076020908152604080842085905583548151958652905192169360008051602062001263833981519152929081900390910190a36040805180820190915260178082527f45746865726e69747920546f6b656e20546573744e657400000000000000000060209092019182526200016d9160049162000281565b50604080518082019091526005808252647445544e5960d81b60209092019182526200019c9160039162000281565b5060058054601260ff19909116179081905560ff16600a0a633b9aca00026006819055600080546001600160a01b03908116825260076020908152604080842085905583548151958652905192169360008051602062001263833981519152929081900390910190a3600b805460018181019092557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319908116909155600c805492830181556000527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c79091018054909116905562000326565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002c457805160ff1916838001178555620002f4565b82800160010185558215620002f4579182015b82811115620002f4578251825591602001919060010190620002d7565b506200030292915062000306565b5090565b6200032391905b808211156200030257600081556001016200030d565b90565b610f2d80620003366000396000f3fe6080604052600436106101815760003560e01c806374ed9ae4116100d1578063a9059cbb1161008a578063dc39d06d11610064578063dc39d06d146105e8578063dd62ed3e14610621578063f2fde38b1461065c578063faa8aab11461068f57610181565b8063a9059cbb1461025c578063cae9ca511461050b578063d4ee1d90146105d357610181565b806374ed9ae41461046f57806379ba5097146104845780638da5cb5b146104995780638e482667146104ae578063928a6270146104e157806395d89b41146104f657610181565b80633659cfe61161013e57806357692f251161011857806357692f25146103a55780635c60da1b146103d857806367a5641f1461040957806370a082311461043c57610181565b80633659cfe61461032a5780633eaaf86b1461035d578063438787d01461037257610181565b8063069fcdaf1461018b57806306fdde03146101d2578063095ea7b31461025c57806318160ddd1461029557806323b872dd146102bc578063313ce567146102ff575b6101896106a4565b005b34801561019757600080fd5b506101be600480360360208110156101ae57600080fd5b50356001600160a01b0316610746565b604080519115158252519081900360200190f35b3480156101de57600080fd5b506101e76107bc565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610221578181015183820152602001610209565b50505050905090810190601f16801561024e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561026857600080fd5b506101be6004803603604081101561027f57600080fd5b506001600160a01b03813516906020013561084a565b3480156102a157600080fd5b506102aa61085a565b60408051918252519081900360200190f35b3480156102c857600080fd5b506101be600480360360608110156102df57600080fd5b506001600160a01b0381358116916020810135909116906040013561088c565b34801561030b57600080fd5b5061031461089d565b6040805160ff9092168252519081900360200190f35b34801561033657600080fd5b506101be6004803603602081101561034d57600080fd5b50356001600160a01b03166108a6565b34801561036957600080fd5b506102aa610914565b34801561037e57600080fd5b506101896004803603602081101561039557600080fd5b50356001600160a01b031661091a565b3480156103b157600080fd5b506101be600480360360208110156103c857600080fd5b50356001600160a01b0316610985565b3480156103e457600080fd5b506103ed6109ee565b604080516001600160a01b039092168252519081900360200190f35b34801561041557600080fd5b506101be6004803603602081101561042c57600080fd5b50356001600160a01b03166109fd565b34801561044857600080fd5b506102aa6004803603602081101561045f57600080fd5b50356001600160a01b0316610a70565b34801561047b57600080fd5b506103ed610a8b565b34801561049057600080fd5b50610189610a9a565b3480156104a557600080fd5b506103ed610b15565b3480156104ba57600080fd5b506101be600480360360208110156104d157600080fd5b50356001600160a01b0316610b24565b3480156104ed57600080fd5b506101be610b93565b34801561050257600080fd5b506101e7610ba9565b34801561051757600080fd5b506101be6004803603606081101561052e57600080fd5b6001600160a01b038235169160208101359181019060608101604082013564010000000081111561055e57600080fd5b82018360208201111561057057600080fd5b8035906020019184600183028401116401000000008311171561059257600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061088c945050505050565b3480156105df57600080fd5b506103ed610c04565b3480156105f457600080fd5b506101be6004803603604081101561060b57600080fd5b506001600160a01b038135169060200135610c13565b34801561062d57600080fd5b506102aa6004803603604081101561064457600080fd5b506001600160a01b0381358116916020013516610ce7565b34801561066857600080fd5b506101896004803603602081101561067f57600080fd5b50356001600160a01b0316610d12565b34801561069b57600080fd5b506103ed610d7d565b336000908152600d602052604081205460ff161515600114156106d35750600a546001600160a01b03166106e1565b506009546001600160a01b03165b6001600160a01b0381166106f457600080fd5b600280546001600160a01b031916331790556040805136601f8101601f1916808301909352909190600083376000803684865af4808015610741576040513d81016040523d6000823e3d81f35b600080fd5b600080546001600160a01b031633146107905760405162461bcd60e51b8152600401808060200182810382526022815260200180610ed76022913960400191505060405180910390fd5b600a546001600160a01b03838116911614156107ab57600080fd5b6107b482610d8c565b506001919050565b6004805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108425780601f1061081757610100808354040283529160200191610842565b820191906000526020600020905b81548152906001019060200180831161082557829003601f168201915b505050505081565b60006108546106a4565b92915050565b6000805260076020527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df546006540390565b60006108966106a4565b9392505050565b60055460ff1681565b600080546001600160a01b031633146108f05760405162461bcd60e51b8152600401808060200182810382526022815260200180610ed76022913960400191505060405180910390fd5b6009546001600160a01b038381169116141561090b57600080fd5b6107b482610e31565b60065481565b6000546001600160a01b031633146109635760405162461bcd60e51b8152600401808060200182810382526022815260200180610ed76022913960400191505060405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b031633146109cf5760405162461bcd60e51b8152600401808060200182810382526022815260200180610ed76022913960400191505060405180910390fd5b506001600160a01b03166000908152600d602052604090205460ff1690565b6009546001600160a01b031681565b600080546001600160a01b03163314610a475760405162461bcd60e51b8152600401808060200182810382526022815260200180610ed76022913960400191505060405180910390fd5b506001600160a01b03166000908152600d60205260409020805460ff1916600190811790915590565b6001600160a01b031660009081526007602052604090205490565b600a546001600160a01b031681565b6001546001600160a01b03163314610ab157600080fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b031681565b600080546001600160a01b03163314610b6e5760405162461bcd60e51b8152600401808060200182810382526022815260200180610ed76022913960400191505060405180910390fd5b506001600160a01b03166000908152600d60205260409020805460ff19169055600190565b336000908152600d602052604090205460ff1690565b6003805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108425780601f1061081757610100808354040283529160200191610842565b6001546001600160a01b031681565b600080546001600160a01b03163314610c5d5760405162461bcd60e51b8152600401808060200182810382526022815260200180610ed76022913960400191505060405180910390fd5b600080546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810186905290519186169263a9059cbb926044808401936020939083900390910190829087803b158015610cb457600080fd5b505af1158015610cc8573d6000803e3d6000fd5b505050506040513d6020811015610cde57600080fd5b50519392505050565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b6000546001600160a01b03163314610d5b5760405162461bcd60e51b8152600401808060200182810382526022815260200180610ed76022913960400191505060405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b6000546001600160a01b03163314610dd55760405162461bcd60e51b8152600401808060200182810382526022815260200180610ed76022913960400191505060405180910390fd5b600a80546001600160a01b039092166001600160a01b03199283168117909155600c80546001810182556000919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7018054909216179055565b6000546001600160a01b03163314610e7a5760405162461bcd60e51b8152600401808060200182810382526022815260200180610ed76022913960400191505060405180910390fd5b600980546001600160a01b039092166001600160a01b03199283168117909155600b80546001810182556000919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db901805490921617905556fe4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e2ea265627a7a72315820a6e3c00d0efbc1af9acd956e7d368ae80dd4c7cf66398e6b8bda1687af2aec6964736f6c63430005110032ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef
Deployed ByteCode
0x6080604052600436106101815760003560e01c806374ed9ae4116100d1578063a9059cbb1161008a578063dc39d06d11610064578063dc39d06d146105e8578063dd62ed3e14610621578063f2fde38b1461065c578063faa8aab11461068f57610181565b8063a9059cbb1461025c578063cae9ca511461050b578063d4ee1d90146105d357610181565b806374ed9ae41461046f57806379ba5097146104845780638da5cb5b146104995780638e482667146104ae578063928a6270146104e157806395d89b41146104f657610181565b80633659cfe61161013e57806357692f251161011857806357692f25146103a55780635c60da1b146103d857806367a5641f1461040957806370a082311461043c57610181565b80633659cfe61461032a5780633eaaf86b1461035d578063438787d01461037257610181565b8063069fcdaf1461018b57806306fdde03146101d2578063095ea7b31461025c57806318160ddd1461029557806323b872dd146102bc578063313ce567146102ff575b6101896106a4565b005b34801561019757600080fd5b506101be600480360360208110156101ae57600080fd5b50356001600160a01b0316610746565b604080519115158252519081900360200190f35b3480156101de57600080fd5b506101e76107bc565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610221578181015183820152602001610209565b50505050905090810190601f16801561024e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561026857600080fd5b506101be6004803603604081101561027f57600080fd5b506001600160a01b03813516906020013561084a565b3480156102a157600080fd5b506102aa61085a565b60408051918252519081900360200190f35b3480156102c857600080fd5b506101be600480360360608110156102df57600080fd5b506001600160a01b0381358116916020810135909116906040013561088c565b34801561030b57600080fd5b5061031461089d565b6040805160ff9092168252519081900360200190f35b34801561033657600080fd5b506101be6004803603602081101561034d57600080fd5b50356001600160a01b03166108a6565b34801561036957600080fd5b506102aa610914565b34801561037e57600080fd5b506101896004803603602081101561039557600080fd5b50356001600160a01b031661091a565b3480156103b157600080fd5b506101be600480360360208110156103c857600080fd5b50356001600160a01b0316610985565b3480156103e457600080fd5b506103ed6109ee565b604080516001600160a01b039092168252519081900360200190f35b34801561041557600080fd5b506101be6004803603602081101561042c57600080fd5b50356001600160a01b03166109fd565b34801561044857600080fd5b506102aa6004803603602081101561045f57600080fd5b50356001600160a01b0316610a70565b34801561047b57600080fd5b506103ed610a8b565b34801561049057600080fd5b50610189610a9a565b3480156104a557600080fd5b506103ed610b15565b3480156104ba57600080fd5b506101be600480360360208110156104d157600080fd5b50356001600160a01b0316610b24565b3480156104ed57600080fd5b506101be610b93565b34801561050257600080fd5b506101e7610ba9565b34801561051757600080fd5b506101be6004803603606081101561052e57600080fd5b6001600160a01b038235169160208101359181019060608101604082013564010000000081111561055e57600080fd5b82018360208201111561057057600080fd5b8035906020019184600183028401116401000000008311171561059257600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061088c945050505050565b3480156105df57600080fd5b506103ed610c04565b3480156105f457600080fd5b506101be6004803603604081101561060b57600080fd5b506001600160a01b038135169060200135610c13565b34801561062d57600080fd5b506102aa6004803603604081101561064457600080fd5b506001600160a01b0381358116916020013516610ce7565b34801561066857600080fd5b506101896004803603602081101561067f57600080fd5b50356001600160a01b0316610d12565b34801561069b57600080fd5b506103ed610d7d565b336000908152600d602052604081205460ff161515600114156106d35750600a546001600160a01b03166106e1565b506009546001600160a01b03165b6001600160a01b0381166106f457600080fd5b600280546001600160a01b031916331790556040805136601f8101601f1916808301909352909190600083376000803684865af4808015610741576040513d81016040523d6000823e3d81f35b600080fd5b600080546001600160a01b031633146107905760405162461bcd60e51b8152600401808060200182810382526022815260200180610ed76022913960400191505060405180910390fd5b600a546001600160a01b03838116911614156107ab57600080fd5b6107b482610d8c565b506001919050565b6004805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108425780601f1061081757610100808354040283529160200191610842565b820191906000526020600020905b81548152906001019060200180831161082557829003601f168201915b505050505081565b60006108546106a4565b92915050565b6000805260076020527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df546006540390565b60006108966106a4565b9392505050565b60055460ff1681565b600080546001600160a01b031633146108f05760405162461bcd60e51b8152600401808060200182810382526022815260200180610ed76022913960400191505060405180910390fd5b6009546001600160a01b038381169116141561090b57600080fd5b6107b482610e31565b60065481565b6000546001600160a01b031633146109635760405162461bcd60e51b8152600401808060200182810382526022815260200180610ed76022913960400191505060405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600080546001600160a01b031633146109cf5760405162461bcd60e51b8152600401808060200182810382526022815260200180610ed76022913960400191505060405180910390fd5b506001600160a01b03166000908152600d602052604090205460ff1690565b6009546001600160a01b031681565b600080546001600160a01b03163314610a475760405162461bcd60e51b8152600401808060200182810382526022815260200180610ed76022913960400191505060405180910390fd5b506001600160a01b03166000908152600d60205260409020805460ff1916600190811790915590565b6001600160a01b031660009081526007602052604090205490565b600a546001600160a01b031681565b6001546001600160a01b03163314610ab157600080fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6000546001600160a01b031681565b600080546001600160a01b03163314610b6e5760405162461bcd60e51b8152600401808060200182810382526022815260200180610ed76022913960400191505060405180910390fd5b506001600160a01b03166000908152600d60205260409020805460ff19169055600190565b336000908152600d602052604090205460ff1690565b6003805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156108425780601f1061081757610100808354040283529160200191610842565b6001546001600160a01b031681565b600080546001600160a01b03163314610c5d5760405162461bcd60e51b8152600401808060200182810382526022815260200180610ed76022913960400191505060405180910390fd5b600080546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810186905290519186169263a9059cbb926044808401936020939083900390910190829087803b158015610cb457600080fd5b505af1158015610cc8573d6000803e3d6000fd5b505050506040513d6020811015610cde57600080fd5b50519392505050565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b6000546001600160a01b03163314610d5b5760405162461bcd60e51b8152600401808060200182810382526022815260200180610ed76022913960400191505060405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031681565b6000546001600160a01b03163314610dd55760405162461bcd60e51b8152600401808060200182810382526022815260200180610ed76022913960400191505060405180910390fd5b600a80546001600160a01b039092166001600160a01b03199283168117909155600c80546001810182556000919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7018054909216179055565b6000546001600160a01b03163314610e7a5760405162461bcd60e51b8152600401808060200182810382526022815260200180610ed76022913960400191505060405180910390fd5b600980546001600160a01b039092166001600160a01b03199283168117909155600b80546001810182556000919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db901805490921617905556fe4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e2ea265627a7a72315820a6e3c00d0efbc1af9acd956e7d368ae80dd4c7cf66398e6b8bda1687af2aec6964736f6c63430005110032