Overview
ETH Balance
0.000037173007685559 ETH
Eth Value
$0.13 (@ $3,601.63/ETH)More Info
Private Name Tags
ContractCreator
Latest 10 internal transactions
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
19689444 | 259 days ago | 0.8144 ETH | ||||
15693793 | 819 days ago | 48.000779 ETH | ||||
15693767 | 819 days ago | 46.21608433 ETH | ||||
15616127 | 830 days ago | 0.35194076 ETH | ||||
15602365 | 832 days ago | 0.38127394 ETH | ||||
15595390 | 833 days ago | 0.03689799 ETH | ||||
15488782 | 849 days ago | 0.000599 ETH | ||||
15488726 | 849 days ago | 0.95570865 ETH | ||||
15485157 | 850 days ago | 0.000199 ETH | ||||
15485132 | 850 days ago | 0.87410848 ETH |
Loading...
Loading
Contract Name:
Brokerbot
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Standard Json-Input format)
/** * SPDX-License-Identifier: LicenseRef-Aktionariat * * Proprietary License * * This code cannot be used without an explicit permission from the copyright holder. * If you wish to use the Aktionariat Brokerbot, you can either use the open version * named Brokerbot.sol that can be used under an MIT License with Automated License Fee Payments, * or you can get in touch with use to negotiate a license to use LicensedBrokerbot.sol . * * Copyright (c) 2021 Aktionariat AG (aktionariat.com), All rights reserved. */ pragma solidity ^0.8.0; import "../utils/Ownable.sol"; import "../ERC20/IERC20.sol"; import "../ERC20/IERC677Receiver.sol"; import "./IBrokerbot.sol"; contract Brokerbot is IBrokerbot, Ownable { address public paymenthub; IERC20 public override immutable base; // ERC-20 currency IERC20 public immutable token; // ERC-20 share token uint256 private price; // current offer price in base currency, without drift uint256 public increment; // increment step the price in/decreases when buying/selling uint256 public driftStart; uint256 public timeToDrift; // seconds until drift pushes price by one drift increment int256 public driftIncrement; // Note that these settings might be hard-coded in various places, so better not change these values. uint8 private constant BUYING_ENABLED = 0x1; uint8 private constant SELLING_ENABLED = 0x2; // note that in the UI, we call the setting "convert ether", which is the opposite uint8 private constant KEEP_ETHER = 0x4; // Version history // Version 2: added ability to process bank orders even if buying disabled // Version 3: added various events, removed license fee // Version 4: made version field public so it is actually usable // Version 5: added target address for withdrawEther uint8 public constant VERSION = 0x5; // more bits to be used by payment hub uint256 public override settings = BUYING_ENABLED | SELLING_ENABLED; event Trade(IERC20 indexed token, address who, bytes ref, int amount, IERC20 base, uint totPrice, uint fee, uint newprice); event PaymentHubUpdate(address indexed paymentHub); event PriceSet(uint256 price, uint256 increment); event DriftSet(uint256 timeToDrift, int256 driftIncrement); event SettingsChange(uint256 setting); constructor( IERC20 _token, uint256 _price, uint256 _increment, IERC20 _base, address _owner, address _paymentHub ) Ownable(_owner) { base = _base; token = _token; price = _price; increment = _increment; paymenthub = _paymentHub; // Should we disabled recoverability in the recovery hub here? // No, if someone attacks us, we can always trigger a transfer and recover the tokens as well as the collateral. } function setPrice(uint256 _price, uint256 _increment) external onlyOwner { anchorPrice(_price); increment = _increment; emit PriceSet(_price, _increment); } function hasDrift() public view returns (bool) { return timeToDrift != 0; } // secondsPerStep should be negative for downwards drift function setDrift(uint256 secondsPerStep, int256 _driftIncrement) external onlyOwner { anchorPrice(getPrice()); timeToDrift = secondsPerStep; driftIncrement = _driftIncrement; emit DriftSet(secondsPerStep, _driftIncrement); } function anchorPrice(uint256 currentPrice) private { price = currentPrice; // rely on time stamp is ok, no exact time stamp needed // solhint-disable-next-line not-rely-on-time driftStart = block.timestamp; } function getPrice() public view returns (uint256) { // rely on time stamp is ok, no exact time stamp needed // solhint-disable-next-line not-rely-on-time return getPriceAtTime(block.timestamp); } function getPriceAtTime(uint256 timestamp) public view returns (uint256) { if (hasDrift()){ uint256 passed = timestamp - driftStart; int256 drifted = int256(passed / timeToDrift) * driftIncrement; int256 driftedPrice = int256(price) + drifted; if (driftedPrice < 0){ return 0; } else { return uint256(driftedPrice); } } else { return price; } } function buy(address from, uint256 paid, bytes calldata ref) internal returns (uint256) { require(hasSetting(BUYING_ENABLED), "buying disabled"); uint shares = getShares(paid); uint costs = notifyTraded(from, shares, ref); if (costs < paid){ IERC20(base).transfer(from, paid - costs); } IERC20(token).transfer(from, shares); return shares; } // Callers must verify that (hasSetting(BUYING_ENABLED) || msg.sender == owner) holds! function notifyTraded(address from, uint256 shares, bytes calldata ref) internal returns (uint256) { // disabling the requirement below for efficiency as this always holds once we reach this point // require(hasSetting(BUYING_ENABLED) || msg.sender == owner, "buying disabled"); uint costs = getBuyPrice(shares); price = price + (shares * increment); emit Trade(token, from, ref, int256(shares), base, costs, 0, getPrice()); return costs; } function notifyTrade(address buyer, uint256 shares, bytes calldata ref) external onlyOwner { notifyTraded(buyer, shares, ref); } function notifyTradeAndTransfer(address buyer, uint256 shares, bytes calldata ref) public onlyOwner { notifyTraded(buyer, shares, ref); IERC20(token).transfer(buyer, shares); } function notifyTrades(address[] calldata buyers, uint256[] calldata shares, bytes[] calldata ref) external onlyOwner { for (uint i = 0; i < buyers.length; i++) { notifyTraded(buyers[i], shares[i], ref[i]); } } function notifyTradesAndTransfer(address[] calldata buyers, uint256[] calldata shares, bytes[] calldata ref) external onlyOwner { for (uint i = 0; i < buyers.length; i++) { notifyTradeAndTransfer(buyers[i], shares[i], ref[i]); } } /** * Payment hub might actually have sent another accepted token, including Ether. */ function processIncoming(IERC20 incomingAsset, address from, uint256 amount, bytes calldata ref) public override payable returns (uint256) { require(msg.sender == address(incomingAsset) || msg.sender == paymenthub, "invalid caller"); if (incomingAsset == token){ return sell(from, amount, ref); } else if (incomingAsset == base){ return buy(from, amount, ref); } else { revert("invalid token"); } } // ERC-677 recipient function onTokenTransfer(address from, uint256 amount, bytes calldata ref) external returns (bool) { processIncoming(IERC20(msg.sender), from, amount, ref); return true; } function hasSetting(uint256 setting) private view returns (bool) { return settings & setting == setting; } /** * ref 0x01 or old format sells shares for base currency. * ref 0x02 indicates a sell via bank transfer. */ function isDirectSale(bytes calldata ref) internal pure returns (bool) { if (ref.length == 0 || ref.length == 20) { return true; // old format } else { if (ref[0] == bytes1(0x01)){ return true; } else if (ref[0] == bytes1(0x02)) { return false; } else { revert("unknown ref"); } } } function sell(address recipient, uint256 amount, bytes calldata ref) internal returns (uint256) { require(hasSetting(SELLING_ENABLED), "selling disabled"); uint256 totPrice = getSellPrice(amount); IERC20 baseToken = IERC20(base); price -= amount * increment; if (isDirectSale(ref)){ baseToken.transfer(recipient, totPrice); } emit Trade(token, recipient, ref, -int256(amount), base, totPrice, 0, getPrice()); return totPrice; } function getSellPrice(uint256 shares) public view returns (uint256) { return getPrice(getPrice() - (shares * increment), shares); } function getBuyPrice(uint256 shares) public view returns (uint256) { return getPrice(getPrice(), shares); } function getPrice(uint256 lowest, uint256 shares) internal view returns (uint256){ if (shares == 0) { return 0; } else { uint256 highest = lowest + (shares - 1) * increment; return ((lowest + highest) / 2) * shares; } } function getShares(uint256 money) public view returns (uint256) { uint256 currentPrice = getPrice(); uint256 min = 0; uint256 max = money / currentPrice; while (min < max){ uint256 middle = (min + max)/2; uint256 totalPrice = getPrice(currentPrice, middle); if (money > totalPrice){ min = middle + 1; } else { max = middle; } } return min; } function withdrawEther(address target, uint256 amount) public ownerOrHub() { (bool success, ) = payable(target).call{value:amount}(""); require(success, "Transfer failed"); } function withdrawEther(uint256 amount) external ownerOrHub() { withdrawEther(msg.sender, amount); } function approve(address erc20, address who, uint256 amount) external onlyOwner() { IERC20(erc20).approve(who, amount); } function withdraw(address ercAddress, address to, uint256 amount) external ownerOrHub() { IERC20(ercAddress).transfer(to, amount); } function setPaymentHub(address hub) external onlyOwner() { paymenthub = hub; emit PaymentHubUpdate(paymenthub); } function setSettings(uint256 _settings) public onlyOwner() { settings = _settings; emit SettingsChange(_settings); } function setEnabled(bool _buyingEnabled, bool _sellingEnabled) external onlyOwner() { uint256 _settings = settings; if (_buyingEnabled != hasSetting(BUYING_ENABLED)){ _settings ^= BUYING_ENABLED; } if (_sellingEnabled != hasSetting(SELLING_ENABLED)){ _settings ^= SELLING_ENABLED; } setSettings(_settings); } modifier ownerOrHub() { require(owner == msg.sender || paymenthub == msg.sender, "not owner nor hub"); _; } }
/** * SPDX-License-Identifier: MIT * * Copyright (c) 2016-2019 zOS Global Limited * */ pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see `ERC20Detailed`. */ interface IERC20 { // Optional functions function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a `Transfer` event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through `transferFrom`. This is * zero by default. * * This value changes when `approve` or `transferFrom` are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * > Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an `Approval` event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a `Transfer` event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to `approve`. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IERC677Receiver { function onTokenTransfer(address from, uint256 amount, bytes calldata data) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../ERC20/IERC20.sol"; interface IBrokerbot { function base() external view returns (IERC20); function settings() external view returns (uint256); // @return The amount of shares bought on buying or how much in the base currency is transfered on selling function processIncoming(IERC20 token_, address from, uint256 amount, bytes calldata ref) external payable returns (uint256); }
// SPDX-License-Identifier: MIT // // From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol // // Modifications: // - Replaced Context._msgSender() with msg.sender // - Made leaner // - Extracted interface pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable { address public owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor (address initialOwner) { owner = initialOwner; emit OwnershipTransferred(address(0), owner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) external onlyOwner { emit OwnershipTransferred(owner, newOwner); owner = newOwner; } modifier onlyOwner() { require(owner == msg.sender, "not owner"); _; } }
{ "evmVersion": "london", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_increment","type":"uint256"},{"internalType":"contract IERC20","name":"_base","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_paymentHub","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timeToDrift","type":"uint256"},{"indexed":false,"internalType":"int256","name":"driftIncrement","type":"int256"}],"name":"DriftSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"paymentHub","type":"address"}],"name":"PaymentHubUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"increment","type":"uint256"}],"name":"PriceSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"setting","type":"uint256"}],"name":"SettingsChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"bytes","name":"ref","type":"bytes"},{"indexed":false,"internalType":"int256","name":"amount","type":"int256"},{"indexed":false,"internalType":"contract IERC20","name":"base","type":"address"},{"indexed":false,"internalType":"uint256","name":"totPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newprice","type":"uint256"}],"name":"Trade","type":"event"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"erc20","type":"address"},{"internalType":"address","name":"who","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"base","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"driftIncrement","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"driftStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"getBuyPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getPriceAtTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"getSellPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"money","type":"uint256"}],"name":"getShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasDrift","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"increment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"bytes","name":"ref","type":"bytes"}],"name":"notifyTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"bytes","name":"ref","type":"bytes"}],"name":"notifyTradeAndTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"buyers","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"},{"internalType":"bytes[]","name":"ref","type":"bytes[]"}],"name":"notifyTrades","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"buyers","type":"address[]"},{"internalType":"uint256[]","name":"shares","type":"uint256[]"},{"internalType":"bytes[]","name":"ref","type":"bytes[]"}],"name":"notifyTradesAndTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"ref","type":"bytes"}],"name":"onTokenTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymenthub","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"incomingAsset","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"ref","type":"bytes"}],"name":"processIncoming","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"secondsPerStep","type":"uint256"},{"internalType":"int256","name":"_driftIncrement","type":"int256"}],"name":"setDrift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_buyingEnabled","type":"bool"},{"internalType":"bool","name":"_sellingEnabled","type":"bool"}],"name":"setEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"hub","type":"address"}],"name":"setPaymentHub","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_increment","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_settings","type":"uint256"}],"name":"setSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeToDrift","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ercAddress","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c060405260036007553480156200001657600080fd5b5060405162001d9d38038062001d9d8339810160408190526200003991620000cf565b600080546001600160a01b0319166001600160a01b03841690811782556040518492907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350606092831b6001600160601b03199081166080529590921b90941660a052600292909255600355600180546001600160a01b0319166001600160a01b039092169190911790555062000165565b60008060008060008060c08789031215620000e957600080fd5b8651620000f6816200014c565b809650506020870151945060408701519350606087015162000118816200014c565b60808801519093506200012b816200014c565b60a08801519092506200013e816200014c565b809150509295509295509295565b6001600160a01b03811681146200016257600080fd5b50565b60805160601c60a05160601c611bc6620001d7600039600081816105740152818161080a01528181610bbd015281816111b4015281816113a6015261146401526000818161024f01528181610857015281816110d601528181611203015281816112d001526114ab0152611bc66000f3fe6080604052600436106101e35760003560e01c8063a4c0ed3611610102578063e06174e411610095578063fc0c546a11610064578063fc0c546a14610562578063ffa1ad7414610596578063fff4da1f146105bd578063fff89745146105dd57600080fd5b8063e06174e4146104ec578063e1f21c6714610502578063f2fde38b14610522578063f7d975771461054257600080fd5b8063bf13d438116100d1578063bf13d43814610480578063c7780ab2146104a0578063d09de08a146104b6578063d9caed12146104cc57600080fd5b8063a4c0ed3614610400578063afaefe9e14610420578063b03a13fe14610440578063ba730e531461046057600080fd5b80637cd6a7fd1161017a5780638da5cb5b116101495780638da5cb5b1461038b57806391be6ad5146103ab57806398d5fdca146103cb5780639bb8c0fd146103e057600080fd5b80637cd6a7fd1461031c5780637ff6c1911461033c57806384b41fda146103525780638a07d3d01461036857600080fd5b80635c627935116101b65780635c627935146102a957806369365c52146102c95780636f7267b7146102dc578063777adcf0146102fc57600080fd5b806308d4db14146101e85780633bed33ce1461021b5780635001f3b51461023d578063522f681514610289575b600080fd5b3480156101f457600080fd5b5061020861020336600461189a565b6105fd565b6040519081526020015b60405180910390f35b34801561022757600080fd5b5061023b61023636600461189a565b610616565b005b34801561024957600080fd5b506102717f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610212565b34801561029557600080fd5b5061023b6102a43660046116af565b61066b565b3480156102b557600080fd5b5061023b6102c43660046117ee565b610744565b6102086102d7366004611827565b6107a8565b3480156102e857600080fd5b506102086102f736600461189a565b6108dc565b34801561030857600080fd5b50600154610271906001600160a01b031681565b34801561032857600080fd5b5061023b61033736600461189a565b610956565b34801561034857600080fd5b5061020860045481565b34801561035e57600080fd5b5061020860055481565b34801561037457600080fd5b5060055415155b6040519015158152602001610212565b34801561039757600080fd5b50600054610271906001600160a01b031681565b3480156103b757600080fd5b5061023b6103c6366004611737565b6109bb565b3480156103d757600080fd5b50610208610a72565b3480156103ec57600080fd5b5061023b6103fb3660046116db565b610a82565b34801561040c57600080fd5b5061037b61041b3660046116db565b610abf565b34801561042c57600080fd5b5061023b61043b3660046118b3565b610ada565b34801561044c57600080fd5b5061023b61045b3660046116db565b610b60565b34801561046c57600080fd5b5061020861047b36600461189a565b610c39565b34801561048c57600080fd5b5061020861049b36600461189a565b610c5e565b3480156104ac57600080fd5b5061020860065481565b3480156104c257600080fd5b5061020860035481565b3480156104d857600080fd5b5061023b6104e736600461166e565b610cd7565b3480156104f857600080fd5b5061020860075481565b34801561050e57600080fd5b5061023b61051d36600461166e565b610d9f565b34801561052e57600080fd5b5061023b61053d36600461164a565b610dfe565b34801561054e57600080fd5b5061023b61055d3660046118b3565b610e83565b34801561056e57600080fd5b506102717f000000000000000000000000000000000000000000000000000000000000000081565b3480156105a257600080fd5b506105ab600581565b60405160ff9091168152602001610212565b3480156105c957600080fd5b5061023b6105d836600461164a565b610ef5565b3480156105e957600080fd5b5061023b6105f8366004611737565b610f69565b600061061061060a610a72565b8361101d565b92915050565b6000546001600160a01b031633148061063957506001546001600160a01b031633145b61065e5760405162461bcd60e51b815260040161065590611961565b60405180910390fd5b610668338261066b565b50565b6000546001600160a01b031633148061068e57506001546001600160a01b031633145b6106aa5760405162461bcd60e51b815260040161065590611961565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146106f7576040519150601f19603f3d011682016040523d82523d6000602084013e6106fc565b606091505b505090508061073f5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610655565b505050565b6000546001600160a01b0316331461076e5760405162461bcd60e51b81526004016106559061193e565b60075482151560018083161414610783576001185b610791600260075481161490565b15158215151461079f576002185b61073f81610956565b6000336001600160a01b03871614806107cb57506001546001600160a01b031633145b6108085760405162461bcd60e51b815260206004820152600e60248201526d34b73b30b634b21031b0b63632b960911b6044820152606401610655565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614156108555761084e85858585611074565b90506108d3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b0316141561089b5761084e85858585611253565b60405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b6044820152606401610655565b95945050505050565b6000806108e7610a72565b90506000806108f68386611a2c565b90505b8082101561094e576000600261090f8385611a14565b6109199190611a2c565b90506000610927858361101d565b9050808711156109435761093c826001611a14565b9350610947565b8192505b50506108f9565b509392505050565b6000546001600160a01b031633146109805760405162461bcd60e51b81526004016106559061193e565b60078190556040518181527f73f575b434990a047744d035619e8cb101d71ae30e15cee70124fcfa992a4b479060200160405180910390a150565b6000546001600160a01b031633146109e55760405162461bcd60e51b81526004016106559061193e565b60005b85811015610a6957610a57878783818110610a0557610a05611b57565b9050602002016020810190610a1a919061164a565b868684818110610a2c57610a2c611b57565b90506020020135858585818110610a4557610a45611b57565b905060200281019061045b919061198c565b80610a6181611b09565b9150506109e8565b50505050505050565b6000610a7d42610c5e565b905090565b6000546001600160a01b03163314610aac5760405162461bcd60e51b81526004016106559061193e565b610ab88484848461142e565b5050505050565b6000610ace33868686866107a8565b50600195945050505050565b6000546001600160a01b03163314610b045760405162461bcd60e51b81526004016106559061193e565b610b18610b0f610a72565b60025542600455565b6005829055600681905560408051838152602081018390527f0c64990ff5fa601870b48aa83367706d39e6f55a0f73069c97c2f9c08241a17e91015b60405180910390a15050565b6000546001600160a01b03163314610b8a5760405162461bcd60e51b81526004016106559061193e565b610b968484848461142e565b5060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b158015610c0157600080fd5b505af1158015610c15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab891906117d1565b600061061060035483610c4c9190611ad3565b610c54610a72565b61060a9190611af2565b6000610c6b600554151590565b15610ccf57600060045483610c809190611af2565b9050600060065460055483610c959190611a2c565b610c9f9190611a4e565b9050600081600254610cb191906119d3565b90506000811215610cc757506000949350505050565b949350505050565b505060025490565b6000546001600160a01b0316331480610cfa57506001546001600160a01b031633145b610d165760405162461bcd60e51b815260040161065590611961565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044015b602060405180830381600087803b158015610d6157600080fd5b505af1158015610d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9991906117d1565b50505050565b6000546001600160a01b03163314610dc95760405162461bcd60e51b81526004016106559061193e565b60405163095ea7b360e01b81526001600160a01b0383811660048301526024820183905284169063095ea7b390604401610d47565b6000546001600160a01b03163314610e285760405162461bcd60e51b81526004016106559061193e565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610ead5760405162461bcd60e51b81526004016106559061193e565b610eba8260025542600455565b600381905560408051838152602081018390527fa0f1665b7b659537b52deec61ea64d134a3bccda74c7f4e79f2246e7a8187a8a9101610b54565b6000546001600160a01b03163314610f1f5760405162461bcd60e51b81526004016106559061193e565b600180546001600160a01b0319166001600160a01b0383169081179091556040517f4a534dbb0a1201b9baddbb0018d195c269a25847c33b19c06d24309f20f84b3390600090a250565b6000546001600160a01b03163314610f935760405162461bcd60e51b81526004016106559061193e565b60005b85811015610a695761100a878783818110610fb357610fb3611b57565b9050602002016020810190610fc8919061164a565b868684818110610fda57610fda611b57565b90506020020135858585818110610ff357610ff3611b57565b9050602002810190611005919061198c565b61142e565b508061101581611b09565b915050610f96565b60008161102c57506000610610565b60035460009061103d600185611af2565b6110479190611ad3565b6110519085611a14565b90508260026110608387611a14565b61106a9190611a2c565b610cc79190611ad3565b6000611084600260075481161490565b6110c35760405162461bcd60e51b815260206004820152601060248201526f1cd95b1b1a5b99c8191a5cd8589b195960821b6044820152606401610655565b60006110ce85610c39565b6003549091507f0000000000000000000000000000000000000000000000000000000000000000906111009087611ad3565b600260008282546111119190611af2565b90915550611121905085856114fa565b156111aa5760405163a9059cbb60e01b81526001600160a01b0388811660048301526024820184905282169063a9059cbb90604401602060405180830381600087803b15801561117057600080fd5b505af1158015611184573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a891906117d1565b505b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f424641a08047715d4b70195e1d90818d302683d9f65f41910ca13f5a486d37cc8887876112018b611b24565b7f000000000000000000000000000000000000000000000000000000000000000088600061122d610a72565b6040516112419897969594939291906118d5565b60405180910390a25095945050505050565b6000611263600160075481161490565b6112a15760405162461bcd60e51b815260206004820152600f60248201526e189d5e5a5b99c8191a5cd8589b1959608a1b6044820152606401610655565b60006112ac856108dc565b905060006112bc8783878761142e565b905085811015611380576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a9059cbb88611300848a611af2565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561134657600080fd5b505af115801561135a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137e91906117d1565b505b60405163a9059cbb60e01b81526001600160a01b038881166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b1580156113ea57600080fd5b505af11580156113fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142291906117d1565b50909695505050505050565b60008061143a856105fd565b90506003548561144a9190611ad3565b6002546114579190611a14565b6002556001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f424641a08047715d4b70195e1d90818d302683d9f65f41910ca13f5a486d37cc878686897f00000000000000000000000000000000000000000000000000000000000000008760006114d5610a72565b6040516114e99897969594939291906118d5565b60405180910390a295945050505050565b60008115806115095750601482145b1561151657506001610610565b600160f81b838360008161152c5761152c611b57565b9050013560f81c60f81b6001600160f81b031916141561154e57506001610610565b600160f91b838360008161156457611564611b57565b9050013560f81c60f81b6001600160f81b031916141561158657506000610610565b60405162461bcd60e51b815260206004820152600b60248201526a3ab735b737bbb7103932b360a91b6044820152606401610655565b60008083601f8401126115ce57600080fd5b50813567ffffffffffffffff8111156115e657600080fd5b6020830191508360208260051b850101111561160157600080fd5b9250929050565b60008083601f84011261161a57600080fd5b50813567ffffffffffffffff81111561163257600080fd5b60208301915083602082850101111561160157600080fd5b60006020828403121561165c57600080fd5b813561166781611b6d565b9392505050565b60008060006060848603121561168357600080fd5b833561168e81611b6d565b9250602084013561169e81611b6d565b929592945050506040919091013590565b600080604083850312156116c257600080fd5b82356116cd81611b6d565b946020939093013593505050565b600080600080606085870312156116f157600080fd5b84356116fc81611b6d565b935060208501359250604085013567ffffffffffffffff81111561171f57600080fd5b61172b87828801611608565b95989497509550505050565b6000806000806000806060878903121561175057600080fd5b863567ffffffffffffffff8082111561176857600080fd5b6117748a838b016115bc565b9098509650602089013591508082111561178d57600080fd5b6117998a838b016115bc565b909650945060408901359150808211156117b257600080fd5b506117bf89828a016115bc565b979a9699509497509295939492505050565b6000602082840312156117e357600080fd5b815161166781611b82565b6000806040838503121561180157600080fd5b823561180c81611b82565b9150602083013561181c81611b82565b809150509250929050565b60008060008060006080868803121561183f57600080fd5b853561184a81611b6d565b9450602086013561185a81611b6d565b935060408601359250606086013567ffffffffffffffff81111561187d57600080fd5b61188988828901611608565b969995985093965092949392505050565b6000602082840312156118ac57600080fd5b5035919050565b600080604083850312156118c657600080fd5b50508035926020909101359150565b6001600160a01b03898116825260e0602083018190528201889052600090610100898b828601376000848b018201526040840198909852959095166060820152608081019390935260a083019190915260c0820152601f909301601f1916909201019392505050565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b6020808252601190820152703737ba1037bbb732b9103737b910343ab160791b604082015260600190565b6000808335601e198436030181126119a357600080fd5b83018035915067ffffffffffffffff8211156119be57600080fd5b60200191503681900382131561160157600080fd5b600080821280156001600160ff1b03849003851316156119f5576119f5611b41565b600160ff1b8390038412811615611a0e57611a0e611b41565b50500190565b60008219821115611a2757611a27611b41565b500190565b600082611a4957634e487b7160e01b600052601260045260246000fd5b500490565b60006001600160ff1b0381841382841380821686840486111615611a7457611a74611b41565b600160ff1b6000871282811687830589121615611a9357611a93611b41565b60008712925087820587128484161615611aaf57611aaf611b41565b87850587128184161615611ac557611ac5611b41565b505050929093029392505050565b6000816000190483118215151615611aed57611aed611b41565b500290565b600082821015611b0457611b04611b41565b500390565b6000600019821415611b1d57611b1d611b41565b5060010190565b6000600160ff1b821415611b3a57611b3a611b41565b5060000390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038116811461066857600080fd5b801515811461066857600080fdfea264697066735822122041b2d15d8e8b00e2bff98c764b50f84934be7a90ce18628be6c8ebb01b41280264736f6c634300080700330000000000000000000000002e880962a9609aa3eab4def919fe9e917e99073b00000000000000000000000000000000000000000000000083ffd4e0cc9730000000000000000000000000000000000000000000000000000000048c27395000000000000000000000000000b4272071ecadd69d933adcd19ca99fe80664fc080000000000000000000000009b40c0eacc47beb9dbc7eaceeeeb04b9119c77a5000000000000000000000000fb330379134ea1efce9cf6f28e2ccb917899e007
Deployed Bytecode
0x6080604052600436106101e35760003560e01c8063a4c0ed3611610102578063e06174e411610095578063fc0c546a11610064578063fc0c546a14610562578063ffa1ad7414610596578063fff4da1f146105bd578063fff89745146105dd57600080fd5b8063e06174e4146104ec578063e1f21c6714610502578063f2fde38b14610522578063f7d975771461054257600080fd5b8063bf13d438116100d1578063bf13d43814610480578063c7780ab2146104a0578063d09de08a146104b6578063d9caed12146104cc57600080fd5b8063a4c0ed3614610400578063afaefe9e14610420578063b03a13fe14610440578063ba730e531461046057600080fd5b80637cd6a7fd1161017a5780638da5cb5b116101495780638da5cb5b1461038b57806391be6ad5146103ab57806398d5fdca146103cb5780639bb8c0fd146103e057600080fd5b80637cd6a7fd1461031c5780637ff6c1911461033c57806384b41fda146103525780638a07d3d01461036857600080fd5b80635c627935116101b65780635c627935146102a957806369365c52146102c95780636f7267b7146102dc578063777adcf0146102fc57600080fd5b806308d4db14146101e85780633bed33ce1461021b5780635001f3b51461023d578063522f681514610289575b600080fd5b3480156101f457600080fd5b5061020861020336600461189a565b6105fd565b6040519081526020015b60405180910390f35b34801561022757600080fd5b5061023b61023636600461189a565b610616565b005b34801561024957600080fd5b506102717f000000000000000000000000b4272071ecadd69d933adcd19ca99fe80664fc0881565b6040516001600160a01b039091168152602001610212565b34801561029557600080fd5b5061023b6102a43660046116af565b61066b565b3480156102b557600080fd5b5061023b6102c43660046117ee565b610744565b6102086102d7366004611827565b6107a8565b3480156102e857600080fd5b506102086102f736600461189a565b6108dc565b34801561030857600080fd5b50600154610271906001600160a01b031681565b34801561032857600080fd5b5061023b61033736600461189a565b610956565b34801561034857600080fd5b5061020860045481565b34801561035e57600080fd5b5061020860055481565b34801561037457600080fd5b5060055415155b6040519015158152602001610212565b34801561039757600080fd5b50600054610271906001600160a01b031681565b3480156103b757600080fd5b5061023b6103c6366004611737565b6109bb565b3480156103d757600080fd5b50610208610a72565b3480156103ec57600080fd5b5061023b6103fb3660046116db565b610a82565b34801561040c57600080fd5b5061037b61041b3660046116db565b610abf565b34801561042c57600080fd5b5061023b61043b3660046118b3565b610ada565b34801561044c57600080fd5b5061023b61045b3660046116db565b610b60565b34801561046c57600080fd5b5061020861047b36600461189a565b610c39565b34801561048c57600080fd5b5061020861049b36600461189a565b610c5e565b3480156104ac57600080fd5b5061020860065481565b3480156104c257600080fd5b5061020860035481565b3480156104d857600080fd5b5061023b6104e736600461166e565b610cd7565b3480156104f857600080fd5b5061020860075481565b34801561050e57600080fd5b5061023b61051d36600461166e565b610d9f565b34801561052e57600080fd5b5061023b61053d36600461164a565b610dfe565b34801561054e57600080fd5b5061023b61055d3660046118b3565b610e83565b34801561056e57600080fd5b506102717f0000000000000000000000002e880962a9609aa3eab4def919fe9e917e99073b81565b3480156105a257600080fd5b506105ab600581565b60405160ff9091168152602001610212565b3480156105c957600080fd5b5061023b6105d836600461164a565b610ef5565b3480156105e957600080fd5b5061023b6105f8366004611737565b610f69565b600061061061060a610a72565b8361101d565b92915050565b6000546001600160a01b031633148061063957506001546001600160a01b031633145b61065e5760405162461bcd60e51b815260040161065590611961565b60405180910390fd5b610668338261066b565b50565b6000546001600160a01b031633148061068e57506001546001600160a01b031633145b6106aa5760405162461bcd60e51b815260040161065590611961565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146106f7576040519150601f19603f3d011682016040523d82523d6000602084013e6106fc565b606091505b505090508061073f5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610655565b505050565b6000546001600160a01b0316331461076e5760405162461bcd60e51b81526004016106559061193e565b60075482151560018083161414610783576001185b610791600260075481161490565b15158215151461079f576002185b61073f81610956565b6000336001600160a01b03871614806107cb57506001546001600160a01b031633145b6108085760405162461bcd60e51b815260206004820152600e60248201526d34b73b30b634b21031b0b63632b960911b6044820152606401610655565b7f0000000000000000000000002e880962a9609aa3eab4def919fe9e917e99073b6001600160a01b0316866001600160a01b031614156108555761084e85858585611074565b90506108d3565b7f000000000000000000000000b4272071ecadd69d933adcd19ca99fe80664fc086001600160a01b0316866001600160a01b0316141561089b5761084e85858585611253565b60405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b6044820152606401610655565b95945050505050565b6000806108e7610a72565b90506000806108f68386611a2c565b90505b8082101561094e576000600261090f8385611a14565b6109199190611a2c565b90506000610927858361101d565b9050808711156109435761093c826001611a14565b9350610947565b8192505b50506108f9565b509392505050565b6000546001600160a01b031633146109805760405162461bcd60e51b81526004016106559061193e565b60078190556040518181527f73f575b434990a047744d035619e8cb101d71ae30e15cee70124fcfa992a4b479060200160405180910390a150565b6000546001600160a01b031633146109e55760405162461bcd60e51b81526004016106559061193e565b60005b85811015610a6957610a57878783818110610a0557610a05611b57565b9050602002016020810190610a1a919061164a565b868684818110610a2c57610a2c611b57565b90506020020135858585818110610a4557610a45611b57565b905060200281019061045b919061198c565b80610a6181611b09565b9150506109e8565b50505050505050565b6000610a7d42610c5e565b905090565b6000546001600160a01b03163314610aac5760405162461bcd60e51b81526004016106559061193e565b610ab88484848461142e565b5050505050565b6000610ace33868686866107a8565b50600195945050505050565b6000546001600160a01b03163314610b045760405162461bcd60e51b81526004016106559061193e565b610b18610b0f610a72565b60025542600455565b6005829055600681905560408051838152602081018390527f0c64990ff5fa601870b48aa83367706d39e6f55a0f73069c97c2f9c08241a17e91015b60405180910390a15050565b6000546001600160a01b03163314610b8a5760405162461bcd60e51b81526004016106559061193e565b610b968484848461142e565b5060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590527f0000000000000000000000002e880962a9609aa3eab4def919fe9e917e99073b169063a9059cbb90604401602060405180830381600087803b158015610c0157600080fd5b505af1158015610c15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab891906117d1565b600061061060035483610c4c9190611ad3565b610c54610a72565b61060a9190611af2565b6000610c6b600554151590565b15610ccf57600060045483610c809190611af2565b9050600060065460055483610c959190611a2c565b610c9f9190611a4e565b9050600081600254610cb191906119d3565b90506000811215610cc757506000949350505050565b949350505050565b505060025490565b6000546001600160a01b0316331480610cfa57506001546001600160a01b031633145b610d165760405162461bcd60e51b815260040161065590611961565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044015b602060405180830381600087803b158015610d6157600080fd5b505af1158015610d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9991906117d1565b50505050565b6000546001600160a01b03163314610dc95760405162461bcd60e51b81526004016106559061193e565b60405163095ea7b360e01b81526001600160a01b0383811660048301526024820183905284169063095ea7b390604401610d47565b6000546001600160a01b03163314610e285760405162461bcd60e51b81526004016106559061193e565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610ead5760405162461bcd60e51b81526004016106559061193e565b610eba8260025542600455565b600381905560408051838152602081018390527fa0f1665b7b659537b52deec61ea64d134a3bccda74c7f4e79f2246e7a8187a8a9101610b54565b6000546001600160a01b03163314610f1f5760405162461bcd60e51b81526004016106559061193e565b600180546001600160a01b0319166001600160a01b0383169081179091556040517f4a534dbb0a1201b9baddbb0018d195c269a25847c33b19c06d24309f20f84b3390600090a250565b6000546001600160a01b03163314610f935760405162461bcd60e51b81526004016106559061193e565b60005b85811015610a695761100a878783818110610fb357610fb3611b57565b9050602002016020810190610fc8919061164a565b868684818110610fda57610fda611b57565b90506020020135858585818110610ff357610ff3611b57565b9050602002810190611005919061198c565b61142e565b508061101581611b09565b915050610f96565b60008161102c57506000610610565b60035460009061103d600185611af2565b6110479190611ad3565b6110519085611a14565b90508260026110608387611a14565b61106a9190611a2c565b610cc79190611ad3565b6000611084600260075481161490565b6110c35760405162461bcd60e51b815260206004820152601060248201526f1cd95b1b1a5b99c8191a5cd8589b195960821b6044820152606401610655565b60006110ce85610c39565b6003549091507f000000000000000000000000b4272071ecadd69d933adcd19ca99fe80664fc08906111009087611ad3565b600260008282546111119190611af2565b90915550611121905085856114fa565b156111aa5760405163a9059cbb60e01b81526001600160a01b0388811660048301526024820184905282169063a9059cbb90604401602060405180830381600087803b15801561117057600080fd5b505af1158015611184573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a891906117d1565b505b6001600160a01b037f0000000000000000000000002e880962a9609aa3eab4def919fe9e917e99073b167f424641a08047715d4b70195e1d90818d302683d9f65f41910ca13f5a486d37cc8887876112018b611b24565b7f000000000000000000000000b4272071ecadd69d933adcd19ca99fe80664fc0888600061122d610a72565b6040516112419897969594939291906118d5565b60405180910390a25095945050505050565b6000611263600160075481161490565b6112a15760405162461bcd60e51b815260206004820152600f60248201526e189d5e5a5b99c8191a5cd8589b1959608a1b6044820152606401610655565b60006112ac856108dc565b905060006112bc8783878761142e565b905085811015611380576001600160a01b037f000000000000000000000000b4272071ecadd69d933adcd19ca99fe80664fc081663a9059cbb88611300848a611af2565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561134657600080fd5b505af115801561135a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137e91906117d1565b505b60405163a9059cbb60e01b81526001600160a01b038881166004830152602482018490527f0000000000000000000000002e880962a9609aa3eab4def919fe9e917e99073b169063a9059cbb90604401602060405180830381600087803b1580156113ea57600080fd5b505af11580156113fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142291906117d1565b50909695505050505050565b60008061143a856105fd565b90506003548561144a9190611ad3565b6002546114579190611a14565b6002556001600160a01b037f0000000000000000000000002e880962a9609aa3eab4def919fe9e917e99073b167f424641a08047715d4b70195e1d90818d302683d9f65f41910ca13f5a486d37cc878686897f000000000000000000000000b4272071ecadd69d933adcd19ca99fe80664fc088760006114d5610a72565b6040516114e99897969594939291906118d5565b60405180910390a295945050505050565b60008115806115095750601482145b1561151657506001610610565b600160f81b838360008161152c5761152c611b57565b9050013560f81c60f81b6001600160f81b031916141561154e57506001610610565b600160f91b838360008161156457611564611b57565b9050013560f81c60f81b6001600160f81b031916141561158657506000610610565b60405162461bcd60e51b815260206004820152600b60248201526a3ab735b737bbb7103932b360a91b6044820152606401610655565b60008083601f8401126115ce57600080fd5b50813567ffffffffffffffff8111156115e657600080fd5b6020830191508360208260051b850101111561160157600080fd5b9250929050565b60008083601f84011261161a57600080fd5b50813567ffffffffffffffff81111561163257600080fd5b60208301915083602082850101111561160157600080fd5b60006020828403121561165c57600080fd5b813561166781611b6d565b9392505050565b60008060006060848603121561168357600080fd5b833561168e81611b6d565b9250602084013561169e81611b6d565b929592945050506040919091013590565b600080604083850312156116c257600080fd5b82356116cd81611b6d565b946020939093013593505050565b600080600080606085870312156116f157600080fd5b84356116fc81611b6d565b935060208501359250604085013567ffffffffffffffff81111561171f57600080fd5b61172b87828801611608565b95989497509550505050565b6000806000806000806060878903121561175057600080fd5b863567ffffffffffffffff8082111561176857600080fd5b6117748a838b016115bc565b9098509650602089013591508082111561178d57600080fd5b6117998a838b016115bc565b909650945060408901359150808211156117b257600080fd5b506117bf89828a016115bc565b979a9699509497509295939492505050565b6000602082840312156117e357600080fd5b815161166781611b82565b6000806040838503121561180157600080fd5b823561180c81611b82565b9150602083013561181c81611b82565b809150509250929050565b60008060008060006080868803121561183f57600080fd5b853561184a81611b6d565b9450602086013561185a81611b6d565b935060408601359250606086013567ffffffffffffffff81111561187d57600080fd5b61188988828901611608565b969995985093965092949392505050565b6000602082840312156118ac57600080fd5b5035919050565b600080604083850312156118c657600080fd5b50508035926020909101359150565b6001600160a01b03898116825260e0602083018190528201889052600090610100898b828601376000848b018201526040840198909852959095166060820152608081019390935260a083019190915260c0820152601f909301601f1916909201019392505050565b6020808252600990820152683737ba1037bbb732b960b91b604082015260600190565b6020808252601190820152703737ba1037bbb732b9103737b910343ab160791b604082015260600190565b6000808335601e198436030181126119a357600080fd5b83018035915067ffffffffffffffff8211156119be57600080fd5b60200191503681900382131561160157600080fd5b600080821280156001600160ff1b03849003851316156119f5576119f5611b41565b600160ff1b8390038412811615611a0e57611a0e611b41565b50500190565b60008219821115611a2757611a27611b41565b500190565b600082611a4957634e487b7160e01b600052601260045260246000fd5b500490565b60006001600160ff1b0381841382841380821686840486111615611a7457611a74611b41565b600160ff1b6000871282811687830589121615611a9357611a93611b41565b60008712925087820587128484161615611aaf57611aaf611b41565b87850587128184161615611ac557611ac5611b41565b505050929093029392505050565b6000816000190483118215151615611aed57611aed611b41565b500290565b600082821015611b0457611b04611b41565b500390565b6000600019821415611b1d57611b1d611b41565b5060010190565b6000600160ff1b821415611b3a57611b3a611b41565b5060000390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038116811461066857600080fd5b801515811461066857600080fdfea264697066735822122041b2d15d8e8b00e2bff98c764b50f84934be7a90ce18628be6c8ebb01b41280264736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002e880962a9609aa3eab4def919fe9e917e99073b00000000000000000000000000000000000000000000000083ffd4e0cc9730000000000000000000000000000000000000000000000000000000048c27395000000000000000000000000000b4272071ecadd69d933adcd19ca99fe80664fc080000000000000000000000009b40c0eacc47beb9dbc7eaceeeeb04b9119c77a5000000000000000000000000fb330379134ea1efce9cf6f28e2ccb917899e007
-----Decoded View---------------
Arg [0] : _token (address): 0x2E880962A9609aA3eab4DEF919FE9E917E99073B
Arg [1] : _price (uint256): 9511555000000000000
Arg [2] : _increment (uint256): 5000000000000
Arg [3] : _base (address): 0xB4272071eCAdd69d933AdcD19cA99fe80664fc08
Arg [4] : _owner (address): 0x9B40c0EAcc47beb9dbc7EACEEEEB04B9119C77a5
Arg [5] : _paymentHub (address): 0xfb330379134EA1EfCE9Cf6F28E2CcB917899e007
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000002e880962a9609aa3eab4def919fe9e917e99073b
Arg [1] : 00000000000000000000000000000000000000000000000083ffd4e0cc973000
Arg [2] : 0000000000000000000000000000000000000000000000000000048c27395000
Arg [3] : 000000000000000000000000b4272071ecadd69d933adcd19ca99fe80664fc08
Arg [4] : 0000000000000000000000009b40c0eacc47beb9dbc7eaceeeeb04b9119c77a5
Arg [5] : 000000000000000000000000fb330379134ea1efce9cf6f28e2ccb917899e007
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,601.63 | 0.00003717 | $0.133884 |
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.