Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 19 from a total of 19 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw With Fe... | 7282766 | 2580 days ago | IN | 0 ETH | 0.00210796 | ||||
| Do Deposit | 7282760 | 2580 days ago | IN | 0 ETH | 0.00054988 | ||||
| Create Deposit C... | 7282757 | 2580 days ago | IN | 0 ETH | 0.01464288 | ||||
| Withdraw With Fe... | 7282704 | 2580 days ago | IN | 0 ETH | 0.00064815 | ||||
| Withdraw With Fe... | 7282680 | 2580 days ago | IN | 0 ETH | 0.00111725 | ||||
| Withdraw With Fe... | 7282407 | 2580 days ago | IN | 0 ETH | 0.00106237 | ||||
| Do Deposit | 7010111 | 2635 days ago | IN | 0 ETH | 0.00005414 | ||||
| Do Deposit | 7005277 | 2636 days ago | IN | 0 ETH | 0.00007219 | ||||
| Do Deposit | 6967504 | 2642 days ago | IN | 0 ETH | 0.00016146 | ||||
| Do Deposit | 6959749 | 2644 days ago | IN | 0 ETH | 0.0002931 | ||||
| Withdraw With Fe... | 6714779 | 2684 days ago | IN | 0 ETH | 0.00221839 | ||||
| Withdraw With Fe... | 6714266 | 2685 days ago | IN | 0 ETH | 0.00365809 | ||||
| Do Deposit | 6714258 | 2685 days ago | IN | 0 ETH | 0.00048485 | ||||
| Create Deposit C... | 6714254 | 2685 days ago | IN | 0 ETH | 0.0129112 | ||||
| Withdraw With Fe... | 6714230 | 2685 days ago | IN | 0 ETH | 0.00302801 | ||||
| Do Deposit | 6713694 | 2685 days ago | IN | 0 ETH | 0.0003481 | ||||
| Create Deposit C... | 6713691 | 2685 days ago | IN | 0 ETH | 0.00802789 | ||||
| Bind Contract | 6709060 | 2685 days ago | IN | 0 ETH | 0.00053573 | ||||
| Initialize | 6709056 | 2685 days ago | IN | 0 ETH | 0.00100797 |
Latest 3 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 7282757 | 2580 days ago | Contract Creation | 0 ETH | |||
| Transfer | 6714254 | 2685 days ago | Contract Creation | 0 ETH | |||
| Transfer | 6713691 | 2685 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
DRCWalletManager
Compiler Version
v0.4.25+commit.59dbf8f1
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2018-11-15
*/
pragma solidity ^0.4.24;
interface IDRCWalletMgrParams {
function singleWithdrawMin() external returns (uint256); // min value of single withdraw
function singleWithdrawMax() external returns (uint256); // Max value of single withdraw
function dayWithdraw() external returns (uint256); // Max value of one day of withdraw
function monthWithdraw() external returns (uint256); // Max value of one month of withdraw
function dayWithdrawCount() external returns (uint256); // Max number of withdraw counting
function chargeFee() external returns (uint256); // the charge fee for withdraw
function chargeFeePool() external returns (address); // the address that will get the returned charge fees.
}
interface IDRCWalletStorage {
// get the deposit address for this _wallet address
function walletDeposits(address _wallet) external view returns (address);
// get frozen status for the deposit address
function frozenDeposits(address _deposit) external view returns (bool);
// get a wallet address by the deposit address and the index
function wallet(address _deposit, uint256 _ind) external view returns (address);
// get a wallet name by the deposit address and the index
function walletName(address _deposit, uint256 _ind) external view returns (bytes32);
// get the wallets number of a deposit address
function walletsNumber(address _deposit) external view returns (uint256);
// get the frozen amount of the deposit address
function frozenAmount(address _deposit) external view returns (uint256);
// get the balance of the deposit address
function balanceOf(address _deposit) external view returns (uint256);
// get the deposit address by index
function depositAddressByIndex(uint256 _ind) external view returns (address);
// get the frozen amount of the deposit address
function size() external view returns (uint256);
// judge if the _deposit address exsisted.
function isExisted(address _deposit) external view returns (bool);
// add one deposit address for that wallet
function addDeposit(address _wallet, address _depositAddr) external returns (bool);
// change the default wallet address for the deposit address
function changeDefaultWallet(address _oldWallet, address _newWallet) external returns (bool);
// freeze or release the tokens that has been deposited in the deposit address.
function freezeTokens(address _deposit, bool _freeze, uint256 _value) external returns (bool);
// increase balance of this deposit address
function increaseBalance(address _deposit, uint256 _value) external returns (bool);
// decrease balance of this deposit address
function decreaseBalance(address _deposit, uint256 _value) external returns (bool);
// add withdraw address for one deposit addresss
function addWithdraw(address _deposit, bytes32 _name, address _withdraw) external returns (bool);
// change the withdraw wallet name
function changeWalletName(address _deposit, bytes32 _newName, address _wallet) external returns (bool);
// remove deposit contract address from storage
function removeDeposit(address _depositAddr) external returns (bool);
// withdraw tokens from this contract
function withdrawToken(address _token, address _to, uint256 _value) external returns (bool);
}
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
*/
function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
// Gas optimization: this is cheaper than asserting 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
if (_a == 0) {
return 0;
}
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 _a / _b;
}
/**
* @dev Subtracts 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 c) {
c = _a + _b;
assert(c >= _a);
return c;
}
}
contract Ownable {
address public owner;
event OwnershipRenounced(address indexed previousOwner);
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender
* account.
*/
constructor() public {
owner = msg.sender;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
/**
* @dev Allows the current owner to relinquish control of the contract.
* @notice Renouncing to ownership will leave the contract without an owner.
* It will not be possible to call the functions with the `onlyOwner`
* modifier anymore.
*/
function renounceOwnership() public onlyOwner {
emit OwnershipRenounced(owner);
owner = address(0);
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param _newOwner The address to transfer ownership to.
*/
function transferOwnership(address _newOwner) public onlyOwner {
_transferOwnership(_newOwner);
}
/**
* @dev Transfers control of the contract to a newOwner.
* @param _newOwner The address to transfer ownership to.
*/
function _transferOwnership(address _newOwner) internal {
require(_newOwner != address(0));
emit OwnershipTransferred(owner, _newOwner);
owner = _newOwner;
}
}
contract Withdrawable is Ownable {
event ReceiveEther(address _from, uint256 _value);
event WithdrawEther(address _to, uint256 _value);
event WithdrawToken(address _token, address _to, uint256 _value);
/**
* @dev recording receiving ether from msn.sender
*/
function () payable public {
emit ReceiveEther(msg.sender, msg.value);
}
/**
* @dev withdraw,send ether to target
* @param _to is where the ether will be sent to
* _amount is the number of the ether
*/
function withdraw(address _to, uint _amount) public onlyOwner returns (bool) {
require(_to != address(0));
_to.transfer(_amount);
emit WithdrawEther(_to, _amount);
return true;
}
/**
* @dev withdraw tokens, send tokens to target
*
* @param _token the token address that will be withdraw
* @param _to is where the tokens will be sent to
* _value is the number of the token
*/
function withdrawToken(address _token, address _to, uint256 _value) public onlyOwner returns (bool) {
require(_to != address(0));
require(_token != address(0));
ERC20 tk = ERC20(_token);
tk.transfer(_to, _value);
emit WithdrawToken(_token, _to, _value);
return true;
}
/**
* @dev receive approval from an ERC20 token contract, and then gain the tokens,
* then take a record
*
* @param _from address The address which you want to send tokens from
* @param _value uint256 the amounts of tokens to be sent
* @param _token address the ERC20 token address
* @param _extraData bytes the extra data for the record
*/
// function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public {
// require(_token != address(0));
// require(_from != address(0));
// ERC20 tk = ERC20(_token);
// require(tk.transferFrom(_from, this, _value));
// emit ReceiveDeposit(_from, _value, _token, _extraData);
// }
}
contract TokenDestructible is Ownable {
constructor() public payable { }
/**
* @notice Terminate contract and refund to owner
* @param _tokens List of addresses of ERC20 or ERC20Basic token contracts to
refund.
* @notice The called token contracts could try to re-enter this contract. Only
supply token contracts you trust.
*/
function destroy(address[] _tokens) public onlyOwner {
// Transfer tokens to owner
for (uint256 i = 0; i < _tokens.length; i++) {
ERC20Basic token = ERC20Basic(_tokens[i]);
uint256 balance = token.balanceOf(this);
token.transfer(owner, balance);
}
// Transfer Eth to owner and terminate contract
selfdestruct(owner);
}
}
contract Claimable is Ownable {
address public pendingOwner;
/**
* @dev Modifier throws if called by any account other than the pendingOwner.
*/
modifier onlyPendingOwner() {
require(msg.sender == pendingOwner);
_;
}
/**
* @dev Allows the current owner to set the pendingOwner address.
* @param newOwner The address to transfer ownership to.
*/
function transferOwnership(address newOwner) public onlyOwner {
pendingOwner = newOwner;
}
/**
* @dev Allows the pendingOwner address to finalize the transfer.
*/
function claimOwnership() public onlyPendingOwner {
emit OwnershipTransferred(owner, pendingOwner);
owner = pendingOwner;
pendingOwner = address(0);
}
}
contract DepositWithdraw is Claimable, Withdrawable, TokenDestructible {
using SafeMath for uint256;
/**
* transaction record
*/
struct TransferRecord {
uint256 timeStamp;
address account;
uint256 value;
}
/**
* accumulated transferring amount record
*/
struct accumulatedRecord {
uint256 mul;
uint256 count;
uint256 value;
}
TransferRecord[] deposRecs; // record all the deposit tx data
TransferRecord[] withdrRecs; // record all the withdraw tx data
accumulatedRecord dayWithdrawRec; // accumulated amount record for one day
accumulatedRecord monthWithdrawRec; // accumulated amount record for one month
address wallet; // the binded withdraw address
event ReceiveDeposit(address _from, uint256 _value, address _token, bytes _extraData);
/**
* @dev constructor of the DepositWithdraw contract
* @param _wallet the binded wallet address to this depositwithdraw contract
*/
constructor(address _wallet) public {
require(_wallet != address(0));
wallet = _wallet;
}
/**
* @dev set the default wallet address
* @param _wallet the default wallet address binded to this deposit contract
*/
function setWithdrawWallet(address _wallet) onlyOwner public returns (bool) {
require(_wallet != address(0));
wallet = _wallet;
return true;
}
/**
* @dev util function to change bytes data to bytes32 data
* @param _data the bytes data to be converted
*/
function bytesToBytes32(bytes _data) public pure returns (bytes32 result) {
assembly {
result := mload(add(_data, 32))
}
}
/**
* @dev receive approval from an ERC20 token contract, take a record
*
* @param _from address The address which you want to send tokens from
* @param _value uint256 the amounts of tokens to be sent
* @param _token address the ERC20 token address
* @param _extraData bytes the extra data for the record
*/
function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) onlyOwner public {
require(_token != address(0));
require(_from != address(0));
ERC20 tk = ERC20(_token);
require(tk.transferFrom(_from, this, _value));
bytes32 timestamp = bytesToBytes32(_extraData);
deposRecs.push(TransferRecord(uint256(timestamp), _from, _value));
emit ReceiveDeposit(_from, _value, _token, _extraData);
}
// function authorize(address _token, address _spender, uint256 _value) onlyOwner public returns (bool) {
// ERC20 tk = ERC20(_token);
// require(tk.approve(_spender, _value));
// return true;
// }
/**
* @dev record withdraw into this contract
*
* @param _time the timstamp of the withdraw time
* @param _to is where the tokens will be sent to
* @param _value is the number of the token
*/
function recordWithdraw(uint256 _time, address _to, uint256 _value) onlyOwner public {
withdrRecs.push(TransferRecord(_time, _to, _value));
}
/**
* @dev check if withdraw amount is not valid
*
* @param _params the limitation parameters for withdraw
* @param _value is the number of the token
* @param _time the timstamp of the withdraw time
*/
function checkWithdrawAmount(address _params, uint256 _value, uint256 _time) public returns (bool) {
IDRCWalletMgrParams params = IDRCWalletMgrParams(_params);
require(_value <= params.singleWithdrawMax());
require(_value >= params.singleWithdrawMin());
uint256 daysCount = _time.div(86400); // one day of seconds
if (daysCount <= dayWithdrawRec.mul) {
dayWithdrawRec.count = dayWithdrawRec.count.add(1);
dayWithdrawRec.value = dayWithdrawRec.value.add(_value);
require(dayWithdrawRec.count <= params.dayWithdrawCount());
require(dayWithdrawRec.value <= params.dayWithdraw());
} else {
dayWithdrawRec.mul = daysCount;
dayWithdrawRec.count = 1;
dayWithdrawRec.value = _value;
}
uint256 monthsCount = _time.div(86400 * 30);
if (monthsCount <= monthWithdrawRec.mul) {
monthWithdrawRec.count = monthWithdrawRec.count.add(1);
monthWithdrawRec.value = monthWithdrawRec.value.add(_value);
require(monthWithdrawRec.value <= params.monthWithdraw());
} else {
monthWithdrawRec.mul = monthsCount;
monthWithdrawRec.count = 1;
monthWithdrawRec.value = _value;
}
return true;
}
/**
* @dev withdraw tokens, send tokens to target
*
* @param _token the token address that will be withdraw
* @param _params the limitation parameters for withdraw
* @param _time the timstamp of the withdraw time
* @param _to is where the tokens will be sent to
* _value is the number of the token
* _fee is the amount of the transferring costs
* _tokenReturn is the address that return back the tokens of the _fee
*/
function withdrawToken(address _token, address _params, uint256 _time, address _to, uint256 _value, uint256 _fee, address _tokenReturn) public onlyOwner returns (bool) {
require(_to != address(0));
require(_token != address(0));
require(_value > _fee);
// require(_tokenReturn != address(0));
require(checkWithdrawAmount(_params, _value, _time));
ERC20 tk = ERC20(_token);
uint256 realAmount = _value.sub(_fee);
require(tk.transfer(_to, realAmount));
if (_tokenReturn != address(0) && _fee > 0) {
require(tk.transfer(_tokenReturn, _fee));
}
recordWithdraw(_time, _to, realAmount);
emit WithdrawToken(_token, _to, realAmount);
return true;
}
/**
* @dev withdraw tokens, send tokens to target default wallet
*
* @param _token the token address that will be withdraw
* @param _params the limitation parameters for withdraw
* @param _time the timestamp occur the withdraw record
* @param _value is the number of the token
* _fee is the amount of the transferring costs
* —tokenReturn is the address that return back the tokens of the _fee
*/
function withdrawTokenToDefault(address _token, address _params, uint256 _time, uint256 _value, uint256 _fee, address _tokenReturn) public onlyOwner returns (bool) {
return withdrawToken(_token, _params, _time, wallet, _value, _fee, _tokenReturn);
}
/**
* @dev get the Deposit records number
*
*/
function getDepositNum() public view returns (uint256) {
return deposRecs.length;
}
/**
* @dev get the one of the Deposit records
*
* @param _ind the deposit record index
*/
function getOneDepositRec(uint256 _ind) public view returns (uint256, address, uint256) {
require(_ind < deposRecs.length);
return (deposRecs[_ind].timeStamp, deposRecs[_ind].account, deposRecs[_ind].value);
}
/**
* @dev get the withdraw records number
*
*/
function getWithdrawNum() public view returns (uint256) {
return withdrRecs.length;
}
/**
* @dev get the one of the withdraw records
*
* @param _ind the withdraw record index
*/
function getOneWithdrawRec(uint256 _ind) public view returns (uint256, address, uint256) {
require(_ind < withdrRecs.length);
return (withdrRecs[_ind].timeStamp, withdrRecs[_ind].account, withdrRecs[_ind].value);
}
}
contract DelayedClaimable is Claimable {
uint256 public end;
uint256 public start;
/**
* @dev Used to specify the time period during which a pending
* owner can claim ownership.
* @param _start The earliest time ownership can be claimed.
* @param _end The latest time ownership can be claimed.
*/
function setLimits(uint256 _start, uint256 _end) public onlyOwner {
require(_start <= _end);
end = _end;
start = _start;
}
/**
* @dev Allows the pendingOwner address to finalize the transfer, as long as it is called within
* the specified start and end time.
*/
function claimOwnership() public onlyPendingOwner {
require((block.number <= end) && (block.number >= start));
emit OwnershipTransferred(owner, pendingOwner);
owner = pendingOwner;
pendingOwner = address(0);
end = 0;
}
}
contract OwnerContract is DelayedClaimable {
Claimable public ownedContract;
address public pendingOwnedOwner;
// address internal origOwner;
/**
* @dev bind a contract as its owner
*
* @param _contract the contract address that will be binded by this Owner Contract
*/
function bindContract(address _contract) onlyOwner public returns (bool) {
require(_contract != address(0));
ownedContract = Claimable(_contract);
// origOwner = ownedContract.owner();
// take ownership of the owned contract
if (ownedContract.owner() != address(this)) {
ownedContract.claimOwnership();
}
return true;
}
/**
* @dev change the owner of the contract from this contract address to the original one.
*
*/
// function transferOwnershipBack() onlyOwner public {
// ownedContract.transferOwnership(origOwner);
// ownedContract = Claimable(address(0));
// origOwner = address(0);
// }
/**
* @dev change the owner of the contract from this contract address to another one.
*
* @param _nextOwner the contract address that will be next Owner of the original Contract
*/
function changeOwnershipto(address _nextOwner) onlyOwner public {
require(ownedContract != address(0));
if (ownedContract.owner() != pendingOwnedOwner) {
ownedContract.transferOwnership(_nextOwner);
pendingOwnedOwner = _nextOwner;
// ownedContract = Claimable(address(0));
// origOwner = address(0);
} else {
// the pending owner has already taken the ownership
ownedContract = Claimable(address(0));
pendingOwnedOwner = address(0);
}
}
/**
* @dev to confirm the owner of the owned contract has already been transferred.
*
*/
function ownedOwnershipTransferred() onlyOwner public returns (bool) {
require(ownedContract != address(0));
if (ownedContract.owner() == pendingOwnedOwner) {
// the pending owner has already taken the ownership
ownedContract = Claimable(address(0));
pendingOwnedOwner = address(0);
return true;
} else {
return false;
}
}
}
contract DRCWalletManager is OwnerContract, Withdrawable, TokenDestructible {
using SafeMath for uint256;
/**
* withdraw wallet description
*/
// struct WithdrawWallet {
// bytes32 name;
// address walletAddr;
// }
/**
* Deposit data storage
*/
// struct DepositRepository {
// // uint256 balance;
// uint256 frozen;
// WithdrawWallet[] withdrawWallets;
// // mapping (bytes32 => address) withdrawWallets;
// }
// mapping (address => DepositRepository) depositRepos;
// mapping (address => address) public walletDeposits;
// mapping (address => bool) public frozenDeposits;
ERC20 public tk; // the token will be managed
IDRCWalletMgrParams public params; // the parameters that the management needs
IDRCWalletStorage public walletStorage; // the deposits and wallets data stored in a contract
event CreateDepositAddress(address indexed _wallet, address _deposit);
event FrozenTokens(address indexed _deposit, bool _freeze, uint256 _value);
event ChangeDefaultWallet(address indexed _oldWallet, address _newWallet);
/**
* @dev initialize this contract with token, parameters and storage address
*
* @param _token the token address that will be withdraw
* @param _walletParams the wallet management parameters
*/
function initialize(address _token, address _walletParams, address _walletStorage) onlyOwner public returns (bool) {
require(_token != address(0));
require(_walletParams != address(0));
tk = ERC20(_token);
params = IDRCWalletMgrParams(_walletParams);
walletStorage = IDRCWalletStorage(_walletStorage);
return true;
}
/**
* @dev create deposit contract address for the default withdraw wallet
*
* @param _wallet the binded default withdraw wallet address
*/
function createDepositContract(address _wallet) onlyOwner public returns (address) {
require(_wallet != address(0));
DepositWithdraw deposWithdr = new DepositWithdraw(_wallet); // new contract for deposit
address _deposit = address(deposWithdr);
// walletDeposits[_wallet] = _deposit;
// WithdrawWallet[] storage withdrawWalletList = depositRepos[_deposit].withdrawWallets;
// withdrawWalletList.push(WithdrawWallet("default wallet", _wallet));
// // depositRepos[_deposit].balance = 0;
// depositRepos[_deposit].frozen = 0;
walletStorage.addDeposit(_wallet, _deposit);
// deposWithdr.authorize(address(tk), this, 1e27); // give authorization to owner contract
emit CreateDepositAddress(_wallet, _deposit);
return _deposit;
}
/**
* @dev deposit a value of funds to the deposit address
*
* @param _deposit the deposit address
* @param _increase increase or decrease the value
* @param _value the deposit funds value
*/
function doDeposit(address _deposit, bool _increase, uint256 _value) onlyOwner public returns (bool) {
return (_increase
? walletStorage.increaseBalance(_deposit, _value)
: walletStorage.decreaseBalance(_deposit, _value));
}
/**
* @dev get deposit contract address by using the default withdraw wallet
*
* @param _wallet the binded default withdraw wallet address
*/
function getDepositAddress(address _wallet) onlyOwner public view returns (address) {
require(_wallet != address(0));
// address deposit = walletDeposits[_wallet];
// return deposit;
return walletStorage.walletDeposits(_wallet);
}
/**
* @dev get deposit balance and frozen amount by using the deposit address
*
* @param _deposit the deposit contract address
*/
function getDepositInfo(address _deposit) onlyOwner public view returns (uint256, uint256) {
require(_deposit != address(0));
uint256 _balance = walletStorage.balanceOf(_deposit);
// uint256 frozenAmount = depositRepos[_deposit].frozen;
uint256 frozenAmount = walletStorage.frozenAmount(_deposit);
// depositRepos[_deposit].balance = _balance;
return (_balance, frozenAmount);
}
/**
* @dev get the number of withdraw wallet addresses bindig to the deposit contract address
*
* @param _deposit the deposit contract address
*/
function getDepositWithdrawCount(address _deposit) onlyOwner public view returns (uint) {
require(_deposit != address(0));
// WithdrawWallet[] storage withdrawWalletList = depositRepos[_deposit].withdrawWallets;
// uint len = withdrawWalletList.length;
uint len = walletStorage.walletsNumber(_deposit);
return len;
}
/**
* @dev get the withdraw wallet addresses list binding to the deposit contract address
*
* @param _deposit the deposit contract address
* @param _indices the array of indices of the withdraw wallets
*/
function getDepositWithdrawList(address _deposit, uint[] _indices) onlyOwner public view returns (bytes32[], address[]) {
require(_indices.length != 0);
bytes32[] memory names = new bytes32[](_indices.length);
address[] memory wallets = new address[](_indices.length);
for (uint i = 0; i < _indices.length; i = i.add(1)) {
// WithdrawWallet storage wallet = depositRepos[_deposit].withdrawWallets[_indices[i]];
// names[i] = wallet.name;
// wallets[i] = wallet.walletAddr;
names[i] = walletStorage.walletName(_deposit, i);
wallets[i] = walletStorage.wallet(_deposit, i);
}
return (names, wallets);
}
/**
* @dev change the default withdraw wallet address binding to the deposit contract address
*
* @param _oldWallet the previous default withdraw wallet
* @param _newWallet the new default withdraw wallet
*/
function changeDefaultWithdraw(address _oldWallet, address _newWallet) onlyOwner public returns (bool) {
require(_oldWallet != address(0));
require(_newWallet != address(0));
address deposit = walletStorage.walletDeposits(_oldWallet);
DepositWithdraw deposWithdr = DepositWithdraw(deposit);
require(deposWithdr.setWithdrawWallet(_newWallet));
// WithdrawWallet[] storage withdrawWalletList = depositRepos[deposit].withdrawWallets;
// withdrawWalletList[0].walletAddr = _newWallet;
bool res = walletStorage.changeDefaultWallet(_oldWallet, _newWallet);
emit ChangeDefaultWallet(_oldWallet, _newWallet);
return res;
}
/**
* @dev freeze the tokens in the deposit address
*
* @param _deposit the deposit address
* @param _freeze to freeze or release
* @param _value the amount of tokens need to be frozen
*/
function freezeTokens(address _deposit, bool _freeze, uint256 _value) onlyOwner public returns (bool) {
// require(_deposit != address(0));
// frozenDeposits[_deposit] = _freeze;
// if (_freeze) {
// depositRepos[_deposit].frozen = depositRepos[_deposit].frozen.add(_value);
// } else {
// require(_value <= depositRepos[_deposit].frozen);
// depositRepos[_deposit].frozen = depositRepos[_deposit].frozen.sub(_value);
// }
bool res = walletStorage.freezeTokens(_deposit, _freeze, _value);
emit FrozenTokens(_deposit, _freeze, _value);
return res;
}
/**
* @dev withdraw the tokens from the deposit address to default wallet with charge fee
*
* @param _deposit the deposit address
* @param _time the timestamp the withdraw occurs
* @param _value the amount of tokens need to be frozen
* @param _check if we will check the value is valid or meet the limit condition
*/
function withdrawWithFee(address _deposit, uint256 _time, uint256 _value, bool _check) onlyOwner public returns (bool) {
// WithdrawWallet[] storage withdrawWalletList = depositRepos[_deposit].withdrawWallets;
// return withdrawWithFee(_deposit, _time, withdrawWalletList[0].name, withdrawWalletList[0].walletAddr, _value, _check);
bytes32 defaultWalletName = walletStorage.walletName(_deposit, 0);
address defaultWallet = walletStorage.wallet(_deposit, 0);
return withdrawWithFee(_deposit, _time, defaultWalletName, defaultWallet, _value, _check);
}
/**
* @dev check if the wallet name is not matching the expected wallet address
*
* @param _deposit the deposit address
* @param _name the withdraw wallet name
* @param _to the withdraw wallet address
*/
function checkWithdrawAddress(address _deposit, bytes32 _name, address _to) public view returns (bool, bool) {
// uint len = depositRepos[_deposit].withdrawWallets.length;
uint len = walletStorage.walletsNumber(_deposit);
for (uint i = 0; i < len; i = i.add(1)) {
// WithdrawWallet memory wallet = depositRepos[_deposit].withdrawWallets[i];
// if (_name == wallet.name) {
// return(true, (_to == wallet.walletAddr));
// }
// if (_to == wallet.walletAddr) {
// return(true, true);
// }
bytes32 walletName = walletStorage.walletName(_deposit, i);
address walletAddr = walletStorage.wallet(_deposit, i);
if (_name == walletName) {
return(true, (_to == walletAddr));
}
if (_to == walletAddr) {
return(false, true);
}
}
return (false, false);
}
/**
* @dev withdraw tokens from this contract, send tokens to target withdraw wallet
*
* @param _deposWithdr the deposit contract that will record withdrawing
* @param _time the timestamp occur the withdraw record
* @param _to the address the token will be transfer to
* @param _value the token transferred value
*/
function withdrawFromThis(DepositWithdraw _deposWithdr, uint256 _time, address _to, uint256 _value) private returns (bool) {
uint256 fee = params.chargeFee();
uint256 realAmount = _value.sub(fee);
address tokenReturn = params.chargeFeePool();
if (tokenReturn != address(0) && fee > 0) {
// require(tk.transfer(tokenReturn, fee));
require(walletStorage.withdrawToken(tk, tokenReturn, fee));
}
// require (tk.transfer(_to, realAmount));
require(walletStorage.withdrawToken(tk, _to, realAmount));
_deposWithdr.recordWithdraw(_time, _to, realAmount);
return true;
}
/**
* @dev withdraw tokens, send tokens to target withdraw wallet
*
* @param _deposit the deposit address that will be withdraw from
* @param _time the timestamp occur the withdraw record
* @param _name the withdraw address alias name to verify
* @param _to the address the token will be transfer to
* @param _value the token transferred value
* @param _check if we will check the value is valid or meet the limit condition
*/
function withdrawWithFee(address _deposit,
uint256 _time,
bytes32 _name,
address _to,
uint256 _value,
bool _check) onlyOwner public returns (bool) {
require(_deposit != address(0));
require(_to != address(0));
uint256 totalBalance = walletStorage.balanceOf(_deposit);
uint256 frozen = walletStorage.frozenAmount(_deposit);
// uint256 available = totalBalance.sub(frozen);
// require(_value <= available);
if (_check) {
require(_value <= totalBalance.sub(frozen));
}
uint256 _balance = tk.balanceOf(_deposit);
bool exist;
bool correct;
// WithdrawWallet[] storage withdrawWalletList = depositRepos[_deposit].withdrawWallets;
(exist, correct) = checkWithdrawAddress(_deposit, _name, _to);
if(!exist) {
// withdrawWalletList.push(WithdrawWallet(_name, _to));
if (!correct) {
walletStorage.addWithdraw(_deposit, _name, _to);
} else {
walletStorage.changeWalletName(_deposit, _name, _to);
}
} else {
require(correct, "wallet address must be correct with wallet name!");
}
DepositWithdraw deposWithdr = DepositWithdraw(_deposit);
/**
* if deposit address doesn't have enough tokens to withdraw,
* then withdraw from this contract. Record this in the independent deposit contract.
*/
if (_value > _balance) {
require(deposWithdr.checkWithdrawAmount(address(params), _value, _time));
if(_balance > 0) {
require(deposWithdr.withdrawToken(address(tk), address(walletStorage), _balance));
}
require(withdrawFromThis(deposWithdr, _time, _to, _value));
// return true;
} else {
require(deposWithdr.withdrawToken(address(tk), address(params), _time, _to, _value, params.chargeFee(), params.chargeFeePool()));
}
return walletStorage.decreaseBalance(_deposit, _value);
}
/**
* @dev destory the old depoist contract and take back the tokens
*
* @param _deposit the deposit address
*/
function destroyDepositContract(address _deposit) onlyOwner public returns (bool) {
require(_deposit != address(0));
DepositWithdraw deposWithdr = DepositWithdraw(_deposit);
address[] memory tokens = new address[](1);
tokens[0] = address(tk);
deposWithdr.destroy(tokens);
return walletStorage.removeDeposit(_deposit);
}
}
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 ERC20 is ERC20Basic {
function allowance(address _owner, address _spender)
public view returns (uint256);
function transferFrom(address _from, address _to, uint256 _value)
public returns (bool);
function approve(address _spender, uint256 _value) public returns (bool);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"withdrawToken","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"walletStorage","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_deposit","type":"address"}],"name":"getDepositWithdrawCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tk","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_deposit","type":"address"},{"name":"_freeze","type":"bool"},{"name":"_value","type":"uint256"}],"name":"freezeTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_oldWallet","type":"address"},{"name":"_newWallet","type":"address"}],"name":"changeDefaultWithdraw","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pendingOwnedOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_deposit","type":"address"},{"name":"_time","type":"uint256"},{"name":"_name","type":"bytes32"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_check","type":"bool"}],"name":"withdrawWithFee","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_deposit","type":"address"},{"name":"_increase","type":"bool"},{"name":"_value","type":"uint256"}],"name":"doDeposit","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_deposit","type":"address"}],"name":"getDepositInfo","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_deposit","type":"address"},{"name":"_name","type":"bytes32"},{"name":"_to","type":"address"}],"name":"checkWithdrawAddress","outputs":[{"name":"","type":"bool"},{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_deposit","type":"address"},{"name":"_indices","type":"uint256[]"}],"name":"getDepositWithdrawList","outputs":[{"name":"","type":"bytes32[]"},{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_contract","type":"address"}],"name":"bindContract","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_deposit","type":"address"}],"name":"destroyDepositContract","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_wallet","type":"address"}],"name":"createDepositContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ownedContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"start","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_walletParams","type":"address"},{"name":"_walletStorage","type":"address"}],"name":"initialize","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_start","type":"uint256"},{"name":"_end","type":"uint256"}],"name":"setLimits","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokens","type":"address[]"}],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"params","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_wallet","type":"address"}],"name":"getDepositAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"ownedOwnershipTransferred","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pendingOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nextOwner","type":"address"}],"name":"changeOwnershipto","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"end","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_deposit","type":"address"},{"name":"_time","type":"uint256"},{"name":"_value","type":"uint256"},{"name":"_check","type":"bool"}],"name":"withdrawWithFee","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_wallet","type":"address"},{"indexed":false,"name":"_deposit","type":"address"}],"name":"CreateDepositAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_deposit","type":"address"},{"indexed":false,"name":"_freeze","type":"bool"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"FrozenTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_oldWallet","type":"address"},{"indexed":false,"name":"_newWallet","type":"address"}],"name":"ChangeDefaultWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_from","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"ReceiveEther","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"WithdrawEther","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_token","type":"address"},{"indexed":false,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"WithdrawToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]Contract Creation Code
608060405260008054600160a060020a031916331790556142e8806100256000396000f30060806040526004361061017c5763ffffffff60e060020a60003504166301e3366781146101b857806314a0bc6f146101f6578063196198fa1461022757806321f408be1461025a57806322e113a31461026f57806345629402146102985780634902d163146102bf5780634a738bea146102d45780634d8d0e1b1461030b5780634e71e0c8146103345780635287ce121461034b5780635682d43d14610385578063715018a6146103cb5780637df83cd0146103e05780638157d4b5146104dc5780638da5cb5b146104fd5780639ab8bc2714610512578063aba9650e14610533578063bc467a3e14610554578063be9a655514610569578063c0c53b8b1461057e578063c4590d3f146105ab578063c6786e5a146105c6578063cff0ab961461061b578063d83a7f6714610630578063dbf3543014610651578063e30c397814610666578063ede930c91461067b578063efbe1c1c1461069c578063f23f2cbe146106b1578063f2fde38b146106dd578063f3fef3a3146106fe575b6040805133815234602082015281517ff32a9f77675fd5917534c7746608fd3e309eac68fbdcbf5925e24ca97a704396929181900390910190a1005b3480156101c457600080fd5b506101e2600160a060020a0360043581169060243516604435610722565b604080519115158252519081900360200190f35b34801561020257600080fd5b5061020b610854565b60408051600160a060020a039092168252519081900360200190f35b34801561023357600080fd5b50610248600160a060020a0360043516610863565b60408051918252519081900360200190f35b34801561026657600080fd5b5061020b61092d565b34801561027b57600080fd5b506101e2600160a060020a0360043516602435151560443561093c565b3480156102a457600080fd5b506101e2600160a060020a0360043581169060243516610a4c565b3480156102cb57600080fd5b5061020b610cb3565b3480156102e057600080fd5b506101e2600160a060020a0360043581169060243590604435906064351660843560a4351515610cc2565b34801561031757600080fd5b506101e2600160a060020a0360043516602435151560443561159a565b34801561034057600080fd5b506103496116fb565b005b34801561035757600080fd5b5061036c600160a060020a036004351661179a565b6040805192835260208301919091528051918290030190f35b34801561039157600080fd5b506103b0600160a060020a036004358116906024359060443516611903565b60408051921515835290151560208301528051918290030190f35b3480156103d757600080fd5b50610349611b64565b3480156103ec57600080fd5b50604080516020600460248035828101358481028087018601909752808652610443968435600160a060020a031696369660449591949091019291829185019084908082843750949750611bc39650505050505050565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561048757818101518382015260200161046f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156104c65781810151838201526020016104ae565b5050505090500194505050505060405180910390f35b3480156104e857600080fd5b506101e2600160a060020a0360043516611df2565b34801561050957600080fd5b5061020b611f4b565b34801561051e57600080fd5b506101e2600160a060020a0360043516611f5a565b34801561053f57600080fd5b5061020b600160a060020a03600435166120f6565b34801561056057600080fd5b5061020b612247565b34801561057557600080fd5b50610248612256565b34801561058a57600080fd5b506101e2600160a060020a036004358116906024358116906044351661225c565b3480156105b757600080fd5b506103496004356024356122e1565b3480156105d257600080fd5b50604080516020600480358082013583810280860185019096528085526103499536959394602494938501929182918501908490808284375094975061230d9650505050505050565b34801561062757600080fd5b5061020b612494565b34801561063c57600080fd5b5061020b600160a060020a03600435166124a3565b34801561065d57600080fd5b506101e261256a565b34801561067257600080fd5b5061020b612663565b34801561068757600080fd5b50610349600160a060020a0360043516612672565b3480156106a857600080fd5b50610248612802565b3480156106bd57600080fd5b506101e2600160a060020a03600435166024356044356064351515612808565b3480156106e957600080fd5b50610349600160a060020a036004351661297c565b34801561070a57600080fd5b506101e2600160a060020a03600435166024356129b5565b600080548190600160a060020a0316331461073c57600080fd5b600160a060020a038416151561075157600080fd5b600160a060020a038516151561076657600080fd5b50604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151869283169163a9059cbb9160448083019260209291908290030181600087803b1580156107d357600080fd5b505af11580156107e7573d6000803e3d6000fd5b505050506040513d60208110156107fd57600080fd5b505060408051600160a060020a0380881682528616602082015280820185905290517f037238854fe57fbf51f09946f854fc3916fe83938d6521f09bd05463839f13049181900360600190a1506001949350505050565b600854600160a060020a031681565b600080548190600160a060020a0316331461087d57600080fd5b600160a060020a038316151561089257600080fd5b600854604080517fb714a90d000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301529151919092169163b714a90d9160248083019260209291908290030181600087803b1580156108fa57600080fd5b505af115801561090e573d6000803e3d6000fd5b505050506040513d602081101561092457600080fd5b50519392505050565b600654600160a060020a031681565b600080548190600160a060020a0316331461095657600080fd5b600854604080517f22e113a3000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152871515602483015260448201879052915191909216916322e113a39160648083019260209291908290030181600087803b1580156109cd57600080fd5b505af11580156109e1573d6000803e3d6000fd5b505050506040513d60208110156109f757600080fd5b5051604080518615158152602081018690528151929350600160a060020a038816927ffd984c05c771ebc127f8483a21238f2b87610feb88410280c0f435d02ae0f439929181900390910190a2949350505050565b60008054819081908190600160a060020a03163314610a6a57600080fd5b600160a060020a0386161515610a7f57600080fd5b600160a060020a0385161515610a9457600080fd5b600854604080517f79b6fead000000000000000000000000000000000000000000000000000000008152600160a060020a038981166004830152915191909216916379b6fead9160248083019260209291908290030181600087803b158015610afc57600080fd5b505af1158015610b10573d6000803e3d6000fd5b505050506040513d6020811015610b2657600080fd5b5051604080517f9373f432000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152915192955085945090841691639373f432916024808201926020929091908290030181600087803b158015610b9357600080fd5b505af1158015610ba7573d6000803e3d6000fd5b505050506040513d6020811015610bbd57600080fd5b50511515610bca57600080fd5b600854604080517fbf403204000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015288811660248301529151919092169163bf4032049160448083019260209291908290030181600087803b158015610c3a57600080fd5b505af1158015610c4e573d6000803e3d6000fd5b505050506040513d6020811015610c6457600080fd5b505160408051600160a060020a0388811682529151929350908816917fb15573eb768216f61724fe33469e0a6160b82aadd32d51a4faec79aeb5351ad39181900360200190a295945050505050565b600554600160a060020a031681565b60008054819081908190819081908190600160a060020a03163314610ce657600080fd5b600160a060020a038d161515610cfb57600080fd5b600160a060020a038a161515610d1057600080fd5b600860009054906101000a9004600160a060020a0316600160a060020a03166370a082318e6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610d8057600080fd5b505af1158015610d94573d6000803e3d6000fd5b505050506040513d6020811015610daa57600080fd5b81019080805190602001909291905050509550600860009054906101000a9004600160a060020a0316600160a060020a03166386602c848e6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610e2d57600080fd5b505af1158015610e41573d6000803e3d6000fd5b505050506040513d6020811015610e5757600080fd5b505194508715610e7d57610e71868663ffffffff612a6616565b891115610e7d57600080fd5b600660009054906101000a9004600160a060020a0316600160a060020a03166370a082318e6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610eed57600080fd5b505af1158015610f01573d6000803e3d6000fd5b505050506040513d6020811015610f1757600080fd5b50519350610f268d8c8c611903565b90935091508215156110d15781151561100557600860009054906101000a9004600160a060020a0316600160a060020a03166384062bdd8e8d8d6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a03168152602001836000191660001916815260200182600160a060020a0316600160a060020a031681526020019350505050602060405180830381600087803b158015610fd357600080fd5b505af1158015610fe7573d6000803e3d6000fd5b505050506040513d6020811015610ffd57600080fd5b506110cc9050565b600860009054906101000a9004600160a060020a0316600160a060020a031663e31dd8968e8d8d6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a03168152602001836000191660001916815260200182600160a060020a0316600160a060020a031681526020019350505050602060405180830381600087803b15801561109f57600080fd5b505af11580156110b3573d6000803e3d6000fd5b505050506040513d60208110156110c957600080fd5b50505b611165565b81151561116557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f77616c6c65742061646472657373206d75737420626520636f7272656374207760448201527f6974682077616c6c6574206e616d652100000000000000000000000000000000606482015290519081900360840190fd5b508b838911156112f157600754604080517f68c31649000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018c9052604481018f90529051918316916368c31649916064808201926020929091908290030181600087803b1580156111e557600080fd5b505af11580156111f9573d6000803e3d6000fd5b505050506040513d602081101561120f57600080fd5b5051151561121c57600080fd5b60008411156112d557600654600854604080517f01e33667000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820187905251918316916301e33667916064808201926020929091908290030181600087803b15801561129e57600080fd5b505af11580156112b2573d6000803e3d6000fd5b505050506040513d60208110156112c857600080fd5b505115156112d557600080fd5b6112e1818d8c8c612a78565b15156112ec57600080fd5b6114e5565b80600160a060020a03166366013bdd600660009054906101000a9004600160a060020a0316600760009054906101000a9004600160a060020a03168f8e8e600760009054906101000a9004600160a060020a0316600160a060020a031663744c8c096040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561138257600080fd5b505af1158015611396573d6000803e3d6000fd5b505050506040513d60208110156113ac57600080fd5b5051600754604080517fd16edc150000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169163d16edc15916004808201926020929091908290030181600087803b15801561140e57600080fd5b505af1158015611422573d6000803e3d6000fd5b505050506040513d602081101561143857600080fd5b50516040805160e060020a63ffffffff8b16028152600160a060020a039889166004820152968816602488015260448701959095529286166064860152608485019190915260a48401529290921660c4820152905160e48083019260209291908290030181600087803b1580156114ae57600080fd5b505af11580156114c2573d6000803e3d6000fd5b505050506040513d60208110156114d857600080fd5b505115156114e557600080fd5b600860009054906101000a9004600160a060020a0316600160a060020a031663ff0569498e8b6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561155d57600080fd5b505af1158015611571573d6000803e3d6000fd5b505050506040513d602081101561158757600080fd5b50519d9c50505050505050505050505050565b60008054600160a060020a031633146115b257600080fd5b8261165757600854604080517fff056949000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152602482018690529151919092169163ff0569499160448083019260209291908290030181600087803b15801561162657600080fd5b505af115801561163a573d6000803e3d6000fd5b505050506040513d602081101561165057600080fd5b50516116f3565b600854604080517f5b86f599000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301526024820186905291519190921691635b86f5999160448083019260209291908290030181600087803b1580156116c657600080fd5b505af11580156116da573d6000803e3d6000fd5b505050506040513d60208110156116f057600080fd5b50515b949350505050565b600154600160a060020a0316331461171257600080fd5b600254431115801561172657506003544310155b151561173157600080fd5b60015460008054604051600160a060020a0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36001805460008054600160a060020a0319908116600160a060020a038416178255909116909155600255565b60008054819081908190600160a060020a031633146117b857600080fd5b600160a060020a03851615156117cd57600080fd5b600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152915191909216916370a082319160248083019260209291908290030181600087803b15801561183557600080fd5b505af1158015611849573d6000803e3d6000fd5b505050506040513d602081101561185f57600080fd5b5051600854604080517f86602c84000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015291519395509116916386602c84916024808201926020929091908290030181600087803b1580156118cb57600080fd5b505af11580156118df573d6000803e3d6000fd5b505050506040513d60208110156118f557600080fd5b505191959194509092505050565b600854604080517fb714a90d000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152915160009384938493849384938493169163b714a90d91602480830192602092919082900301818787803b15801561197457600080fd5b505af1158015611988573d6000803e3d6000fd5b505050506040513d602081101561199e57600080fd5b50519350600092505b83831015611b5057600854604080517ff19ae02a000000000000000000000000000000000000000000000000000000008152600160a060020a038c81166004830152602482018790529151919092169163f19ae02a9160448083019260209291908290030181600087803b158015611a1e57600080fd5b505af1158015611a32573d6000803e3d6000fd5b505050506040513d6020811015611a4857600080fd5b5051600854604080517f437ec21d000000000000000000000000000000000000000000000000000000008152600160a060020a038d8116600483015260248201889052915193955091169163437ec21d916044808201926020929091908290030181600087803b158015611abb57600080fd5b505af1158015611acf573d6000803e3d6000fd5b505050506040513d6020811015611ae557600080fd5b5051905087821415611b1157600181600160a060020a031688600160a060020a03161495509550611b58565b80600160a060020a031687600160a060020a03161415611b38576000600195509550611b58565b611b4983600163ffffffff612da916565b92506119a7565b600080955095505b50505050935093915050565b600054600160a060020a03163314611b7b57600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a260008054600160a060020a0319169055565b60008054606091829182918291600160a060020a03163314611be457600080fd5b85511515611bf157600080fd5b8551604051908082528060200260200182016040528015611c1c578160200160208202803883390190505b5092508551604051908082528060200260200182016040528015611c4a578160200160208202803883390190505b509150600090505b8551811015611de657600854604080517ff19ae02a000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152602482018590529151919092169163f19ae02a9160448083019260209291908290030181600087803b158015611cca57600080fd5b505af1158015611cde573d6000803e3d6000fd5b505050506040513d6020811015611cf457600080fd5b50518351849083908110611d0457fe5b6020908102909101810191909152600854604080517f437ec21d000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152602482018690529151919092169263437ec21d92604480820193918290030181600087803b158015611d7d57600080fd5b505af1158015611d91573d6000803e3d6000fd5b505050506040513d6020811015611da757600080fd5b50518251839083908110611db757fe5b600160a060020a03909216602092830290910190910152611ddf81600163ffffffff612da916565b9050611c52565b50909590945092505050565b60008054600160a060020a03163314611e0a57600080fd5b600160a060020a0382161515611e1f57600080fd5b60048054600160a060020a031916600160a060020a0384811691909117808355604080517f8da5cb5b000000000000000000000000000000000000000000000000000000008152905130949290931692638da5cb5b928281019260209291908290030181600087803b158015611e9457600080fd5b505af1158015611ea8573d6000803e3d6000fd5b505050506040513d6020811015611ebe57600080fd5b5051600160a060020a031614611f435760048054604080517f4e71e0c80000000000000000000000000000000000000000000000000000000081529051600160a060020a0390921692634e71e0c892828201926000929082900301818387803b158015611f2a57600080fd5b505af1158015611f3e573d6000803e3d6000fd5b505050505b506001919050565b600054600160a060020a031681565b600080548190606090600160a060020a03163314611f7757600080fd5b600160a060020a0384161515611f8c57600080fd5b604080516001808252818301909252859350906020808301908038833950506006548251929350600160a060020a0316918391506000908110611fcb57fe5b600160a060020a0392831660209182029092018101919091526040517fc6786e5a000000000000000000000000000000000000000000000000000000008152600481018281528451602483015284519386169363c6786e5a9386938392604490910191858101910280838360005b83811015612051578181015183820152602001612039565b5050505090500192505050600060405180830381600087803b15801561207657600080fd5b505af115801561208a573d6000803e3d6000fd5b5050600854604080517f0a633e09000000000000000000000000000000000000000000000000000000008152600160a060020a0389811660048301529151919092169350630a633e09925060248083019260209291908290030181600087803b1580156116c657600080fd5b6000805481908190600160a060020a0316331461211257600080fd5b600160a060020a038416151561212757600080fd5b83612130612dbc565b600160a060020a03909116815260405190819003602001906000f08015801561215d573d6000803e3d6000fd5b50600854604080517f2f1c563e000000000000000000000000000000000000000000000000000000008152600160a060020a03888116600483015280851660248301529151939550859450911691632f1c563e916044808201926020929091908290030181600087803b1580156121d357600080fd5b505af11580156121e7573d6000803e3d6000fd5b505050506040513d60208110156121fd57600080fd5b505060408051600160a060020a0383811682529151918616917f55c48b5893b218bfd1f85d28d11d185c7ec0f376933dbb0a09db48711c120e229181900360200190a29392505050565b600454600160a060020a031681565b60035481565b60008054600160a060020a0316331461227457600080fd5b600160a060020a038416151561228957600080fd5b600160a060020a038316151561229e57600080fd5b5060068054600160a060020a03948516600160a060020a031991821617909155600780549385169382169390931790925560088054919093169116179055600190565b600054600160a060020a031633146122f857600080fd5b8082111561230557600080fd5b600255600355565b6000805481908190600160a060020a0316331461232957600080fd5b600092505b835183101561248657838381518110151561234557fe5b6020908102909101810151604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051919450600160a060020a038516926370a08231926024808401938290030181600087803b1580156123af57600080fd5b505af11580156123c3573d6000803e3d6000fd5b505050506040513d60208110156123d957600080fd5b505160008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201526024810185905290519394509085169263a9059cbb92604480840193602093929083900390910190829087803b15801561244f57600080fd5b505af1158015612463573d6000803e3d6000fd5b505050506040513d602081101561247957600080fd5b505060019092019161232e565b600054600160a060020a0316ff5b600754600160a060020a031681565b60008054600160a060020a031633146124bb57600080fd5b600160a060020a03821615156124d057600080fd5b600854604080517f79b6fead000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152915191909216916379b6fead9160248083019260209291908290030181600087803b15801561253857600080fd5b505af115801561254c573d6000803e3d6000fd5b505050506040513d602081101561256257600080fd5b505192915050565b60008054600160a060020a0316331461258257600080fd5b600454600160a060020a0316151561259957600080fd5b60055460048054604080517f8da5cb5b0000000000000000000000000000000000000000000000000000000081529051600160a060020a039485169490921692638da5cb5b9282820192602092908290030181600087803b1580156125fd57600080fd5b505af1158015612611573d6000803e3d6000fd5b505050506040513d602081101561262757600080fd5b5051600160a060020a0316141561265c575060048054600160a060020a03199081169091556005805490911690556001612660565b5060005b90565b600154600160a060020a031681565b600054600160a060020a0316331461268957600080fd5b600454600160a060020a031615156126a057600080fd5b60055460048054604080517f8da5cb5b0000000000000000000000000000000000000000000000000000000081529051600160a060020a039485169490921692638da5cb5b9282820192602092908290030181600087803b15801561270457600080fd5b505af1158015612718573d6000803e3d6000fd5b505050506040513d602081101561272e57600080fd5b5051600160a060020a0316146127e25760048054604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a03858116948201949094529051929091169163f2fde38b9160248082019260009290919082900301818387803b1580156127a957600080fd5b505af11580156127bd573d6000803e3d6000fd5b505060058054600160a060020a031916600160a060020a038516179055506127ff9050565b60048054600160a060020a03199081169091556005805490911690555b50565b60025481565b6000805481908190600160a060020a0316331461282457600080fd5b600854604080517ff19ae02a000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152600060248301819052925193169263f19ae02a92604480840193602093929083900390910190829087803b15801561289557600080fd5b505af11580156128a9573d6000803e3d6000fd5b505050506040513d60208110156128bf57600080fd5b5051600854604080517f437ec21d000000000000000000000000000000000000000000000000000000008152600160a060020a038b8116600483015260006024830181905292519496509092169263437ec21d926044808201936020939283900390910190829087803b15801561293557600080fd5b505af1158015612949573d6000803e3d6000fd5b505050506040513d602081101561295f57600080fd5b50519050612971878784848989610cc2565b979650505050505050565b600054600160a060020a0316331461299357600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b60008054600160a060020a031633146129cd57600080fd5b600160a060020a03831615156129e257600080fd5b604051600160a060020a0384169083156108fc029084906000818181858888f19350505050158015612a18573d6000803e3d6000fd5b5060408051600160a060020a03851681526020810184905281517fdb35132c111efe920cede025e819975671cfd1b8fcc1174762c8670c4e94c211929181900390910190a150600192915050565b600082821115612a7257fe5b50900390565b600080600080600760009054906101000a9004600160a060020a0316600160a060020a031663744c8c096040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612ad157600080fd5b505af1158015612ae5573d6000803e3d6000fd5b505050506040513d6020811015612afb57600080fd5b50519250612b0f858463ffffffff612a6616565b9150600760009054906101000a9004600160a060020a0316600160a060020a031663d16edc156040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612b6457600080fd5b505af1158015612b78573d6000803e3d6000fd5b505050506040513d6020811015612b8e57600080fd5b50519050600160a060020a03811615801590612baa5750600083115b15612c6057600854600654604080517f01e33667000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152848316602482015260448101879052905191909216916301e336679160648083019260209291908290030181600087803b158015612c2957600080fd5b505af1158015612c3d573d6000803e3d6000fd5b505050506040513d6020811015612c5357600080fd5b50511515612c6057600080fd5b600854600654604080517f01e33667000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152898316602482015260448101869052905191909216916301e336679160648083019260209291908290030181600087803b158015612cda57600080fd5b505af1158015612cee573d6000803e3d6000fd5b505050506040513d6020811015612d0457600080fd5b50511515612d1157600080fd5b604080517fab40340a00000000000000000000000000000000000000000000000000000000815260048101899052600160a060020a038881166024830152604482018590529151918a169163ab40340a9160648082019260009290919082900301818387803b158015612d8357600080fd5b505af1158015612d97573d6000803e3d6000fd5b5060019b9a5050505050505050505050565b81810182811015612db657fe5b92915050565b6040516114f080612dcd833901905600608060405234801561001057600080fd5b506040516020806114f0833981016040525160008054600160a060020a03191633179055600160a060020a038116151561004957600080fd5b600a8054600160a060020a031916600160a060020a0392909216919091179055611478806100786000396000f3006080604052600436106100ec5763ffffffff60e060020a600035041662226eb5811461012857806301e336671461014f5780634e71e0c81461018d57806366013bdd146101a457806368c31649146101e3578063715018a61461020a57806374cd5c0b1461021f5780638da5cb5b1461025d5780638f4ffcb11461028e5780639373f432146102fe5780639bdd070d1461031f578063a901199014610358578063ab40340a14610370578063bfe370d914610397578063c5a88559146103f0578063c6786e5a14610405578063e30c39781461045a578063f2fde38b1461046f578063f3fef3a314610490575b6040805133815234602082015281517ff32a9f77675fd5917534c7746608fd3e309eac68fbdcbf5925e24ca97a704396929181900390910190a1005b34801561013457600080fd5b5061013d6104b4565b60408051918252519081900360200190f35b34801561015b57600080fd5b50610179600160a060020a03600435811690602435166044356104ba565b604080519115158252519081900360200190f35b34801561019957600080fd5b506101a26105ec565b005b3480156101b057600080fd5b50610179600160a060020a03600435811690602435811690604435906064358116906084359060a4359060c43516610674565b3480156101ef57600080fd5b50610179600160a060020a03600435166024356044356108a7565b34801561021657600080fd5b506101a2610bdf565b34801561022b57600080fd5b50610237600435610c4b565b60408051938452600160a060020a03909216602084015282820152519081900360600190f35b34801561026957600080fd5b50610272610ce2565b60408051600160a060020a039092168252519081900360200190f35b34801561029a57600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526101a294600160a060020a03813581169560248035966044359093169536956084949201918190840183828082843750949750610cf19650505050505050565b34801561030a57600080fd5b50610179600160a060020a0360043516610f83565b34801561032b57600080fd5b50610179600160a060020a0360043581169060243581169060443590606435906084359060a43516610fe2565b34801561036457600080fd5b50610237600435611023565b34801561037c57600080fd5b506101a2600435600160a060020a0360243516604435611095565b3480156103a357600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261013d9436949293602493928401919081908401838280828437509497506111789650505050505050565b3480156103fc57600080fd5b5061013d61117f565b34801561041157600080fd5b50604080516020600480358082013583810280860185019096528085526101a2953695939460249493850192918291850190849080828437509497506111859650505050505050565b34801561046657600080fd5b5061027261130c565b34801561047b57600080fd5b506101a2600160a060020a036004351661131b565b34801561049c57600080fd5b50610179600160a060020a0360043516602435611361565b60025490565b600080548190600160a060020a031633146104d457600080fd5b600160a060020a03841615156104e957600080fd5b600160a060020a03851615156104fe57600080fd5b50604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151869283169163a9059cbb9160448083019260209291908290030181600087803b15801561056b57600080fd5b505af115801561057f573d6000803e3d6000fd5b505050506040513d602081101561059557600080fd5b505060408051600160a060020a0380881682528616602082015280820185905290517f037238854fe57fbf51f09946f854fc3916fe83938d6521f09bd05463839f13049181900360600190a1506001949350505050565b600154600160a060020a0316331461060357600080fd5b60015460008054604051600160a060020a0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b6000805481908190600160a060020a0316331461069057600080fd5b600160a060020a03871615156106a557600080fd5b600160a060020a038a1615156106ba57600080fd5b8486116106c657600080fd5b6106d189878a6108a7565b15156106dc57600080fd5b8991506106ef868663ffffffff61141216565b905081600160a060020a031663a9059cbb88836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561075457600080fd5b505af1158015610768573d6000803e3d6000fd5b505050506040513d602081101561077e57600080fd5b5051151561078b57600080fd5b600160a060020a038416158015906107a35750600085115b156108425781600160a060020a031663a9059cbb85876040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561080b57600080fd5b505af115801561081f573d6000803e3d6000fd5b505050506040513d602081101561083557600080fd5b5051151561084257600080fd5b61084d888883611095565b60408051600160a060020a03808d1682528916602082015280820183905290517f037238854fe57fbf51f09946f854fc3916fe83938d6521f09bd05463839f13049181900360600190a15060019998505050505050505050565b60008060008086925082600160a060020a0316637312aaae6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156108ee57600080fd5b505af1158015610902573d6000803e3d6000fd5b505050506040513d602081101561091857600080fd5b505186111561092657600080fd5b82600160a060020a03166314361fd16040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561096457600080fd5b505af1158015610978573d6000803e3d6000fd5b505050506040513d602081101561098e57600080fd5b505186101561099c57600080fd5b6109af856201518063ffffffff61142416565b6004549092508211610ae3576005546109cf90600163ffffffff61143916565b6005556006546109e5908763ffffffff61143916565b60046002018190555082600160a060020a031663f213aad26040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610a2c57600080fd5b505af1158015610a40573d6000803e3d6000fd5b505050506040513d6020811015610a5657600080fd5b50516005541115610a6657600080fd5b82600160a060020a0316635e3cbb7c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610aa457600080fd5b505af1158015610ab8573d6000803e3d6000fd5b505050506040513d6020811015610ace57600080fd5b50516006541115610ade57600080fd5b610af3565b6004829055600160055560068690555b610b068562278d0063ffffffff61142416565b6007549091508111610bc257600854610b2690600163ffffffff61143916565b600855600954610b3c908763ffffffff61143916565b60076002018190555082600160a060020a031663be54f2146040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610b8357600080fd5b505af1158015610b97573d6000803e3d6000fd5b505050506040513d6020811015610bad57600080fd5b50516009541115610bbd57600080fd5b610bd2565b6007819055600160085560098690555b5060019695505050505050565b600054600160a060020a03163314610bf657600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600354600090819081908410610c6057600080fd5b6003805485908110610c6e57fe5b906000526020600020906003020160000154600385815481101515610c8f57fe5b906000526020600020906003020160010160009054906101000a9004600160a060020a0316600386815481101515610cc357fe5b9060005260206000209060030201600201549250925092509193909250565b600054600160a060020a031681565b600080548190600160a060020a03163314610d0b57600080fd5b600160a060020a0384161515610d2057600080fd5b600160a060020a0386161515610d3557600080fd5b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152306024830152604482018890529151869450918416916323b872dd916064808201926020929091908290030181600087803b158015610daa57600080fd5b505af1158015610dbe573d6000803e3d6000fd5b505050506040513d6020811015610dd457600080fd5b50511515610de157600080fd5b610dea83611178565b6040805160608082018352838252600160a060020a038a811660208085018281528587018d815260028054600181018255600091825297517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace60039099029889015591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf8801805473ffffffffffffffffffffffffffffffffffffffff1916918716919091179055517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad09096019590955585519182528181018c9052918a1694810194909452608091840182815288519285019290925287519495507f3bc54c6dcf5be6793947a9f34e5ca45d6ce9196bea304a5550c3e2d2f2156502948b948b948b948b949293909260a085019290860191908190849084905b83811015610f3e578181015183820152602001610f26565b50505050905090810190601f168015610f6b5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1505050505050565b60008054600160a060020a03163314610f9b57600080fd5b600160a060020a0382161515610fb057600080fd5b50600a8054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff199091161790556001919050565b60008054600160a060020a03163314610ffa57600080fd5b600a5461101890889088908890600160a060020a0316888888610674565b979650505050505050565b60025460009081908190841061103857600080fd5b600280548590811061104657fe5b90600052602060002090600302016000015460028581548110151561106757fe5b600091825260209091206001600390920201015460028054600160a060020a039092169187908110610cc357fe5b600054600160a060020a031633146110ac57600080fd5b60408051606081018252938452600160a060020a039283166020850190815290840191825260038054600181018255600082905294517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9590910294850155517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c8401805473ffffffffffffffffffffffffffffffffffffffff19169190931617909155517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d90910155565b6020015190565b60035490565b6000805481908190600160a060020a031633146111a157600080fd5b600092505b83518310156112fe5783838151811015156111bd57fe5b6020908102909101810151604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051919450600160a060020a038516926370a08231926024808401938290030181600087803b15801561122757600080fd5b505af115801561123b573d6000803e3d6000fd5b505050506040513d602081101561125157600080fd5b505160008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201526024810185905290519394509085169263a9059cbb92604480840193602093929083900390910190829087803b1580156112c757600080fd5b505af11580156112db573d6000803e3d6000fd5b505050506040513d60208110156112f157600080fd5b50506001909201916111a6565b600054600160a060020a0316ff5b600154600160a060020a031681565b600054600160a060020a0316331461133257600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008054600160a060020a0316331461137957600080fd5b600160a060020a038316151561138e57600080fd5b604051600160a060020a0384169083156108fc029084906000818181858888f193505050501580156113c4573d6000803e3d6000fd5b5060408051600160a060020a03851681526020810184905281517fdb35132c111efe920cede025e819975671cfd1b8fcc1174762c8670c4e94c211929181900390910190a150600192915050565b60008282111561141e57fe5b50900390565b6000818381151561143157fe5b049392505050565b8181018281101561144657fe5b929150505600a165627a7a723058201ab45f0d83bc4a86f553ee7cfb1a907c30c9cf11de4bf4cf21e9a2d55eae5c420029a165627a7a72305820712a232f462a2374baadf9e545d65a9fb8b18f294852f8502b5b4969c86922710029
Deployed Bytecode
0x60806040526004361061017c5763ffffffff60e060020a60003504166301e3366781146101b857806314a0bc6f146101f6578063196198fa1461022757806321f408be1461025a57806322e113a31461026f57806345629402146102985780634902d163146102bf5780634a738bea146102d45780634d8d0e1b1461030b5780634e71e0c8146103345780635287ce121461034b5780635682d43d14610385578063715018a6146103cb5780637df83cd0146103e05780638157d4b5146104dc5780638da5cb5b146104fd5780639ab8bc2714610512578063aba9650e14610533578063bc467a3e14610554578063be9a655514610569578063c0c53b8b1461057e578063c4590d3f146105ab578063c6786e5a146105c6578063cff0ab961461061b578063d83a7f6714610630578063dbf3543014610651578063e30c397814610666578063ede930c91461067b578063efbe1c1c1461069c578063f23f2cbe146106b1578063f2fde38b146106dd578063f3fef3a3146106fe575b6040805133815234602082015281517ff32a9f77675fd5917534c7746608fd3e309eac68fbdcbf5925e24ca97a704396929181900390910190a1005b3480156101c457600080fd5b506101e2600160a060020a0360043581169060243516604435610722565b604080519115158252519081900360200190f35b34801561020257600080fd5b5061020b610854565b60408051600160a060020a039092168252519081900360200190f35b34801561023357600080fd5b50610248600160a060020a0360043516610863565b60408051918252519081900360200190f35b34801561026657600080fd5b5061020b61092d565b34801561027b57600080fd5b506101e2600160a060020a0360043516602435151560443561093c565b3480156102a457600080fd5b506101e2600160a060020a0360043581169060243516610a4c565b3480156102cb57600080fd5b5061020b610cb3565b3480156102e057600080fd5b506101e2600160a060020a0360043581169060243590604435906064351660843560a4351515610cc2565b34801561031757600080fd5b506101e2600160a060020a0360043516602435151560443561159a565b34801561034057600080fd5b506103496116fb565b005b34801561035757600080fd5b5061036c600160a060020a036004351661179a565b6040805192835260208301919091528051918290030190f35b34801561039157600080fd5b506103b0600160a060020a036004358116906024359060443516611903565b60408051921515835290151560208301528051918290030190f35b3480156103d757600080fd5b50610349611b64565b3480156103ec57600080fd5b50604080516020600460248035828101358481028087018601909752808652610443968435600160a060020a031696369660449591949091019291829185019084908082843750949750611bc39650505050505050565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561048757818101518382015260200161046f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156104c65781810151838201526020016104ae565b5050505090500194505050505060405180910390f35b3480156104e857600080fd5b506101e2600160a060020a0360043516611df2565b34801561050957600080fd5b5061020b611f4b565b34801561051e57600080fd5b506101e2600160a060020a0360043516611f5a565b34801561053f57600080fd5b5061020b600160a060020a03600435166120f6565b34801561056057600080fd5b5061020b612247565b34801561057557600080fd5b50610248612256565b34801561058a57600080fd5b506101e2600160a060020a036004358116906024358116906044351661225c565b3480156105b757600080fd5b506103496004356024356122e1565b3480156105d257600080fd5b50604080516020600480358082013583810280860185019096528085526103499536959394602494938501929182918501908490808284375094975061230d9650505050505050565b34801561062757600080fd5b5061020b612494565b34801561063c57600080fd5b5061020b600160a060020a03600435166124a3565b34801561065d57600080fd5b506101e261256a565b34801561067257600080fd5b5061020b612663565b34801561068757600080fd5b50610349600160a060020a0360043516612672565b3480156106a857600080fd5b50610248612802565b3480156106bd57600080fd5b506101e2600160a060020a03600435166024356044356064351515612808565b3480156106e957600080fd5b50610349600160a060020a036004351661297c565b34801561070a57600080fd5b506101e2600160a060020a03600435166024356129b5565b600080548190600160a060020a0316331461073c57600080fd5b600160a060020a038416151561075157600080fd5b600160a060020a038516151561076657600080fd5b50604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151869283169163a9059cbb9160448083019260209291908290030181600087803b1580156107d357600080fd5b505af11580156107e7573d6000803e3d6000fd5b505050506040513d60208110156107fd57600080fd5b505060408051600160a060020a0380881682528616602082015280820185905290517f037238854fe57fbf51f09946f854fc3916fe83938d6521f09bd05463839f13049181900360600190a1506001949350505050565b600854600160a060020a031681565b600080548190600160a060020a0316331461087d57600080fd5b600160a060020a038316151561089257600080fd5b600854604080517fb714a90d000000000000000000000000000000000000000000000000000000008152600160a060020a0386811660048301529151919092169163b714a90d9160248083019260209291908290030181600087803b1580156108fa57600080fd5b505af115801561090e573d6000803e3d6000fd5b505050506040513d602081101561092457600080fd5b50519392505050565b600654600160a060020a031681565b600080548190600160a060020a0316331461095657600080fd5b600854604080517f22e113a3000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152871515602483015260448201879052915191909216916322e113a39160648083019260209291908290030181600087803b1580156109cd57600080fd5b505af11580156109e1573d6000803e3d6000fd5b505050506040513d60208110156109f757600080fd5b5051604080518615158152602081018690528151929350600160a060020a038816927ffd984c05c771ebc127f8483a21238f2b87610feb88410280c0f435d02ae0f439929181900390910190a2949350505050565b60008054819081908190600160a060020a03163314610a6a57600080fd5b600160a060020a0386161515610a7f57600080fd5b600160a060020a0385161515610a9457600080fd5b600854604080517f79b6fead000000000000000000000000000000000000000000000000000000008152600160a060020a038981166004830152915191909216916379b6fead9160248083019260209291908290030181600087803b158015610afc57600080fd5b505af1158015610b10573d6000803e3d6000fd5b505050506040513d6020811015610b2657600080fd5b5051604080517f9373f432000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152915192955085945090841691639373f432916024808201926020929091908290030181600087803b158015610b9357600080fd5b505af1158015610ba7573d6000803e3d6000fd5b505050506040513d6020811015610bbd57600080fd5b50511515610bca57600080fd5b600854604080517fbf403204000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015288811660248301529151919092169163bf4032049160448083019260209291908290030181600087803b158015610c3a57600080fd5b505af1158015610c4e573d6000803e3d6000fd5b505050506040513d6020811015610c6457600080fd5b505160408051600160a060020a0388811682529151929350908816917fb15573eb768216f61724fe33469e0a6160b82aadd32d51a4faec79aeb5351ad39181900360200190a295945050505050565b600554600160a060020a031681565b60008054819081908190819081908190600160a060020a03163314610ce657600080fd5b600160a060020a038d161515610cfb57600080fd5b600160a060020a038a161515610d1057600080fd5b600860009054906101000a9004600160a060020a0316600160a060020a03166370a082318e6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610d8057600080fd5b505af1158015610d94573d6000803e3d6000fd5b505050506040513d6020811015610daa57600080fd5b81019080805190602001909291905050509550600860009054906101000a9004600160a060020a0316600160a060020a03166386602c848e6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610e2d57600080fd5b505af1158015610e41573d6000803e3d6000fd5b505050506040513d6020811015610e5757600080fd5b505194508715610e7d57610e71868663ffffffff612a6616565b891115610e7d57600080fd5b600660009054906101000a9004600160a060020a0316600160a060020a03166370a082318e6040518263ffffffff1660e060020a0281526004018082600160a060020a0316600160a060020a03168152602001915050602060405180830381600087803b158015610eed57600080fd5b505af1158015610f01573d6000803e3d6000fd5b505050506040513d6020811015610f1757600080fd5b50519350610f268d8c8c611903565b90935091508215156110d15781151561100557600860009054906101000a9004600160a060020a0316600160a060020a03166384062bdd8e8d8d6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a03168152602001836000191660001916815260200182600160a060020a0316600160a060020a031681526020019350505050602060405180830381600087803b158015610fd357600080fd5b505af1158015610fe7573d6000803e3d6000fd5b505050506040513d6020811015610ffd57600080fd5b506110cc9050565b600860009054906101000a9004600160a060020a0316600160a060020a031663e31dd8968e8d8d6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a03168152602001836000191660001916815260200182600160a060020a0316600160a060020a031681526020019350505050602060405180830381600087803b15801561109f57600080fd5b505af11580156110b3573d6000803e3d6000fd5b505050506040513d60208110156110c957600080fd5b50505b611165565b81151561116557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f77616c6c65742061646472657373206d75737420626520636f7272656374207760448201527f6974682077616c6c6574206e616d652100000000000000000000000000000000606482015290519081900360840190fd5b508b838911156112f157600754604080517f68c31649000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152602481018c9052604481018f90529051918316916368c31649916064808201926020929091908290030181600087803b1580156111e557600080fd5b505af11580156111f9573d6000803e3d6000fd5b505050506040513d602081101561120f57600080fd5b5051151561121c57600080fd5b60008411156112d557600654600854604080517f01e33667000000000000000000000000000000000000000000000000000000008152600160a060020a03938416600482015291831660248301526044820187905251918316916301e33667916064808201926020929091908290030181600087803b15801561129e57600080fd5b505af11580156112b2573d6000803e3d6000fd5b505050506040513d60208110156112c857600080fd5b505115156112d557600080fd5b6112e1818d8c8c612a78565b15156112ec57600080fd5b6114e5565b80600160a060020a03166366013bdd600660009054906101000a9004600160a060020a0316600760009054906101000a9004600160a060020a03168f8e8e600760009054906101000a9004600160a060020a0316600160a060020a031663744c8c096040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561138257600080fd5b505af1158015611396573d6000803e3d6000fd5b505050506040513d60208110156113ac57600080fd5b5051600754604080517fd16edc150000000000000000000000000000000000000000000000000000000081529051600160a060020a039092169163d16edc15916004808201926020929091908290030181600087803b15801561140e57600080fd5b505af1158015611422573d6000803e3d6000fd5b505050506040513d602081101561143857600080fd5b50516040805160e060020a63ffffffff8b16028152600160a060020a039889166004820152968816602488015260448701959095529286166064860152608485019190915260a48401529290921660c4820152905160e48083019260209291908290030181600087803b1580156114ae57600080fd5b505af11580156114c2573d6000803e3d6000fd5b505050506040513d60208110156114d857600080fd5b505115156114e557600080fd5b600860009054906101000a9004600160a060020a0316600160a060020a031663ff0569498e8b6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561155d57600080fd5b505af1158015611571573d6000803e3d6000fd5b505050506040513d602081101561158757600080fd5b50519d9c50505050505050505050505050565b60008054600160a060020a031633146115b257600080fd5b8261165757600854604080517fff056949000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152602482018690529151919092169163ff0569499160448083019260209291908290030181600087803b15801561162657600080fd5b505af115801561163a573d6000803e3d6000fd5b505050506040513d602081101561165057600080fd5b50516116f3565b600854604080517f5b86f599000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301526024820186905291519190921691635b86f5999160448083019260209291908290030181600087803b1580156116c657600080fd5b505af11580156116da573d6000803e3d6000fd5b505050506040513d60208110156116f057600080fd5b50515b949350505050565b600154600160a060020a0316331461171257600080fd5b600254431115801561172657506003544310155b151561173157600080fd5b60015460008054604051600160a060020a0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36001805460008054600160a060020a0319908116600160a060020a038416178255909116909155600255565b60008054819081908190600160a060020a031633146117b857600080fd5b600160a060020a03851615156117cd57600080fd5b600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152915191909216916370a082319160248083019260209291908290030181600087803b15801561183557600080fd5b505af1158015611849573d6000803e3d6000fd5b505050506040513d602081101561185f57600080fd5b5051600854604080517f86602c84000000000000000000000000000000000000000000000000000000008152600160a060020a03898116600483015291519395509116916386602c84916024808201926020929091908290030181600087803b1580156118cb57600080fd5b505af11580156118df573d6000803e3d6000fd5b505050506040513d60208110156118f557600080fd5b505191959194509092505050565b600854604080517fb714a90d000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152915160009384938493849384938493169163b714a90d91602480830192602092919082900301818787803b15801561197457600080fd5b505af1158015611988573d6000803e3d6000fd5b505050506040513d602081101561199e57600080fd5b50519350600092505b83831015611b5057600854604080517ff19ae02a000000000000000000000000000000000000000000000000000000008152600160a060020a038c81166004830152602482018790529151919092169163f19ae02a9160448083019260209291908290030181600087803b158015611a1e57600080fd5b505af1158015611a32573d6000803e3d6000fd5b505050506040513d6020811015611a4857600080fd5b5051600854604080517f437ec21d000000000000000000000000000000000000000000000000000000008152600160a060020a038d8116600483015260248201889052915193955091169163437ec21d916044808201926020929091908290030181600087803b158015611abb57600080fd5b505af1158015611acf573d6000803e3d6000fd5b505050506040513d6020811015611ae557600080fd5b5051905087821415611b1157600181600160a060020a031688600160a060020a03161495509550611b58565b80600160a060020a031687600160a060020a03161415611b38576000600195509550611b58565b611b4983600163ffffffff612da916565b92506119a7565b600080955095505b50505050935093915050565b600054600160a060020a03163314611b7b57600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a260008054600160a060020a0319169055565b60008054606091829182918291600160a060020a03163314611be457600080fd5b85511515611bf157600080fd5b8551604051908082528060200260200182016040528015611c1c578160200160208202803883390190505b5092508551604051908082528060200260200182016040528015611c4a578160200160208202803883390190505b509150600090505b8551811015611de657600854604080517ff19ae02a000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152602482018590529151919092169163f19ae02a9160448083019260209291908290030181600087803b158015611cca57600080fd5b505af1158015611cde573d6000803e3d6000fd5b505050506040513d6020811015611cf457600080fd5b50518351849083908110611d0457fe5b6020908102909101810191909152600854604080517f437ec21d000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152602482018690529151919092169263437ec21d92604480820193918290030181600087803b158015611d7d57600080fd5b505af1158015611d91573d6000803e3d6000fd5b505050506040513d6020811015611da757600080fd5b50518251839083908110611db757fe5b600160a060020a03909216602092830290910190910152611ddf81600163ffffffff612da916565b9050611c52565b50909590945092505050565b60008054600160a060020a03163314611e0a57600080fd5b600160a060020a0382161515611e1f57600080fd5b60048054600160a060020a031916600160a060020a0384811691909117808355604080517f8da5cb5b000000000000000000000000000000000000000000000000000000008152905130949290931692638da5cb5b928281019260209291908290030181600087803b158015611e9457600080fd5b505af1158015611ea8573d6000803e3d6000fd5b505050506040513d6020811015611ebe57600080fd5b5051600160a060020a031614611f435760048054604080517f4e71e0c80000000000000000000000000000000000000000000000000000000081529051600160a060020a0390921692634e71e0c892828201926000929082900301818387803b158015611f2a57600080fd5b505af1158015611f3e573d6000803e3d6000fd5b505050505b506001919050565b600054600160a060020a031681565b600080548190606090600160a060020a03163314611f7757600080fd5b600160a060020a0384161515611f8c57600080fd5b604080516001808252818301909252859350906020808301908038833950506006548251929350600160a060020a0316918391506000908110611fcb57fe5b600160a060020a0392831660209182029092018101919091526040517fc6786e5a000000000000000000000000000000000000000000000000000000008152600481018281528451602483015284519386169363c6786e5a9386938392604490910191858101910280838360005b83811015612051578181015183820152602001612039565b5050505090500192505050600060405180830381600087803b15801561207657600080fd5b505af115801561208a573d6000803e3d6000fd5b5050600854604080517f0a633e09000000000000000000000000000000000000000000000000000000008152600160a060020a0389811660048301529151919092169350630a633e09925060248083019260209291908290030181600087803b1580156116c657600080fd5b6000805481908190600160a060020a0316331461211257600080fd5b600160a060020a038416151561212757600080fd5b83612130612dbc565b600160a060020a03909116815260405190819003602001906000f08015801561215d573d6000803e3d6000fd5b50600854604080517f2f1c563e000000000000000000000000000000000000000000000000000000008152600160a060020a03888116600483015280851660248301529151939550859450911691632f1c563e916044808201926020929091908290030181600087803b1580156121d357600080fd5b505af11580156121e7573d6000803e3d6000fd5b505050506040513d60208110156121fd57600080fd5b505060408051600160a060020a0383811682529151918616917f55c48b5893b218bfd1f85d28d11d185c7ec0f376933dbb0a09db48711c120e229181900360200190a29392505050565b600454600160a060020a031681565b60035481565b60008054600160a060020a0316331461227457600080fd5b600160a060020a038416151561228957600080fd5b600160a060020a038316151561229e57600080fd5b5060068054600160a060020a03948516600160a060020a031991821617909155600780549385169382169390931790925560088054919093169116179055600190565b600054600160a060020a031633146122f857600080fd5b8082111561230557600080fd5b600255600355565b6000805481908190600160a060020a0316331461232957600080fd5b600092505b835183101561248657838381518110151561234557fe5b6020908102909101810151604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051919450600160a060020a038516926370a08231926024808401938290030181600087803b1580156123af57600080fd5b505af11580156123c3573d6000803e3d6000fd5b505050506040513d60208110156123d957600080fd5b505160008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201526024810185905290519394509085169263a9059cbb92604480840193602093929083900390910190829087803b15801561244f57600080fd5b505af1158015612463573d6000803e3d6000fd5b505050506040513d602081101561247957600080fd5b505060019092019161232e565b600054600160a060020a0316ff5b600754600160a060020a031681565b60008054600160a060020a031633146124bb57600080fd5b600160a060020a03821615156124d057600080fd5b600854604080517f79b6fead000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152915191909216916379b6fead9160248083019260209291908290030181600087803b15801561253857600080fd5b505af115801561254c573d6000803e3d6000fd5b505050506040513d602081101561256257600080fd5b505192915050565b60008054600160a060020a0316331461258257600080fd5b600454600160a060020a0316151561259957600080fd5b60055460048054604080517f8da5cb5b0000000000000000000000000000000000000000000000000000000081529051600160a060020a039485169490921692638da5cb5b9282820192602092908290030181600087803b1580156125fd57600080fd5b505af1158015612611573d6000803e3d6000fd5b505050506040513d602081101561262757600080fd5b5051600160a060020a0316141561265c575060048054600160a060020a03199081169091556005805490911690556001612660565b5060005b90565b600154600160a060020a031681565b600054600160a060020a0316331461268957600080fd5b600454600160a060020a031615156126a057600080fd5b60055460048054604080517f8da5cb5b0000000000000000000000000000000000000000000000000000000081529051600160a060020a039485169490921692638da5cb5b9282820192602092908290030181600087803b15801561270457600080fd5b505af1158015612718573d6000803e3d6000fd5b505050506040513d602081101561272e57600080fd5b5051600160a060020a0316146127e25760048054604080517ff2fde38b000000000000000000000000000000000000000000000000000000008152600160a060020a03858116948201949094529051929091169163f2fde38b9160248082019260009290919082900301818387803b1580156127a957600080fd5b505af11580156127bd573d6000803e3d6000fd5b505060058054600160a060020a031916600160a060020a038516179055506127ff9050565b60048054600160a060020a03199081169091556005805490911690555b50565b60025481565b6000805481908190600160a060020a0316331461282457600080fd5b600854604080517ff19ae02a000000000000000000000000000000000000000000000000000000008152600160a060020a038a81166004830152600060248301819052925193169263f19ae02a92604480840193602093929083900390910190829087803b15801561289557600080fd5b505af11580156128a9573d6000803e3d6000fd5b505050506040513d60208110156128bf57600080fd5b5051600854604080517f437ec21d000000000000000000000000000000000000000000000000000000008152600160a060020a038b8116600483015260006024830181905292519496509092169263437ec21d926044808201936020939283900390910190829087803b15801561293557600080fd5b505af1158015612949573d6000803e3d6000fd5b505050506040513d602081101561295f57600080fd5b50519050612971878784848989610cc2565b979650505050505050565b600054600160a060020a0316331461299357600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b60008054600160a060020a031633146129cd57600080fd5b600160a060020a03831615156129e257600080fd5b604051600160a060020a0384169083156108fc029084906000818181858888f19350505050158015612a18573d6000803e3d6000fd5b5060408051600160a060020a03851681526020810184905281517fdb35132c111efe920cede025e819975671cfd1b8fcc1174762c8670c4e94c211929181900390910190a150600192915050565b600082821115612a7257fe5b50900390565b600080600080600760009054906101000a9004600160a060020a0316600160a060020a031663744c8c096040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612ad157600080fd5b505af1158015612ae5573d6000803e3d6000fd5b505050506040513d6020811015612afb57600080fd5b50519250612b0f858463ffffffff612a6616565b9150600760009054906101000a9004600160a060020a0316600160a060020a031663d16edc156040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612b6457600080fd5b505af1158015612b78573d6000803e3d6000fd5b505050506040513d6020811015612b8e57600080fd5b50519050600160a060020a03811615801590612baa5750600083115b15612c6057600854600654604080517f01e33667000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152848316602482015260448101879052905191909216916301e336679160648083019260209291908290030181600087803b158015612c2957600080fd5b505af1158015612c3d573d6000803e3d6000fd5b505050506040513d6020811015612c5357600080fd5b50511515612c6057600080fd5b600854600654604080517f01e33667000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152898316602482015260448101869052905191909216916301e336679160648083019260209291908290030181600087803b158015612cda57600080fd5b505af1158015612cee573d6000803e3d6000fd5b505050506040513d6020811015612d0457600080fd5b50511515612d1157600080fd5b604080517fab40340a00000000000000000000000000000000000000000000000000000000815260048101899052600160a060020a038881166024830152604482018590529151918a169163ab40340a9160648082019260009290919082900301818387803b158015612d8357600080fd5b505af1158015612d97573d6000803e3d6000fd5b5060019b9a5050505050505050505050565b81810182811015612db657fe5b92915050565b6040516114f080612dcd833901905600608060405234801561001057600080fd5b506040516020806114f0833981016040525160008054600160a060020a03191633179055600160a060020a038116151561004957600080fd5b600a8054600160a060020a031916600160a060020a0392909216919091179055611478806100786000396000f3006080604052600436106100ec5763ffffffff60e060020a600035041662226eb5811461012857806301e336671461014f5780634e71e0c81461018d57806366013bdd146101a457806368c31649146101e3578063715018a61461020a57806374cd5c0b1461021f5780638da5cb5b1461025d5780638f4ffcb11461028e5780639373f432146102fe5780639bdd070d1461031f578063a901199014610358578063ab40340a14610370578063bfe370d914610397578063c5a88559146103f0578063c6786e5a14610405578063e30c39781461045a578063f2fde38b1461046f578063f3fef3a314610490575b6040805133815234602082015281517ff32a9f77675fd5917534c7746608fd3e309eac68fbdcbf5925e24ca97a704396929181900390910190a1005b34801561013457600080fd5b5061013d6104b4565b60408051918252519081900360200190f35b34801561015b57600080fd5b50610179600160a060020a03600435811690602435166044356104ba565b604080519115158252519081900360200190f35b34801561019957600080fd5b506101a26105ec565b005b3480156101b057600080fd5b50610179600160a060020a03600435811690602435811690604435906064358116906084359060a4359060c43516610674565b3480156101ef57600080fd5b50610179600160a060020a03600435166024356044356108a7565b34801561021657600080fd5b506101a2610bdf565b34801561022b57600080fd5b50610237600435610c4b565b60408051938452600160a060020a03909216602084015282820152519081900360600190f35b34801561026957600080fd5b50610272610ce2565b60408051600160a060020a039092168252519081900360200190f35b34801561029a57600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526101a294600160a060020a03813581169560248035966044359093169536956084949201918190840183828082843750949750610cf19650505050505050565b34801561030a57600080fd5b50610179600160a060020a0360043516610f83565b34801561032b57600080fd5b50610179600160a060020a0360043581169060243581169060443590606435906084359060a43516610fe2565b34801561036457600080fd5b50610237600435611023565b34801561037c57600080fd5b506101a2600435600160a060020a0360243516604435611095565b3480156103a357600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261013d9436949293602493928401919081908401838280828437509497506111789650505050505050565b3480156103fc57600080fd5b5061013d61117f565b34801561041157600080fd5b50604080516020600480358082013583810280860185019096528085526101a2953695939460249493850192918291850190849080828437509497506111859650505050505050565b34801561046657600080fd5b5061027261130c565b34801561047b57600080fd5b506101a2600160a060020a036004351661131b565b34801561049c57600080fd5b50610179600160a060020a0360043516602435611361565b60025490565b600080548190600160a060020a031633146104d457600080fd5b600160a060020a03841615156104e957600080fd5b600160a060020a03851615156104fe57600080fd5b50604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151869283169163a9059cbb9160448083019260209291908290030181600087803b15801561056b57600080fd5b505af115801561057f573d6000803e3d6000fd5b505050506040513d602081101561059557600080fd5b505060408051600160a060020a0380881682528616602082015280820185905290517f037238854fe57fbf51f09946f854fc3916fe83938d6521f09bd05463839f13049181900360600190a1506001949350505050565b600154600160a060020a0316331461060357600080fd5b60015460008054604051600160a060020a0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b6000805481908190600160a060020a0316331461069057600080fd5b600160a060020a03871615156106a557600080fd5b600160a060020a038a1615156106ba57600080fd5b8486116106c657600080fd5b6106d189878a6108a7565b15156106dc57600080fd5b8991506106ef868663ffffffff61141216565b905081600160a060020a031663a9059cbb88836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561075457600080fd5b505af1158015610768573d6000803e3d6000fd5b505050506040513d602081101561077e57600080fd5b5051151561078b57600080fd5b600160a060020a038416158015906107a35750600085115b156108425781600160a060020a031663a9059cbb85876040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561080b57600080fd5b505af115801561081f573d6000803e3d6000fd5b505050506040513d602081101561083557600080fd5b5051151561084257600080fd5b61084d888883611095565b60408051600160a060020a03808d1682528916602082015280820183905290517f037238854fe57fbf51f09946f854fc3916fe83938d6521f09bd05463839f13049181900360600190a15060019998505050505050505050565b60008060008086925082600160a060020a0316637312aaae6040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156108ee57600080fd5b505af1158015610902573d6000803e3d6000fd5b505050506040513d602081101561091857600080fd5b505186111561092657600080fd5b82600160a060020a03166314361fd16040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561096457600080fd5b505af1158015610978573d6000803e3d6000fd5b505050506040513d602081101561098e57600080fd5b505186101561099c57600080fd5b6109af856201518063ffffffff61142416565b6004549092508211610ae3576005546109cf90600163ffffffff61143916565b6005556006546109e5908763ffffffff61143916565b60046002018190555082600160a060020a031663f213aad26040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610a2c57600080fd5b505af1158015610a40573d6000803e3d6000fd5b505050506040513d6020811015610a5657600080fd5b50516005541115610a6657600080fd5b82600160a060020a0316635e3cbb7c6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610aa457600080fd5b505af1158015610ab8573d6000803e3d6000fd5b505050506040513d6020811015610ace57600080fd5b50516006541115610ade57600080fd5b610af3565b6004829055600160055560068690555b610b068562278d0063ffffffff61142416565b6007549091508111610bc257600854610b2690600163ffffffff61143916565b600855600954610b3c908763ffffffff61143916565b60076002018190555082600160a060020a031663be54f2146040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610b8357600080fd5b505af1158015610b97573d6000803e3d6000fd5b505050506040513d6020811015610bad57600080fd5b50516009541115610bbd57600080fd5b610bd2565b6007819055600160085560098690555b5060019695505050505050565b600054600160a060020a03163314610bf657600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600354600090819081908410610c6057600080fd5b6003805485908110610c6e57fe5b906000526020600020906003020160000154600385815481101515610c8f57fe5b906000526020600020906003020160010160009054906101000a9004600160a060020a0316600386815481101515610cc357fe5b9060005260206000209060030201600201549250925092509193909250565b600054600160a060020a031681565b600080548190600160a060020a03163314610d0b57600080fd5b600160a060020a0384161515610d2057600080fd5b600160a060020a0386161515610d3557600080fd5b604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152306024830152604482018890529151869450918416916323b872dd916064808201926020929091908290030181600087803b158015610daa57600080fd5b505af1158015610dbe573d6000803e3d6000fd5b505050506040513d6020811015610dd457600080fd5b50511515610de157600080fd5b610dea83611178565b6040805160608082018352838252600160a060020a038a811660208085018281528587018d815260028054600181018255600091825297517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace60039099029889015591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf8801805473ffffffffffffffffffffffffffffffffffffffff1916918716919091179055517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad09096019590955585519182528181018c9052918a1694810194909452608091840182815288519285019290925287519495507f3bc54c6dcf5be6793947a9f34e5ca45d6ce9196bea304a5550c3e2d2f2156502948b948b948b948b949293909260a085019290860191908190849084905b83811015610f3e578181015183820152602001610f26565b50505050905090810190601f168015610f6b5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1505050505050565b60008054600160a060020a03163314610f9b57600080fd5b600160a060020a0382161515610fb057600080fd5b50600a8054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff199091161790556001919050565b60008054600160a060020a03163314610ffa57600080fd5b600a5461101890889088908890600160a060020a0316888888610674565b979650505050505050565b60025460009081908190841061103857600080fd5b600280548590811061104657fe5b90600052602060002090600302016000015460028581548110151561106757fe5b600091825260209091206001600390920201015460028054600160a060020a039092169187908110610cc357fe5b600054600160a060020a031633146110ac57600080fd5b60408051606081018252938452600160a060020a039283166020850190815290840191825260038054600181018255600082905294517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9590910294850155517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c8401805473ffffffffffffffffffffffffffffffffffffffff19169190931617909155517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d90910155565b6020015190565b60035490565b6000805481908190600160a060020a031633146111a157600080fd5b600092505b83518310156112fe5783838151811015156111bd57fe5b6020908102909101810151604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051919450600160a060020a038516926370a08231926024808401938290030181600087803b15801561122757600080fd5b505af115801561123b573d6000803e3d6000fd5b505050506040513d602081101561125157600080fd5b505160008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201526024810185905290519394509085169263a9059cbb92604480840193602093929083900390910190829087803b1580156112c757600080fd5b505af11580156112db573d6000803e3d6000fd5b505050506040513d60208110156112f157600080fd5b50506001909201916111a6565b600054600160a060020a0316ff5b600154600160a060020a031681565b600054600160a060020a0316331461133257600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008054600160a060020a0316331461137957600080fd5b600160a060020a038316151561138e57600080fd5b604051600160a060020a0384169083156108fc029084906000818181858888f193505050501580156113c4573d6000803e3d6000fd5b5060408051600160a060020a03851681526020810184905281517fdb35132c111efe920cede025e819975671cfd1b8fcc1174762c8670c4e94c211929181900390910190a150600192915050565b60008282111561141e57fe5b50900390565b6000818381151561143157fe5b049392505050565b8181018281101561144657fe5b929150505600a165627a7a723058201ab45f0d83bc4a86f553ee7cfb1a907c30c9cf11de4bf4cf21e9a2d55eae5c420029a165627a7a72305820712a232f462a2374baadf9e545d65a9fb8b18f294852f8502b5b4969c86922710029
Swarm Source
bzzr://712a232f462a2374baadf9e545d65a9fb8b18f294852f8502b5b4969c8692271
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.