Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 137 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Cancel | 13134948 | 1211 days ago | IN | 0 ETH | 0.00937924 | ||||
Offer | 13133910 | 1211 days ago | IN | 0 ETH | 0.02597671 | ||||
Cancel | 13115735 | 1214 days ago | IN | 0 ETH | 0.0110344 | ||||
Offer | 13114973 | 1214 days ago | IN | 0 ETH | 0.01747965 | ||||
Buy | 13104672 | 1216 days ago | IN | 0 ETH | 0.01146343 | ||||
Buy | 13104645 | 1216 days ago | IN | 0 ETH | 0.0075497 | ||||
Buy | 13104626 | 1216 days ago | IN | 0 ETH | 0.01064535 | ||||
Offer | 13104614 | 1216 days ago | IN | 0 ETH | 0.01795879 | ||||
Cancel | 12785627 | 1266 days ago | IN | 0 ETH | 0.00210343 | ||||
Cancel | 12785613 | 1266 days ago | IN | 0 ETH | 0.00206895 | ||||
Offer | 12770667 | 1268 days ago | IN | 0 ETH | 0.00263442 | ||||
Offer | 12770609 | 1268 days ago | IN | 0 ETH | 0.00282729 | ||||
Offer | 12770573 | 1268 days ago | IN | 0 ETH | 0.00303481 | ||||
Cancel | 12767412 | 1269 days ago | IN | 0 ETH | 0.00157028 | ||||
Offer | 12758060 | 1270 days ago | IN | 0 ETH | 0.0025056 | ||||
Offer | 12758049 | 1270 days ago | IN | 0 ETH | 0.00303481 | ||||
Cancel | 12708640 | 1278 days ago | IN | 0 ETH | 0.00139527 | ||||
Offer | 12706690 | 1278 days ago | IN | 0 ETH | 0.00193668 | ||||
Cancel | 12706675 | 1278 days ago | IN | 0 ETH | 0.00065887 | ||||
Offer | 12704804 | 1278 days ago | IN | 0 ETH | 0.0045569 | ||||
Cancel | 12679621 | 1282 days ago | IN | 0 ETH | 0.00216495 | ||||
Cancel | 12518848 | 1307 days ago | IN | 0 ETH | 0.00193102 | ||||
Offer | 12518623 | 1307 days ago | IN | 0 ETH | 0.00743055 | ||||
Offer | 12506441 | 1309 days ago | IN | 0 ETH | 0.00928035 | ||||
Cancel | 12490616 | 1312 days ago | IN | 0 ETH | 0.01593344 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MatchingMarket
Compiler Version
v0.5.12+commit.7709ece9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-01-28 */ // SPDX-License-Identifier: AGPL-3.0-or-later /// matching_market.sol // Copyright (C) 2017 - 2021 Maker Ecosystem Growth Holdings, INC. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see <https://www.gnu.org/licenses/>. pragma solidity ^0.5.12; /// math.sol -- mixin for inline numerical wizardry // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. contract DSMath { function add(uint x, uint y) internal pure returns (uint z) { require((z = x + y) >= x, "ds-math-add-overflow"); } function sub(uint x, uint y) internal pure returns (uint z) { require((z = x - y) <= x, "ds-math-sub-underflow"); } function mul(uint x, uint y) internal pure returns (uint z) { require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow"); } function min(uint x, uint y) internal pure returns (uint z) { return x <= y ? x : y; } function max(uint x, uint y) internal pure returns (uint z) { return x >= y ? x : y; } function imin(int x, int y) internal pure returns (int z) { return x <= y ? x : y; } function imax(int x, int y) internal pure returns (int z) { return x >= y ? x : y; } uint constant WAD = 10 ** 18; uint constant RAY = 10 ** 27; function wmul(uint x, uint y) internal pure returns (uint z) { z = add(mul(x, y), WAD / 2) / WAD; } function rmul(uint x, uint y) internal pure returns (uint z) { z = add(mul(x, y), RAY / 2) / RAY; } function wdiv(uint x, uint y) internal pure returns (uint z) { z = add(mul(x, WAD), y / 2) / y; } function rdiv(uint x, uint y) internal pure returns (uint z) { z = add(mul(x, RAY), y / 2) / y; } // This famous algorithm is called "exponentiation by squaring" // and calculates x^n with x as fixed-point and n as regular unsigned. // // It's O(log n), instead of O(n) for naive repeated multiplication. // // These facts are why it works: // // If n is even, then x^n = (x^2)^(n/2). // If n is odd, then x^n = x * x^(n-1), // and applying the equation for even x gives // x^n = x * (x^2)^((n-1) / 2). // // Also, EVM division is flooring and // floor[(n-1) / 2] = floor[n / 2]. // function rpow(uint x, uint n) internal pure returns (uint z) { z = n % 2 != 0 ? x : RAY; for (n /= 2; n != 0; n /= 2) { x = rmul(x, x); if (n % 2 != 0) { z = rmul(z, x); } } } } /// erc20.sol -- API for the ERC20 token standard // See <https://github.com/ethereum/EIPs/issues/20>. // This file likely does not meet the threshold of originality // required for copyright to apply. As a result, this is free and // unencumbered software belonging to the public domain. contract ERC20Events { event Approval(address indexed src, address indexed guy, uint wad); event Transfer(address indexed src, address indexed dst, uint wad); } contract ERC20 is ERC20Events { function totalSupply() public view returns (uint); function balanceOf(address guy) public view returns (uint); function allowance(address src, address guy) public view returns (uint); function approve(address guy, uint wad) public returns (bool); function transfer(address dst, uint wad) public returns (bool); function transferFrom( address src, address dst, uint wad ) public returns (bool); } contract EventfulMarket { event LogItemUpdate(uint id); event LogTrade(uint pay_amt, address indexed pay_gem, uint buy_amt, address indexed buy_gem); event LogMake( bytes32 indexed id, bytes32 indexed pair, address indexed maker, ERC20 pay_gem, ERC20 buy_gem, uint128 pay_amt, uint128 buy_amt, uint64 timestamp ); event LogBump( bytes32 indexed id, bytes32 indexed pair, address indexed maker, ERC20 pay_gem, ERC20 buy_gem, uint128 pay_amt, uint128 buy_amt, uint64 timestamp ); event LogTake( bytes32 id, bytes32 indexed pair, address indexed maker, ERC20 pay_gem, ERC20 buy_gem, address indexed taker, uint128 take_amt, uint128 give_amt, uint64 timestamp ); event LogKill( bytes32 indexed id, bytes32 indexed pair, address indexed maker, ERC20 pay_gem, ERC20 buy_gem, uint128 pay_amt, uint128 buy_amt, uint64 timestamp ); } contract SimpleMarket is EventfulMarket, DSMath { uint public last_offer_id; mapping (uint => OfferInfo) public offers; bool locked; struct OfferInfo { uint pay_amt; ERC20 pay_gem; uint buy_amt; ERC20 buy_gem; address owner; uint64 timestamp; } modifier can_buy(uint id) { require(isActive(id)); _; } modifier can_cancel(uint id) { require(isActive(id)); require(getOwner(id) == msg.sender); _; } modifier can_offer { _; } modifier synchronized { require(!locked); locked = true; _; locked = false; } function isActive(uint id) public view returns (bool active) { return offers[id].timestamp > 0; } function getOwner(uint id) public view returns (address owner) { return offers[id].owner; } function getOffer(uint id) public view returns (uint, ERC20, uint, ERC20) { OfferInfo memory offer = offers[id]; return (offer.pay_amt, offer.pay_gem, offer.buy_amt, offer.buy_gem); } // ---- Public entrypoints ---- // function bump(bytes32 id_) public can_buy(uint256(id_)) { uint256 id = uint256(id_); emit LogBump( id_, keccak256(abi.encodePacked(offers[id].pay_gem, offers[id].buy_gem)), offers[id].owner, offers[id].pay_gem, offers[id].buy_gem, uint128(offers[id].pay_amt), uint128(offers[id].buy_amt), offers[id].timestamp ); } // Accept given `quantity` of an offer. Transfers funds from caller to // offer maker, and from market to caller. function buy(uint id, uint quantity) public can_buy(id) synchronized returns (bool) { OfferInfo memory offer = offers[id]; uint spend = mul(quantity, offer.buy_amt) / offer.pay_amt; require(uint128(spend) == spend); require(uint128(quantity) == quantity); // For backwards semantic compatibility. if (quantity == 0 || spend == 0 || quantity > offer.pay_amt || spend > offer.buy_amt) { return false; } offers[id].pay_amt = sub(offer.pay_amt, quantity); offers[id].buy_amt = sub(offer.buy_amt, spend); safeTransferFrom(offer.buy_gem, msg.sender, offer.owner, spend); safeTransfer(offer.pay_gem, msg.sender, quantity); emit LogItemUpdate(id); emit LogTake( bytes32(id), keccak256(abi.encodePacked(offer.pay_gem, offer.buy_gem)), offer.owner, offer.pay_gem, offer.buy_gem, msg.sender, uint128(quantity), uint128(spend), uint64(now) ); emit LogTrade(quantity, address(offer.pay_gem), spend, address(offer.buy_gem)); if (offers[id].pay_amt == 0) { delete offers[id]; } return true; } // Cancel an offer. Refunds offer maker. function cancel(uint id) public can_cancel(id) synchronized returns (bool success) { // read-only offer. Modify an offer by directly accessing offers[id] OfferInfo memory offer = offers[id]; delete offers[id]; safeTransfer(offer.pay_gem, offer.owner, offer.pay_amt); emit LogItemUpdate(id); emit LogKill( bytes32(id), keccak256(abi.encodePacked(offer.pay_gem, offer.buy_gem)), offer.owner, offer.pay_gem, offer.buy_gem, uint128(offer.pay_amt), uint128(offer.buy_amt), uint64(now) ); success = true; } function kill(bytes32 id) public { require(cancel(uint256(id))); } function make( ERC20 pay_gem, ERC20 buy_gem, uint128 pay_amt, uint128 buy_amt ) public returns (bytes32 id) { return bytes32(offer(pay_amt, pay_gem, buy_amt, buy_gem)); } // Make a new offer. Takes funds from the caller into market escrow. function offer(uint pay_amt, ERC20 pay_gem, uint buy_amt, ERC20 buy_gem) public can_offer synchronized returns (uint id) { require(uint128(pay_amt) == pay_amt); require(uint128(buy_amt) == buy_amt); require(pay_amt > 0); require(pay_gem != ERC20(0x0)); require(buy_amt > 0); require(buy_gem != ERC20(0x0)); require(pay_gem != buy_gem); OfferInfo memory info; info.pay_amt = pay_amt; info.pay_gem = pay_gem; info.buy_amt = buy_amt; info.buy_gem = buy_gem; info.owner = msg.sender; info.timestamp = uint64(now); id = _next_id(); offers[id] = info; safeTransferFrom(pay_gem, msg.sender, address(this), pay_amt); emit LogItemUpdate(id); emit LogMake( bytes32(id), keccak256(abi.encodePacked(pay_gem, buy_gem)), msg.sender, pay_gem, buy_gem, uint128(pay_amt), uint128(buy_amt), uint64(now) ); } function take(bytes32 id, uint128 maxTakeAmount) public { require(buy(uint256(id), maxTakeAmount)); } function _next_id() internal returns (uint) { last_offer_id++; return last_offer_id; } function safeTransfer(ERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(ERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function _callOptionalReturn(ERC20 token, bytes memory data) private { uint256 size; assembly { size := extcodesize(token) } require(size > 0, "Not a contract"); (bool success, bytes memory returndata) = address(token).call(data); require(success, "Token call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } interface PriceOracleLike { function getPriceFor(address, address, uint256) external view returns (uint256); } contract MatchingEvents { event LogMinSell(address pay_gem, uint min_amount); event LogUnsortedOffer(uint id); event LogSortedOffer(uint id); event LogInsert(address keeper, uint id); event LogDelete(address keeper, uint id); } contract MatchingMarket is MatchingEvents, SimpleMarket { struct sortInfo { uint next; //points to id of next higher offer uint prev; //points to id of previous lower offer uint delb; //the blocknumber where this entry was marked for delete } mapping(uint => sortInfo) public _rank; //doubly linked lists of sorted offer ids mapping(address => mapping(address => uint)) public _best; //id of the highest offer for a token pair mapping(address => mapping(address => uint)) public _span; //number of offers stored for token pair in sorted orderbook mapping(address => uint) public _dust; //minimum sell amount for a token to avoid dust offers mapping(uint => uint) public _near; //next unsorted offer id uint _head; //first unsorted offer id // dust management address public dustToken; uint256 public dustLimit; address public priceOracle; constructor(address _dustToken, uint256 _dustLimit, address _priceOracle) public { dustToken = _dustToken; dustLimit = _dustLimit; priceOracle = _priceOracle; _setMinSell(ERC20(dustToken), dustLimit); } // If owner, can cancel an offer // If dust, anyone can cancel an offer modifier can_cancel(uint id) { require(isActive(id), "Offer was deleted or taken, or never existed."); require( msg.sender == getOwner(id) || offers[id].pay_amt < _dust[address(offers[id].pay_gem)], "Offer can not be cancelled because user is not owner nor a dust one." ); _; } // ---- Public entrypoints ---- // function make( ERC20 pay_gem, ERC20 buy_gem, uint128 pay_amt, uint128 buy_amt ) public returns (bytes32) { return bytes32(offer(pay_amt, pay_gem, buy_amt, buy_gem)); } function take(bytes32 id, uint128 maxTakeAmount) public { require(buy(uint256(id), maxTakeAmount)); } function kill(bytes32 id) public { require(cancel(uint256(id))); } // Make a new offer. Takes funds from the caller into market escrow. // // * creates new offer without putting it in // the sorted list. // * available to authorized contracts only! // * keepers should call insert(id,pos) // to put offer in the sorted list. // function offer( uint pay_amt, //maker (ask) sell how much ERC20 pay_gem, //maker (ask) sell which token uint buy_amt, //taker (ask) buy how much ERC20 buy_gem //taker (ask) buy which token ) public returns (uint) { require(!locked, "Reentrancy attempt"); return _offeru(pay_amt, pay_gem, buy_amt, buy_gem); } // Make a new offer. Takes funds from the caller into market escrow. function offer( uint pay_amt, //maker (ask) sell how much ERC20 pay_gem, //maker (ask) sell which token uint buy_amt, //maker (ask) buy how much ERC20 buy_gem, //maker (ask) buy which token uint pos //position to insert offer, 0 should be used if unknown ) public can_offer returns (uint) { return offer(pay_amt, pay_gem, buy_amt, buy_gem, pos, true); } function offer( uint pay_amt, //maker (ask) sell how much ERC20 pay_gem, //maker (ask) sell which token uint buy_amt, //maker (ask) buy how much ERC20 buy_gem, //maker (ask) buy which token uint pos, //position to insert offer, 0 should be used if unknown bool rounding //match "close enough" orders? ) public can_offer returns (uint) { require(!locked, "Reentrancy attempt"); require(_dust[address(pay_gem)] <= pay_amt); return _matcho(pay_amt, pay_gem, buy_amt, buy_gem, pos, rounding); } //Transfers funds from caller to offer maker, and from market to caller. function buy(uint id, uint amount) public can_buy(id) returns (bool) { require(!locked, "Reentrancy attempt"); return _buys(id, amount); } // Cancel an offer. Refunds offer maker. function cancel(uint id) public can_cancel(id) returns (bool success) { require(!locked, "Reentrancy attempt"); if (isOfferSorted(id)) { require(_unsort(id)); } else { require(_hide(id)); } return super.cancel(id); //delete the offer. } //insert offer into the sorted list //keepers need to use this function function insert( uint id, //maker (ask) id uint pos //position to insert into ) public returns (bool) { require(!locked, "Reentrancy attempt"); require(!isOfferSorted(id)); //make sure offers[id] is not yet sorted require(isActive(id)); //make sure offers[id] is active _hide(id); //remove offer from unsorted offers list _sort(id, pos); //put offer into the sorted offers list emit LogInsert(msg.sender, id); return true; } //deletes _rank [id] // Function should be called by keepers. function del_rank(uint id) public returns (bool) { require(!locked, "Reentrancy attempt"); require(!isActive(id) && _rank[id].delb != 0 && _rank[id].delb < block.number - 10); delete _rank[id]; emit LogDelete(msg.sender, id); return true; } //set the minimum sell amount for a token. Uses Uniswap as a price oracle. // Function is used to avoid "dust offers" that have // very small amount of tokens to sell, and it would // cost more gas to accept the offer, than the value // of tokens received. function setMinSell( ERC20 pay_gem //token to assign minimum sell amount to ) public { require(msg.sender == tx.origin, "No indirect calls please"); require(address(pay_gem) != dustToken, "Can't set dust for the dustToken"); uint256 dust = PriceOracleLike(priceOracle).getPriceFor(dustToken, address(pay_gem), dustLimit); _setMinSell(pay_gem, dust); } //returns the minimum sell amount for an offer function getMinSell( ERC20 pay_gem //token for which minimum sell amount is queried ) public view returns (uint) { return _dust[address(pay_gem)]; } //return the best offer for a token pair // the best offer is the lowest one if it's an ask, // and highest one if it's a bid offer function getBestOffer(ERC20 sell_gem, ERC20 buy_gem) public view returns(uint) { return _best[address(sell_gem)][address(buy_gem)]; } //return the next worse offer in the sorted list // the worse offer is the higher one if its an ask, // a lower one if its a bid offer, // and in both cases the newer one if they're equal. function getWorseOffer(uint id) public view returns(uint) { return _rank[id].prev; } //return the next better offer in the sorted list // the better offer is in the lower priced one if its an ask, // the next higher priced one if its a bid offer // and in both cases the older one if they're equal. function getBetterOffer(uint id) public view returns(uint) { return _rank[id].next; } //return the amount of better offers for a token pair function getOfferCount(ERC20 sell_gem, ERC20 buy_gem) public view returns(uint) { return _span[address(sell_gem)][address(buy_gem)]; } //get the first unsorted offer that was inserted by a contract // Contracts can't calculate the insertion position of their offer because it is not an O(1) operation. // Their offers get put in the unsorted list of offers. // Keepers can calculate the insertion position offchain and pass it to the insert() function to insert // the unsorted offer into the sorted list. Unsorted offers will not be matched, but can be bought with buy(). function getFirstUnsortedOffer() public view returns(uint) { return _head; } //get the next unsorted offer // Can be used to cycle through all the unsorted offers. function getNextUnsortedOffer(uint id) public view returns(uint) { return _near[id]; } function isOfferSorted(uint id) public view returns(bool) { return _rank[id].next != 0 || _rank[id].prev != 0 || _best[address(offers[id].pay_gem)][address(offers[id].buy_gem)] == id; } function sellAllAmount(ERC20 pay_gem, uint pay_amt, ERC20 buy_gem, uint min_fill_amount) public returns (uint fill_amt) { require(!locked, "Reentrancy attempt"); uint offerId; while (pay_amt > 0) { //while there is amount to sell offerId = getBestOffer(buy_gem, pay_gem); //Get the best offer for the token pair require(offerId != 0); //Fails if there are not more offers // There is a chance that pay_amt is smaller than 1 wei of the other token if (pay_amt * 1 ether < wdiv(offers[offerId].buy_amt, offers[offerId].pay_amt)) { break; //We consider that all amount is sold } if (pay_amt >= offers[offerId].buy_amt) { //If amount to sell is higher or equal than current offer amount to buy fill_amt = add(fill_amt, offers[offerId].pay_amt); //Add amount bought to acumulator pay_amt = sub(pay_amt, offers[offerId].buy_amt); //Decrease amount to sell take(bytes32(offerId), uint128(offers[offerId].pay_amt)); //We take the whole offer } else { // if lower uint256 baux = rmul(pay_amt * 10 ** 9, rdiv(offers[offerId].pay_amt, offers[offerId].buy_amt)) / 10 ** 9; fill_amt = add(fill_amt, baux); //Add amount bought to acumulator take(bytes32(offerId), uint128(baux)); //We take the portion of the offer that we need pay_amt = 0; //All amount is sold } } require(fill_amt >= min_fill_amount); } function buyAllAmount(ERC20 buy_gem, uint buy_amt, ERC20 pay_gem, uint max_fill_amount) public returns (uint fill_amt) { require(!locked, "Reentrancy attempt"); uint offerId; while (buy_amt > 0) { //Meanwhile there is amount to buy offerId = getBestOffer(buy_gem, pay_gem); //Get the best offer for the token pair require(offerId != 0); // There is a chance that buy_amt is smaller than 1 wei of the other token if (buy_amt * 1 ether < wdiv(offers[offerId].pay_amt, offers[offerId].buy_amt)) { break; //We consider that all amount is sold } if (buy_amt >= offers[offerId].pay_amt) { //If amount to buy is higher or equal than current offer amount to sell fill_amt = add(fill_amt, offers[offerId].buy_amt); //Add amount sold to acumulator buy_amt = sub(buy_amt, offers[offerId].pay_amt); //Decrease amount to buy take(bytes32(offerId), uint128(offers[offerId].pay_amt)); //We take the whole offer } else { //if lower fill_amt = add(fill_amt, rmul(buy_amt * 10 ** 9, rdiv(offers[offerId].buy_amt, offers[offerId].pay_amt)) / 10 ** 9); //Add amount sold to acumulator take(bytes32(offerId), uint128(buy_amt)); //We take the portion of the offer that we need buy_amt = 0; //All amount is bought } } require(fill_amt <= max_fill_amount); } function getBuyAmount(ERC20 buy_gem, ERC20 pay_gem, uint pay_amt) public view returns (uint fill_amt) { uint256 offerId = getBestOffer(buy_gem, pay_gem); //Get best offer for the token pair while (pay_amt > offers[offerId].buy_amt) { fill_amt = add(fill_amt, offers[offerId].pay_amt); //Add amount to buy accumulator pay_amt = sub(pay_amt, offers[offerId].buy_amt); //Decrease amount to pay if (pay_amt > 0) { //If we still need more offers offerId = getWorseOffer(offerId); //We look for the next best offer require(offerId != 0); //Fails if there are not enough offers to complete } } fill_amt = add(fill_amt, rmul(pay_amt * 10 ** 9, rdiv(offers[offerId].pay_amt, offers[offerId].buy_amt)) / 10 ** 9); //Add proportional amount of last offer to buy accumulator } function getPayAmount(ERC20 pay_gem, ERC20 buy_gem, uint buy_amt) public view returns (uint fill_amt) { uint256 offerId = getBestOffer(buy_gem, pay_gem); //Get best offer for the token pair while (buy_amt > offers[offerId].pay_amt) { fill_amt = add(fill_amt, offers[offerId].buy_amt); //Add amount to pay accumulator buy_amt = sub(buy_amt, offers[offerId].pay_amt); //Decrease amount to buy if (buy_amt > 0) { //If we still need more offers offerId = getWorseOffer(offerId); //We look for the next best offer require(offerId != 0); //Fails if there are not enough offers to complete } } fill_amt = add(fill_amt, rmul(buy_amt * 10 ** 9, rdiv(offers[offerId].buy_amt, offers[offerId].pay_amt)) / 10 ** 9); //Add proportional amount of last offer to pay accumulator } // ---- Internal Functions ---- // function _setMinSell( ERC20 pay_gem, //token to assign minimum sell amount to uint256 dust ) internal { _dust[address(pay_gem)] = dust; emit LogMinSell(address(pay_gem), dust); } function _buys(uint id, uint amount) internal returns (bool) { if (amount == offers[id].pay_amt) { if (isOfferSorted(id)) { //offers[id] must be removed from sorted list because all of it is bought _unsort(id); }else{ _hide(id); } } require(super.buy(id, amount)); // If offer has become dust during buy, we cancel it if (isActive(id) && offers[id].pay_amt < _dust[address(offers[id].pay_gem)]) { cancel(id); } return true; } //find the id of the next higher offer after offers[id] function _find(uint id) internal view returns (uint) { require( id > 0 ); address buy_gem = address(offers[id].buy_gem); address pay_gem = address(offers[id].pay_gem); uint top = _best[pay_gem][buy_gem]; uint old_top = 0; // Find the larger-than-id order whose successor is less-than-id. while (top != 0 && _isPricedLtOrEq(id, top)) { old_top = top; top = _rank[top].prev; } return old_top; } //find the id of the next higher offer after offers[id] function _findpos(uint id, uint pos) internal view returns (uint) { require(id > 0); // Look for an active order. while (pos != 0 && !isActive(pos)) { pos = _rank[pos].prev; } if (pos == 0) { //if we got to the end of list without a single active offer return _find(id); } else { // if we did find a nearby active offer // Walk the order book down from there... if(_isPricedLtOrEq(id, pos)) { uint old_pos; // Guaranteed to run at least once because of // the prior if statements. while (pos != 0 && _isPricedLtOrEq(id, pos)) { old_pos = pos; pos = _rank[pos].prev; } return old_pos; // ...or walk it up. } else { while (pos != 0 && !_isPricedLtOrEq(id, pos)) { pos = _rank[pos].next; } return pos; } } } //return true if offers[low] priced less than or equal to offers[high] function _isPricedLtOrEq( uint low, //lower priced offer's id uint high //higher priced offer's id ) internal view returns (bool) { return mul(offers[low].buy_amt, offers[high].pay_amt) >= mul(offers[high].buy_amt, offers[low].pay_amt); } //these variables are global only because of solidity local variable limit //match offers with taker offer, and execute token transactions function _matcho( uint t_pay_amt, //taker sell how much ERC20 t_pay_gem, //taker sell which token uint t_buy_amt, //taker buy how much ERC20 t_buy_gem, //taker buy which token uint pos, //position id bool rounding //match "close enough" orders? ) internal returns (uint id) { uint best_maker_id; //highest maker id uint t_buy_amt_old; //taker buy how much saved uint m_buy_amt; //maker offer wants to buy this much token uint m_pay_amt; //maker offer wants to sell this much token // there is at least one offer stored for token pair while (_best[address(t_buy_gem)][address(t_pay_gem)] > 0) { best_maker_id = _best[address(t_buy_gem)][address(t_pay_gem)]; m_buy_amt = offers[best_maker_id].buy_amt; m_pay_amt = offers[best_maker_id].pay_amt; // Ugly hack to work around rounding errors. Based on the idea that // the furthest the amounts can stray from their "true" values is 1. // Ergo the worst case has t_pay_amt and m_pay_amt at +1 away from // their "correct" values and m_buy_amt and t_buy_amt at -1. // Since (c - 1) * (d - 1) > (a + 1) * (b + 1) is equivalent to // c * d > a * b + a + b + c + d, we write... if (mul(m_buy_amt, t_buy_amt) > mul(t_pay_amt, m_pay_amt) + (rounding ? m_buy_amt + t_buy_amt + t_pay_amt + m_pay_amt : 0)) { break; } // ^ The `rounding` parameter is a compromise borne of a couple days // of discussion. buy(best_maker_id, min(m_pay_amt, t_buy_amt)); t_buy_amt_old = t_buy_amt; t_buy_amt = sub(t_buy_amt, min(m_pay_amt, t_buy_amt)); t_pay_amt = mul(t_buy_amt, t_pay_amt) / t_buy_amt_old; if (t_pay_amt == 0 || t_buy_amt == 0) { break; } } if (t_buy_amt > 0 && t_pay_amt > 0 && t_pay_amt >= _dust[address(t_pay_gem)]) { //new offer should be created id = super.offer(t_pay_amt, t_pay_gem, t_buy_amt, t_buy_gem); //insert offer into the sorted list _sort(id, pos); } } // Make a new offer without putting it in the sorted list. // Takes funds from the caller into market escrow. // ****Available to authorized contracts only!********** // Keepers should call insert(id,pos) to put offer in the sorted list. function _offeru( uint pay_amt, //maker (ask) sell how much ERC20 pay_gem, //maker (ask) sell which token uint buy_amt, //maker (ask) buy how much ERC20 buy_gem //maker (ask) buy which token ) internal returns (uint id) { require(_dust[address(pay_gem)] <= pay_amt); id = super.offer(pay_amt, pay_gem, buy_amt, buy_gem); _near[id] = _head; _head = id; emit LogUnsortedOffer(id); } //put offer into the sorted list function _sort( uint id, //maker (ask) id uint pos //position to insert into ) internal { require(isActive(id)); ERC20 buy_gem = offers[id].buy_gem; ERC20 pay_gem = offers[id].pay_gem; uint prev_id; //maker (ask) id pos = pos == 0 || offers[pos].pay_gem != pay_gem || offers[pos].buy_gem != buy_gem || !isOfferSorted(pos) ? _find(id) : _findpos(id, pos); if (pos != 0) { //offers[id] is not the highest offer //requirement below is satisfied by statements above //require(_isPricedLtOrEq(id, pos)); prev_id = _rank[pos].prev; _rank[pos].prev = id; _rank[id].next = pos; } else { //offers[id] is the highest offer prev_id = _best[address(pay_gem)][address(buy_gem)]; _best[address(pay_gem)][address(buy_gem)] = id; } if (prev_id != 0) { //if lower offer does exist //requirement below is satisfied by statements above //require(!_isPricedLtOrEq(id, prev_id)); _rank[prev_id].next = id; _rank[id].prev = prev_id; } _span[address(pay_gem)][address(buy_gem)]++; emit LogSortedOffer(id); } // Remove offer from the sorted list (does not cancel offer) function _unsort( uint id //id of maker (ask) offer to remove from sorted list ) internal returns (bool) { address buy_gem = address(offers[id].buy_gem); address pay_gem = address(offers[id].pay_gem); require(_span[pay_gem][buy_gem] > 0); require(_rank[id].delb == 0 && //assert id is in the sorted list isOfferSorted(id)); if (id != _best[pay_gem][buy_gem]) { // offers[id] is not the highest offer require(_rank[_rank[id].next].prev == id); _rank[_rank[id].next].prev = _rank[id].prev; } else { //offers[id] is the highest offer _best[pay_gem][buy_gem] = _rank[id].prev; } if (_rank[id].prev != 0) { //offers[id] is not the lowest offer require(_rank[_rank[id].prev].next == id); _rank[_rank[id].prev].next = _rank[id].next; } _span[pay_gem][buy_gem]--; _rank[id].delb = block.number; //mark _rank[id] for deletion return true; } //Hide offer from the unsorted order book (does not cancel offer) function _hide( uint id //id of maker offer to remove from unsorted list ) internal returns (bool) { uint uid = _head; //id of an offer in unsorted offers list uint pre = uid; //id of previous offer in unsorted offers list require(!isOfferSorted(id)); //make sure offer id is not in sorted offers list if (_head == id) { //check if offer is first offer in unsorted offers list _head = _near[id]; //set head to new first unsorted offer _near[id] = 0; //delete order from unsorted order list return true; } while (uid > 0 && uid != id) { //find offer in unsorted order list pre = uid; uid = _near[uid]; } if (uid != id) { //did not find offer id in unsorted offers list return false; } _near[pre] = _near[id]; //set previous unsorted offer to point to offer after offer id _near[id] = 0; //delete order from unsorted order list return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_dustToken","type":"address"},{"internalType":"uint256","name":"_dustLimit","type":"uint256"},{"internalType":"address","name":"_priceOracle","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"pair","type":"bytes32"},{"indexed":true,"internalType":"address","name":"maker","type":"address"},{"indexed":false,"internalType":"contract ERC20","name":"pay_gem","type":"address"},{"indexed":false,"internalType":"contract ERC20","name":"buy_gem","type":"address"},{"indexed":false,"internalType":"uint128","name":"pay_amt","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"buy_amt","type":"uint128"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"LogBump","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"keeper","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"LogDelete","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"keeper","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"LogInsert","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"LogItemUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"pair","type":"bytes32"},{"indexed":true,"internalType":"address","name":"maker","type":"address"},{"indexed":false,"internalType":"contract ERC20","name":"pay_gem","type":"address"},{"indexed":false,"internalType":"contract ERC20","name":"buy_gem","type":"address"},{"indexed":false,"internalType":"uint128","name":"pay_amt","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"buy_amt","type":"uint128"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"LogKill","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"pair","type":"bytes32"},{"indexed":true,"internalType":"address","name":"maker","type":"address"},{"indexed":false,"internalType":"contract ERC20","name":"pay_gem","type":"address"},{"indexed":false,"internalType":"contract ERC20","name":"buy_gem","type":"address"},{"indexed":false,"internalType":"uint128","name":"pay_amt","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"buy_amt","type":"uint128"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"LogMake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pay_gem","type":"address"},{"indexed":false,"internalType":"uint256","name":"min_amount","type":"uint256"}],"name":"LogMinSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"LogSortedOffer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"pair","type":"bytes32"},{"indexed":true,"internalType":"address","name":"maker","type":"address"},{"indexed":false,"internalType":"contract ERC20","name":"pay_gem","type":"address"},{"indexed":false,"internalType":"contract ERC20","name":"buy_gem","type":"address"},{"indexed":true,"internalType":"address","name":"taker","type":"address"},{"indexed":false,"internalType":"uint128","name":"take_amt","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"give_amt","type":"uint128"},{"indexed":false,"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"LogTake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pay_amt","type":"uint256"},{"indexed":true,"internalType":"address","name":"pay_gem","type":"address"},{"indexed":false,"internalType":"uint256","name":"buy_amt","type":"uint256"},{"indexed":true,"internalType":"address","name":"buy_gem","type":"address"}],"name":"LogTrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"LogUnsortedOffer","type":"event"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"_best","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_dust","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_near","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_rank","outputs":[{"internalType":"uint256","name":"next","type":"uint256"},{"internalType":"uint256","name":"prev","type":"uint256"},{"internalType":"uint256","name":"delb","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"_span","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"id_","type":"bytes32"}],"name":"bump","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ERC20","name":"buy_gem","type":"address"},{"internalType":"uint256","name":"buy_amt","type":"uint256"},{"internalType":"contract ERC20","name":"pay_gem","type":"address"},{"internalType":"uint256","name":"max_fill_amount","type":"uint256"}],"name":"buyAllAmount","outputs":[{"internalType":"uint256","name":"fill_amt","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"cancel","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"del_rank","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"dustLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dustToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract ERC20","name":"sell_gem","type":"address"},{"internalType":"contract ERC20","name":"buy_gem","type":"address"}],"name":"getBestOffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getBetterOffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract ERC20","name":"buy_gem","type":"address"},{"internalType":"contract ERC20","name":"pay_gem","type":"address"},{"internalType":"uint256","name":"pay_amt","type":"uint256"}],"name":"getBuyAmount","outputs":[{"internalType":"uint256","name":"fill_amt","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFirstUnsortedOffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract ERC20","name":"pay_gem","type":"address"}],"name":"getMinSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getNextUnsortedOffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getOffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"contract ERC20","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"contract ERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract ERC20","name":"sell_gem","type":"address"},{"internalType":"contract ERC20","name":"buy_gem","type":"address"}],"name":"getOfferCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getOwner","outputs":[{"internalType":"address","name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"contract ERC20","name":"pay_gem","type":"address"},{"internalType":"contract ERC20","name":"buy_gem","type":"address"},{"internalType":"uint256","name":"buy_amt","type":"uint256"}],"name":"getPayAmount","outputs":[{"internalType":"uint256","name":"fill_amt","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getWorseOffer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"pos","type":"uint256"}],"name":"insert","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"isActive","outputs":[{"internalType":"bool","name":"active","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"isOfferSorted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"kill","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"last_offer_id","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ERC20","name":"pay_gem","type":"address"},{"internalType":"contract ERC20","name":"buy_gem","type":"address"},{"internalType":"uint128","name":"pay_amt","type":"uint128"},{"internalType":"uint128","name":"buy_amt","type":"uint128"}],"name":"make","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"pay_amt","type":"uint256"},{"internalType":"contract ERC20","name":"pay_gem","type":"address"},{"internalType":"uint256","name":"buy_amt","type":"uint256"},{"internalType":"contract ERC20","name":"buy_gem","type":"address"},{"internalType":"uint256","name":"pos","type":"uint256"}],"name":"offer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"pay_amt","type":"uint256"},{"internalType":"contract ERC20","name":"pay_gem","type":"address"},{"internalType":"uint256","name":"buy_amt","type":"uint256"},{"internalType":"contract ERC20","name":"buy_gem","type":"address"},{"internalType":"uint256","name":"pos","type":"uint256"},{"internalType":"bool","name":"rounding","type":"bool"}],"name":"offer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"pay_amt","type":"uint256"},{"internalType":"contract ERC20","name":"pay_gem","type":"address"},{"internalType":"uint256","name":"buy_amt","type":"uint256"},{"internalType":"contract ERC20","name":"buy_gem","type":"address"}],"name":"offer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"offers","outputs":[{"internalType":"uint256","name":"pay_amt","type":"uint256"},{"internalType":"contract ERC20","name":"pay_gem","type":"address"},{"internalType":"uint256","name":"buy_amt","type":"uint256"},{"internalType":"contract ERC20","name":"buy_gem","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint64","name":"timestamp","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"priceOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ERC20","name":"pay_gem","type":"address"},{"internalType":"uint256","name":"pay_amt","type":"uint256"},{"internalType":"contract ERC20","name":"buy_gem","type":"address"},{"internalType":"uint256","name":"min_fill_amount","type":"uint256"}],"name":"sellAllAmount","outputs":[{"internalType":"uint256","name":"fill_amt","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ERC20","name":"pay_gem","type":"address"}],"name":"setMinSell","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint128","name":"maxTakeAmount","type":"uint128"}],"name":"take","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162002f0938038062002f09833981810160405260608110156200003757600080fd5b5080516020820151604090920151600980546001600160a01b038085166001600160a01b03199283161792839055600a869055600b8054828616931692909217909155929392620000939116836001600160e01b036200009c16565b505050620000f5565b6001600160a01b0382166000818152600660209081526040918290208490558151928352820183905280517fc28d56449b0bb31e64ee7487e061f57a2e72aea8019d810832f26dda099823d09281900390910190a15050565b612e0480620001056000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c80637ca9429a11610130578063a78d4316116100b8578063d2b420ce1161007c578063d2b420ce14610753578063d6febde814610770578063e1a6f01414610793578063f09ea2a6146107db578063ff1fd9741461081757610227565b8063a78d4316146106b9578063b4f9b6c8146106d6578063c2d526aa146106f3578063c41a360a1461072e578063cf71efa91461074b57610227565b80638af82a2e116100ff5780638af82a2e1461062b578063911550f41461063357806391be90c814610650578063943911bc146106765780639ca376321461069357610227565b80637ca9429a146105405780638185402b1461056e57806382afd23b146105a85780638a72ea6a146105c557610227565b80634579268a116101b357806361f54a791161018257806361f54a79146104a2578063677170e1146104bf5780637238c915146104ed57806374c1d7d3146104f5578063779997c31461052357610227565b80634579268a146103e3578063467f0b7b14610431578063496064551461044e578063511fa4871461047c57610227565b80631b33d412116101fa5780631b33d412146103235780631d834a1b14610363578063232cae0b1461039a5780632630c12f146103a257806340e58ee5146103c657610227565b80630374fc6f1461022c5780630621b4f61461026c578063093f5198146102a6578063144a2752146102ed575b600080fd5b61025a6004803603604081101561024257600080fd5b506001600160a01b038135811691602001351661084d565b60408051918252519081900360200190f35b61025a6004803603608081101561028257600080fd5b506001600160a01b038135811691602081013591604082013516906060013561087a565b61025a600480360360808110156102bc57600080fd5b506001600160a01b0381358116916020810135909116906001600160801b0360408201358116916060013516610a05565b61025a6004803603606081101561030357600080fd5b506001600160a01b03813581169160208101359091169060400135610a2e565b61025a600480360360a081101561033957600080fd5b508035906001600160a01b0360208201358116916040810135916060820135169060800135610af3565b6103866004803603604081101561037957600080fd5b5080359060200135610b0e565b604080519115158252519081900360200190f35b61025a610bdb565b6103aa610be1565b604080516001600160a01b039092168252519081900360200190f35b610386600480360360208110156103dc57600080fd5b5035610bf0565b610400600480360360208110156103f957600080fd5b5035610d5b565b604080519485526001600160a01b039384166020860152848101929092529091166060830152519081900360800190f35b6103866004803603602081101561044757600080fd5b5035610de7565b61047a6004803603604081101561046457600080fd5b50803590602001356001600160801b0316610ee9565b005b61025a6004803603602081101561049257600080fd5b50356001600160a01b0316610f09565b61025a600480360360208110156104b857600080fd5b5035610f24565b61025a600480360360408110156104d557600080fd5b506001600160a01b0381358116916020013516610f36565b6103aa610f53565b61025a6004803603604081101561050b57600080fd5b506001600160a01b0381358116916020013516610f62565b61047a6004803603602081101561053957600080fd5b5035610f7f565b61025a6004803603604081101561055657600080fd5b506001600160a01b0381358116916020013516611079565b61025a6004803603608081101561058457600080fd5b506001600160a01b03813581169160208101359160408201351690606001356110a4565b610386600480360360208110156105be57600080fd5b503561120f565b6105e2600480360360208110156105db57600080fd5b5035611236565b604080519687526001600160a01b03958616602088015286810194909452918416606086015290921660808401526001600160401b0390911660a0830152519081900360c00190f35b61025a611285565b61025a6004803603602081101561064957600080fd5b503561128b565b61025a6004803603602081101561066657600080fd5b50356001600160a01b031661129d565b61025a6004803603602081101561068c57600080fd5b50356112af565b61047a600480360360208110156106a957600080fd5b50356001600160a01b03166112c4565b61025a600480360360208110156106cf57600080fd5b5035611419565b61047a600480360360208110156106ec57600080fd5b503561142b565b6107106004803603602081101561070957600080fd5b5035611440565b60408051938452602084019290925282820152519081900360600190f35b6103aa6004803603602081101561074457600080fd5b5035611461565b61025a61147f565b6103866004803603602081101561076957600080fd5b5035611485565b6103866004803603604081101561078657600080fd5b50803590602001356114f4565b61025a600480360360c08110156107a957600080fd5b508035906001600160a01b0360208201358116916040810135916060820135169060808101359060a001351515611568565b61025a600480360360808110156107f157600080fd5b508035906001600160a01b036020820135811691604081013591606090910135166115f6565b61025a6004803603606081101561082d57600080fd5b506001600160a01b03813581169160208101359091169060400135611652565b6001600160a01b038083166000908152600460209081526040808320938516835292905220545b92915050565b60025460009060ff16156108ca576040805162461bcd60e51b81526020600482015260126024820152711499595b9d1c985b98de48185d1d195b5c1d60721b604482015290519081900360640190fd5b60005b84156109ef576108dd848761084d565b9050806108e957600080fd5b6000818152600160205260409020600281015490546109089190611706565b85670de0b6b3a764000002101561091e576109ef565b600081815260016020526040902060020154851061099257600081815260016020526040902054610950908390611735565b600082815260016020526040902060020154909250610970908690611784565b60008281526001602052604090205490955061098d908290610ee9565b6109ea565b60008181526001602052604081208054600290910154633b9aca00916109c491898402916109bf916117d4565b6117f0565b816109cb57fe5b0490506109d88382611735565b92506109e48282610ee9565b60009550505b6108cd565b828210156109fc57600080fd5b50949350505050565b6000610a25836001600160801b031686846001600160801b0316876115f6565b95945050505050565b600080610a3b858561084d565b90505b600081815260016020526040902060020154831115610ab357600081815260016020526040902054610a71908390611735565b600082815260016020526040902060020154909250610a91908490611784565b92508215610aae57610aa2816112af565b905080610aae57600080fd5b610a3e565b60008181526001602052604090208054600290910154610a25918491633b9aca0091610ae691888402916109bf916117d4565b81610aed57fe5b04611735565b6000610b0486868686866001611568565b9695505050505050565b60025460009060ff1615610b5e576040805162461bcd60e51b81526020600482015260126024820152711499595b9d1c985b98de48185d1d195b5c1d60721b604482015290519081900360640190fd5b610b6783611485565b15610b7157600080fd5b610b7a8361120f565b610b8357600080fd5b610b8c83611820565b50610b9783836118ca565b604080513381526020810185905281517f6d5c16212bdea16850dce4d9fa2314c446bd30ce84700d9c36c7677c6d283940929181900390910190a150600192915050565b60005481565b600b546001600160a01b031681565b600081610bfc8161120f565b610c375760405162461bcd60e51b815260040180806020018281038252602d815260200180612d79602d913960400191505060405180910390fd5b610c4081611461565b6001600160a01b0316336001600160a01b03161480610c8c57506000818152600160208181526040808420808401546001600160a01b0316855260068352908420549385905291905254105b610cc75760405162461bcd60e51b8152600401808060200182810382526044815260200180612d356044913960600191505060405180910390fd5b60025460ff1615610d14576040805162461bcd60e51b81526020600482015260126024820152711499595b9d1c985b98de48185d1d195b5c1d60721b604482015290519081900360640190fd5b610d1d83611485565b15610d3957610d2b83611a69565b610d3457600080fd5b610d4b565b610d4283611820565b610d4b57600080fd5b610d5483611c23565b9392505050565b600080600080610d69612cff565b5050506000928352505060016020818152604092839020835160c0810185528154808252938201546001600160a01b03908116938201849052600283015495820186905260038301548116606083018190526004909301549081166080830152600160a01b90046001600160401b031660a090910152919390929190565b60025460009060ff1615610e37576040805162461bcd60e51b81526020600482015260126024820152711499595b9d1c985b98de48185d1d195b5c1d60721b604482015290519081900360640190fd5b610e408261120f565b158015610e5d575060008281526003602052604090206002015415155b8015610e7d57506000828152600360205260409020600201546009194301115b610e8657600080fd5b60008281526003602090815260408083208381556001810184905560020192909255815133815290810184905281517fcb9d6176c6aac6478ebb9a2754cdce22a944de29ed1f2642f8613884eba4b40c929181900390910190a15060015b919050565b610efc826001600160801b0383166114f4565b610f0557600080fd5b5050565b6001600160a01b031660009081526006602052604090205490565b60009081526007602052604090205490565b600560209081526000928352604080842090915290825290205481565b6009546001600160a01b031681565b600460209081526000928352604080842090915290825290205481565b80610f898161120f565b610f9257600080fd5b6000828152600160208181526040808420600481015481850154600383015484516001600160601b0319606084811b8216838a015283901b1660348201528551602881830301815260488201808852815191890191909120998c90529790965283546002909401546001600160a01b03928316909752811660688601526001600160801b0392831660888601529190941660a88401526001600160401b03600160a01b85041660c8840152905186949190931692909184917f70a14c213064359ede031fd2a1645a11ce2ec825ffe6ab5cfb5b160c3ef4d0a29181900360e80190a4505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b60025460009060ff16156110f4576040805162461bcd60e51b81526020600482015260126024820152711499595b9d1c985b98de48185d1d195b5c1d60721b604482015290519081900360640190fd5b60005b841561120257611107868561084d565b90508061111357600080fd5b600081815260016020526040902080546002909101546111339190611706565b85670de0b6b3a764000002101561114957611202565b60008181526001602052604090205485106111ba5760008181526001602052604090206002015461117b908390611735565b600082815260016020526040902054909250611198908690611784565b6000828152600160205260409020549095506111b5908290610ee9565b6111fd565b6000818152600160205260409020600281015490546111ec918491633b9aca0091610ae6918a8402916109bf916117d4565b91506111f88186610ee9565b600094505b6110f7565b828211156109fc57600080fd5b600090815260016020526040902060040154600160a01b90046001600160401b0316151590565b6001602081905260009182526040909120805491810154600282015460038301546004909301546001600160a01b0392831693919291821691811690600160a01b90046001600160401b031686565b60085490565b60009081526003602052604090205490565b60066020526000908152604090205481565b60009081526003602052604090206001015490565b333214611318576040805162461bcd60e51b815260206004820152601860248201527f4e6f20696e6469726563742063616c6c7320706c656173650000000000000000604482015290519081900360640190fd5b6009546001600160a01b038281169116141561137b576040805162461bcd60e51b815260206004820181905260248201527f43616e277420736574206475737420666f72207468652064757374546f6b656e604482015290519081900360640190fd5b600b54600954600a546040805163413713c160e01b81526001600160a01b0393841660048201528584166024820152604481019290925251600093929092169163413713c191606480820192602092909190829003018186803b1580156113e157600080fd5b505afa1580156113f5573d6000803e3d6000fd5b505050506040513d602081101561140b57600080fd5b50519050610f058282611fc4565b60076020526000908152604090205481565b61143481610bf0565b61143d57600080fd5b50565b60036020526000908152604090208054600182015460029092015490919083565b6000908152600160205260409020600401546001600160a01b031690565b600a5481565b6000818152600360205260408120541515806114b1575060008281526003602052604090206001015415155b806108745750506000818152600160208181526040808420928301546001600160a01b039081168552600483528185206003909401541684529190529020541490565b6000826115008161120f565b61150957600080fd5b60025460ff1615611556576040805162461bcd60e51b81526020600482015260126024820152711499595b9d1c985b98de48185d1d195b5c1d60721b604482015290519081900360640190fd5b611560848461201d565b949350505050565b60025460009060ff16156115b8576040805162461bcd60e51b81526020600482015260126024820152711499595b9d1c985b98de48185d1d195b5c1d60721b604482015290519081900360640190fd5b6001600160a01b0386166000908152600660205260409020548710156115dd57600080fd5b6115eb8787878787876120c9565b979650505050505050565b60025460009060ff1615611646576040805162461bcd60e51b81526020600482015260126024820152711499595b9d1c985b98de48185d1d195b5c1d60721b604482015290519081900360640190fd5b610a258585858561222b565b60008061165f848661084d565b90505b6000818152600160205260409020548311156116d457600081815260016020526040902060020154611695908390611735565b6000828152600160205260409020549092506116b2908490611784565b925082156116cf576116c3816112af565b9050806116cf57600080fd5b611662565b600081815260016020526040902060028101549054610a25918491633b9aca0091610ae691888402916109bf916117d4565b60008161172661171e85670de0b6b3a76400006122b5565b600285610aed565b8161172d57fe5b049392505050565b80820182811015610874576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b80820382811115610874576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b60008161172661171e856b033b2e3c9fd0803ce80000006122b5565b60006b033b2e3c9fd0803ce800000061172661180c85856122b5565b60026b033b2e3c9fd0803ce8000000610aed565b6008546000908061183084611485565b1561183a57600080fd5b8360085414156118625750505060008181526007602052604081208054600855556001610ee4565b5b6000821180156118735750838214155b1561188e575060008181526007602052604090205490611863565b8382146118a057600092505050610ee4565b60008481526007602052604080822080549383529082209290925584815290555060019050919050565b6118d38261120f565b6118dc57600080fd5b6000828152600160208190526040822060038101549101546001600160a01b039182169291169083158061192e5750600084815260016020819052604090912001546001600160a01b03838116911614155b8061195657506000848152600160205260409020600301546001600160a01b03848116911614155b80611967575061196584611485565b155b61197a576119758585612318565b611983565b611983856123ea565b935083156119b1575060008381526003602052604080822060010180549087905586835291208490556119de565b506001600160a01b0381811660009081526004602090815260408083209386168352929052208054908590555b8015611a025760008181526003602052604080822087905586825290206001018190555b6001600160a01b03808316600090815260056020908152604080832093871683529281529082902080546001019055815187815291517f20fb9bad86c18f7e22e8065258790d9416a7d2df8ff05f80f82c46d38b925acd9281900390910190a15050505050565b600081815260016020818152604080842060038101549301546001600160a01b0390811680865260058452828620919094168086529252832054909190611aaf57600080fd5b600084815260036020526040902060020154158015611ad25750611ad284611485565b611adb57600080fd5b6001600160a01b038082166000908152600460209081526040808320938616835292905220548414611b4e576000848152600360205260408082205482529020600101548414611b2a57600080fd5b60008481526003602052604080822060018082015491548452919092200155611b84565b6000848152600360209081526040808320600101546001600160a01b038086168552600484528285209087168552909252909120555b60008481526003602052604090206001015415611bdb576000848152600360205260408082206001015482529020548414611bbe57600080fd5b600084815260036020526040808220805460019091015483529120555b6001600160a01b039081166000908152600560209081526040808320949093168252928352818120805460001901905593845260039091529091204360029091015550600190565b600081611c2f8161120f565b611c6a5760405162461bcd60e51b815260040180806020018281038252602d815260200180612d79602d913960400191505060405180910390fd5b611c7381611461565b6001600160a01b0316336001600160a01b03161480611cbf57506000818152600160208181526040808420808401546001600160a01b0316855260068352908420549385905291905254105b611cfa5760405162461bcd60e51b8152600401808060200182810382526044815260200180612d356044913960600191505060405180910390fd5b60025460ff1615611d0a57600080fd5b6002805460ff19166001179055611d1f612cff565b600160008581526020019081526020016000206040518060c0016040529081600082015481526020016001820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600282015481526020016003820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016004820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016004820160149054906101000a90046001600160401b03166001600160401b03166001600160401b0316815250509050600160008581526020019081526020016000206000808201600090556001820160006101000a8154906001600160a01b03021916905560028201600090556003820160006101000a8154906001600160a01b0302191690556004820160006101000a8154906001600160a01b0302191690556004820160146101000a8154906001600160401b0302191690555050611eb4816020015182608001518360000151612467565b6040805185815290517fa2c251311b1a7a475913900a2a73dc9789a21b04bc737e050bbc506dd4eb34889181900360200190a160808101516020808301805160608086018051604080516001600160601b031995851b8616818901529190931b9093166034840152815160288185030181526048840180845281519190960120935190518751838901516001600160a01b0393841690975290821660688501526001600160801b03908116608885015290941660a88301526001600160401b03421660c8830152519290931692909187917f9577941d28fff863bfbee4694a6a4a56fb09e169619189d2eaa750b5b4819995919081900360e80190a450506002805460ff19169055506001919050565b6001600160a01b0382166000818152600660209081526040918290208490558151928352820183905280517fc28d56449b0bb31e64ee7487e061f57a2e72aea8019d810832f26dda099823d09281900390910190a15050565b60008281526001602052604081205482141561205b5761203c83611485565b156120505761204a83611a69565b5061205b565b61205983611820565b505b61206583836124be565b61206e57600080fd5b6120778361120f565b80156120b057506000838152600160208181526040808420808401546001600160a01b0316855260068352908420549387905291905254105b156120c0576120be83610bf0565b505b50600192915050565b60008060008060005b6001600160a01b038089166000908152600460209081526040808320938e1683529290522054156121cc5750506001600160a01b038087166000908152600460209081526040808320938c168352928152828220548083526001909152919020600281015490549193509085612149576000612151565b808b8a840101015b61215b8c836122b5565b01612166838b6122b5565b1115612171576121cc565b6121848461217f838c61280f565b6114f4565b5088925061219b89612196838c61280f565b611784565b9850826121a88a8d6122b5565b816121af57fe5b049a508a15806121bd575088155b156121c7576121cc565b6120d2565b6000891180156121dc575060008b115b801561220057506001600160a01b038a166000908152600660205260409020548b10155b1561221d576122118b8b8b8b612826565b945061221d85886118ca565b505050509695505050505050565b6001600160a01b03831660009081526006602052604081205485101561225057600080fd5b61225c85858585612826565b600880546000838152600760209081526040918290209290925591839055815183815291519293507f8173832a493e0a3989e521458e55bfe9feac9f9b675a94e100b9d5a85f81486292918290030190a1949350505050565b60008115806122d0575050808202828282816122cd57fe5b04145b610874576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b600080831161232657600080fd5b811580159061233b57506123398261120f565b155b15612359576000918252600360205260409091206001015490612326565b8161236e57612367836123ea565b9050610874565b6123788383612aac565b156123b25760005b821580159061239457506123948484612aac565b15612367575060008281526003602052604090206001015491612380565b81158015906123c857506123c68383612aac565b155b156123e35760009182526003602052604090912054906123b2565b5080610874565b60008082116123f857600080fd5b600082815260016020818152604080842060038101549301546001600160a01b039081168086526004845282862091909416808652925283205490925b811580159061244957506124498683612aac565b15610a25575060008181526003602052604090206001015490612435565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526124b9908490612afc565b505050565b6000826124ca8161120f565b6124d357600080fd5b60025460ff16156124e357600080fd5b6002805460ff191660011790556124f8612cff565b506000848152600160208181526040808420815160c0810183528154808252948201546001600160a01b039081169482019490945260028201549281018390526003820154841660608201526004909101549283166080820152600160a01b9092046001600160401b031660a0830152909291906125779087906122b5565b8161257e57fe5b04905080816001600160801b03161461259657600080fd5b84856001600160801b0316146125ab57600080fd5b8415806125b6575080155b806125c15750815185115b806125cf5750816040015181115b156125df576000935050506127fe565b81516125eb9086611784565b600087815260016020526040908190209190915582015161260c9082611784565b600087815260016020526040902060020155606082015160808301516126359190339084612c91565b61264482602001513387612467565b6040805187815290517fa2c251311b1a7a475913900a2a73dc9789a21b04bc737e050bbc506dd4eb34889181900360200190a160808201516020808401805160608087018051604080516001600160601b031995851b8616818901529190931b909316603484015281516028818503018152604884018084528151919096012093519051948c90526001600160a01b03908116606884015293841660888301526001600160801b03808b1660a8840152861660c88301526001600160401b03421660e8830152513394909316927f3383e3357c77fd2e3a4b30deea81179bc70a795d053d14d5b7f2f01d0fd4596f918190036101080190a481606001516001600160a01b031682602001516001600160a01b03167f819e390338feffe95e2de57172d6faf337853dfd15c7a09a32d76f7fd24438758784604051808381526020018281526020019250505060405180910390a36000868152600160205260409020546127f7576000868152600160208190526040822082815590810180546001600160a01b0319908116909155600282019290925560038101805490921690915560040180546001600160e01b03191690555b6001935050505b506002805460ff1916905592915050565b60008183111561281f5781610d54565b5090919050565b60025460009060ff161561283957600080fd5b6002805460ff191660011790556001600160801b038516851461285b57600080fd5b82836001600160801b03161461287057600080fd5b6000851161287d57600080fd5b6001600160a01b03841661289057600080fd5b6000831161289d57600080fd5b6001600160a01b0382166128b057600080fd5b816001600160a01b0316846001600160a01b031614156128cf57600080fd5b6128d7612cff565b8581526001600160a01b03808616602083015260408201859052831660608201523360808201526001600160401b03421660a0820152612915612cf1565b600081815260016020818152604092839020855181559085015191810180546001600160a01b039384166001600160a01b031991821617909155928501516002820155606085015160038201805491841691851691909117905560808501516004909101805460a08701516001600160401b0316600160a01b0267ffffffffffffffff60a01b19939094169416939093171617905591506129b885333089612c91565b6040805183815290517fa2c251311b1a7a475913900a2a73dc9789a21b04bc737e050bbc506dd4eb34889181900360200190a1604080516001600160601b0319606088811b82166020808501919091529087901b90911660348301528251602881840301815260488301808552815191909201206001600160a01b0389811690925290861660688301526001600160801b03808a166088840152871660a88301526001600160401b03421660c8830152915133929185917f773ff502687307abfa024ac9f62f9752a0d210dac2ffd9a29e38e12e2ea82c829181900360e80190a4506002805460ff19169055949350505050565b6000818152600160205260408082206002015484835290822054612ad091906122b5565b60008481526001602052604080822060020154858352912054612af391906122b5565b10159392505050565b813b80612b41576040805162461bcd60e51b815260206004820152600e60248201526d139bdd08184818dbdb9d1c9858dd60921b604482015290519081900360640190fd5b60006060846001600160a01b0316846040518082805190602001908083835b60208310612b7f5780518252601f199092019160209182019101612b60565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612be1576040519150601f19603f3d011682016040523d82523d6000602084013e612be6565b606091505b509150915081612c31576040805162461bcd60e51b8152602060048201526011602482015270151bdad95b8818d85b1b0819985a5b1959607a1b604482015290519081900360640190fd5b805115612c8a57808060200190516020811015612c4d57600080fd5b5051612c8a5760405162461bcd60e51b815260040180806020018281038252602a815260200180612da6602a913960400191505060405180910390fd5b5050505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612ceb908590612afc565b50505050565b600080546001019081905590565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091529056fe4f666665722063616e206e6f742062652063616e63656c6c656420626563617573652075736572206973206e6f74206f776e6572206e6f7220612064757374206f6e652e4f66666572207761732064656c65746564206f722074616b656e2c206f72206e6576657220657869737465642e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a723158206f3a4b826a23cab71d5a8985898080c26f83c99d68739949347e6380227b5dda64736f6c634300050c00320000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000056bc75e2d63100000000000000000000000000000c498aef706cd0b5ed8a54b4ffa23df1187eb9fd9
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102275760003560e01c80637ca9429a11610130578063a78d4316116100b8578063d2b420ce1161007c578063d2b420ce14610753578063d6febde814610770578063e1a6f01414610793578063f09ea2a6146107db578063ff1fd9741461081757610227565b8063a78d4316146106b9578063b4f9b6c8146106d6578063c2d526aa146106f3578063c41a360a1461072e578063cf71efa91461074b57610227565b80638af82a2e116100ff5780638af82a2e1461062b578063911550f41461063357806391be90c814610650578063943911bc146106765780639ca376321461069357610227565b80637ca9429a146105405780638185402b1461056e57806382afd23b146105a85780638a72ea6a146105c557610227565b80634579268a116101b357806361f54a791161018257806361f54a79146104a2578063677170e1146104bf5780637238c915146104ed57806374c1d7d3146104f5578063779997c31461052357610227565b80634579268a146103e3578063467f0b7b14610431578063496064551461044e578063511fa4871461047c57610227565b80631b33d412116101fa5780631b33d412146103235780631d834a1b14610363578063232cae0b1461039a5780632630c12f146103a257806340e58ee5146103c657610227565b80630374fc6f1461022c5780630621b4f61461026c578063093f5198146102a6578063144a2752146102ed575b600080fd5b61025a6004803603604081101561024257600080fd5b506001600160a01b038135811691602001351661084d565b60408051918252519081900360200190f35b61025a6004803603608081101561028257600080fd5b506001600160a01b038135811691602081013591604082013516906060013561087a565b61025a600480360360808110156102bc57600080fd5b506001600160a01b0381358116916020810135909116906001600160801b0360408201358116916060013516610a05565b61025a6004803603606081101561030357600080fd5b506001600160a01b03813581169160208101359091169060400135610a2e565b61025a600480360360a081101561033957600080fd5b508035906001600160a01b0360208201358116916040810135916060820135169060800135610af3565b6103866004803603604081101561037957600080fd5b5080359060200135610b0e565b604080519115158252519081900360200190f35b61025a610bdb565b6103aa610be1565b604080516001600160a01b039092168252519081900360200190f35b610386600480360360208110156103dc57600080fd5b5035610bf0565b610400600480360360208110156103f957600080fd5b5035610d5b565b604080519485526001600160a01b039384166020860152848101929092529091166060830152519081900360800190f35b6103866004803603602081101561044757600080fd5b5035610de7565b61047a6004803603604081101561046457600080fd5b50803590602001356001600160801b0316610ee9565b005b61025a6004803603602081101561049257600080fd5b50356001600160a01b0316610f09565b61025a600480360360208110156104b857600080fd5b5035610f24565b61025a600480360360408110156104d557600080fd5b506001600160a01b0381358116916020013516610f36565b6103aa610f53565b61025a6004803603604081101561050b57600080fd5b506001600160a01b0381358116916020013516610f62565b61047a6004803603602081101561053957600080fd5b5035610f7f565b61025a6004803603604081101561055657600080fd5b506001600160a01b0381358116916020013516611079565b61025a6004803603608081101561058457600080fd5b506001600160a01b03813581169160208101359160408201351690606001356110a4565b610386600480360360208110156105be57600080fd5b503561120f565b6105e2600480360360208110156105db57600080fd5b5035611236565b604080519687526001600160a01b03958616602088015286810194909452918416606086015290921660808401526001600160401b0390911660a0830152519081900360c00190f35b61025a611285565b61025a6004803603602081101561064957600080fd5b503561128b565b61025a6004803603602081101561066657600080fd5b50356001600160a01b031661129d565b61025a6004803603602081101561068c57600080fd5b50356112af565b61047a600480360360208110156106a957600080fd5b50356001600160a01b03166112c4565b61025a600480360360208110156106cf57600080fd5b5035611419565b61047a600480360360208110156106ec57600080fd5b503561142b565b6107106004803603602081101561070957600080fd5b5035611440565b60408051938452602084019290925282820152519081900360600190f35b6103aa6004803603602081101561074457600080fd5b5035611461565b61025a61147f565b6103866004803603602081101561076957600080fd5b5035611485565b6103866004803603604081101561078657600080fd5b50803590602001356114f4565b61025a600480360360c08110156107a957600080fd5b508035906001600160a01b0360208201358116916040810135916060820135169060808101359060a001351515611568565b61025a600480360360808110156107f157600080fd5b508035906001600160a01b036020820135811691604081013591606090910135166115f6565b61025a6004803603606081101561082d57600080fd5b506001600160a01b03813581169160208101359091169060400135611652565b6001600160a01b038083166000908152600460209081526040808320938516835292905220545b92915050565b60025460009060ff16156108ca576040805162461bcd60e51b81526020600482015260126024820152711499595b9d1c985b98de48185d1d195b5c1d60721b604482015290519081900360640190fd5b60005b84156109ef576108dd848761084d565b9050806108e957600080fd5b6000818152600160205260409020600281015490546109089190611706565b85670de0b6b3a764000002101561091e576109ef565b600081815260016020526040902060020154851061099257600081815260016020526040902054610950908390611735565b600082815260016020526040902060020154909250610970908690611784565b60008281526001602052604090205490955061098d908290610ee9565b6109ea565b60008181526001602052604081208054600290910154633b9aca00916109c491898402916109bf916117d4565b6117f0565b816109cb57fe5b0490506109d88382611735565b92506109e48282610ee9565b60009550505b6108cd565b828210156109fc57600080fd5b50949350505050565b6000610a25836001600160801b031686846001600160801b0316876115f6565b95945050505050565b600080610a3b858561084d565b90505b600081815260016020526040902060020154831115610ab357600081815260016020526040902054610a71908390611735565b600082815260016020526040902060020154909250610a91908490611784565b92508215610aae57610aa2816112af565b905080610aae57600080fd5b610a3e565b60008181526001602052604090208054600290910154610a25918491633b9aca0091610ae691888402916109bf916117d4565b81610aed57fe5b04611735565b6000610b0486868686866001611568565b9695505050505050565b60025460009060ff1615610b5e576040805162461bcd60e51b81526020600482015260126024820152711499595b9d1c985b98de48185d1d195b5c1d60721b604482015290519081900360640190fd5b610b6783611485565b15610b7157600080fd5b610b7a8361120f565b610b8357600080fd5b610b8c83611820565b50610b9783836118ca565b604080513381526020810185905281517f6d5c16212bdea16850dce4d9fa2314c446bd30ce84700d9c36c7677c6d283940929181900390910190a150600192915050565b60005481565b600b546001600160a01b031681565b600081610bfc8161120f565b610c375760405162461bcd60e51b815260040180806020018281038252602d815260200180612d79602d913960400191505060405180910390fd5b610c4081611461565b6001600160a01b0316336001600160a01b03161480610c8c57506000818152600160208181526040808420808401546001600160a01b0316855260068352908420549385905291905254105b610cc75760405162461bcd60e51b8152600401808060200182810382526044815260200180612d356044913960600191505060405180910390fd5b60025460ff1615610d14576040805162461bcd60e51b81526020600482015260126024820152711499595b9d1c985b98de48185d1d195b5c1d60721b604482015290519081900360640190fd5b610d1d83611485565b15610d3957610d2b83611a69565b610d3457600080fd5b610d4b565b610d4283611820565b610d4b57600080fd5b610d5483611c23565b9392505050565b600080600080610d69612cff565b5050506000928352505060016020818152604092839020835160c0810185528154808252938201546001600160a01b03908116938201849052600283015495820186905260038301548116606083018190526004909301549081166080830152600160a01b90046001600160401b031660a090910152919390929190565b60025460009060ff1615610e37576040805162461bcd60e51b81526020600482015260126024820152711499595b9d1c985b98de48185d1d195b5c1d60721b604482015290519081900360640190fd5b610e408261120f565b158015610e5d575060008281526003602052604090206002015415155b8015610e7d57506000828152600360205260409020600201546009194301115b610e8657600080fd5b60008281526003602090815260408083208381556001810184905560020192909255815133815290810184905281517fcb9d6176c6aac6478ebb9a2754cdce22a944de29ed1f2642f8613884eba4b40c929181900390910190a15060015b919050565b610efc826001600160801b0383166114f4565b610f0557600080fd5b5050565b6001600160a01b031660009081526006602052604090205490565b60009081526007602052604090205490565b600560209081526000928352604080842090915290825290205481565b6009546001600160a01b031681565b600460209081526000928352604080842090915290825290205481565b80610f898161120f565b610f9257600080fd5b6000828152600160208181526040808420600481015481850154600383015484516001600160601b0319606084811b8216838a015283901b1660348201528551602881830301815260488201808852815191890191909120998c90529790965283546002909401546001600160a01b03928316909752811660688601526001600160801b0392831660888601529190941660a88401526001600160401b03600160a01b85041660c8840152905186949190931692909184917f70a14c213064359ede031fd2a1645a11ce2ec825ffe6ab5cfb5b160c3ef4d0a29181900360e80190a4505050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b60025460009060ff16156110f4576040805162461bcd60e51b81526020600482015260126024820152711499595b9d1c985b98de48185d1d195b5c1d60721b604482015290519081900360640190fd5b60005b841561120257611107868561084d565b90508061111357600080fd5b600081815260016020526040902080546002909101546111339190611706565b85670de0b6b3a764000002101561114957611202565b60008181526001602052604090205485106111ba5760008181526001602052604090206002015461117b908390611735565b600082815260016020526040902054909250611198908690611784565b6000828152600160205260409020549095506111b5908290610ee9565b6111fd565b6000818152600160205260409020600281015490546111ec918491633b9aca0091610ae6918a8402916109bf916117d4565b91506111f88186610ee9565b600094505b6110f7565b828211156109fc57600080fd5b600090815260016020526040902060040154600160a01b90046001600160401b0316151590565b6001602081905260009182526040909120805491810154600282015460038301546004909301546001600160a01b0392831693919291821691811690600160a01b90046001600160401b031686565b60085490565b60009081526003602052604090205490565b60066020526000908152604090205481565b60009081526003602052604090206001015490565b333214611318576040805162461bcd60e51b815260206004820152601860248201527f4e6f20696e6469726563742063616c6c7320706c656173650000000000000000604482015290519081900360640190fd5b6009546001600160a01b038281169116141561137b576040805162461bcd60e51b815260206004820181905260248201527f43616e277420736574206475737420666f72207468652064757374546f6b656e604482015290519081900360640190fd5b600b54600954600a546040805163413713c160e01b81526001600160a01b0393841660048201528584166024820152604481019290925251600093929092169163413713c191606480820192602092909190829003018186803b1580156113e157600080fd5b505afa1580156113f5573d6000803e3d6000fd5b505050506040513d602081101561140b57600080fd5b50519050610f058282611fc4565b60076020526000908152604090205481565b61143481610bf0565b61143d57600080fd5b50565b60036020526000908152604090208054600182015460029092015490919083565b6000908152600160205260409020600401546001600160a01b031690565b600a5481565b6000818152600360205260408120541515806114b1575060008281526003602052604090206001015415155b806108745750506000818152600160208181526040808420928301546001600160a01b039081168552600483528185206003909401541684529190529020541490565b6000826115008161120f565b61150957600080fd5b60025460ff1615611556576040805162461bcd60e51b81526020600482015260126024820152711499595b9d1c985b98de48185d1d195b5c1d60721b604482015290519081900360640190fd5b611560848461201d565b949350505050565b60025460009060ff16156115b8576040805162461bcd60e51b81526020600482015260126024820152711499595b9d1c985b98de48185d1d195b5c1d60721b604482015290519081900360640190fd5b6001600160a01b0386166000908152600660205260409020548710156115dd57600080fd5b6115eb8787878787876120c9565b979650505050505050565b60025460009060ff1615611646576040805162461bcd60e51b81526020600482015260126024820152711499595b9d1c985b98de48185d1d195b5c1d60721b604482015290519081900360640190fd5b610a258585858561222b565b60008061165f848661084d565b90505b6000818152600160205260409020548311156116d457600081815260016020526040902060020154611695908390611735565b6000828152600160205260409020549092506116b2908490611784565b925082156116cf576116c3816112af565b9050806116cf57600080fd5b611662565b600081815260016020526040902060028101549054610a25918491633b9aca0091610ae691888402916109bf916117d4565b60008161172661171e85670de0b6b3a76400006122b5565b600285610aed565b8161172d57fe5b049392505050565b80820182811015610874576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b80820382811115610874576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b60008161172661171e856b033b2e3c9fd0803ce80000006122b5565b60006b033b2e3c9fd0803ce800000061172661180c85856122b5565b60026b033b2e3c9fd0803ce8000000610aed565b6008546000908061183084611485565b1561183a57600080fd5b8360085414156118625750505060008181526007602052604081208054600855556001610ee4565b5b6000821180156118735750838214155b1561188e575060008181526007602052604090205490611863565b8382146118a057600092505050610ee4565b60008481526007602052604080822080549383529082209290925584815290555060019050919050565b6118d38261120f565b6118dc57600080fd5b6000828152600160208190526040822060038101549101546001600160a01b039182169291169083158061192e5750600084815260016020819052604090912001546001600160a01b03838116911614155b8061195657506000848152600160205260409020600301546001600160a01b03848116911614155b80611967575061196584611485565b155b61197a576119758585612318565b611983565b611983856123ea565b935083156119b1575060008381526003602052604080822060010180549087905586835291208490556119de565b506001600160a01b0381811660009081526004602090815260408083209386168352929052208054908590555b8015611a025760008181526003602052604080822087905586825290206001018190555b6001600160a01b03808316600090815260056020908152604080832093871683529281529082902080546001019055815187815291517f20fb9bad86c18f7e22e8065258790d9416a7d2df8ff05f80f82c46d38b925acd9281900390910190a15050505050565b600081815260016020818152604080842060038101549301546001600160a01b0390811680865260058452828620919094168086529252832054909190611aaf57600080fd5b600084815260036020526040902060020154158015611ad25750611ad284611485565b611adb57600080fd5b6001600160a01b038082166000908152600460209081526040808320938616835292905220548414611b4e576000848152600360205260408082205482529020600101548414611b2a57600080fd5b60008481526003602052604080822060018082015491548452919092200155611b84565b6000848152600360209081526040808320600101546001600160a01b038086168552600484528285209087168552909252909120555b60008481526003602052604090206001015415611bdb576000848152600360205260408082206001015482529020548414611bbe57600080fd5b600084815260036020526040808220805460019091015483529120555b6001600160a01b039081166000908152600560209081526040808320949093168252928352818120805460001901905593845260039091529091204360029091015550600190565b600081611c2f8161120f565b611c6a5760405162461bcd60e51b815260040180806020018281038252602d815260200180612d79602d913960400191505060405180910390fd5b611c7381611461565b6001600160a01b0316336001600160a01b03161480611cbf57506000818152600160208181526040808420808401546001600160a01b0316855260068352908420549385905291905254105b611cfa5760405162461bcd60e51b8152600401808060200182810382526044815260200180612d356044913960600191505060405180910390fd5b60025460ff1615611d0a57600080fd5b6002805460ff19166001179055611d1f612cff565b600160008581526020019081526020016000206040518060c0016040529081600082015481526020016001820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600282015481526020016003820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016004820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016004820160149054906101000a90046001600160401b03166001600160401b03166001600160401b0316815250509050600160008581526020019081526020016000206000808201600090556001820160006101000a8154906001600160a01b03021916905560028201600090556003820160006101000a8154906001600160a01b0302191690556004820160006101000a8154906001600160a01b0302191690556004820160146101000a8154906001600160401b0302191690555050611eb4816020015182608001518360000151612467565b6040805185815290517fa2c251311b1a7a475913900a2a73dc9789a21b04bc737e050bbc506dd4eb34889181900360200190a160808101516020808301805160608086018051604080516001600160601b031995851b8616818901529190931b9093166034840152815160288185030181526048840180845281519190960120935190518751838901516001600160a01b0393841690975290821660688501526001600160801b03908116608885015290941660a88301526001600160401b03421660c8830152519290931692909187917f9577941d28fff863bfbee4694a6a4a56fb09e169619189d2eaa750b5b4819995919081900360e80190a450506002805460ff19169055506001919050565b6001600160a01b0382166000818152600660209081526040918290208490558151928352820183905280517fc28d56449b0bb31e64ee7487e061f57a2e72aea8019d810832f26dda099823d09281900390910190a15050565b60008281526001602052604081205482141561205b5761203c83611485565b156120505761204a83611a69565b5061205b565b61205983611820565b505b61206583836124be565b61206e57600080fd5b6120778361120f565b80156120b057506000838152600160208181526040808420808401546001600160a01b0316855260068352908420549387905291905254105b156120c0576120be83610bf0565b505b50600192915050565b60008060008060005b6001600160a01b038089166000908152600460209081526040808320938e1683529290522054156121cc5750506001600160a01b038087166000908152600460209081526040808320938c168352928152828220548083526001909152919020600281015490549193509085612149576000612151565b808b8a840101015b61215b8c836122b5565b01612166838b6122b5565b1115612171576121cc565b6121848461217f838c61280f565b6114f4565b5088925061219b89612196838c61280f565b611784565b9850826121a88a8d6122b5565b816121af57fe5b049a508a15806121bd575088155b156121c7576121cc565b6120d2565b6000891180156121dc575060008b115b801561220057506001600160a01b038a166000908152600660205260409020548b10155b1561221d576122118b8b8b8b612826565b945061221d85886118ca565b505050509695505050505050565b6001600160a01b03831660009081526006602052604081205485101561225057600080fd5b61225c85858585612826565b600880546000838152600760209081526040918290209290925591839055815183815291519293507f8173832a493e0a3989e521458e55bfe9feac9f9b675a94e100b9d5a85f81486292918290030190a1949350505050565b60008115806122d0575050808202828282816122cd57fe5b04145b610874576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b600080831161232657600080fd5b811580159061233b57506123398261120f565b155b15612359576000918252600360205260409091206001015490612326565b8161236e57612367836123ea565b9050610874565b6123788383612aac565b156123b25760005b821580159061239457506123948484612aac565b15612367575060008281526003602052604090206001015491612380565b81158015906123c857506123c68383612aac565b155b156123e35760009182526003602052604090912054906123b2565b5080610874565b60008082116123f857600080fd5b600082815260016020818152604080842060038101549301546001600160a01b039081168086526004845282862091909416808652925283205490925b811580159061244957506124498683612aac565b15610a25575060008181526003602052604090206001015490612435565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526124b9908490612afc565b505050565b6000826124ca8161120f565b6124d357600080fd5b60025460ff16156124e357600080fd5b6002805460ff191660011790556124f8612cff565b506000848152600160208181526040808420815160c0810183528154808252948201546001600160a01b039081169482019490945260028201549281018390526003820154841660608201526004909101549283166080820152600160a01b9092046001600160401b031660a0830152909291906125779087906122b5565b8161257e57fe5b04905080816001600160801b03161461259657600080fd5b84856001600160801b0316146125ab57600080fd5b8415806125b6575080155b806125c15750815185115b806125cf5750816040015181115b156125df576000935050506127fe565b81516125eb9086611784565b600087815260016020526040908190209190915582015161260c9082611784565b600087815260016020526040902060020155606082015160808301516126359190339084612c91565b61264482602001513387612467565b6040805187815290517fa2c251311b1a7a475913900a2a73dc9789a21b04bc737e050bbc506dd4eb34889181900360200190a160808201516020808401805160608087018051604080516001600160601b031995851b8616818901529190931b909316603484015281516028818503018152604884018084528151919096012093519051948c90526001600160a01b03908116606884015293841660888301526001600160801b03808b1660a8840152861660c88301526001600160401b03421660e8830152513394909316927f3383e3357c77fd2e3a4b30deea81179bc70a795d053d14d5b7f2f01d0fd4596f918190036101080190a481606001516001600160a01b031682602001516001600160a01b03167f819e390338feffe95e2de57172d6faf337853dfd15c7a09a32d76f7fd24438758784604051808381526020018281526020019250505060405180910390a36000868152600160205260409020546127f7576000868152600160208190526040822082815590810180546001600160a01b0319908116909155600282019290925560038101805490921690915560040180546001600160e01b03191690555b6001935050505b506002805460ff1916905592915050565b60008183111561281f5781610d54565b5090919050565b60025460009060ff161561283957600080fd5b6002805460ff191660011790556001600160801b038516851461285b57600080fd5b82836001600160801b03161461287057600080fd5b6000851161287d57600080fd5b6001600160a01b03841661289057600080fd5b6000831161289d57600080fd5b6001600160a01b0382166128b057600080fd5b816001600160a01b0316846001600160a01b031614156128cf57600080fd5b6128d7612cff565b8581526001600160a01b03808616602083015260408201859052831660608201523360808201526001600160401b03421660a0820152612915612cf1565b600081815260016020818152604092839020855181559085015191810180546001600160a01b039384166001600160a01b031991821617909155928501516002820155606085015160038201805491841691851691909117905560808501516004909101805460a08701516001600160401b0316600160a01b0267ffffffffffffffff60a01b19939094169416939093171617905591506129b885333089612c91565b6040805183815290517fa2c251311b1a7a475913900a2a73dc9789a21b04bc737e050bbc506dd4eb34889181900360200190a1604080516001600160601b0319606088811b82166020808501919091529087901b90911660348301528251602881840301815260488301808552815191909201206001600160a01b0389811690925290861660688301526001600160801b03808a166088840152871660a88301526001600160401b03421660c8830152915133929185917f773ff502687307abfa024ac9f62f9752a0d210dac2ffd9a29e38e12e2ea82c829181900360e80190a4506002805460ff19169055949350505050565b6000818152600160205260408082206002015484835290822054612ad091906122b5565b60008481526001602052604080822060020154858352912054612af391906122b5565b10159392505050565b813b80612b41576040805162461bcd60e51b815260206004820152600e60248201526d139bdd08184818dbdb9d1c9858dd60921b604482015290519081900360640190fd5b60006060846001600160a01b0316846040518082805190602001908083835b60208310612b7f5780518252601f199092019160209182019101612b60565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612be1576040519150601f19603f3d011682016040523d82523d6000602084013e612be6565b606091505b509150915081612c31576040805162461bcd60e51b8152602060048201526011602482015270151bdad95b8818d85b1b0819985a5b1959607a1b604482015290519081900360640190fd5b805115612c8a57808060200190516020811015612c4d57600080fd5b5051612c8a5760405162461bcd60e51b815260040180806020018281038252602a815260200180612da6602a913960400191505060405180910390fd5b5050505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612ceb908590612afc565b50505050565b600080546001019081905590565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091529056fe4f666665722063616e206e6f742062652063616e63656c6c656420626563617573652075736572206973206e6f74206f776e6572206e6f7220612064757374206f6e652e4f66666572207761732064656c65746564206f722074616b656e2c206f72206e6576657220657869737465642e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a265627a7a723158206f3a4b826a23cab71d5a8985898080c26f83c99d68739949347e6380227b5dda64736f6c634300050c0032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000000000000000000000000000056bc75e2d63100000000000000000000000000000c498aef706cd0b5ed8a54b4ffa23df1187eb9fd9
-----Decoded View---------------
Arg [0] : _dustToken (address): 0x6B175474E89094C44Da98b954EedeAC495271d0F
Arg [1] : _dustLimit (uint256): 100000000000000000000
Arg [2] : _priceOracle (address): 0xC498aEf706CD0B5ed8A54b4ffA23df1187Eb9FD9
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [1] : 0000000000000000000000000000000000000000000000056bc75e2d63100000
Arg [2] : 000000000000000000000000c498aef706cd0b5ed8a54b4ffa23df1187eb9fd9
Deployed Bytecode Sourcemap
13361:25202:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13361:25202:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20441:147;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20441:147:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;22529:1768;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;22529:1768:0;;;;;;;;;;;;;;;;;;;;:::i;15113:253::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;15113:253:0;;;;;;;;;;;;;-1:-1:-1;;;;;15113:253:0;;;;;;;;;;;;:::i;26070:977::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26070:977:0;;;;;;;;;;;;;;;;;:::i;16398:467::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;16398:467:0;;;-1:-1:-1;;;;;16398:467:0;;;;;;;;;;;;;;;;;;;;;;:::i;18278:593::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18278:593:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6296:25;;;:::i;14347:26::-;;;:::i;:::-;;;;-1:-1:-1;;;;;14347:26:0;;;;;;;;;;;;;;17841:347;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17841:347:0;;:::i;7221:217::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7221:217:0;;:::i;:::-;;;;;;;-1:-1:-1;;;;;7221:217:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18952:313;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18952:313:0;;:::i;15374:115::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15374:115:0;;;;;;-1:-1:-1;;;;;15374:115:0;;:::i;:::-;;20063:213;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20063:213:0;-1:-1:-1;;;;;20063:213:0;;:::i;22182:100::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22182:100:0;;:::i;13864:57::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13864:57:0;;;;;;;;;;:::i;14285:24::-;;;:::i;13756:57::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13756:57:0;;;;;;;;;;:::i;7488:473::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7488:473:0;;:::i;21343:148::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;21343:148:0;;;;;;;;;;:::i;24305:1757::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;24305:1757:0;;;;;;;;;;;;;;;;;;;;:::i;6989:111::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6989:111:0;;:::i;6330:41::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6330:41:0;;:::i;:::-;;;;;;;-1:-1:-1;;;;;6330:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6330:41:0;;;;;;;;;;;;;;;;21982:90;;;:::i;21175:101::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21175:101:0;;:::i;13990:37::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13990:37:0;-1:-1:-1;;;;;13990:37:0;;:::i;20820:98::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20820:98:0;;:::i;19567:436::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19567:436:0;-1:-1:-1;;;;;19567:436:0;;:::i;14110:34::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14110:34:0;;:::i;15497:80::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15497:80:0;;:::i;13649:38::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13649:38:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;7108:105;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7108:105:0;;:::i;14316:24::-;;;:::i;22290:231::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22290:231:0;;:::i;17594:193::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17594:193:0;;;;;;;:::i;16873:635::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;16873:635:0;;;-1:-1:-1;;;;;16873:635:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15910:406::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;15910:406:0;;;-1:-1:-1;;;;;15910:406:0;;;;;;;;;;;;;;;;;;;:::i;27055:977::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27055:977:0;;;;;;;;;;;;;;;;;:::i;20441:147::-;-1:-1:-1;;;;;20538:24:0;;;20514:4;20538:24;;;:5;:24;;;;;;;;:42;;;;;;;;;;20441:147;;;;;:::o;22529:1768::-;22692:6;;22652:13;;22692:6;;22691:7;22683:38;;;;;-1:-1:-1;;;22683:38:0;;;;;;;;;;;;-1:-1:-1;;;22683:38:0;;;;;;;;;;;;;;;22732:12;22755:1488;22762:11;;22755:1488;;22858:30;22871:7;22880;22858:12;:30::i;:::-;22848:40;-1:-1:-1;22953:12:0;22945:21;;;;;;23158:15;;;;:6;:15;;;;;:23;;;;23183;;23153:54;;23158:23;23153:4;:54::i;:::-;23133:7;23143;23133:17;:74;23129:191;;;23228:5;;23129:191;23349:15;;;;:6;:15;;;;;:23;;;23338:34;;23334:898;;23512:15;;;;:6;:15;;;;;:23;23498:38;;23502:8;;23498:3;:38::i;:::-;23621:15;;;;:6;:15;;;;;:23;;;23487:49;;-1:-1:-1;23608:37:0;;23612:7;;23608:3;:37::i;:::-;23706:16;23732:15;;;:6;:15;;;;;:23;23598:47;;-1:-1:-1;23701:56:0;;23714:7;;23701:4;:56::i;:::-;23334:898;;;23838:12;23882:15;;;:6;:15;;;;;:23;;23907;;;;;23935:7;;23853:79;;23858:17;;;;23877:54;;:4;:54::i;:::-;23853:4;:79::i;:::-;:89;;;;;;23838:104;;23972:19;23976:8;23986:4;23972:3;:19::i;:::-;23961:30;-1:-1:-1;24052:37:0;24065:7;24083:4;24052;:37::i;:::-;24167:1;24157:11;;23334:898;;22755:1488;;;24273:15;24261:8;:27;;24253:36;;;;;;22529:1768;;;;;;;:::o;15113:253::-;15276:7;15316:41;15322:7;-1:-1:-1;;;;;15316:41:0;15331:7;15340;-1:-1:-1;;;;;15316:41:0;15349:7;15316:5;:41::i;:::-;15308:50;15113:253;-1:-1:-1;;;;;15113:253:0:o;26070:977::-;26157:13;26183:15;26201:30;26214:7;26223;26201:12;:30::i;:::-;26183:48;;26288:567;26305:15;;;;:6;:15;;;;;:23;;;26295:33;;26288:567;;;26370:15;;;;:6;:15;;;;;:23;26356:38;;26360:8;;26356:3;:38::i;:::-;26465:15;;;;:6;:15;;;;;:23;;;26345:49;;-1:-1:-1;26452:37:0;;26456:7;;26452:3;:37::i;:::-;26442:47;-1:-1:-1;26536:11:0;;26532:312;;26642:22;26656:7;26642:13;:22::i;:::-;26632:32;-1:-1:-1;26739:12:0;26731:21;;;;;;26288:567;;;26919:15;;;;:6;:15;;;;;:23;;26944;;;;;26876:104;;26880:8;;26972:7;;26890:79;;26895:17;;;;26914:54;;:4;:54::i;26890:79::-;:89;;;;;;26876:3;:104::i;16398:467::-;16776:4;16805:52;16811:7;16820;16829;16838;16847:3;16852:4;16805:5;:52::i;:::-;16798:59;16398:467;-1:-1:-1;;;;;;16398:467:0:o;18278:593::-;18450:6;;18419:4;;18450:6;;18449:7;18441:38;;;;;-1:-1:-1;;;18441:38:0;;;;;;;;;;;;-1:-1:-1;;;18441:38:0;;;;;;;;;;;;;;;18499:17;18513:2;18499:13;:17::i;:::-;18498:18;18490:27;;;;;;18580:12;18589:2;18580:8;:12::i;:::-;18572:21;;;;;;18648:9;18654:2;18648:5;:9::i;:::-;;18730:14;18736:2;18740:3;18730:5;:14::i;:::-;18816:25;;;18826:10;18816:25;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18859:4:0;18278:593;;;;:::o;6296:25::-;;;;:::o;14347:26::-;;;-1:-1:-1;;;;;14347:26:0;;:::o;17841:347::-;17924:12;17902:2;14765:12;14774:2;14765:8;:12::i;:::-;14757:70;;;;-1:-1:-1;;;14757:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14876:12;14885:2;14876:8;:12::i;:::-;-1:-1:-1;;;;;14862:26:0;:10;-1:-1:-1;;;;;14862:26:0;;:85;;;-1:-1:-1;14913:34:0;14927:10;;;:6;:10;;;;;;;;:18;;;;-1:-1:-1;;;;;14927:18:0;14913:34;;:5;:34;;;;;;14892:10;;;;;;;:18;:55;14862:85;14840:203;;;;-1:-1:-1;;;14840:203:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17963:6;;;;17962:7;17954:38;;;;;-1:-1:-1;;;17954:38:0;;;;;;;;;;;;-1:-1:-1;;;17954:38:0;;;;;;;;;;;;;;;18007:17;18021:2;18007:13;:17::i;:::-;18003:121;;;18049:11;18057:2;18049:7;:11::i;:::-;18041:20;;;;;;18003:121;;;18102:9;18108:2;18102:5;:9::i;:::-;18094:18;;;;;;18141:16;18154:2;18141:12;:16::i;:::-;18134:23;17841:347;-1:-1:-1;;;17841:347:0:o;7221:217::-;7269:4;7275:5;7282:4;7288:5;7304:22;;:::i;:::-;-1:-1:-1;;;7329:10:0;;;;-1:-1:-1;;7329:6:0;:10;;;;;;;;;7304:35;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7304:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7304:35:0;;-1:-1:-1;;;;;7304:35:0;;;;;;;;;;;;7221:217::o;18952:313::-;19044:6;;19013:4;;19044:6;;19043:7;19035:38;;;;;-1:-1:-1;;;19035:38:0;;;;;;;;;;;;-1:-1:-1;;;19035:38:0;;;;;;;;;;;;;;;19093:12;19102:2;19093:8;:12::i;:::-;19092:13;:36;;;;-1:-1:-1;19109:9:0;;;;:5;:9;;;;;:14;;;:19;;19092:36;:74;;;;-1:-1:-1;19132:9:0;;;;:5;:9;;;;;:14;;;-1:-1:-1;;19149:12:0;:17;-1:-1:-1;19092:74:0;19084:83;;;;;;19185:9;;;;:5;:9;;;;;;;;19178:16;;;;;;;;;;;;;;;19210:25;;19220:10;19210:25;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19253:4:0;18952:313;;;;:::o;15374:115::-;15449:31;15461:2;-1:-1:-1;;;;;15449:31:0;;:3;:31::i;:::-;15441:40;;;;;;15374:115;;:::o;20063:213::-;-1:-1:-1;;;;;20245:23:0;20216:4;20245:23;;;:5;:23;;;;;;;20063:213::o;22182:100::-;22241:4;22265:9;;;:5;:9;;;;;;;22182:100::o;13864:57::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14285:24::-;;;-1:-1:-1;;;;;14285:24:0;;:::o;13756:57::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;7488:473::-;7556:3;6640:12;7556:3;6640:8;:12::i;:::-;6632:21;;;;;;7578:10;7741;;;:6;:10;;;;;;;;:16;;;;7686:18;;;;7706;;;;7669:56;;-1:-1:-1;;;;;;7669:56:0;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;7669:56:0;;;;;;7659:67;;;;;;;;;7772:10;;;;;;;;7846:18;;7888;;;;;-1:-1:-1;;;;;7686:18:0;;;7619:334;;;7706:18;;7619:334;;;;-1:-1:-1;;;;;7619:334:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;7922:20:0;;;7619:334;;;;;;7599:3;;7741:16;;;;;7659:67;;7599:3;;7619:334;;;;;;;;;6664:1;7488:473;;:::o;21343:148::-;-1:-1:-1;;;;;21441:24:0;;;21417:4;21441:24;;;:5;:24;;;;;;;;:42;;;;;;;;;;;;;21343:148::o;24305:1757::-;24467:6;;24427:13;;24467:6;;24466:7;24458:38;;;;;-1:-1:-1;;;24458:38:0;;;;;;;;;;;;-1:-1:-1;;;24458:38:0;;;;;;;;;;;;;;;24507:12;24530:1478;24537:11;;24530:1478;;24636:30;24649:7;24658;24636:12;:30::i;:::-;24626:40;-1:-1:-1;24731:12:0;24723:21;;;;;;24878:15;;;;:6;:15;;;;;:23;;24903;;;;;24873:54;;24878:23;24873:4;:54::i;:::-;24853:7;24863;24853:17;:74;24849:191;;;24948:5;;24849:191;25069:15;;;;:6;:15;;;;;:23;25058:34;;25054:943;;25232:15;;;;:6;:15;;;;;:23;;;25218:38;;25222:8;;25218:3;:38::i;:::-;25339:15;;;;:6;:15;;;;;:23;25207:49;;-1:-1:-1;25326:37:0;;25330:7;;25326:3;:37::i;:::-;25423:16;25449:15;;;:6;:15;;;;;:23;25316:47;;-1:-1:-1;25418:56:0;;25431:7;;25418:4;:56::i;:::-;25054:943;;;25663:15;;;;:6;:15;;;;;:23;;;;25688;;25620:104;;25624:8;;25716:7;;25634:79;;25639:17;;;;25658:54;;:4;:54::i;25620:104::-;25609:115;-1:-1:-1;25775:40:0;25788:7;25806;25775:4;:40::i;:::-;25910:1;25900:11;;25054:943;24530:1478;;;26038:15;26026:8;:27;;26018:36;;;;;6989:111;7037:11;7068:10;;;:6;:10;;;;;:20;;;-1:-1:-1;;;7068:20:0;;-1:-1:-1;;;;;7068:20:0;:24;;;6989:111::o;6330:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6330:41:0;;;;;;;;;;;;;-1:-1:-1;;;6330:41:0;;-1:-1:-1;;;;;6330:41:0;;:::o;21982:90::-;22059:5;;21982:90;:::o;21175:101::-;21228:4;21254:9;;;:5;:9;;;;;:14;;21175:101::o;13990:37::-;;;;;;;;;;;;;:::o;20820:98::-;20872:4;20896:9;;;:5;:9;;;;;:14;;;;20820:98::o;19567:436::-;19703:10;19717:9;19703:23;19695:60;;;;;-1:-1:-1;;;19695:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19794:9;;-1:-1:-1;;;;;19774:29:0;;;19794:9;;19774:29;;19766:74;;;;;-1:-1:-1;;;19766:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19892:11;;19917:9;;19946;;19876:80;;;-1:-1:-1;;;19876:80:0;;-1:-1:-1;;;;;19917:9:0;;;19876:80;;;;;;;;;;;;;;;;;;;19861:12;;19892:11;;;;;19876:40;;:80;;;;;;;;;;;;;;;19892:11;19876:80;;;5:2:-1;;;;30:1;27;20:12;5:2;19876:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19876:80:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19876:80:0;;-1:-1:-1;19969:26:0;19981:7;19876:80;19969:11;:26::i;14110:34::-;;;;;;;;;;;;;:::o;15497:80::-;15549:19;15564:2;15549:6;:19::i;:::-;15541:28;;;;;;15497:80;:::o;13649:38::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7108:105::-;7156:13;7189:10;;;:6;:10;;;;;:16;;;-1:-1:-1;;;;;7189:16:0;;7108:105::o;14316:24::-;;;;:::o;22290:231::-;22342:4;22366:9;;;:5;:9;;;;;:14;:19;;;:58;;-1:-1:-1;22405:9:0;;;;:5;:9;;;;;:14;;;:19;;22366:58;:147;;;-1:-1:-1;;22444:34:0;22458:10;;;:6;:10;;;;;;;;:18;;;;-1:-1:-1;;;;;22458:18:0;;;22444:34;;:5;:34;;;;;22487:18;;;;;;22444:63;;;;;;;;:69;;22290:231::o;17594:193::-;17684:4;17662:2;6640:12;6649:2;6640:8;:12::i;:::-;6632:21;;;;;;17715:6;;;;17714:7;17706:38;;;;;-1:-1:-1;;;17706:38:0;;;;;;;;;;;;-1:-1:-1;;;17706:38:0;;;;;;;;;;;;;;;17762:17;17768:2;17772:6;17762:5;:17::i;:::-;17755:24;17594:193;-1:-1:-1;;;;17594:193:0:o;16873:635::-;17339:6;;17308:4;;17339:6;;17338:7;17330:38;;;;;-1:-1:-1;;;17330:38:0;;;;;;;;;;;;-1:-1:-1;;;17330:38:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;17387:23:0;;;;;;:5;:23;;;;;;:34;-1:-1:-1;17387:34:0;17379:43;;;;;;17442:58;17450:7;17459;17468;17477;17486:3;17491:8;17442:7;:58::i;:::-;17435:65;16873:635;-1:-1:-1;;;;;;;16873:635:0:o;15910:406::-;16218:6;;16187:4;;16218:6;;16217:7;16209:38;;;;;-1:-1:-1;;;16209:38:0;;;;;;;;;;;;-1:-1:-1;;;16209:38:0;;;;;;;;;;;;;;;16265:43;16273:7;16282;16291;16300;16265;:43::i;27055:977::-;27142:13;27168:15;27186:30;27199:7;27208;27186:12;:30::i;:::-;27168:48;;27273:567;27290:15;;;;:6;:15;;;;;:23;27280:33;;27273:567;;;27355:15;;;;:6;:15;;;;;:23;;;27341:38;;27345:8;;27341:3;:38::i;:::-;27450:15;;;;:6;:15;;;;;:23;27330:49;;-1:-1:-1;27437:37:0;;27441:7;;27437:3;:37::i;:::-;27427:47;-1:-1:-1;27521:11:0;;27517:312;;27627:22;27641:7;27627:13;:22::i;:::-;27617:32;-1:-1:-1;27724:12:0;27716:21;;;;;;27273:567;;;27904:15;;;;:6;:15;;;;;:23;;;;27929;;27861:104;;27865:8;;27957:7;;27875:79;;27880:17;;;;27899:54;;:4;:54::i;2745:111::-;2798:6;2847:1;2821:23;2825:11;2829:1;2455:8;2825:3;:11::i;:::-;2842:1;2838;:5;;2821:23;:27;;;;;;;2745:111;-1:-1:-1;;;2745:111:0:o;1594:128::-;1678:5;;;1673:16;;;;1665:49;;;;;-1:-1:-1;;;1665:49:0;;;;;;;;;;;;-1:-1:-1;;;1665:49:0;;;;;;;;;;;;;;1728:129;1812:5;;;1807:16;;;;1799:50;;;;;-1:-1:-1;;;1799:50:0;;;;;;;;;;;;-1:-1:-1;;;1799:50:0;;;;;;;;;;;;;;2862:111;2915:6;2964:1;2938:23;2942:11;2946:1;2490:8;2942:3;:11::i;2626:113::-;2679:6;2490:8;2702:23;2706:9;2710:1;2713;2706:3;:9::i;:::-;2723:1;2490:8;2717:7;;37375:1185;37537:5;;37504:4;;37537:5;37707:17;37721:2;37707:13;:17::i;:::-;37706:18;37698:27;;;;;;37804:2;37795:5;;:11;37791:285;;;-1:-1:-1;;;37900:9:0;;;;:5;:9;;;;;;;37892:5;:17;37972:13;-1:-1:-1;38053:11:0;;37791:285;38086:133;38099:1;38093:3;:7;:20;;;;;38111:2;38104:3;:9;;38093:20;38086:133;;;-1:-1:-1;38197:10:0;;;;:5;:10;;;;;;;38086:133;;;38240:2;38233:3;:9;38229:117;;38329:5;38322:12;;;;;;38229:117;38369:9;;;;:5;:9;;;;;;;;38356:10;;;;;;:22;;;;38460:9;;;:13;;-1:-1:-1;;;;37375:1185:0;;;:::o;34551:1481::-;34701:12;34710:2;34701:8;:12::i;:::-;34693:21;;;;;;34727:13;34743:10;;;:6;:10;;;;;;;:18;;;;34788;;;-1:-1:-1;;;;;34743:18:0;;;;34788;;;34902:8;;;:42;;-1:-1:-1;34914:11:0;;;;:6;:11;;;;;;;;:19;;-1:-1:-1;;;;;34914:30:0;;;:19;;:30;;34902:42;:76;;;-1:-1:-1;34948:11:0;;;;:6;:11;;;;;:19;;;-1:-1:-1;;;;;34948:30:0;;;:19;;:30;;34902:76;:99;;;;34983:18;34997:3;34983:13;:18::i;:::-;34982:19;34902:99;:175;;35060:17;35069:2;35073:3;35060:8;:17::i;:::-;34902:175;;;35026:9;35032:2;35026:5;:9::i;:::-;34896:181;-1:-1:-1;35094:8:0;;35090:546;;-1:-1:-1;35318:10:0;;;;:5;:10;;;;;;:15;;;;35348:20;;;;35383:9;;;;;:20;;;35090:546;;;-1:-1:-1;;;;;;35522:23:0;;;;;;;:5;:23;;;;;;;;:41;;;;;;;;;;;35578:46;;;;35090:546;35652:12;;35648:287;;35860:14;;;;:5;:14;;;;;;:24;;;35899:9;;;;;:14;;:24;;;35648:287;-1:-1:-1;;;;;35947:23:0;;;;;;;:5;:23;;;;;;;;:41;;;;;;;;;;;;:43;;;;;;36006:18;;;;;;;;;;;;;;;;;34551:1481;;;;;:::o;36106:1190::-;36240:4;36288:10;;;:6;:10;;;;;;;;:18;;;;36344;;;-1:-1:-1;;;;;36344:18:0;;;36382:14;;;:5;:14;;;;;36288:18;;;;36382:23;;;;;;;;36288:18;;36344;36374:36;;;;;;36431:9;;;;:5;:9;;;;;:14;;;:19;:111;;;;;36525:17;36539:2;36525:13;:17::i;:::-;36423:120;;;;;;-1:-1:-1;;;;;36566:14:0;;;;;;;:5;:14;;;;;;;;:23;;;;;;;;;;36560:29;;36556:361;;36666:21;36672:9;;;36666:5;36672:9;;;;;;:14;36666:21;;;;:26;;;:32;;36658:41;;;;;;36743:9;;;;:5;:9;;;;;;:14;;;;;36720;;36714:21;;;;;;:26;:43;36556:361;;;36891:9;;;;:5;:9;;;;;;;;:14;;;-1:-1:-1;;;;;36865:14:0;;;;;:5;:14;;;;;:23;;;;;;;;;;;:40;36556:361;36933:9;;;;:5;:9;;;;;:14;;;:19;36929:211;;37037:21;37043:9;;;37037:5;37043:9;;;;;;:14;;;37037:21;;;;:26;:32;;37029:41;;;;;;37114:9;;;;:5;:9;;;;;;:14;;37091;;;;;37085:21;;;;:43;36929:211;-1:-1:-1;;;;;37152:14:0;;;;;;;:5;:14;;;;;;;;:23;;;;;;;;;;;;:25;;-1:-1:-1;;37152:25:0;;;37188:9;;;:5;:9;;;;;;37205:12;37188:14;;;;:29;-1:-1:-1;;;36106:1190:0:o;9507:728::-;9612:12;9568:2;14765:12;14774:2;14765:8;:12::i;:::-;14757:70;;;;-1:-1:-1;;;14757:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14876:12;14885:2;14876:8;:12::i;:::-;-1:-1:-1;;;;;14862:26:0;:10;-1:-1:-1;;;;;14862:26:0;;:85;;;-1:-1:-1;14913:34:0;14927:10;;;:6;:10;;;;;;;;:18;;;;-1:-1:-1;;;;;14927:18:0;14913:34;;:5;:34;;;;;;14892:10;;;;;;;:18;:55;14862:85;14840:203;;;;-1:-1:-1;;;14840:203:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6905:6;;;;6904:7;6896:16;;;;;;6923:6;:13;;-1:-1:-1;;6923:13:0;6932:4;6923:13;;;9720:22;;:::i;:::-;9745:6;:10;9752:2;9745:10;;;;;;;;;;;9720:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9720:35:0;-1:-1:-1;;;;;9720:35:0;-1:-1:-1;;;;;9720:35:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9720:35:0;-1:-1:-1;;;;;9720:35:0;-1:-1:-1;;;;;9720:35:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9720:35:0;-1:-1:-1;;;;;9720:35:0;-1:-1:-1;;;;;9720:35:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9720:35:0;-1:-1:-1;;;;;9720:35:0;-1:-1:-1;;;;;9720:35:0;;;;;;;9773:6;:10;9780:2;9773:10;;;;;;;;;;;;9766:17;;;;;;;;;;;;;;;-1:-1:-1;;;;;9766:17:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9766:17:0;;;;;;;;;;;;;;-1:-1:-1;;;;;9766:17:0;;;;;;;;;;;;;;-1:-1:-1;;;;;9766:17:0;;;;;;;9796:55;9809:5;:13;;;9824:5;:11;;;9837:5;:13;;;9796:12;:55::i;:::-;9869:17;;;;;;;;;;;;;;;;;10022:11;;;;9977:13;;;;;;9992;;;;;;9960:46;;;-1:-1:-1;;;;;;9960:46:0;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;9960:46:0;;;;;;9950:57;;;;;;;10048:13;;10076;;10112;;10149;;;;-1:-1:-1;;;;;9902:298:0;;;;;;;;;;;;;-1:-1:-1;;;;;9902:298:0;;;;;;;;;;;;;;-1:-1:-1;;;;;10185:3:0;9902:298;;;;;;;;;;;9950:57;;9932:2;;9902:298;;;;;;;;;;-1:-1:-1;;6959:6:0;:14;;-1:-1:-1;;6959:14:0;;;-1:-1:-1;10223:4:0;;9507:728;-1:-1:-1;9507:728:0:o;28082:242::-;-1:-1:-1;;;;;28236:23:0;;;;;;:5;:23;;;;;;;;;:30;;;28282:34;;;;;;;;;;;;;;;;;;;;;;28082:242;;:::o;28332:619::-;28405:4;28441:10;;;:6;:10;;;;;:18;28431:28;;28427:268;;;28480:17;28494:2;28480:13;:17::i;:::-;28476:208;;;28609:11;28617:2;28609:7;:11::i;:::-;;28476:208;;;28659:9;28665:2;28659:5;:9::i;:::-;;28476:208;28713:21;28723:2;28727:6;28713:9;:21::i;:::-;28705:30;;;;;;28812:12;28821:2;28812:8;:12::i;:::-;:71;;;;-1:-1:-1;28849:34:0;28863:10;;;:6;:10;;;;;;;;:18;;;;-1:-1:-1;;;;;28863:18:0;28849:34;;:5;:34;;;;;;28828:10;;;;;;;:18;:55;28812:71;28808:114;;;28900:10;28907:2;28900:6;:10::i;:::-;;28808:114;-1:-1:-1;28939:4:0;28332:619;;;;:::o;31341:2385::-;31707:7;31732:18;31783;31842:14;31917;32057:1364;-1:-1:-1;;;;;32064:25:0;;;32112:1;32064:25;;;:5;:25;;;;;;;;:45;;;;;;;;;;:49;32057:1364;;-1:-1:-1;;;;;;;32146:25:0;;;;;;;:5;:25;;;;;;;;:45;;;;;;;;;;;;32218:21;;;:6;:21;;;;;;:29;;;;32274;;32146:45;;-1:-1:-1;32218:29:0;32851:8;:60;;32910:1;32851:60;;;32898:9;32886;32874;32862;:21;:33;:45;32851:60;32805:25;32809:9;32820;32805:3;:25::i;:::-;:107;32777:25;32781:9;32792;32777:3;:25::i;:::-;:135;32773:194;;;32946:5;;32773:194;33094:45;33098:13;33113:25;33117:9;33128;33113:3;:25::i;:::-;33094:3;:45::i;:::-;;33170:9;33154:25;;33206:41;33210:9;33221:25;33225:9;33236;33221:3;:25::i;:::-;33206:3;:41::i;:::-;33194:53;;33302:13;33274:25;33278:9;33289;33274:3;:25::i;:::-;:41;;;;;;;-1:-1:-1;33336:14:0;;;:32;;-1:-1:-1;33354:14:0;;33336:32;33332:78;;;33389:5;;33332:78;32057:1364;;;33449:1;33437:9;:13;:30;;;;;33466:1;33454:9;:13;33437:30;:72;;;;-1:-1:-1;;;;;;33484:25:0;;;;;;:5;:25;;;;;;33471:38;;;33437:72;33433:286;;;33574:55;33586:9;33597;33608;33619;33574:11;:55::i;:::-;33569:60;;33693:14;33699:2;33703:3;33693:5;:14::i;:::-;31341:2385;;;;;;;;;;;;:::o;33992:513::-;-1:-1:-1;;;;;34314:23:0;;34281:7;34314:23;;;:5;:23;;;;;;:34;-1:-1:-1;34314:34:0;34306:43;;;;;;34365:47;34377:7;34386;34395;34404;34365:11;:47::i;:::-;34435:5;;;34423:9;;;;:5;:9;;;;;;;;;:17;;;;34451:10;;;;34477:20;;;;;;;34360:52;;-1:-1:-1;34477:20:0;;;;;;;;;33992:513;;;;;;:::o;1863:142::-;1915:6;1942;;;:30;;-1:-1:-1;;1957:5:0;;;1971:1;1966;1957:5;1966:1;1952:15;;;;;:20;1942:30;1934:63;;;;;-1:-1:-1;;;1934:63:0;;;;;;;;;;;;-1:-1:-1;;;1934:63:0;;;;;;;;;;;;;;29629:1147;29716:4;29751:1;29746:2;:6;29738:15;;;;;;29811:8;;;;;:26;;;29824:13;29833:3;29824:8;:13::i;:::-;29823:14;29811:26;29804:83;;;29860:10;;;;:5;:10;;;;;;:15;;;;29804:83;;;29903:8;29899:870;;30009:9;30015:2;30009:5;:9::i;:::-;30002:16;;;;29899:870;30164:24;30180:2;30184:3;30164:15;:24::i;:::-;30161:597;;;30209:12;30350:145;30357:8;;;;;:36;;;30369:24;30385:2;30389:3;30369:15;:24::i;:::-;30350:145;;;-1:-1:-1;30460:10:0;;;;:5;:10;;;;;:15;;;;30350:145;;30161:597;30611:8;;;;;:37;;;30624:24;30640:2;30644:3;30624:15;:24::i;:::-;30623:25;30611:37;30604:110;;;30679:10;;;;:5;:10;;;;;;:15;;30604:110;;;-1:-1:-1;30739:3:0;30732:10;;29020:540;29094:4;29130:1;29125:2;:6;29116:17;;;;;;29146:15;29172:10;;;:6;:10;;;;;;;;:18;;;;29228;;;-1:-1:-1;;;;;29228:18:0;;;29269:14;;;:5;:14;;;;;29172:18;;;;29269:23;;;;;;;;29172:18;;29407:121;29414:8;;;;;:36;;;29426:24;29442:2;29446:3;29426:15;:24::i;:::-;29407:121;;;-1:-1:-1;29501:10:0;;;;:5;:10;;;;;:15;;;;29407:121;;12084:176;12193:58;;;-1:-1:-1;;;;;12193:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;12193:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;12166:86:0;;12186:5;;12166:19;:86::i;:::-;12084:176;;;:::o;8093:1360::-;8207:4;8163:2;6640:12;6649:2;6640:8;:12::i;:::-;6632:21;;;;;;6905:6;;;;6904:7;6896:16;;;;;;6923:6;:13;;-1:-1:-1;;6923:13:0;6932:4;6923:13;;;8229:22;;:::i;:::-;-1:-1:-1;8254:10:0;;;;:6;:10;;;;;;;;8229:35;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8229:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8229:35:0;;;-1:-1:-1;;;;;8229:35:0;;;;;;;8254:10;8229:35;8288:28;;8292:8;;8288:3;:28::i;:::-;:44;;;;;;8275:57;;8371:5;8361;-1:-1:-1;;;;;8353:23:0;;8345:32;;;;;;8417:8;8404;-1:-1:-1;;;;;8396:29:0;;8388:38;;;;;;8493:13;;;:27;;-1:-1:-1;8510:10:0;;8493:27;:68;;;-1:-1:-1;8548:13:0;;8537:24;;8493:68;:93;;;;8573:5;:13;;;8565:5;:21;8493:93;8489:147;;;8619:5;8612:12;;;;;;8489:147;8673:13;;8669:28;;8688:8;8669:3;:28::i;:::-;8648:10;;;;:6;:10;;;;;;;:49;;;;8733:13;;;8729:25;;8748:5;8729:3;:25::i;:::-;8708:10;;;;:6;:10;;;;;:18;;:46;8782:13;;;;8809:11;;;;8765:63;;8782:13;8797:10;;8822:5;8765:16;:63::i;:::-;8839:49;8852:5;:13;;;8867:10;8879:8;8839:12;:49::i;:::-;8906:17;;;;;;;;;;;;;;;;;9059:11;;;;9014:13;;;;;;9029;;;;;;8997:46;;;-1:-1:-1;;;;;;8997:46:0;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;8997:46:0;;;;;;8987:57;;;;;;;9085:13;;9113;;8939:310;;;;-1:-1:-1;;;;;8939:310:0;;;;;;;;;;;;;;-1:-1:-1;;;;;8939:310:0;;;;;;;;;;;;;-1:-1:-1;;;;;9234:3:0;8939:310;;;;;;9141:10;;8939:310;;;;;;;;;;;;;9323:5;:13;;;-1:-1:-1;;;;;9265:73:0;9292:5;:13;;;-1:-1:-1;;;;;9265:73:0;;9274:8;9308:5;9265:73;;;;;;;;;;;;;;;;;;;;;;;;9355:10;;;;:6;:10;;;;;:18;9351:71;;9400:10;;;;:6;:10;;;;;;;9393:17;;;;;;;;-1:-1:-1;;;;;;9393:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;9393:17:0;;;9351:71;9441:4;9434:11;;;;6947:1;-1:-1:-1;6959:6:0;:14;;-1:-1:-1;;6959:14:0;;;8093:1360;;-1:-1:-1;;8093:1360:0:o;2013:100::-;2065:6;2096:1;2091;:6;;:14;;2104:1;2091:14;;;-1:-1:-1;2100:1:0;;2084:21;-1:-1:-1;2013:100:0:o;10683:1125::-;6905:6;;10831:7;;6905:6;;6904:7;6896:16;;;;;;6923:6;:13;;-1:-1:-1;;6923:13:0;6932:4;6923:13;;;-1:-1:-1;;;;;10864:27:0;;;;10856:36;;;;;;10931:7;10919;-1:-1:-1;;;;;10911:27:0;;10903:36;;;;;;10968:1;10958:7;:11;10950:20;;;;;;-1:-1:-1;;;;;10989:21:0;;10981:30;;;;;;11040:1;11030:7;:11;11022:20;;;;;;-1:-1:-1;;;;;11061:21:0;;11053:30;;;;;;11113:7;-1:-1:-1;;;;;11102:18:0;:7;-1:-1:-1;;;;;11102:18:0;;;11094:27;;;;;;11134:21;;:::i;:::-;11166:22;;;-1:-1:-1;;;;;11199:22:0;;;:12;;;:22;11232:12;;;:22;;;11265;;:12;;;:22;11311:10;11298;;;:23;-1:-1:-1;;;;;11356:3:0;11332:28;:14;;;:28;11376:10;:8;:10::i;:::-;11397;;;;:6;:10;;;;;;;;;:17;;;;;;;;;;;;;-1:-1:-1;;;;;11397:17:0;;;-1:-1:-1;;;;;;11397:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11397:17:0;-1:-1:-1;;;11397:17:0;-1:-1:-1;;;;11397:17:0;;;;;;;;;;;;;;11371:15;-1:-1:-1;11427:61:0;11444:7;11453:10;11473:4;11480:7;11427:16;:61::i;:::-;11506:17;;;;;;;;;;;;;;;;;11597:34;;;-1:-1:-1;;;;;;11597:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;11597:34:0;;;;;;11587:45;;;;;;;-1:-1:-1;;;;;11597:34:0;;;11539:261;;;11597:34;;;11539:261;;;;-1:-1:-1;;;;;11539:261:0;;;;;;;;;;;;;-1:-1:-1;;;;;11785:3:0;11539:261;;;;;;;11647:10;;11587:45;11569:2;;11539:261;;;;;;;;;-1:-1:-1;6959:6:0;:14;;-1:-1:-1;;6959:14:0;;;10683:1125;;-1:-1:-1;;;;10683:1125:0:o;30860:322::-;31038:4;31132:12;;;:6;:12;;;;;;:20;;;31154:11;;;;;;:19;31128:46;;31132:20;31128:3;:46::i;:::-;31071:11;;;;:6;:11;;;;;;:19;;;31092:12;;;;;:20;31067:46;;31071:19;31067:3;:46::i;:::-;:107;;;30860:322;-1:-1:-1;;;30860:322:0:o;12480:499::-;12602:18;;12640:8;12632:35;;;;;-1:-1:-1;;;12632:35:0;;;;;;;;;;;;-1:-1:-1;;;12632:35:0;;;;;;;;;;;;;;;12681:12;12695:23;12730:5;-1:-1:-1;;;;;12722:19:0;12742:4;12722:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;12722:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;12680:67:0;;;;12766:7;12758:37;;;;;-1:-1:-1;;;12758:37:0;;;;;;;;;;;;-1:-1:-1;;;12758:37:0;;;;;;;;;;;;;;;12810:17;;:21;12806:166;;12894:10;12883:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12883:30:0;12875:85;;;;-1:-1:-1;;;12875:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12480:499;;;;;:::o;12268:204::-;12395:68;;;-1:-1:-1;;;;;12395:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;12395:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;12368:96:0;;12388:5;;12368:19;:96::i;:::-;12268:204;;;;:::o;11953:123::-;12009:4;12031:15;;;;;;;;11953:123;:::o;13361:25202::-;;;;;;;;;-1:-1:-1;13361:25202:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://6f3a4b826a23cab71d5a8985898080c26f83c99d68739949347e6380227b5dda
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.