Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 3 internal transactions
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
9586500 | 1804 days ago | 0.00001 ETH | ||||
9575260 | 1806 days ago | 0.001 ETH | ||||
9575260 | 1806 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
AssetSwap
Compiler Version
v0.6.3+commit.8dda9521
Contract Source Code (Solidity Multiple files format)
pragma solidity 0.6.3; import "./Book.sol"; import "./Oracle.sol"; /** MIT License Copyright © 2020 Eric G. Falkenstein Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ contract AssetSwap { constructor (address priceOracle, int _levRatio) public { administrators[msg.sender] = true; feeAddress = msg.sender; oracle = Oracle(priceOracle); levRatio = _levRatio; } Oracle public oracle; int[5][2] public assetReturns; /// these are pushed by the oracle each week int public levRatio; uint public lastOracleSettleTime; /// updates at time of oracle settlement. /// Used a lot so this is written to the contract mapping(address => address) public books; /// LP eth address to book contract address mapping(address => uint) public assetSwapBalance; /// how ETH is ultimately withdrawn mapping(address => bool) public administrators; /// gives user right to key functions address payable public feeAddress; /// address for oracle fees event SubkTracker( address indexed eLP, address indexed eTaker, bytes32 eSubkID, bool eisOpen); event BurnHist( address eLP, bytes32 eSubkID, address eBurner, uint eTime); event LPNewBook( address indexed eLP, address eLPBook); event RatesUpdated( address indexed eLP, uint8 closefee, int16 longFundingRate, int16 shortFundingRate ); modifier onlyAdmin() { require(administrators[msg.sender], "admin only"); _; } function removeAdmin(address toRemove) external onlyAdmin { require(toRemove != msg.sender, "You may not remove yourself as an admin."); administrators[toRemove] = false; } /** Grant administrator priviledges to a user * @param newAdmin the address to promote */ function addAdmin(address newAdmin) external onlyAdmin { administrators[newAdmin] = true; } function adjustMinRM(uint16 _min) external { require(books[msg.sender] != address(0), "User must have a book"); require(_min >= 1); Book b = Book(books[msg.sender]); b.adjustMinRMBook(_min); } /** data are input in basis points as a percent of national * thus 10 is 0.1% of notional, which when applied to the crypto * with 2.5 leverage, generates a 0.25% of RM charge. funding rates * can be negative, which implies the taker receives a payment. * if you change the fees so they can be greater than 2.5% of RM, * say X, you must adjustn the Oracle contract to have a maximum value of * 1 - X, so that player RM can cover every conceivable scenario */ function updateFees(uint newClose, int frLong, int frShort) external { require(books[msg.sender] != address(0), "User must have a book"); /// data are input as basis points of notional, adjusted to bps of RM to simplify calculations /// thus for the spx, the leverage ratio is 1000, and so dividing it by 1e2 gives 10 /// Thus for the spx, a long rate of 0.21% per week, applied to the notional, /// is 2.1% per week applied to the RM int longRate = frLong * levRatio / 1e2; int shortRate = frShort * levRatio / 1e2; uint closefee = newClose * uint(levRatio) / 1e2; /// fees are capped to avoid predatory pricing that would potentially besmirch OracleSwap's reputation require(closefee <= 250); require(longRate <= 250 && longRate >= -250); require(shortRate <= 250 && shortRate >= -250); Book b = Book(books[msg.sender]); b.updateFeesBook(uint8(closefee), int16(longRate), int16(shortRate)); emit RatesUpdated(msg.sender, uint8(closefee), int16(longRate), int16(shortRate)); } function changeFeeAddress(address payable newAddress) external onlyAdmin { feeAddress = newAddress; } /** this is where money is sent from the Book contract to a player's account * the player can then withdraw this to their personal address */ function balanceInput(address recipient) external payable { assetSwapBalance[recipient] += msg.value; } /** fees are in basis points of national, as in the case when updating the fees * minimum RM is in Szabo, so 4 would imply a minimum RM of 4 Szabo */ function createBook(uint16 _min, uint _closefee, int frLong, int frShort) external payable returns (address newBook) { require(books[msg.sender] == address(0), "User must not have a preexisting book"); require(msg.value >= uint(_min) * 10 szabo, "Must prep for book"); require(_min >= 1); int16 longRate = int16(frLong * levRatio / 1e2); int16 shortRate = int16(frShort * levRatio / 1e2); uint8 closefee = uint8(_closefee * uint(levRatio) / 1e2); require(longRate <= 250 && longRate >= -250); require(shortRate <= 250 && shortRate >= -250); require(closefee <= 250); books[msg.sender] = address(new Book(msg.sender, address(this), _min, closefee, longRate, shortRate)); Book b = Book(books[msg.sender]); b.fundLPBook.value(msg.value)(); emit LPNewBook(msg.sender, books[msg.sender]); return books[msg.sender]; } function fundLP(address _lp) external payable { require(books[_lp] != address(0)); Book b = Book(books[_lp]); b.fundLPBook.value(msg.value)(); } function fundTaker(address _lp, bytes32 subkID) external payable { require(books[_lp] != address(0)); Book b = Book(books[_lp]); b.fundTakerBook.value(msg.value)(subkID); } function burnTaker(address _lp, bytes32 subkID) external payable { require(books[_lp] != address(0)); Book b = Book(books[_lp]); uint refund = b.burnTakerBook(subkID, msg.sender, msg.value); emit BurnHist(_lp, subkID, msg.sender, now); assetSwapBalance[msg.sender] += refund; } function burnLP() external payable { require(books[msg.sender] != address(0)); Book b = Book(books[msg.sender]); uint refund = b.burnLPBook(msg.value); bytes32 abcnull; emit BurnHist(msg.sender, abcnull, msg.sender, now); assetSwapBalance[msg.sender] += refund; } function cancel(address _lp, bytes32 subkID, bool closeNow) external payable { require(hourOfDay() != 16, "Cannot cancel during 4 PM ET hour"); Book b = Book(books[_lp]); uint8 priceDay = oracle.getStartDay(); uint8 endDay = 5; if (closeNow) endDay = priceDay; b.cancelBook.value(msg.value)(lastOracleSettleTime, subkID, msg.sender, endDay); } function closeBook(address _lp) external payable { require(msg.sender == _lp); require(books[_lp] != address(0)); Book b = Book(books[_lp]); b.closeBookBook.value(msg.value)(); } function redeem(address _lp, bytes32 subkID) external { require(books[_lp] != address(0)); Book b = Book(books[_lp]); b.redeemBook(subkID, msg.sender); emit SubkTracker(_lp, msg.sender, subkID, false); } /** once started, this process requires a total of at least 4 separate executions. * Each execution is limited to processing 200 subcontracts to avoid gas limits, so if there * are more than 200 accounts in any step they will have to be executed multiple times * eg, 555 new accounts would require 3 executions of that step */ function settleParts(address _lp) external returns (bool isComplete) { require(books[_lp] != address(0)); Book b = Book(books[_lp]); uint lastBookSettleTime = b.lastBookSettleTime(); require(now > (lastOracleSettleTime + 24 hours)); require(lastOracleSettleTime > lastBookSettleTime, "one settle per week"); uint settleNumb = b.settleNum(); if (settleNumb < 1e4) { b.settleExpiring(assetReturns[1]); } else if (settleNumb < 2e4) { b.settleRolling(assetReturns[0][0]); } else if (settleNumb < 3e4) { b.settleNew(assetReturns[0]); } else if (settleNumb == 3e4) { b.settleFinal(); isComplete = true; } } function settleBatch(address _lp) external { require(books[_lp] != address(0)); Book b = Book(books[_lp]); uint lastBookSettleTime = b.lastBookSettleTime(); require(now > (lastOracleSettleTime + 24 hours)); require(lastOracleSettleTime > lastBookSettleTime, "one settle per week"); /// the 5x1 vector of returns in units of szabo, where 0.6 is a +60% of RM payoff, /// -0.6 is a -60% of RM payoff. The refer to initial price days to settlement day b.settleExpiring(assetReturns[1]); /// this is the settle to settle return b.settleRolling(assetReturns[0][0]); /// this is the return from the last settlement day to the price day /// for regular closes, the price day == 5, so it is a settlement to settlement return b.settleNew(assetReturns[0]); b.settleFinal(); } function take(address _lp, uint rm, bool isTakerLong) external payable returns (bytes32 newsubkID) { require(rm < 3, "above max size"); // This is to make this contract economically trivial /// a real contract would allow positions much greater than 2 szabos rm = rm * 1 szabo; require(msg.value >= 3 * rm / 2, "Insuffient ETH for your RM"); require(hourOfDay() != 16, "Cannot take during 4 PM ET hour"); uint takerLong; if (isTakerLong) takerLong = 1; else takerLong = 0; /// starting price is taken from the oracle contract based on what the next price day is uint8 priceDay = oracle.getStartDay(); Book book = Book(books[_lp]); newsubkID = book.takeBook.value(msg.value)(msg.sender, rm, lastOracleSettleTime, priceDay, takerLong); emit SubkTracker(_lp, msg.sender, newsubkID, true); } /** withdraw amounts are in 1/1000 of the unit of denomination * Thus, 1234 is 1.234 Szabo */ function withdrawLP(uint amount) external { require(amount > 0); require(books[msg.sender] != address(0)); Book b = Book(books[msg.sender]); amount = 1e9 * amount; b.withdrawLPBook(amount, lastOracleSettleTime); } function withdrawTaker(uint amount, address _lp, bytes32 subkID) external { require(amount > 0); require(books[_lp] != address(0)); Book b = Book(books[_lp]); amount = 1e9 * amount; b.withdrawTakerBook(subkID, amount, lastOracleSettleTime, msg.sender); } /// one can withdraw from one's assetSwap balance at any time. It can only send the entire amount function withdrawFromAssetSwap() external { uint amount = assetSwapBalance[msg.sender]; require(amount > 0); assetSwapBalance[msg.sender] = 0; msg.sender.transfer(amount); } function inactiveOracle(address _lp) external { require(books[_lp] != address(0)); Book b = Book(books[_lp]); b.inactiveOracleBook(); } function inactiveLP(address _lp, bytes32 subkID) external { require(books[_lp] != address(0)); Book b = Book(books[_lp]); b.inactiveLPBook(subkID, msg.sender, lastOracleSettleTime); } function getBookData(address _lp) external view returns (address book, // balances in wei uint lpMargin, uint totalLpLong, uint totalLpShort, uint lpRM, /// in Szabo uint bookMinimum, /// in basis points as a percent of RM /// to convert to notional, we multiply by the leverage ratio int16 longFundingRate, int16 shortFundingRate, uint8 lpCloseFee, /** 0 is fine, 1 means book cancels at next settlement * 2 means LP burned (which cancels the book at next settlement) * 3 book is inactive, no more settling or new positions */ uint8 bookStatus ) { book = books[_lp]; if (book != address(0)) { Book b = Book(book); lpMargin = b.margin(0); totalLpLong = b.margin(1); totalLpShort = b.margin(2); lpRM = b.margin(3); bookMinimum = b.lpMinTakeRM(); longFundingRate = b.fundingRates(1); shortFundingRate = b.fundingRates(0); lpCloseFee = b.bookCloseFee(); bookStatus = b.bookStatus(); } } function getSubkData1(address _lp, bytes32 subkID) external view returns ( address taker, /// in wei uint takerMargin, uint reqMargin ) { address book = books[_lp]; if (book != address(0)) { Book b = Book(book); (taker, takerMargin, reqMargin) = b.getSubkData1Book(subkID); } } function getSubkData2(address _lp, bytes32 subkID) external view returns ( /** 0 new, 1 active and rolled over, 2 taker cancelled, 3 LP cancelled, * 4 intraweek cancelled, 5 taker burned, 6 taker default/redeemable, 7 inactive/redeemable */ uint8 subkStatus, /// for new and expiring subcontracts, either the start or end price that week uint8 priceDay, /** the LP's closing fee, in basis points as a percent of the RM. The total closing fee * is this plus 2.5% of RM, the oracle's fee */ uint8 closeFee, /// the funding rate paid by the taker, which may be negative int16 fundingRate, /// true for taker is long (and thus LP is short) bool takerSide ) { address book = books[_lp]; if (book != address(0)) { Book b = Book(book); (subkStatus, priceDay, closeFee, fundingRate, takerSide) = b.getSubkData2Book(subkID); } } function getSettleInfo(address _lp) external view returns ( /// total number of taker subcontracts, including new, rolled-over, cancelled, and inactive subcontracts uint totalLength, /// taker subcontracts that are expiring at next settlement uint expiringLength, /// taker subcontracts that have not yet settled. Such positions cannot be cancelled. The next week, /// they will be 'active', and cancelable. uint newLength, /// time of last book settlement, in seconds from 1970, Greenwich Mean Time uint lastBookSettleUTC, /// this is used for assessing the progress of a settlement when it is too large to be /// executed in batch. uint settleNumber, /// amount of ETH in the LP book uint bookBalance, /// an LP can close they book en masse, which would push the maturity of the book to 28 days after /// the close is instantiated. Takers should take note. A taker does not pay a cancel fee when /// the LP cancels their book, but they must then wait until the final settlement uint bookMaturityUTC ) { address book = books[_lp]; if (book != address(0)) { Book b = Book(book); (totalLength, expiringLength, newLength, lastBookSettleUTC, settleNumber, bookBalance, bookMaturityUTC) = b.getSettleInfoBook(); } } /** * This gives the raw asset returns for all potential start and end dates: 5 different returns * for new positions (price day to settlement day), and 5 for expiring positions (last settlement to price day) * these are posted by the Oracle at the settlemnet price update. * They are in % return * Leverage Ratio times 1 Szabo, * this allows the books to simply apply these numbers to the RM of the various subcontracts to generate the * weekly PNL. They are capped at +/- 0.975e12 (the unit of account in this contract, szabo), * so that the extreme case of a maximum funding rate, the liability * is never greater than 1 Szabo. This effectively caps player liability at their RM */ function updateReturns(int[5] memory assetRetNew, int[5] memory assetRetExp) public { require(msg.sender == address(oracle)); assetReturns[0] = assetRetNew; assetReturns[1] = assetRetExp; lastOracleSettleTime = now; } function hourOfDay() public view returns(uint hour1) { uint nowTemp = now; /** * 2020 Summer, 1583668800 = March 8 2020 through 1604232000 = November 1 2020 * 2021 Summer, 1615705200 = March 14 2021 through 1636264800 = November 7 2021 * 2022 summer, 1647154800 = March 13 2022 through 1667714400 = November 6 2022 * summer is Daylight Savings Time in the US, where the hour is GMT - 5 in New York City * winter is Standard Time in the US, where the hour is GMT - 4 in New York City * No takes from 4-5 PM NYC time, so hour == 16 is the exclusion time * hour1 takes the number of seconds in the day at this time (nowTemp % 86400), * and divideds by the number of seconds in an hour 3600 */ hour1 = (nowTemp % 86400) / 3600 - 5; if ((nowTemp > 1583668800 && nowTemp < 1604232000) || (nowTemp > 1615705200 && nowTemp < 1636264800) || (nowTemp > 1647154800 && nowTemp < 1667714400)) hour1 = hour1 + 1; } function subzero(uint _a, uint _b) internal pure returns (uint) { if (_b >= _a) { return 0; } return _a - _b; } }
pragma solidity 0.6.3; import "./AssetSwap.sol"; /** MIT License Copyright © 2020 Eric G. Falkenstein Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ contract Book { constructor(address user, address admin, uint16 minReqMarg, uint8 closefee, int16 fundRateLong, int16 fundRateShort) public { assetSwap = AssetSwap(admin); lp = user; lpMinTakeRM = minReqMarg; lastBookSettleTime = now; bookCloseFee = closefee; fundingRates[0] = fundRateShort; fundingRates[1] = fundRateLong; bookEndTime = now + 1100 days; } address public lp; AssetSwap public assetSwap; /// 0 is actual or total margin, 1 is sum of LP's short takers /// 2 is sum of LP's long takers, 3 is the LP's required margin /// units an in wei, and refer to the RM, not the notional uint[4] public margin; uint public lastBookSettleTime; uint public burnFactor = 1 szabo; uint public settleNum; int public lpSettleDebitAcct; uint public bookEndTime; int16[2] public fundingRates; uint16 public lpMinTakeRM; uint8 public bookStatus; uint8 public bookCloseFee; bytes32[][2] public tempContracts; bytes32[] public takerContracts; mapping(bytes32 => Subcontract) public subcontracts; struct Subcontract { address taker; uint takerMargin; /// in wei uint requiredMargin; /// in wei uint16 index; int16 fundingRate; uint8 closeFee; uint8 subkStatus; uint8 priceDay; int8 takerSide; /// 1 if long, -1 if short } modifier onlyAdmin() { require(msg.sender == address(assetSwap)); _; } function adjustMinRMBook(uint16 _min) external onlyAdmin { lpMinTakeRM = _min; } function updateFeesBook(uint8 newClose, int16 longRate, int16 shortRate) external onlyAdmin { fundingRates[0] = shortRate; fundingRates[1] = longRate; bookCloseFee = newClose; } function burnTakerBook(bytes32 subkID, address sender, uint msgval) external onlyAdmin returns (uint) { Subcontract storage k = subcontracts[subkID]; require(sender == k.taker, "must by party to his subcontract"); require(settleNum == 0, "not during settlement process"); require(k.subkStatus < 5, "can only burn active subcontract"); uint burnFee = k.requiredMargin / 2; require(msgval >= burnFee, "Insufficient burn fee"); burnFee = subzero(msgval, burnFee); /** The taker's RM as a percent of the larger of the long or short * side is used to decrement the credits of those at the upcoming settlement * This prevents the burnFactor from going below zero. It is also the likely * side of oracle cheating, as otherwise this implies a greater loss * of future revenue relative to the cheat. Further, it implies the oracle * 'left money on the table' because it did not maximize its position. This assumption, * is not necessary for the incentive effect to work. */ if (margin[1] > margin[2]) { burnFactor = subzero(burnFactor, 1 szabo * k.requiredMargin / margin[1]); } else { burnFactor = subzero(burnFactor, 1 szabo * k.requiredMargin / margin[2]); } k.subkStatus = 5; return burnFee; } function burnLPBook(uint msgval) external onlyAdmin returns (uint) { require(bookStatus != 2, "can only burn once"); /// burn fee is 50% of RM uint burnFee = margin[3] / 2; require(msgval >= burnFee, "Insufficient burn fee"); burnFee = subzero(msgval, burnFee); /** The entire LP RM as a percent of the larger of the long or short * side is used to decrement the credits of those at the upcoming settlement */ if (margin[2] > margin[1]) { burnFactor = subzero(burnFactor, 1 szabo * margin[3] / margin[2]); } else { burnFactor = subzero(burnFactor, 1 szabo * margin[3] / margin[1]); } bookStatus = 2; return burnFee; } function cancelBook(uint lastOracleSettle, bytes32 subkID, address sender, uint8 _endDay) external payable onlyAdmin { Subcontract storage k = subcontracts[subkID]; require(lastOracleSettle < lastBookSettleTime, "Cannot do during settle period"); require(sender == k.taker || sender == lp, "Canceller not LP or taker"); /// checks to see if subk already cancelled, as otherwise redundant require(k.subkStatus == 1, "redundant or too new"); uint feeOracle = 250 * k.requiredMargin / 1e4; /// users sends enough to cover the maximum cancel fee. /// Cancel fee less than the maximum is just sent to the taker's margin account require(msg.value >= (2 * feeOracle), "Insufficient cancel fee"); uint feeLP = uint(k.closeFee) * k.requiredMargin / 1e4; if (bookEndTime < (now + 28 days)) { feeLP = 0; feeOracle = 0; } if (sender == k.taker && _endDay == 5) { k.subkStatus = 2; /// regular taker cancel } else if (sender == k.taker) { require(k.requiredMargin < subzero(margin[0], margin[3]), "Insuff LP RM for immed cancel"); feeLP = feeOracle; /// close fee is now max close fee, overriding initial close fee k.subkStatus = 4; /// immediate taker cancel k.priceDay = _endDay; /// this is the end-day of the subcontract's last week } else { feeOracle = 2 * feeOracle; feeLP = subzero(msg.value, feeOracle); /// this is really a refund to the LP, not a fee k.subkStatus = 3; /// LP cancel } balanceSend(feeOracle, assetSwap.feeAddress()); tempContracts[1].push(subkID); /// sets this up to settle as an expiring subcontract margin[0] += feeLP; k.takerMargin += subzero(msg.value, feeLP + feeOracle); } function fundLPBook() external onlyAdmin payable { margin[0] += msg.value; } function fundTakerBook(bytes32 subkID) external onlyAdmin payable { Subcontract storage k = subcontracts[subkID]; require(k.subkStatus < 2); k.takerMargin += msg.value; } function closeBookBook() external payable onlyAdmin { /// pays the close fee on the larger side of her book uint feeOracle = 250 * (margin[1] + margin[2] - min(margin[1], margin[2])) / 1e4; require(msg.value >= feeOracle, "Insufficient cancel fee"); uint feeOverpay = msg.value - feeOracle; balanceSend(feeOracle, assetSwap.feeAddress()); if (now > bookEndTime) /// this means the next settlement ends this book's activity bookStatus = 1; else /// if initial, needs to be run again in 28 days to complete the shut down bookEndTime = now + 28 days; margin[0] += feeOverpay; } /** *We only need look at when the last book settlement because * if the LP was at fault, someone could have inactivatedthe LP * and received a reward. Thus, the only scenario where a book * can be active and the LP not inactivated, is when the oracle has been * absent for a week */ function inactiveOracleBook() external onlyAdmin { require(now > (lastBookSettleTime + 10 days)); bookStatus = 3; } /** if the book was not settled, the LP is held accountable * the first counterparty to execute this function will then get a bonus credit of their RM from *the LP * if the LP's total margin is zero, they will get whatever is there * after the book is in default all players can redeem their subcontracts * After a book is in default, this cannot be executed */ function inactiveLPBook(bytes32 subkID, address sender, uint _lastOracleSettle) external onlyAdmin { require(bookStatus != 3); Subcontract storage k = subcontracts[subkID]; require(k.taker == sender); require(_lastOracleSettle > lastBookSettleTime); require(subzero(now, _lastOracleSettle) > 48 hours); uint lpDefFee = min(margin[0], margin[3] / 2); margin[0] = subzero(margin[0], lpDefFee); margin[3] = 0; bookStatus = 3; /// annoying, but at least someone good get the negligent LP's money k.takerMargin += lpDefFee; } function redeemBook(bytes32 subkid, address sender) external onlyAdmin { Subcontract storage k = subcontracts[subkid]; require(k.subkStatus > 5 || bookStatus == 3); /// redemption can happen if the subcontract has defaulted subkStatus = 6, is inactive subkStatus = 7 /// or if the book is inactive (bookStatus == 3) uint tMargin = k.takerMargin; k.takerMargin = 0; uint16 index = k.index; /// iff the taker defaulted on an active book, they are penalized by /// burning RM/2 of their margin bool isDefaulted = (k.subkStatus == 6 && bookStatus == 0); uint defPay = k.requiredMargin / 2; uint lpPayment; address tAddress = k.taker; /// this pays the lp for the gas and effort of redeeming for the taker /// The investor should now see their margin in the /// assetSwapBalance, and withdraw from there. It is not meant to generate /// LP profit, just pay them for the inconvenience and gas if (sender == lp) { lpPayment = tMargin - subzero(tMargin, 2e9); tMargin -= lpPayment; margin[0] += lpPayment; } /// this pays the lp for the gas and effort of redeeming for the taker /// it's just 2 finney. The investor should now see their margin in the /// assetSwapBalance, and withdraw from there /** we have to pop the takerLong/Short lists to free up space * this involves this little trick, moving the last row to the row we are * redeeming and writing it over the redeemed subcontract * then we remove the duplicate. */ Subcontract storage lastTaker = subcontracts[takerContracts[takerContracts.length - 1]]; lastTaker.index = index; takerContracts[index] = takerContracts[takerContracts.length - 1]; takerContracts.pop(); delete subcontracts[subkid]; // we only take what is there. It goes to the oracle, so if he's a cheater, you can punish /// him more by withholding this payment as well as the fraudulent PNL. If he's not a cheater /// then you are just negligent for defaulting and probably were not paying attention, as /// you should have know you couldn't cure your margin Friday afternoon before close. if (isDefaulted) { tMargin = subzero(tMargin, defPay); balanceSend(defPay, assetSwap.feeAddress()); } /// money is sent to AssetSwapContract balanceSend(tMargin, tAddress); } /** Settle the rolled over taker sukcontracts * @param assetRet the returns for a long contract for a taker for only one * start day, as they are all starting on the prior settlement price */ function settleRolling(int assetRet) external onlyAdmin { require(settleNum < 2e4, "done with rolling settle"); int takerRetTemp; int lpTemp; /// the first settlement function set the settleNum = 1e4, so that is subtracted to /// see where we are in the total number of takers in the LP's book uint loopCap = min(settleNum - 1e4 + 250, takerContracts.length); for (uint i = (settleNum - 1e4); i < loopCap; i++) { Subcontract storage k = subcontracts[takerContracts[i]]; if (k.subkStatus == 1) { takerRetTemp = int(k.takerSide) * assetRet * int(k.requiredMargin) / 1 szabo - (int(k.fundingRate) * int(k.requiredMargin) / 1e4); lpTemp = lpTemp - takerRetTemp; if (takerRetTemp < 0) { k.takerMargin = subzero(k.takerMargin, uint(-takerRetTemp)); } else { k.takerMargin += uint(takerRetTemp) * burnFactor / 1 szabo; } if (k.takerMargin < k.requiredMargin) { k.subkStatus = 6; if (k.takerSide == 1) margin[2] = subzero(margin[2], k.requiredMargin); else margin[1] = subzero(margin[1], k.requiredMargin); } } } settleNum += 250; if ((settleNum - 1e4) >= takerContracts.length) settleNum = 2e4; lpSettleDebitAcct += lpTemp; } /// this is the fourth and the final of the settlement functions function settleFinal() external onlyAdmin { require(settleNum == 3e4, "not done with all the subcontracts"); /// this take absolute value of (long - short) to update the LP's RM if (margin[2] > margin[1]) margin[3] = margin[2] - margin[1]; else margin[3] = margin[1] - margin[2]; if (lpSettleDebitAcct < 0) margin[0] = subzero(margin[0], uint(-lpSettleDebitAcct)); else /// if the lpSettleDebitAcct is positive, we add it, but first apply the burnFactor /// to remove the burner's pnl in a pro-rata way margin[0] = margin[0] + uint(lpSettleDebitAcct) * burnFactor / 1 szabo; if (bookStatus != 0) { bookStatus = 3; margin[3] = 0; } else if (margin[0] < margin[3]) { // default scenario for LP bookStatus = 3; uint defPay = min(margin[0], margin[3] / 2); margin[0] = subzero(margin[0], defPay); balanceSend(defPay, assetSwap.feeAddress()); margin[3] = 0; } // resets for our next book settlement lpSettleDebitAcct = 0; lastBookSettleTime = now; settleNum = 0; delete tempContracts[1]; delete tempContracts[0]; burnFactor = 1 szabo; } /** Create a new Taker long subcontract of the given parameters * @param taker the address of the party on the other side of the contract * @param rM the Szabo amount in the required margin * isTakerLong is +1 if taker is long, 0 if taker is short * @return subkID the id of the newly created subcontract */ function takeBook(address taker, uint rM, uint lastOracleSettle, uint8 _priceDay, uint isTakerLong) external payable onlyAdmin returns (bytes32 subkID) { require(bookStatus == 0, "book no longer taking positions"); require((now + 28 days) < bookEndTime, "book closing soon"); require(rM >= uint(lpMinTakeRM) * 1 szabo, "must be greater than book min"); require(lastOracleSettle < lastBookSettleTime, "Cannot do during settle period"); require(takerContracts.length < 4000, "book is full"); uint availableMargin = subzero(margin[0] / 2 + margin[2 - isTakerLong], margin[1 + isTakerLong]); require(rM <= availableMargin && (margin[0] - margin[3]) > rM); require(rM <= availableMargin); margin[1 + isTakerLong] += rM; Subcontract memory order; order.requiredMargin = rM; order.takerMargin = msg.value; order.taker = taker; order.takerSide = int8(2 * isTakerLong - 1); margin[3] += rM; subkID = keccak256(abi.encodePacked(now, takerContracts.length)); order.index = uint16(takerContracts.length); order.priceDay = _priceDay; order.fundingRate = fundingRates[isTakerLong]; order.closeFee = bookCloseFee; subcontracts[subkID] = order; takerContracts.push(subkID); tempContracts[0].push(subkID); return subkID; } /** Withdrawing margin * reverts if during the settle period, oracleSettleTime > book settle time * also must leave total margin greater than the required margin */ function withdrawLPBook(uint amount, uint lastOracleSettle) external onlyAdmin { require(margin[0] >= amount, "Cannot withdraw more than the margin"); // if book is dead LP can take everything left, if not dead, can only take up to RM if (bookStatus != 3) { require(subzero(margin[0], amount) >= margin[3], "Cannot w/d more than excess margin"); require(lastOracleSettle < lastBookSettleTime, "Cannot w/d during settle period"); } margin[0] = subzero(margin[0], amount); balanceSend(amount, lp); } function withdrawTakerBook(bytes32 subkID, uint amount, uint lastOracleSettle, address sender) external onlyAdmin { require(lastOracleSettle < lastBookSettleTime, "Cannot w/d during settle period"); Subcontract storage k = subcontracts[subkID]; require(k.subkStatus < 6, "subk dead, must redeem"); require(sender == k.taker, "Must be taker to call this function"); require(subzero(k.takerMargin, amount) >= k.requiredMargin, "cannot w/d more than excess margin"); k.takerMargin = subzero(k.takerMargin, amount); balanceSend(amount, k.taker); } function getSubkData1Book(bytes32 subkID) external view returns (address takerAddress, uint takerMargin, uint requiredMargin) { Subcontract memory k = subcontracts[subkID]; takerAddress = k.taker; takerMargin = k.takerMargin; requiredMargin = k.requiredMargin; } function getSubkData2Book(bytes32 subkID) external view returns (uint8 kStatus, uint8 priceDay, uint8 closeFee, int16 fundingRate, bool takerSide) { Subcontract memory k = subcontracts[subkID]; kStatus = k.subkStatus; priceDay = k.priceDay; closeFee = k.closeFee; fundingRate = k.fundingRate; if (k.takerSide == 1) takerSide = true; } function getSettleInfoBook() external view returns (uint totalLength, uint expiringLength, uint newLength, uint lastBookSettleUTC, uint settleNumber, uint bookBalance, uint bookMaturityUTC) { totalLength = takerContracts.length; expiringLength = tempContracts[1].length; newLength = tempContracts[0].length; lastBookSettleUTC = lastBookSettleTime; settleNumber = settleNum; bookMaturityUTC = bookEndTime; bookBalance = address(this).balance; } /** Settle the taker long sukcontracts * priceDay Expiring returns use the return from the last settle to the priceDay, which * for regular cancels is just 5, the most recent settlement price * this is the first of 4 settlement functions * */ function settleExpiring(int[5] memory assetRetExp) public onlyAdmin { require(bookStatus != 3 && settleNum < 1e4, "done with expiry settle"); int takerRetTemp; int lpTemp; uint loopCap = min(settleNum + 200, tempContracts[1].length); for (uint i = settleNum; i < loopCap; i++) { Subcontract storage k = subcontracts[tempContracts[1][i]]; takerRetTemp = int(k.takerSide) * assetRetExp[k.priceDay - 1] * int(k.requiredMargin) / 1 szabo - (int(k.fundingRate) * int(k.requiredMargin) / 1e4); lpTemp -= takerRetTemp; if (takerRetTemp < 0) { k.takerMargin = subzero(k.takerMargin, uint(-takerRetTemp)); } else { k.takerMargin += uint(takerRetTemp) * burnFactor / 1 szabo; } if (k.takerSide == 1) margin[2] = subzero(margin[2], k.requiredMargin); else margin[1] = subzero(margin[1], k.requiredMargin); k.subkStatus = 7; } settleNum += 200; if (settleNum >= tempContracts[1].length) settleNum = 1e4; lpSettleDebitAcct += lpTemp; } /// this is the third of the settlement functions function settleNew(int[5] memory assetRets) public onlyAdmin { require(settleNum < 3e4, "done with new settle"); int takerRetTemp; int lpTemp; /// after running the second settlement function, settleRolling, it is set to 2e4 uint loopCap = min(settleNum - 2e4 + 200, tempContracts[0].length); for (uint i = (settleNum - 2e4); i < loopCap; i++) { Subcontract storage k = subcontracts[tempContracts[0][i]]; /// subkStatus set to 'active' which means it can be cancelled /// it will also be settled in the settleRolling if not cancelled /// using the more efficient settlement that uses just one return, from last to most recent settlement k.subkStatus = 1; if (k.priceDay != 5) { takerRetTemp = int(k.takerSide) * assetRets[k.priceDay] * int(k.requiredMargin) / 1 szabo - (int(k.fundingRate) * int(k.requiredMargin) / 1e4); lpTemp = lpTemp - takerRetTemp; if (takerRetTemp < 0) { k.takerMargin = subzero(k.takerMargin, uint(-takerRetTemp)); } else { k.takerMargin += uint(takerRetTemp) * burnFactor / 1 szabo; } if (k.takerMargin < k.requiredMargin) { k.subkStatus = 6; if (k.takerSide == 1) margin[2] = subzero(margin[2], k.requiredMargin); else margin[1] = subzero(margin[1], k.requiredMargin); } k.priceDay = 5; } } settleNum += 200; if (settleNum >= tempContracts[0].length) settleNum = 3e4; lpSettleDebitAcct += lpTemp; } /// Function to send balances back to the Assetswap contract function balanceSend(uint amount, address recipient) internal { assetSwap.balanceInput.value(amount)(recipient); } /** Utility function to find the minimum of two unsigned values * @notice returns the first parameter if they are equal */ function min(uint a, uint b) internal pure returns (uint) { if (a <= b) return a; else return b; } function subzero(uint _a, uint _b) internal pure returns (uint) { if (_b >= _a) return 0; else return _a - _b; } }
pragma solidity 0.6.3; import "./AssetSwap.sol"; /** MIT License Copyright © 2020 Eric G. Falkenstein Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ contract Oracle { constructor (uint ethPrice, uint spxPrice, uint btcPrice) public { admins[msg.sender] = true; prices[0][5] = ethPrice; prices[1][5] = spxPrice; prices[2][5] = btcPrice; lastUpdateTime = now; lastSettleTime = now; currentDay = 5; levRatio[0] = 250; // ETH contract 2.5 leverage levRatio[1] = 1000; /// SPX contract 10.0 leverage levRatio[2] = 250; // BTC contract 2.5 leverage } address[3] public assetSwaps; uint[6][3] private prices; uint public lastUpdateTime; uint public lastSettleTime; int[3] public levRatio; uint8 public currentDay; bool public nextUpdateSettle; mapping(address => bool) public admins; mapping(address => bool) public readers; event PriceUpdated( uint ethPrice, uint spxPrice, uint btcPrice, uint eUTCTime, uint eDayNumber, bool eisCorrection ); event AssetSwapContractsChange( address ethSwapContract, address spxSwapContract, address btcSwapContract ); event ChangeReaderStatus( address reader, bool onOrOff ); modifier onlyAdmin() { require(admins[msg.sender]); _; } /** Grant write priviledges to a user, * mainly intended for when the admin wants to switch accounts, ie, paired with a removal */ function addAdmin(address newAdmin) external onlyAdmin { admins[newAdmin] = true; } function removeAdmin(address toRemove) external onlyAdmin { require(toRemove != msg.sender); admins[toRemove] = false; } /** Grant priviledges to a user accessing price data on the blockchain * @param newReader the address. Any reader is thus approved by the oracle/admin * useful for new contracts that use this oracle, in that the oracle would not * need to create a new oracle contract for ETH prices */ function addReaders(address newReader) external onlyAdmin { readers[newReader] = true; emit ChangeReaderStatus(newReader, true); } function removeReaders(address oldReader) external onlyAdmin { readers[oldReader] = false; emit ChangeReaderStatus(oldReader, false); } /** this can only be done once, so this oracle is solely for working with * three AssetSwap contracts * assetswap 0 is the ETH, at 2.5 leverage * assetswap 1 is the SPX, at 10x leverage * assetswap 2 is the BTC, at 2.5 leverage * */ function changeAssetSwaps(address newAS0, address newAS1, address newAS2) external onlyAdmin { require(now > lastSettleTime && now < lastSettleTime + 1 days, "only 1 day after settle"); assetSwaps[0] = newAS0; assetSwaps[1] = newAS1; assetSwaps[2] = newAS2; readers[newAS0] = true; readers[newAS1] = true; readers[newAS2] = true; emit AssetSwapContractsChange(newAS0, newAS1, newAS2); } /** Quickly fix an erroneous price, or correct the fact that 50% movements are * not allowed in the standard price input * this must be called within 60 minutes of the initial price update occurence */ function editPrice(uint _ethprice, uint _spxprice, uint _btcprice) external onlyAdmin { require(now < lastUpdateTime + 60 minutes); prices[0][currentDay] = _ethprice; prices[1][currentDay] = _spxprice; prices[2][currentDay] = _btcprice; emit PriceUpdated(_ethprice, _spxprice, _btcprice, now, currentDay, true); } function updatePrices(uint ethp, uint spxp, uint btcp, bool _newFinalDay) external onlyAdmin { /// no updates within 20 hours of last update require(now > lastUpdateTime + 20 hours); /** can't be executed if the next price should be a settlement price * settlement prices are special because they need to update the asset returns * and sent to the AssetSwap contracts */ require(!nextUpdateSettle); /// after settlement update, at least 48 hours until new prices are posted require(now > lastSettleTime + 48 hours, "too soon after last settle"); /// prevents faulty prices, as stale prices are a common source of bad prices. require(ethp != prices[0][currentDay] && spxp != prices[1][currentDay] && btcp != prices[2][currentDay]); /// extreme price movements are probably mistakes. They can be posted /// but only via a 'price edit' that must be done within 60 minutes of the initial update /// many errors generate inputs off by orders of magnitude, which imply returns of >100% or <-90% require((ethp * 10 < prices[0][currentDay] * 15) && (ethp * 10 > prices[0][currentDay] * 5)); require((spxp * 10 < prices[1][currentDay] * 15) && (spxp * 10 > prices[1][currentDay] * 5)); require((btcp * 10 < prices[2][currentDay] * 15) && (btcp * 10 > prices[2][currentDay] * 5)); if (currentDay == 5) { currentDay = 1; } else { currentDay += 1; nextUpdateSettle = _newFinalDay; } if (currentDay == 4) nextUpdateSettle = true; updatePriceSingle(0, ethp); updatePriceSingle(1, spxp); updatePriceSingle(2, btcp); emit PriceUpdated(ethp, spxp, btcp, now, currentDay, false); lastUpdateTime = now; } function settlePrice(uint ethp, uint spxp, uint btcp) external onlyAdmin { require(nextUpdateSettle); require(now > lastUpdateTime + 20 hours); require(ethp != prices[0][currentDay] && spxp != prices[1][currentDay] && btcp != prices[2][currentDay]); require((ethp * 10 < prices[0][currentDay] * 15) && (ethp * 10 > prices[0][currentDay] * 5)); require((spxp * 10 < prices[1][currentDay] * 15) && (spxp * 10 > prices[1][currentDay] * 5)); require((btcp * 10 < prices[2][currentDay] * 15) && (btcp * 10 > prices[2][currentDay] * 5)); currentDay = 5; nextUpdateSettle = false; updatePriceSingle(0, ethp); updatePriceSingle(1, spxp); updatePriceSingle(2, btcp); int[5] memory assetReturnsNew; int[5] memory assetReturnsExpiring; int cap = 975 * 1 szabo / 1000; for (uint j = 0; j < 3; j++) { /** asset return from start day j to settle day (ie, day 5), * and also the prior settle day (day 0) to the end day. * returns are normalized from 0.975 szabo to - 0.975 szabo * where 0.9 szabo is a 90% of RM profit for the long taker, * 0.2 szabo means a 20% of RM profit for the long taker. */ for (uint i = 0; i < 5; i++) { if (prices[0][i] != 0) { int assetRetFwd = int(prices[j][5] * 1 szabo / prices[j][i]) - 1 szabo; assetReturnsNew[i] = assetRetFwd * int(prices[0][i]) * levRatio[j] / int(prices[0][5]) / 100; /** as funding rates are maxed out at 2.5% of RM, the return must * max out at 97.5% of RM so that required margins cover all * potential payment scenarios */ assetReturnsNew[i] = bound(assetReturnsNew[i], cap); } if (prices[0][i+1] != 0) { int assetRetBack = int(prices[j][i+1] * 1 szabo / prices[j][0]) - 1 szabo; assetReturnsExpiring[i] = assetRetBack * int(prices[0][0]) * levRatio[j] / int(prices[0][i+1]) / 100; assetReturnsExpiring[i] = bound(assetReturnsExpiring[i], cap); } } /// this updates the AssetSwap contract with the vector of returns, /// one for each day of the week AssetSwap asw = AssetSwap(assetSwaps[j]); asw.updateReturns(assetReturnsNew, assetReturnsExpiring); } lastSettleTime = now; emit PriceUpdated(ethp, spxp, btcp, now, currentDay, false); lastUpdateTime = now; } /** Return the entire current price array for a given asset * @param _assetID the asset id of the desired asset * @return _priceHist the price array in USD for the asset * @dev only the admin and addresses granted readership may call this function * While only an admin or reader can access this within the EVM * anyone can access these prices outside the EVM * eg, in javascript: OracleAddress.methods.getUsdPrices.cacheCall(0, { 'from': 'AdminAddress' } */ function getUsdPrices(uint _assetID) public view returns (uint[6] memory _priceHist) { require(admins[msg.sender] || readers[msg.sender]); _priceHist = prices[_assetID]; } /** Return only the latest prices * @param _assetID the asset id of the desired asset * @return _price the latest price of the given asset * @dev only the admin or a designated reader may call this function within the EVM */ function getCurrentPrice(uint _assetID) public view returns (uint _price) { require(admins[msg.sender] || readers[msg.sender]); _price = prices[_assetID][currentDay]; } /** * @return _startDay relevant for trades done now * pulls the day relevant for new AssetSwap subcontracts * startDay 2 means the 2 slot (ie, the third) of prices will be the initial * price for the subcontract. As 5 is the top slot, and rolls into slot 0 * the next week, the next pricing day is 1 when the current day == 5 * (this would be a weekend or Monday morning) */ function getStartDay() public view returns (uint8 _startDay) { if (nextUpdateSettle) { _startDay = 5; } else if (currentDay == 5) { _startDay = 1; } else { _startDay = currentDay + 1; } } function updatePriceSingle(uint _assetID, uint _price) internal { if (currentDay == 1) { uint[6] memory newPrices; newPrices[0] = prices[_assetID][5]; newPrices[1] = _price; prices[_assetID] = newPrices; } else { prices[_assetID][currentDay] = _price; } } function bound(int a, int b) internal pure returns (int) { if (a > b) a = b; if (a < -b) a = -b; return a; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"priceOracle","type":"address"},{"internalType":"int256","name":"_levRatio","type":"int256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"eLP","type":"address"},{"indexed":false,"internalType":"bytes32","name":"eSubkID","type":"bytes32"},{"indexed":false,"internalType":"address","name":"eBurner","type":"address"},{"indexed":false,"internalType":"uint256","name":"eTime","type":"uint256"}],"name":"BurnHist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"eLP","type":"address"},{"indexed":false,"internalType":"address","name":"eLPBook","type":"address"}],"name":"LPNewBook","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"eLP","type":"address"},{"indexed":false,"internalType":"uint8","name":"closefee","type":"uint8"},{"indexed":false,"internalType":"int16","name":"longFundingRate","type":"int16"},{"indexed":false,"internalType":"int16","name":"shortFundingRate","type":"int16"}],"name":"RatesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"eLP","type":"address"},{"indexed":true,"internalType":"address","name":"eTaker","type":"address"},{"indexed":false,"internalType":"bytes32","name":"eSubkID","type":"bytes32"},{"indexed":false,"internalType":"bool","name":"eisOpen","type":"bool"}],"name":"SubkTracker","type":"event"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_min","type":"uint16"}],"name":"adjustMinRM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"administrators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"assetReturns","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"assetSwapBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"balanceInput","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"books","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnLP","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"bytes32","name":"subkID","type":"bytes32"}],"name":"burnTaker","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"bytes32","name":"subkID","type":"bytes32"},{"internalType":"bool","name":"closeNow","type":"bool"}],"name":"cancel","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newAddress","type":"address"}],"name":"changeFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"}],"name":"closeBook","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_min","type":"uint16"},{"internalType":"uint256","name":"_closefee","type":"uint256"},{"internalType":"int256","name":"frLong","type":"int256"},{"internalType":"int256","name":"frShort","type":"int256"}],"name":"createBook","outputs":[{"internalType":"address","name":"newBook","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"}],"name":"fundLP","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"bytes32","name":"subkID","type":"bytes32"}],"name":"fundTaker","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"}],"name":"getBookData","outputs":[{"internalType":"address","name":"book","type":"address"},{"internalType":"uint256","name":"lpMargin","type":"uint256"},{"internalType":"uint256","name":"totalLpLong","type":"uint256"},{"internalType":"uint256","name":"totalLpShort","type":"uint256"},{"internalType":"uint256","name":"lpRM","type":"uint256"},{"internalType":"uint256","name":"bookMinimum","type":"uint256"},{"internalType":"int16","name":"longFundingRate","type":"int16"},{"internalType":"int16","name":"shortFundingRate","type":"int16"},{"internalType":"uint8","name":"lpCloseFee","type":"uint8"},{"internalType":"uint8","name":"bookStatus","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"}],"name":"getSettleInfo","outputs":[{"internalType":"uint256","name":"totalLength","type":"uint256"},{"internalType":"uint256","name":"expiringLength","type":"uint256"},{"internalType":"uint256","name":"newLength","type":"uint256"},{"internalType":"uint256","name":"lastBookSettleUTC","type":"uint256"},{"internalType":"uint256","name":"settleNumber","type":"uint256"},{"internalType":"uint256","name":"bookBalance","type":"uint256"},{"internalType":"uint256","name":"bookMaturityUTC","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"bytes32","name":"subkID","type":"bytes32"}],"name":"getSubkData1","outputs":[{"internalType":"address","name":"taker","type":"address"},{"internalType":"uint256","name":"takerMargin","type":"uint256"},{"internalType":"uint256","name":"reqMargin","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"bytes32","name":"subkID","type":"bytes32"}],"name":"getSubkData2","outputs":[{"internalType":"uint8","name":"subkStatus","type":"uint8"},{"internalType":"uint8","name":"priceDay","type":"uint8"},{"internalType":"uint8","name":"closeFee","type":"uint8"},{"internalType":"int16","name":"fundingRate","type":"int16"},{"internalType":"bool","name":"takerSide","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hourOfDay","outputs":[{"internalType":"uint256","name":"hour1","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"bytes32","name":"subkID","type":"bytes32"}],"name":"inactiveLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"}],"name":"inactiveOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastOracleSettleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"levRatio","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"contract Oracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"bytes32","name":"subkID","type":"bytes32"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toRemove","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"}],"name":"settleBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"}],"name":"settleParts","outputs":[{"internalType":"bool","name":"isComplete","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lp","type":"address"},{"internalType":"uint256","name":"rm","type":"uint256"},{"internalType":"bool","name":"isTakerLong","type":"bool"}],"name":"take","outputs":[{"internalType":"bytes32","name":"newsubkID","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newClose","type":"uint256"},{"internalType":"int256","name":"frLong","type":"int256"},{"internalType":"int256","name":"frShort","type":"int256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int256[5]","name":"assetRetNew","type":"int256[5]"},{"internalType":"int256[5]","name":"assetRetExp","type":"int256[5]"}],"name":"updateReturns","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFromAssetSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_lp","type":"address"},{"internalType":"bytes32","name":"subkID","type":"bytes32"}],"name":"withdrawTaker","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506040516156d33803806156d38339818101604052604081101561003357600080fd5b508051602091820151336000818152600f90945260408420805460ff19166001179055601080546001600160a01b0319908116909217905583546001600160a01b03909316921691909117909155600b55615640806100936000396000f3fe60806040526004361061020f5760003560e01c80637345b10b11610118578063c85c8925116100a0578063e1dcb1f91161006f578063e1dcb1f91461089b578063e4456ecb146108cb578063e9011c0e146108f5578063ff3f161e14610923578063ffd9881b146109495761020f565b8063c85c89251461078f578063ca1e455d146107c8578063d27c7bdb146107fc578063d6ccc19f146108675761020f565b80639482cb5d116100e75780639482cb5d146106c25780639e02b3c8146106ee5780639fab3d4b14610721578063af24608d14610747578063c5aebe931461077a5761020f565b80637345b10b1461063257806374eb1e5f1461064757806376be15851461067a5780637dc0d1d0146106ad5761020f565b8063412753581161019b578063618674191161016a578063618674191461051a5780636453ef76146105535780636dd8a2e9146105685780636ebeebd8146105c957806370480275146105ff5761020f565b806341275358146103d257806344d78bc3146103e75780635eec2b161461045b5780635f1e8134146104e75761020f565b80631acbd5fb116101e25780631acbd5fb146102d7578063285e1406146102fd57806329ca356f146103305780632fdd7df314610357578063362f5fab146103a65761020f565b806301105fe9146102145780630b45260e1461025b57806316065017146102655780631785f53c146102a4575b600080fd5b34801561022057600080fd5b506102476004803603602081101561023757600080fd5b50356001600160a01b03166109e8565b604080519115158252519081900360200190f35b610263610ccb565b005b34801561027157600080fd5b506102636004803603606081101561028857600080fd5b508035906001600160a01b036020820135169060400135610dda565b3480156102b057600080fd5b50610263600480360360208110156102c757600080fd5b50356001600160a01b0316610ea1565b610263600480360360208110156102ed57600080fd5b50356001600160a01b0316610f5b565b34801561030957600080fd5b506102636004803603602081101561032057600080fd5b50356001600160a01b0316610fee565b34801561033c57600080fd5b50610345611061565b60408051918252519081900360200190f35b61038a6004803603608081101561036d57600080fd5b5061ffff8135169060208101359060408101359060600135611067565b604080516001600160a01b039092168252519081900360200190f35b610263600480360360408110156103bc57600080fd5b506001600160a01b03813516906020013561131b565b3480156103de57600080fd5b5061038a611398565b3480156103f357600080fd5b506104206004803603604081101561040a57600080fd5b506001600160a01b0381351690602001356113a7565b6040805160ff968716815294861660208601529290941683830152600190810b900b6060830152911515608082015290519081900360a00190f35b34801561046757600080fd5b50610263600480360361014081101561047f57600080fd5b810190808060a001906005806020026040519081016040528092919082600560200280828437600092019190915250506040805160a0818101909252929594938181019392509060059083908390808284376000920191909152509194506114779350505050565b3480156104f357600080fd5b506102636004803603602081101561050a57600080fd5b50356001600160a01b03166114b2565b34801561052657600080fd5b506102636004803603604081101561053d57600080fd5b506001600160a01b03813516906020013561173f565b34801561055f57600080fd5b506102636117cb565b34801561057457600080fd5b506105a16004803603604081101561058b57600080fd5b506001600160a01b038135169060200135611824565b604080516001600160a01b039094168452602084019290925282820152519081900360600190f35b3480156105d557600080fd5b50610263600480360360608110156105ec57600080fd5b50803590602081013590604001356118de565b34801561060b57600080fd5b506102636004803603602081101561062257600080fd5b50356001600160a01b0316611a9c565b34801561063e57600080fd5b50610345611b11565b34801561065357600080fd5b5061038a6004803603602081101561066a57600080fd5b50356001600160a01b0316611b81565b34801561068657600080fd5b506102476004803603602081101561069d57600080fd5b50356001600160a01b0316611b9c565b3480156106b957600080fd5b5061038a611bb1565b610263600480360360408110156106d857600080fd5b506001600160a01b038135169060200135611bc0565b3480156106fa57600080fd5b506103456004803603602081101561071157600080fd5b50356001600160a01b0316611ce2565b6102636004803603602081101561073757600080fd5b50356001600160a01b0316611cf4565b34801561075357600080fd5b506102636004803603602081101561076a57600080fd5b50356001600160a01b0316611d7f565b34801561078657600080fd5b50610345611e0f565b34801561079b57600080fd5b50610263600480360360408110156107b257600080fd5b506001600160a01b038135169060200135611e15565b610345600480360360608110156107de57600080fd5b506001600160a01b0381351690602081013590604001351515611efb565b34801561080857600080fd5b5061082f6004803603602081101561081f57600080fd5b50356001600160a01b0316612198565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b6102636004803603606081101561087d57600080fd5b506001600160a01b0381351690602081013590604001351515612271565b3480156108a757600080fd5b50610345600480360360408110156108be57600080fd5b50803590602001356123cd565b3480156108d757600080fd5b50610263600480360360208110156108ee57600080fd5b50356123f2565b34801561090157600080fd5b506102636004803603602081101561091857600080fd5b503561ffff1661248e565b6102636004803603602081101561093957600080fd5b50356001600160a01b0316612559565b34801561095557600080fd5b5061097c6004803603602081101561096c57600080fd5b50356001600160a01b0316612578565b604080516001600160a01b03909b168b5260208b0199909952898901979097526060890195909552608088019390935260a0870191909152600190810b810b60c087015290810b900b60e085015260ff9081166101008501521661012083015251908190036101400190f35b6001600160a01b038181166000908152600d6020526040812054909116610a0e57600080fd5b6001600160a01b038083166000908152600d60209081526040808320548151637ce6d97b60e11b81529151941693849263f9cdb2f69260048082019391829003018186803b158015610a5f57600080fd5b505afa158015610a73573d6000803e3d6000fd5b505050506040513d6020811015610a8957600080fd5b5051600c5490915062015180014211610aa157600080fd5b80600c5411610aed576040805162461bcd60e51b81526020600482015260136024820152726f6e6520736574746c6520706572207765656b60681b604482015290519081900360640190fd5b6000826001600160a01b03166315acdf756040518163ffffffff1660e01b815260040160206040518083038186803b158015610b2857600080fd5b505afa158015610b3c573d6000803e3d6000fd5b505050506040513d6020811015610b5257600080fd5b50519050612710811015610bea576001600160a01b03831663e130ce666001805b600502016040518263ffffffff1660e01b8152600401808260058015610bae576020028201915b815481526020019060010190808311610b9a575b5050915050600060405180830381600087803b158015610bcd57600080fd5b505af1158015610be1573d6000803e3d6000fd5b50505050610cc3565b614e20811015610c3f5760015460408051630a438ba760e31b81526004810192909252516001600160a01b0385169163521c5d3891602480830192600092919082900301818387803b158015610bcd57600080fd5b617530811015610c61576001600160a01b03831663095631be60016000610b73565b806175301415610cc357826001600160a01b031663fecdab0c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ca657600080fd5b505af1158015610cba573d6000803e3d6000fd5b50505050600193505b505050919050565b336000908152600d60205260409020546001600160a01b0316610ced57600080fd5b336000908152600d6020908152604080832054815163dd6bf02960e01b815234600482015291516001600160a01b039091169392849263dd6bf029926024808301939282900301818787803b158015610d4557600080fd5b505af1158015610d59573d6000803e3d6000fd5b505050506040513d6020811015610d6f57600080fd5b5051604080513380825260006020830181905282840191909152426060830152915192935090917f53e95741f975a89642a68aaf1407e6a03f4dd08d162e255f9fe3c44d9f3b7b6b9181900360800190a150336000908152600e602052604090208054909101905550565b60008311610de757600080fd5b6001600160a01b038281166000908152600d602052604090205416610e0b57600080fd5b6001600160a01b038083166000908152600d602052604080822054600c54825163c7ebf63b60e01b815260048101879052633b9aca0090980260248901819052604489019190915233606489015291519196931692839263c7ebf63b9260848084019382900301818387803b158015610e8357600080fd5b505af1158015610e97573d6000803e3d6000fd5b5050505050505050565b336000908152600f602052604090205460ff16610ef2576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b6001600160a01b038116331415610f3a5760405162461bcd60e51b81526004018080602001828103825260288152602001806155c26028913960400191505060405180910390fd5b6001600160a01b03166000908152600f60205260409020805460ff19169055565b6001600160a01b038181166000908152600d602052604090205416610f7f57600080fd5b6001600160a01b038082166000908152600d602052604080822054815163465c887b60e11b815291519316928392638cb910f69234926004808301939282900301818588803b158015610fd157600080fd5b505af1158015610fe5573d6000803e3d6000fd5b50505050505050565b336000908152600f602052604090205460ff1661103f576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b600b5481565b336000908152600d60205260408120546001600160a01b0316156110bc5760405162461bcd60e51b815260040180806020018281038252602581526020018061559d6025913960400191505060405180910390fd5b8461ffff166509184e72a00002341015611112576040805162461bcd60e51b81526020600482015260126024820152714d757374207072657020666f7220626f6f6b60701b604482015290519081900360640190fd5b60018561ffff16101561112457600080fd5b60006064600b5485028161113457fe5b05905060006064600b5485028161114757fe5b05905060006064600b5488028161115a57fe5b04905060fa8360010b13158015611176575060f9198360010b12155b61117f57600080fd5b60fa8260010b13158015611198575060f9198260010b12155b6111a157600080fd5b60fa8160ff1611156111b257600080fd5b3330898386866040516111c4906129d3565b6001600160a01b03968716815294909516602085015261ffff90921660408085019190915260ff9091166060840152600191820b820b608084015292810b900b60a082015290519081900360c001906000f080158015611228573d6000803e3d6000fd5b50336000908152600d602052604080822080546001600160a01b0319166001600160a01b039485161790819055815163465c887b60e11b815291519316928392638cb910f69234926004808301939282900301818588803b15801561128c57600080fd5b505af11580156112a0573d6000803e3d6000fd5b5050336000818152600d60209081526040918290205482516001600160a01b03909116815291519295507f154a3febc7352b7a16989452e69bce933ff107f46528b680800f75b0d64b826d945090829003019150a25050336000908152600d60205260409020546001600160a01b0316979650505050505050565b6001600160a01b038281166000908152600d60205260409020541661133f57600080fd5b6001600160a01b038083166000908152600d602052604080822054815163ac462c4b60e01b8152600481018690529151931692839263ac462c4b9234926024808301939282900301818588803b158015610e8357600080fd5b6010546001600160a01b031681565b6001600160a01b038083166000908152600d60205260408120549091829182918291829116801561146c576000819050806001600160a01b03166335c4479f896040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561141b57600080fd5b505afa15801561142f573d6000803e3d6000fd5b505050506040513d60a081101561144557600080fd5b508051602082015160408301516060840151608090940151929a5090985096509094509250505b509295509295909350565b6000546001600160a01b0316331461148e57600080fd5b61149b60018360056129e0565b506114a960068260056129e0565b505042600c5550565b6001600160a01b038181166000908152600d6020526040902054166114d657600080fd5b6001600160a01b038082166000908152600d60209081526040808320548151637ce6d97b60e11b81529151941693849263f9cdb2f69260048082019391829003018186803b15801561152757600080fd5b505afa15801561153b573d6000803e3d6000fd5b505050506040513d602081101561155157600080fd5b5051600c549091506201518001421161156957600080fd5b80600c54116115b5576040805162461bcd60e51b81526020600482015260136024820152726f6e6520736574746c6520706572207765656b60681b604482015290519081900360640190fd5b604051637098673360e11b81526001600160a01b0383169063e130ce6690600690600481019060a40182825b8154815260200190600101908083116115e1575050915050600060405180830381600087803b15801561161357600080fd5b505af1158015611627573d6000803e3d6000fd5b505060015460408051630a438ba760e31b81526004810192909252516001600160a01b038616935063521c5d389250602480830192600092919082900301818387803b15801561167657600080fd5b505af115801561168a573d6000803e3d6000fd5b50506040516304ab18df60e11b81526001600160a01b038516925063095631be9150600190600481019060a40182825b8154815260200190600101908083116116ba575050915050600060405180830381600087803b1580156116ec57600080fd5b505af1158015611700573d6000803e3d6000fd5b50505050816001600160a01b031663fecdab0c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610fd157600080fd5b6001600160a01b038281166000908152600d60205260409020541661176357600080fd5b6001600160a01b038083166000908152600d602052604080822054600c54825163985438c560e01b81526004810187905233602482015260448101919091529151931692839263985438c5926064808201939182900301818387803b158015610fd157600080fd5b336000908152600e6020526040902054806117e557600080fd5b336000818152600e60205260408082208290555183156108fc0291849190818181858888f19350505050158015611820573d6000803e3d6000fd5b5050565b6001600160a01b038083166000908152600d60205260408120549091829182911680156118d6576000819050806001600160a01b0316638d164065876040518263ffffffff1660e01b81526004018082815260200191505060606040518083038186803b15801561189457600080fd5b505afa1580156118a8573d6000803e3d6000fd5b505050506040513d60608110156118be57600080fd5b50805160208201516040909201519096509094509250505b509250925092565b336000908152600d60205260409020546001600160a01b0316611940576040805162461bcd60e51b815260206004820152601560248201527455736572206d7573742068617665206120626f6f6b60581b604482015290519081900360640190fd5b60006064600b5484028161195057fe5b05905060006064600b5484028161196357fe5b05905060006064600b5487028161197657fe5b04905060fa81111561198757600080fd5b60fa831315801561199a575060f9198312155b6119a357600080fd5b60fa82131580156119b6575060f9198212155b6119bf57600080fd5b336000908152600d6020526040808220548151630f2845bd60e41b815260ff85166004820152600187810b810b602483015286810b900b604482015291516001600160a01b0390911692839263f2845bd0926064808301939282900301818387803b158015611a2d57600080fd5b505af1158015611a41573d6000803e3d6000fd5b50506040805160ff86168152600188810b810b602083015287810b900b8183015290513393507f17af015e3d17a025a2d3738280301a9420b0a6cce0bfc4c99c72adb381967df792509081900360600190a250505050505050565b336000908152600f602052604090205460ff16611aed576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b6001600160a01b03166000908152600f60205260409020805460ff19166001179055565b6000426005610e1062015180830604039150635e64de4081118015611b395750635f9ea34081105b80611b55575063604db47081118015611b5557506361876b6081105b80611b71575063622d967081118015611b7157506363674d6081105b15611b7d578160010191505b5090565b600d602052600090815260409020546001600160a01b031681565b600f6020526000908152604090205460ff1681565b6000546001600160a01b031681565b6001600160a01b038281166000908152600d602052604090205416611be457600080fd5b6001600160a01b038083166000908152600d6020908152604080832054815163f6afd84d60e01b8152600481018790523360248201523460448201529151941693849263f6afd84d926064808201939182900301818787803b158015611c4957600080fd5b505af1158015611c5d573d6000803e3d6000fd5b505050506040513d6020811015611c7357600080fd5b5051604080516001600160a01b038716815260208101869052338183015242606082015290519192507f53e95741f975a89642a68aaf1407e6a03f4dd08d162e255f9fe3c44d9f3b7b6b919081900360800190a1336000908152600e6020526040902080549091019055505050565b600e6020526000908152604090205481565b336001600160a01b03821614611d0957600080fd5b6001600160a01b038181166000908152600d602052604090205416611d2d57600080fd5b6001600160a01b038082166000908152600d6020526040808220548151630f9de42f60e31b815291519316928392637cef21789234926004808301939282900301818588803b158015610fd157600080fd5b6001600160a01b038181166000908152600d602052604090205416611da357600080fd5b6001600160a01b038082166000908152600d602052604080822054815163673a03b560e11b81529151931692839263ce74076a926004808201939182900301818387803b158015611df357600080fd5b505af1158015611e07573d6000803e3d6000fd5b505050505050565b600c5481565b6001600160a01b038281166000908152600d602052604090205416611e3957600080fd5b6001600160a01b038083166000908152600d60205260408082205481516329c1c91b60e11b815260048101869052336024820152915193169283926353839236926044808201939182900301818387803b158015611e9657600080fd5b505af1158015611eaa573d6000803e3d6000fd5b5050604080518581526000602082015281513394506001600160a01b03881693507f9f814fb693360988c5219264a7d37e9a5fef9d9de4b4a43677bb415c5f91bd7b929181900390910190a3505050565b600060038310611f43576040805162461bcd60e51b815260206004820152600e60248201526d61626f7665206d61782073697a6560901b604482015290519081900360640190fd5b64e8d4a510008302926002906502ba7def30000204341015611fac576040805162461bcd60e51b815260206004820152601a60248201527f496e7375666669656e742045544820666f7220796f757220524d000000000000604482015290519081900360640190fd5b611fb4611b11565b60101415612009576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742074616b6520647572696e67203420504d20455420686f757200604482015290519081900360640190fd5b600082156120195750600161201d565b5060005b60008060009054906101000a90046001600160a01b03166001600160a01b031663ff4dfa516040518163ffffffff1660e01b815260040160206040518083038186803b15801561206c57600080fd5b505afa158015612080573d6000803e3d6000fd5b505050506040513d602081101561209657600080fd5b50516001600160a01b038088166000908152600d602090815260409182902054600c54835163aad1e2ed60e01b8152336004820152602481018c9052604481019190915260ff8616606482015260848101889052925194955090921692839263aad1e2ed92349260a4808301939282900301818588803b15801561211957600080fd5b505af115801561212d573d6000803e3d6000fd5b50505050506040513d602081101561214457600080fd5b50516040805182815260016020820152815192965033926001600160a01b038b16927f9f814fb693360988c5219264a7d37e9a5fef9d9de4b4a43677bb415c5f91bd7b928290030190a35050509392505050565b6001600160a01b038082166000908152600d60205260408120549091829182918291829182918291168015612265576000819050806001600160a01b0316634b3437ba6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561220557600080fd5b505afa158015612219573d6000803e3d6000fd5b505050506040513d60e081101561222f57600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151949e50929c50909a50985096509094509250505b50919395979092949650565b612279611b11565b601014156122b85760405162461bcd60e51b81526004018080602001828103825260218152602001806155ea6021913960400191505060405180910390fd5b6001600160a01b038084166000908152600d602090815260408083205483548251600162b205af60e01b03198152925191861695169263ff4dfa519260048082019391829003018186803b15801561230f57600080fd5b505afa158015612323573d6000803e3d6000fd5b505050506040513d602081101561233957600080fd5b50519050600583156123485750805b600c5460408051632f0e225160e01b815260048101929092526024820187905233604483015260ff83166064830152516001600160a01b03851691632f0e225191349160848082019260009290919082900301818588803b1580156123ac57600080fd5b505af11580156123c0573d6000803e3d6000fd5b5050505050505050505050565b600182600281106123da57fe5b6005020181600581106123e957fe5b01549150829050565b600081116123ff57600080fd5b336000908152600d60205260409020546001600160a01b031661242157600080fd5b336000908152600d602052604080822054600c548251632e1033cf60e11b8152633b9aca00909502600486018190526024860191909152915191936001600160a01b0391909116928392635c20679e92604480820193929182900301818387803b158015611df357600080fd5b336000908152600d60205260409020546001600160a01b03166124f0576040805162461bcd60e51b815260206004820152601560248201527455736572206d7573742068617665206120626f6f6b60581b604482015290519081900360640190fd5b60018161ffff16101561250257600080fd5b336000908152600d6020526040808220548151626dcb2760e11b815261ffff8516600482015291516001600160a01b0390911692839262db964e926024808301939282900301818387803b158015611df357600080fd5b6001600160a01b03166000908152600e60205260409020805434019055565b6001600160a01b038082166000908152600d602052604081205490911690808080808080808089156129c65760008a9050806001600160a01b03166345f2968660006040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156125ee57600080fd5b505afa158015612602573d6000803e3d6000fd5b505050506040513d602081101561261857600080fd5b5051604080516322f94b4360e11b8152600160048201529051919b506001600160a01b038316916345f2968691602480820192602092909190829003018186803b15801561266557600080fd5b505afa158015612679573d6000803e3d6000fd5b505050506040513d602081101561268f57600080fd5b5051604080516322f94b4360e11b8152600260048201529051919a506001600160a01b038316916345f2968691602480820192602092909190829003018186803b1580156126dc57600080fd5b505afa1580156126f0573d6000803e3d6000fd5b505050506040513d602081101561270657600080fd5b5051604080516322f94b4360e11b81526003600482015290519199506001600160a01b038316916345f2968691602480820192602092909190829003018186803b15801561275357600080fd5b505afa158015612767573d6000803e3d6000fd5b505050506040513d602081101561277d57600080fd5b50516040805163328b8fd560e21b815290519198506001600160a01b0383169163ca2e3f5491600480820192602092909190829003018186803b1580156127c357600080fd5b505afa1580156127d7573d6000803e3d6000fd5b505050506040513d60208110156127ed57600080fd5b5051604080516319ff274560e31b815260016004820152905161ffff90921697506001600160a01b0383169163cff93a2891602480820192602092909190829003018186803b15801561283f57600080fd5b505afa158015612853573d6000803e3d6000fd5b505050506040513d602081101561286957600080fd5b5051604080516319ff274560e31b81526000600482015290519196506001600160a01b0383169163cff93a2891602480820192602092909190829003018186803b1580156128b657600080fd5b505afa1580156128ca573d6000803e3d6000fd5b505050506040513d60208110156128e057600080fd5b505160408051632313771160e01b815290519195506001600160a01b03831691632313771191600480820192602092909190829003018186803b15801561292657600080fd5b505afa15801561293a573d6000803e3d6000fd5b505050506040513d602081101561295057600080fd5b5051604080516306aea6a160e21b815290519194506001600160a01b03831691631aba9a8491600480820192602092909190829003018186803b15801561299657600080fd5b505afa1580156129aa573d6000803e3d6000fd5b505050506040513d60208110156129c057600080fd5b50519150505b9193959799509193959799565b612b6b80612a3283390190565b8260058101928215612a0e579160200282015b82811115612a0e5782518255916020019190600101906129f3565b50611b7d92612a2e9250905b80821115611b7d5760008155600101612a1a565b9056fe608060405264e8d4a5100060075534801561001957600080fd5b50604051612b6b380380612b6b833981810160405260c081101561003c57600080fd5b508051602082015160408301516060840151608085015160a090950151600180546001600160a01b039586166001600160a01b031991821617825560008054969097169516949094178555600c805442600681905560ff90941663010000000263ff0000001961ffff96871661ffff19938416171617909155600b805497860b8516620100000263ffff0000199390960b909416961695909517949094169190911790556305aa3200909101600a55612a709081906100fb90396000f3fe60806040526004361061020e5760003560e01c80638d16406511610118578063ce74076a116100a0578063e130ce661161006f578063e130ce6614610817578063f2845bd014610876578063f6afd84d146108b6578063f9cdb2f6146108f5578063fecdab0c1461090a5761020e565b8063ce74076a1461076b578063cff93a2814610780578063d4dbfd31146107c3578063dd6bf029146107ed5761020e565b8063b1b71afa116100e7578063b1b71afa146106a0578063b769c441146106b5578063c12016fb146106ca578063c7ebf63b146106fa578063ca2e3f541461073f5761020e565b80638d164065146105b1578063985438c514610603578063aad1e2ed14610642578063ac462c4b146106835761020e565b806345f296861161019b578063538392361161016a57806353839236146105235780635c20679e1461055c5780636c734d3e1461058c5780637cef2178146105a15780638cb910f6146105a95761020e565b806345f296861461046d5780634a66aa2a146104975780634b3437ba146104ac578063521c5d38146104f95761020e565b80631d95807c116101e25780631d95807c146102f457806323137711146103875780632f0e22511461039c578063313c06a0146103d757806335c4479f146104085761020e565b8062db964e14610213578063095631be1461024357806315acdf75146102a25780631aba9a84146102c9575b600080fd5b34801561021f57600080fd5b506102416004803603602081101561023657600080fd5b503561ffff1661091f565b005b34801561024f57600080fd5b50610241600480360360a081101561026657600080fd5b810190808060a00190600580602002604051908101604052809291908260056020028082843760009201919091525091945061094e9350505050565b3480156102ae57600080fd5b506102b7610ba0565b60408051918252519081900360200190f35b3480156102d557600080fd5b506102de610ba6565b6040805160ff9092168252519081900360200190f35b34801561030057600080fd5b5061031e6004803603602081101561031757600080fd5b5035610bb5565b604080516001600160a01b03909a168a5260208a01989098528888019690965261ffff9094166060880152600192830b90920b608087015260ff90811660a087015290811660c08601521660e0840152600090810b900b61010083015251908190036101200190f35b34801561039357600080fd5b506102de610c23565b610241600480360360808110156103b257600080fd5b5080359060208101359060408101356001600160a01b0316906060013560ff16610c33565b3480156103e357600080fd5b506103ec611019565b604080516001600160a01b039092168252519081900360200190f35b34801561041457600080fd5b506104326004803603602081101561042b57600080fd5b5035611028565b6040805160ff968716815294861660208601529290941683830152600190810b900b6060830152911515608082015290519081900360a00190f35b34801561047957600080fd5b506102b76004803603602081101561049057600080fd5b5035611107565b3480156104a357600080fd5b506102b761111b565b3480156104b857600080fd5b506104c1611121565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b34801561050557600080fd5b506102416004803603602081101561051c57600080fd5b5035611142565b34801561052f57600080fd5b506102416004803603604081101561054657600080fd5b50803590602001356001600160a01b031661134c565b34801561056857600080fd5b506102416004803603604081101561057f57600080fd5b5080359060200135611599565b34801561059857600080fd5b506102b76116d2565b6102416116d8565b6102416117ff565b3480156105bd57600080fd5b506105db600480360360208110156105d457600080fd5b5035611820565b604080516001600160a01b039094168452602084019290925282820152519081900360600190f35b34801561060f57600080fd5b506102416004803603606081101561062657600080fd5b508035906001600160a01b0360208201351690604001356118de565b6102b7600480360360a081101561065857600080fd5b506001600160a01b038135169060208101359060408101359060ff60608201351690608001356119af565b6102416004803603602081101561069957600080fd5b5035611df8565b3480156106ac57600080fd5b506102b7611e45565b3480156106c157600080fd5b506103ec611e4b565b3480156106d657600080fd5b506102b7600480360360408110156106ed57600080fd5b5080359060200135611e5a565b34801561070657600080fd5b506102416004803603608081101561071d57600080fd5b50803590602081013590604081013590606001356001600160a01b0316611e88565b34801561074b57600080fd5b5061075461202b565b6040805161ffff9092168252519081900360200190f35b34801561077757600080fd5b50610241612035565b34801561078c57600080fd5b506107aa600480360360208110156107a357600080fd5b5035612072565b60408051600192830b90920b8252519081900360200190f35b3480156107cf57600080fd5b506102b7600480360360208110156107e657600080fd5b503561209c565b3480156107f957600080fd5b506102b76004803603602081101561081057600080fd5b50356120ba565b34801561082357600080fd5b50610241600480360360a081101561083a57600080fd5b810190808060a0019060058060200260405190810160405280929190826005602002808284376000920191909152509194506121ef9350505050565b34801561088257600080fd5b506102416004803603606081101561089957600080fd5b5060ff813516906020810135600190810b9160400135900b612419565b3480156108c257600080fd5b506102b7600480360360608110156108d957600080fd5b508035906001600160a01b036020820135169060400135612483565b34801561090157600080fd5b506102b761269b565b34801561091657600080fd5b506102416126a1565b6001546001600160a01b0316331461093657600080fd5b600c805461ffff191661ffff92909216919091179055565b6001546001600160a01b0316331461096557600080fd5b617530600854106109b4576040805162461bcd60e51b8152602060048201526014602482015273646f6e652077697468206e657720736574746c6560601b604482015290519081900360640190fd5b600854600090819081906109d290614d571901600d835b015461285b565b600854909150614e1f19015b81811015610b77576000601081600d810184815481106109fa57fe5b60009182526020808320909101548352820192909252604001902060038101805460ff60281b1916600160281b1790819055909150600160301b900460ff16600514610b6e5760028101546003820154612710620100008204600190810b900b8302059164e8d4a51000918990600160301b900460ff1660058110610a7b57fe5b60200201516003850154600160381b9004600090810b900b020281610a9c57fe5b0503945084840393506000851215610ac957610abf816001015486600003612874565b6001820155610aeb565b64e8d4a51000600754860281610adb57fe5b6001830180549290910490910190555b806002015481600101541015610b555760038101805460ff60281b1916650600000000001790819055600160381b9004600090810b900b60011415610b4557610b3d6002805b01548260020154612874565b600455610b55565b610b5160026001610b31565b6003555b60038101805460ff60301b191666050000000000001790555b506001016109de565b506008805460c80190819055600d5411610b92576175306008555b506009805490910190555050565b60085481565b600c5462010000900460ff1681565b6010602052600090815260408120805460018083015460028401546003909401546001600160a01b039093169490939261ffff811692620100008204900b9160ff6401000000008304811692600160281b8104821692600160301b820490921691600160381b909104900b89565b600c546301000000900460ff1681565b6001546001600160a01b03163314610c4a57600080fd5b60008381526010602052604090206006548510610cae576040805162461bcd60e51b815260206004820152601e60248201527f43616e6e6f7420646f20647572696e6720736574746c6520706572696f640000604482015290519081900360640190fd5b80546001600160a01b0384811691161480610cd657506000546001600160a01b038481169116145b610d27576040805162461bcd60e51b815260206004820152601960248201527f43616e63656c6c6572206e6f74204c50206f722074616b657200000000000000604482015290519081900360640190fd5b6003810154600160281b900460ff16600114610d81576040805162461bcd60e51b8152602060048201526014602482015273726564756e64616e74206f7220746f6f206e657760601b604482015290519081900360640190fd5b6000612710826002015460fa0281610d9557fe5b04905080600202341015610dea576040805162461bcd60e51b8152602060048201526017602482015276496e73756666696369656e742063616e63656c2066656560481b604482015290519081900360640190fd5b6002820154600383015460009161271091640100000000900460ff1602049050426224ea0001600a541015610e20575060009050805b82546001600160a01b038681169116148015610e3f57508360ff166005145b15610e605760038301805460ff60281b191665020000000000179055610f38565b82546001600160a01b0386811691161415610f0e5760028054610e879160035b0154612874565b836002015410610ede576040805162461bcd60e51b815260206004820152601d60248201527f496e73756666204c5020524d20666f7220696d6d65642063616e63656c000000604482015290519081900360640190fd5b5060038201805460ff60281b1916650400000000001760ff60301b1916600160301b60ff86160217905580610f38565b816002029150610f1e3483612874565b60038401805460ff60281b19166503000000000017905590505b610fbb82600160009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b815260040160206040518083038186803b158015610f8a57600080fd5b505afa158015610f9e573d6000803e3d6000fd5b505050506040513d6020811015610fb457600080fd5b505161288e565b600e80546001810182556000919091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01869055600280548201905561100434838301612874565b60019093018054909301909255505050505050565b6000546001600160a01b031681565b60008060008060006110386128ff565b50600086815260106020908152604080832081516101208101835281546001600160a01b03168152600180830154948201949094526002820154928101929092526003015461ffff81166060830152620100008104830b830b830b6080830181905260ff6401000000008304811660a08501819052600160281b8404821660c08601819052600160301b850490921660e08601819052600160381b909404870b870b870b6101008601819052919b50929950919750955090920b14156110fd57600191505b5091939590929450565b6002816004811061111457fe5b0154905081565b600a5481565b600f54600e54600d54600654600854600a5494959394929391929091479190565b6001546001600160a01b0316331461115957600080fd5b614e20600854106111b1576040805162461bcd60e51b815260206004820152601860248201527f646f6e65207769746820726f6c6c696e6720736574746c650000000000000000604482015290519081900360640190fd5b60008060006111ce6127106008540360fa01600f8054905061285b565b60085490915061270f19015b8181101561131d57600060106000600f84815481106111f557fe5b9060005260206000200154815260200190815260200160002090508060030160059054906101000a900460ff1660ff16600114156113145760028101546003820154612710620100008204600190810b900b8302059164e8d4a5100091600160381b9004600090810b900b890202050394508484039350600085121561129057611286816001015486600003612874565b60018201556112b2565b64e8d4a510006007548602816112a257fe5b6001830180549290910490910190555b8060020154816001015410156113145760038101805460ff60281b1916650600000000001790819055600160381b9004600090810b900b60011415611304576112fc600280610b31565b600455611314565b61131060026001610b31565b6003555b506001016111da565b506008805460fa8101909155600f546126151990910110610b9257614e20600855506009805490910190555050565b6001546001600160a01b0316331461136357600080fd5b600082815260106020526040902060038101546005600160281b90910460ff16118061139a5750600c5462010000900460ff166003145b6113a357600080fd5b6001810180546000918290556003830154909161ffff821691600160281b900460ff1660061480156113de5750600c5462010000900460ff16155b9050600060028560020154816113f057fe5b86546000805493909204935090916001600160a01b03918216918981169116141561143757611423866377359400612874565b600280549188039182019055958690039591505b600060106000600f6001600f80549050038154811061145257fe5b6000918252602080832091909101548352820192909252604001902060038101805461ffff191661ffff8916179055600f805491925090600019810190811061149757fe5b9060005260206000200154600f8761ffff16815481106114b357fe5b600091825260209091200155600f8054806114ca57fe5b6000828152602080822083016000199081018390559092019092558b8252601090526040812080546001600160a01b0319168155600181018290556002810191909155600301805467ffffffffffffffff1916905584156115835761152f8785612874565b965061158384600160009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b815260040160206040518083038186803b158015610f8a57600080fd5b61158d878361288e565b50505050505050505050565b6001546001600160a01b031633146115b057600080fd5b6002548211156115f15760405162461bcd60e51b81526004018080602001828103825260248152602001806129f56024913960400191505060405180910390fd5b600c5462010000900460ff166003146116a7576005546002546116149084612874565b10156116515760405162461bcd60e51b815260040180806020018281038252602281526020018061298e6022913960400191505060405180910390fd5b60065481106116a7576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f7420772f6420647572696e6720736574746c6520706572696f6400604482015290519081900360640190fd5b6002546116b49083612874565b6002556000546116ce9083906001600160a01b031661288e565b5050565b60095481565b6001546001600160a01b031633146116ef57600080fd5b6000612710611707600260010154600280015461285b565b6002800154600260010154010360fa028161171e57fe5b04905080341015611770576040805162461bcd60e51b8152602060048201526017602482015276496e73756666696369656e742063616e63656c2066656560481b604482015290519081900360640190fd5b600081340390506117c982600160009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b815260040160206040518083038186803b158015610f8a57600080fd5b600a544211156117e957600c805462ff00001916620100001790556117f3565b6224ea004201600a555b60028054909101905550565b6001546001600160a01b0316331461181657600080fd5b6002805434019055565b600080600061182d6128ff565b50505060009182525060106020908152604080832081516101208101835281546001600160a01b0316808252600180840154958301869052600284015494830185905260039093015461ffff81166060840152620100008104840b840b90930b608083015260ff6401000000008404811660a0840152600160281b8404811660c0840152600160301b84041660e0830152600160381b909204850b850b90940b610100909401939093529192909190565b6001546001600160a01b031633146118f557600080fd5b600c5462010000900460ff166003141561190e57600080fd5b600083815260106020526040902080546001600160a01b0384811691161461193557600080fd5b600654821161194357600080fd5b6202a3006119514284612874565b1161195b57600080fd5b60006119726002825b01546005546002900461285b565b9050611984600260005b015482612874565b6002556000600555600c805462ff000019166203000017905560019190910180549091019055505050565b6001546000906001600160a01b031633146119c957600080fd5b600c5462010000900460ff1615611a27576040805162461bcd60e51b815260206004820152601f60248201527f626f6f6b206e6f206c6f6e6765722074616b696e6720706f736974696f6e7300604482015290519081900360640190fd5b600a54426224ea000110611a76576040805162461bcd60e51b81526020600482015260116024820152703137b7b59031b637b9b4b7339039b7b7b760791b604482015290519081900360640190fd5b600c5461ffff1664e8d4a5100002851015611ad8576040805162461bcd60e51b815260206004820152601d60248201527f6d7573742062652067726561746572207468616e20626f6f6b206d696e000000604482015290519081900360640190fd5b6006548410611b2e576040805162461bcd60e51b815260206004820152601e60248201527f43616e6e6f7420646f20647572696e6720736574746c6520706572696f640000604482015290519081900360640190fd5b600f54610fa011611b75576040805162461bcd60e51b815260206004820152600c60248201526b189bdbdac81a5cc8199d5b1b60a21b604482015290519081900360640190fd5b6000611ba260028460020360048110611b8a57fe5b015460028054040160028560010160048110610e8057fe5b9050808611158015611bb957506005546002540386105b611bc257600080fd5b80861115611bcf57600080fd5b8560028460010160048110611be057fe5b0180549091019055611bf06128ff565b604081018790523460208201526001600160a01b0388168152600284810260001901600090810b900b610100830152879060030180549091019055600f5460408051426020808301919091528183018490528251808303840181526060928301909352825192019190912061ffff9092169083015260ff861660e08301529250600b8460028110611c7d57fe5b60108082049290920154600f918216600290810261010090810a909204600190810b810b810b60808701908152600c546301000000900460ff90811660a0890190815260008b8152602098895260408082208b5181546001600160a01b0319166001600160a01b03909116178155998b01518a8701558a0151958901959095556060890151600390980180549351915160c08b015160e08c0151988c015161ffff1990961661ffff9b8c161763ffff000019166201000094880b9b909b16939093029990991764ff000000001916640100000000998416999099029890981760ff60281b1916600160281b918316919091021760ff60301b1916600160301b958216959095029490941767ff000000000000001916600160381b91840b9094160292909217909355815490810182559082527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80201849055600d0180546001810182556000918252602090912001839055505095945050505050565b6001546001600160a01b03163314611e0f57600080fd5b600081815260106020526040902060038101546002600160281b90910460ff1610611e3957600080fd5b60010180543401905550565b60075481565b6001546001600160a01b031681565b600d8260028110611e6757fe5b018181548110611e7357fe5b90600052602060002001600091509150505481565b6001546001600160a01b03163314611e9f57600080fd5b6006548210611ef5576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f7420772f6420647572696e6720736574746c6520706572696f6400604482015290519081900360640190fd5b600084815260106020526040902060038101546006600160281b90910460ff1610611f60576040805162461bcd60e51b81526020600482015260166024820152757375626b20646561642c206d7573742072656465656d60501b604482015290519081900360640190fd5b80546001600160a01b03838116911614611fab5760405162461bcd60e51b81526004018080602001828103825260238152602001806129d26023913960400191505060405180910390fd5b8060020154611fbe826001015486612874565b1015611ffb5760405162461bcd60e51b8152600401808060200182810382526022815260200180612a196022913960400191505060405180910390fd5b612009816001015485612874565b600182015580546120249085906001600160a01b031661288e565b5050505050565b600c5461ffff1681565b6001546001600160a01b0316331461204c57600080fd5b600654620d2f0001421161205f57600080fd5b600c805462ff0000191662030000179055565b600b816002811061207f57fe5b60109182820401919006600202915054906101000a900460010b81565b600f81815481106120a957fe5b600091825260209091200154905081565b6001546000906001600160a01b031633146120d457600080fd5b600c5460ff62010000909104166002141561212b576040805162461bcd60e51b815260206004820152601260248201527163616e206f6e6c79206275726e206f6e636560701b604482015290519081900360640190fd5b600554600290048083101561217f576040805162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e74206275726e2066656560581b604482015290519081900360640190fd5b6121898382612874565b60035460045491925010156121c4576007546121bc906002805b015460055464e8d4a5100002816121b657fe5b04612874565b6007556121d8565b6007546121d490600260016121a3565b6007555b600c805462ff000019166202000017905592915050565b6001546001600160a01b0316331461220657600080fd5b600c5462010000900460ff166003148015906122255750612710600854105b612276576040805162461bcd60e51b815260206004820152601760248201527f646f6e6520776974682065787069727920736574746c65000000000000000000604482015290519081900360640190fd5b600080600061229260085460c801600d6001600281106109cb57fe5b6008549091505b818110156123f1576000601081600d60010184815481106122b657fe5b90600052602060002001548152602001908152602001600020905061271081600201548260030160029054906101000a900460010b60010b02816122f657fe5b0564e8d4a5100082600201548860018560030160069054906101000a900460ff160360ff166005811061232557fe5b60200201516003850154600160381b9004600090810b900b02028161234657fe5b050394508484039350600085121561237357612369816001015486600003612874565b6001820155612395565b64e8d4a5100060075486028161238557fe5b6001830180549290910490910190555b6003810154600160381b9004600090810b900b600114156123c3576123bb600280610b31565b6004556123d3565b6123cf60026001610b31565b6003555b600301805460ff60281b191665070000000000179055600101612299565b506008805460c80190819055600e5411610b9257612710600855506009805490910190555050565b6001546001600160a01b0316331461243057600080fd5b600b8054600192830b61ffff90811661ffff199092169190911763ffff00001916620100009490930b1692909202179055600c805463ff0000001916630100000060ff9390931692909202919091179055565b6001546000906001600160a01b0316331461249d57600080fd5b600084815260106020526040902080546001600160a01b0385811691161461250c576040805162461bcd60e51b815260206004820181905260248201527f6d75737420627920706172747920746f2068697320737562636f6e7472616374604482015290519081900360640190fd5b60085415612561576040805162461bcd60e51b815260206004820152601d60248201527f6e6f7420647572696e6720736574746c656d656e742070726f63657373000000604482015290519081900360640190fd5b60038101546005600160281b90910460ff16106125c5576040805162461bcd60e51b815260206004820181905260248201527f63616e206f6e6c79206275726e2061637469766520737562636f6e7472616374604482015290519081900360640190fd5b600060028260020154816125d557fe5b04905080841015612625576040805162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e74206275726e2066656560581b604482015290519081900360640190fd5b61262f8482612874565b60045460035491925010156126675760075461265f90600260015b0154846002015464e8d4a5100002816121b657fe5b60075561267a565b6007546126769060028061264a565b6007555b600391909101805460ff60281b191665050000000000179055949350505050565b60065481565b6001546001600160a01b031633146126b857600080fd5b600854617530146126fa5760405162461bcd60e51b81526004018080602001828103825260228152602001806129b06022913960400191505060405180910390fd5b60035460045411156127155760035460045403600555612720565b600454600354036005555b600060095412156127475761273f600260000154600954600003612874565b60025561276a565b64e8d4a51000600754600954028161275b57fe5b04600260000154016002600001555b600c5462010000900460ff161561279957600c805462ff00001916620300001790556000600260030155612826565b600554600254101561282657600c805462ff000019166203000017905560006127c3600282611964565b90506127d16002600061197c565b60025560015460408051630824ea6b60e31b8152905161281f9284926001600160a01b0390911691634127535891600480820192602092909190829003018186803b158015610f8a57600080fd5b5060006005555b6000600981905542600655600855600d60016128449101600061294b565b612850600d600061294b565b64e8d4a51000600755565b600081831161286b57508161286e565b50805b92915050565b60008282106128855750600061286e565b5080820361286e565b600154604080516001626074f160e11b031981526001600160a01b0384811660048301529151919092169163ff3f161e91859160248082019260009290919082900301818588803b1580156128e257600080fd5b505af11580156128f6573d6000803e3d6000fd5b50505050505050565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b5080546000825590600052602060002090810190612969919061296c565b50565b61298a91905b808211156129865760008155600101612972565b5090565b9056fe43616e6e6f7420772f64206d6f7265207468616e20657863657373206d617267696e6e6f7420646f6e65207769746820616c6c2074686520737562636f6e7472616374734d7573742062652074616b657220746f2063616c6c20746869732066756e6374696f6e43616e6e6f74207769746864726177206d6f7265207468616e20746865206d617267696e63616e6e6f7420772f64206d6f7265207468616e20657863657373206d617267696ea26469706673582212207a71c70efef0c7f61da40c4313bc6e58999d6154b2858cebd7ffa6596353c1fc64736f6c6343000603003355736572206d757374206e6f7420686176652061207072656578697374696e6720626f6f6b596f75206d6179206e6f742072656d6f766520796f757273656c6620617320616e2061646d696e2e43616e6e6f742063616e63656c20647572696e67203420504d20455420686f7572a2646970667358221220af1a70419ae5167800c073357e5f5c7742613ac71b28101920b46c987f48f72864736f6c63430006030033000000000000000000000000b0009be42625f9ad53221dd0ac1bb1b799467ac000000000000000000000000000000000000000000000000000000000000000fa
Deployed Bytecode
0x60806040526004361061020f5760003560e01c80637345b10b11610118578063c85c8925116100a0578063e1dcb1f91161006f578063e1dcb1f91461089b578063e4456ecb146108cb578063e9011c0e146108f5578063ff3f161e14610923578063ffd9881b146109495761020f565b8063c85c89251461078f578063ca1e455d146107c8578063d27c7bdb146107fc578063d6ccc19f146108675761020f565b80639482cb5d116100e75780639482cb5d146106c25780639e02b3c8146106ee5780639fab3d4b14610721578063af24608d14610747578063c5aebe931461077a5761020f565b80637345b10b1461063257806374eb1e5f1461064757806376be15851461067a5780637dc0d1d0146106ad5761020f565b8063412753581161019b578063618674191161016a578063618674191461051a5780636453ef76146105535780636dd8a2e9146105685780636ebeebd8146105c957806370480275146105ff5761020f565b806341275358146103d257806344d78bc3146103e75780635eec2b161461045b5780635f1e8134146104e75761020f565b80631acbd5fb116101e25780631acbd5fb146102d7578063285e1406146102fd57806329ca356f146103305780632fdd7df314610357578063362f5fab146103a65761020f565b806301105fe9146102145780630b45260e1461025b57806316065017146102655780631785f53c146102a4575b600080fd5b34801561022057600080fd5b506102476004803603602081101561023757600080fd5b50356001600160a01b03166109e8565b604080519115158252519081900360200190f35b610263610ccb565b005b34801561027157600080fd5b506102636004803603606081101561028857600080fd5b508035906001600160a01b036020820135169060400135610dda565b3480156102b057600080fd5b50610263600480360360208110156102c757600080fd5b50356001600160a01b0316610ea1565b610263600480360360208110156102ed57600080fd5b50356001600160a01b0316610f5b565b34801561030957600080fd5b506102636004803603602081101561032057600080fd5b50356001600160a01b0316610fee565b34801561033c57600080fd5b50610345611061565b60408051918252519081900360200190f35b61038a6004803603608081101561036d57600080fd5b5061ffff8135169060208101359060408101359060600135611067565b604080516001600160a01b039092168252519081900360200190f35b610263600480360360408110156103bc57600080fd5b506001600160a01b03813516906020013561131b565b3480156103de57600080fd5b5061038a611398565b3480156103f357600080fd5b506104206004803603604081101561040a57600080fd5b506001600160a01b0381351690602001356113a7565b6040805160ff968716815294861660208601529290941683830152600190810b900b6060830152911515608082015290519081900360a00190f35b34801561046757600080fd5b50610263600480360361014081101561047f57600080fd5b810190808060a001906005806020026040519081016040528092919082600560200280828437600092019190915250506040805160a0818101909252929594938181019392509060059083908390808284376000920191909152509194506114779350505050565b3480156104f357600080fd5b506102636004803603602081101561050a57600080fd5b50356001600160a01b03166114b2565b34801561052657600080fd5b506102636004803603604081101561053d57600080fd5b506001600160a01b03813516906020013561173f565b34801561055f57600080fd5b506102636117cb565b34801561057457600080fd5b506105a16004803603604081101561058b57600080fd5b506001600160a01b038135169060200135611824565b604080516001600160a01b039094168452602084019290925282820152519081900360600190f35b3480156105d557600080fd5b50610263600480360360608110156105ec57600080fd5b50803590602081013590604001356118de565b34801561060b57600080fd5b506102636004803603602081101561062257600080fd5b50356001600160a01b0316611a9c565b34801561063e57600080fd5b50610345611b11565b34801561065357600080fd5b5061038a6004803603602081101561066a57600080fd5b50356001600160a01b0316611b81565b34801561068657600080fd5b506102476004803603602081101561069d57600080fd5b50356001600160a01b0316611b9c565b3480156106b957600080fd5b5061038a611bb1565b610263600480360360408110156106d857600080fd5b506001600160a01b038135169060200135611bc0565b3480156106fa57600080fd5b506103456004803603602081101561071157600080fd5b50356001600160a01b0316611ce2565b6102636004803603602081101561073757600080fd5b50356001600160a01b0316611cf4565b34801561075357600080fd5b506102636004803603602081101561076a57600080fd5b50356001600160a01b0316611d7f565b34801561078657600080fd5b50610345611e0f565b34801561079b57600080fd5b50610263600480360360408110156107b257600080fd5b506001600160a01b038135169060200135611e15565b610345600480360360608110156107de57600080fd5b506001600160a01b0381351690602081013590604001351515611efb565b34801561080857600080fd5b5061082f6004803603602081101561081f57600080fd5b50356001600160a01b0316612198565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b6102636004803603606081101561087d57600080fd5b506001600160a01b0381351690602081013590604001351515612271565b3480156108a757600080fd5b50610345600480360360408110156108be57600080fd5b50803590602001356123cd565b3480156108d757600080fd5b50610263600480360360208110156108ee57600080fd5b50356123f2565b34801561090157600080fd5b506102636004803603602081101561091857600080fd5b503561ffff1661248e565b6102636004803603602081101561093957600080fd5b50356001600160a01b0316612559565b34801561095557600080fd5b5061097c6004803603602081101561096c57600080fd5b50356001600160a01b0316612578565b604080516001600160a01b03909b168b5260208b0199909952898901979097526060890195909552608088019390935260a0870191909152600190810b810b60c087015290810b900b60e085015260ff9081166101008501521661012083015251908190036101400190f35b6001600160a01b038181166000908152600d6020526040812054909116610a0e57600080fd5b6001600160a01b038083166000908152600d60209081526040808320548151637ce6d97b60e11b81529151941693849263f9cdb2f69260048082019391829003018186803b158015610a5f57600080fd5b505afa158015610a73573d6000803e3d6000fd5b505050506040513d6020811015610a8957600080fd5b5051600c5490915062015180014211610aa157600080fd5b80600c5411610aed576040805162461bcd60e51b81526020600482015260136024820152726f6e6520736574746c6520706572207765656b60681b604482015290519081900360640190fd5b6000826001600160a01b03166315acdf756040518163ffffffff1660e01b815260040160206040518083038186803b158015610b2857600080fd5b505afa158015610b3c573d6000803e3d6000fd5b505050506040513d6020811015610b5257600080fd5b50519050612710811015610bea576001600160a01b03831663e130ce666001805b600502016040518263ffffffff1660e01b8152600401808260058015610bae576020028201915b815481526020019060010190808311610b9a575b5050915050600060405180830381600087803b158015610bcd57600080fd5b505af1158015610be1573d6000803e3d6000fd5b50505050610cc3565b614e20811015610c3f5760015460408051630a438ba760e31b81526004810192909252516001600160a01b0385169163521c5d3891602480830192600092919082900301818387803b158015610bcd57600080fd5b617530811015610c61576001600160a01b03831663095631be60016000610b73565b806175301415610cc357826001600160a01b031663fecdab0c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ca657600080fd5b505af1158015610cba573d6000803e3d6000fd5b50505050600193505b505050919050565b336000908152600d60205260409020546001600160a01b0316610ced57600080fd5b336000908152600d6020908152604080832054815163dd6bf02960e01b815234600482015291516001600160a01b039091169392849263dd6bf029926024808301939282900301818787803b158015610d4557600080fd5b505af1158015610d59573d6000803e3d6000fd5b505050506040513d6020811015610d6f57600080fd5b5051604080513380825260006020830181905282840191909152426060830152915192935090917f53e95741f975a89642a68aaf1407e6a03f4dd08d162e255f9fe3c44d9f3b7b6b9181900360800190a150336000908152600e602052604090208054909101905550565b60008311610de757600080fd5b6001600160a01b038281166000908152600d602052604090205416610e0b57600080fd5b6001600160a01b038083166000908152600d602052604080822054600c54825163c7ebf63b60e01b815260048101879052633b9aca0090980260248901819052604489019190915233606489015291519196931692839263c7ebf63b9260848084019382900301818387803b158015610e8357600080fd5b505af1158015610e97573d6000803e3d6000fd5b5050505050505050565b336000908152600f602052604090205460ff16610ef2576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b6001600160a01b038116331415610f3a5760405162461bcd60e51b81526004018080602001828103825260288152602001806155c26028913960400191505060405180910390fd5b6001600160a01b03166000908152600f60205260409020805460ff19169055565b6001600160a01b038181166000908152600d602052604090205416610f7f57600080fd5b6001600160a01b038082166000908152600d602052604080822054815163465c887b60e11b815291519316928392638cb910f69234926004808301939282900301818588803b158015610fd157600080fd5b505af1158015610fe5573d6000803e3d6000fd5b50505050505050565b336000908152600f602052604090205460ff1661103f576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b600b5481565b336000908152600d60205260408120546001600160a01b0316156110bc5760405162461bcd60e51b815260040180806020018281038252602581526020018061559d6025913960400191505060405180910390fd5b8461ffff166509184e72a00002341015611112576040805162461bcd60e51b81526020600482015260126024820152714d757374207072657020666f7220626f6f6b60701b604482015290519081900360640190fd5b60018561ffff16101561112457600080fd5b60006064600b5485028161113457fe5b05905060006064600b5485028161114757fe5b05905060006064600b5488028161115a57fe5b04905060fa8360010b13158015611176575060f9198360010b12155b61117f57600080fd5b60fa8260010b13158015611198575060f9198260010b12155b6111a157600080fd5b60fa8160ff1611156111b257600080fd5b3330898386866040516111c4906129d3565b6001600160a01b03968716815294909516602085015261ffff90921660408085019190915260ff9091166060840152600191820b820b608084015292810b900b60a082015290519081900360c001906000f080158015611228573d6000803e3d6000fd5b50336000908152600d602052604080822080546001600160a01b0319166001600160a01b039485161790819055815163465c887b60e11b815291519316928392638cb910f69234926004808301939282900301818588803b15801561128c57600080fd5b505af11580156112a0573d6000803e3d6000fd5b5050336000818152600d60209081526040918290205482516001600160a01b03909116815291519295507f154a3febc7352b7a16989452e69bce933ff107f46528b680800f75b0d64b826d945090829003019150a25050336000908152600d60205260409020546001600160a01b0316979650505050505050565b6001600160a01b038281166000908152600d60205260409020541661133f57600080fd5b6001600160a01b038083166000908152600d602052604080822054815163ac462c4b60e01b8152600481018690529151931692839263ac462c4b9234926024808301939282900301818588803b158015610e8357600080fd5b6010546001600160a01b031681565b6001600160a01b038083166000908152600d60205260408120549091829182918291829116801561146c576000819050806001600160a01b03166335c4479f896040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561141b57600080fd5b505afa15801561142f573d6000803e3d6000fd5b505050506040513d60a081101561144557600080fd5b508051602082015160408301516060840151608090940151929a5090985096509094509250505b509295509295909350565b6000546001600160a01b0316331461148e57600080fd5b61149b60018360056129e0565b506114a960068260056129e0565b505042600c5550565b6001600160a01b038181166000908152600d6020526040902054166114d657600080fd5b6001600160a01b038082166000908152600d60209081526040808320548151637ce6d97b60e11b81529151941693849263f9cdb2f69260048082019391829003018186803b15801561152757600080fd5b505afa15801561153b573d6000803e3d6000fd5b505050506040513d602081101561155157600080fd5b5051600c549091506201518001421161156957600080fd5b80600c54116115b5576040805162461bcd60e51b81526020600482015260136024820152726f6e6520736574746c6520706572207765656b60681b604482015290519081900360640190fd5b604051637098673360e11b81526001600160a01b0383169063e130ce6690600690600481019060a40182825b8154815260200190600101908083116115e1575050915050600060405180830381600087803b15801561161357600080fd5b505af1158015611627573d6000803e3d6000fd5b505060015460408051630a438ba760e31b81526004810192909252516001600160a01b038616935063521c5d389250602480830192600092919082900301818387803b15801561167657600080fd5b505af115801561168a573d6000803e3d6000fd5b50506040516304ab18df60e11b81526001600160a01b038516925063095631be9150600190600481019060a40182825b8154815260200190600101908083116116ba575050915050600060405180830381600087803b1580156116ec57600080fd5b505af1158015611700573d6000803e3d6000fd5b50505050816001600160a01b031663fecdab0c6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610fd157600080fd5b6001600160a01b038281166000908152600d60205260409020541661176357600080fd5b6001600160a01b038083166000908152600d602052604080822054600c54825163985438c560e01b81526004810187905233602482015260448101919091529151931692839263985438c5926064808201939182900301818387803b158015610fd157600080fd5b336000908152600e6020526040902054806117e557600080fd5b336000818152600e60205260408082208290555183156108fc0291849190818181858888f19350505050158015611820573d6000803e3d6000fd5b5050565b6001600160a01b038083166000908152600d60205260408120549091829182911680156118d6576000819050806001600160a01b0316638d164065876040518263ffffffff1660e01b81526004018082815260200191505060606040518083038186803b15801561189457600080fd5b505afa1580156118a8573d6000803e3d6000fd5b505050506040513d60608110156118be57600080fd5b50805160208201516040909201519096509094509250505b509250925092565b336000908152600d60205260409020546001600160a01b0316611940576040805162461bcd60e51b815260206004820152601560248201527455736572206d7573742068617665206120626f6f6b60581b604482015290519081900360640190fd5b60006064600b5484028161195057fe5b05905060006064600b5484028161196357fe5b05905060006064600b5487028161197657fe5b04905060fa81111561198757600080fd5b60fa831315801561199a575060f9198312155b6119a357600080fd5b60fa82131580156119b6575060f9198212155b6119bf57600080fd5b336000908152600d6020526040808220548151630f2845bd60e41b815260ff85166004820152600187810b810b602483015286810b900b604482015291516001600160a01b0390911692839263f2845bd0926064808301939282900301818387803b158015611a2d57600080fd5b505af1158015611a41573d6000803e3d6000fd5b50506040805160ff86168152600188810b810b602083015287810b900b8183015290513393507f17af015e3d17a025a2d3738280301a9420b0a6cce0bfc4c99c72adb381967df792509081900360600190a250505050505050565b336000908152600f602052604090205460ff16611aed576040805162461bcd60e51b815260206004820152600a60248201526961646d696e206f6e6c7960b01b604482015290519081900360640190fd5b6001600160a01b03166000908152600f60205260409020805460ff19166001179055565b6000426005610e1062015180830604039150635e64de4081118015611b395750635f9ea34081105b80611b55575063604db47081118015611b5557506361876b6081105b80611b71575063622d967081118015611b7157506363674d6081105b15611b7d578160010191505b5090565b600d602052600090815260409020546001600160a01b031681565b600f6020526000908152604090205460ff1681565b6000546001600160a01b031681565b6001600160a01b038281166000908152600d602052604090205416611be457600080fd5b6001600160a01b038083166000908152600d6020908152604080832054815163f6afd84d60e01b8152600481018790523360248201523460448201529151941693849263f6afd84d926064808201939182900301818787803b158015611c4957600080fd5b505af1158015611c5d573d6000803e3d6000fd5b505050506040513d6020811015611c7357600080fd5b5051604080516001600160a01b038716815260208101869052338183015242606082015290519192507f53e95741f975a89642a68aaf1407e6a03f4dd08d162e255f9fe3c44d9f3b7b6b919081900360800190a1336000908152600e6020526040902080549091019055505050565b600e6020526000908152604090205481565b336001600160a01b03821614611d0957600080fd5b6001600160a01b038181166000908152600d602052604090205416611d2d57600080fd5b6001600160a01b038082166000908152600d6020526040808220548151630f9de42f60e31b815291519316928392637cef21789234926004808301939282900301818588803b158015610fd157600080fd5b6001600160a01b038181166000908152600d602052604090205416611da357600080fd5b6001600160a01b038082166000908152600d602052604080822054815163673a03b560e11b81529151931692839263ce74076a926004808201939182900301818387803b158015611df357600080fd5b505af1158015611e07573d6000803e3d6000fd5b505050505050565b600c5481565b6001600160a01b038281166000908152600d602052604090205416611e3957600080fd5b6001600160a01b038083166000908152600d60205260408082205481516329c1c91b60e11b815260048101869052336024820152915193169283926353839236926044808201939182900301818387803b158015611e9657600080fd5b505af1158015611eaa573d6000803e3d6000fd5b5050604080518581526000602082015281513394506001600160a01b03881693507f9f814fb693360988c5219264a7d37e9a5fef9d9de4b4a43677bb415c5f91bd7b929181900390910190a3505050565b600060038310611f43576040805162461bcd60e51b815260206004820152600e60248201526d61626f7665206d61782073697a6560901b604482015290519081900360640190fd5b64e8d4a510008302926002906502ba7def30000204341015611fac576040805162461bcd60e51b815260206004820152601a60248201527f496e7375666669656e742045544820666f7220796f757220524d000000000000604482015290519081900360640190fd5b611fb4611b11565b60101415612009576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742074616b6520647572696e67203420504d20455420686f757200604482015290519081900360640190fd5b600082156120195750600161201d565b5060005b60008060009054906101000a90046001600160a01b03166001600160a01b031663ff4dfa516040518163ffffffff1660e01b815260040160206040518083038186803b15801561206c57600080fd5b505afa158015612080573d6000803e3d6000fd5b505050506040513d602081101561209657600080fd5b50516001600160a01b038088166000908152600d602090815260409182902054600c54835163aad1e2ed60e01b8152336004820152602481018c9052604481019190915260ff8616606482015260848101889052925194955090921692839263aad1e2ed92349260a4808301939282900301818588803b15801561211957600080fd5b505af115801561212d573d6000803e3d6000fd5b50505050506040513d602081101561214457600080fd5b50516040805182815260016020820152815192965033926001600160a01b038b16927f9f814fb693360988c5219264a7d37e9a5fef9d9de4b4a43677bb415c5f91bd7b928290030190a35050509392505050565b6001600160a01b038082166000908152600d60205260408120549091829182918291829182918291168015612265576000819050806001600160a01b0316634b3437ba6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561220557600080fd5b505afa158015612219573d6000803e3d6000fd5b505050506040513d60e081101561222f57600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151949e50929c50909a50985096509094509250505b50919395979092949650565b612279611b11565b601014156122b85760405162461bcd60e51b81526004018080602001828103825260218152602001806155ea6021913960400191505060405180910390fd5b6001600160a01b038084166000908152600d602090815260408083205483548251600162b205af60e01b03198152925191861695169263ff4dfa519260048082019391829003018186803b15801561230f57600080fd5b505afa158015612323573d6000803e3d6000fd5b505050506040513d602081101561233957600080fd5b50519050600583156123485750805b600c5460408051632f0e225160e01b815260048101929092526024820187905233604483015260ff83166064830152516001600160a01b03851691632f0e225191349160848082019260009290919082900301818588803b1580156123ac57600080fd5b505af11580156123c0573d6000803e3d6000fd5b5050505050505050505050565b600182600281106123da57fe5b6005020181600581106123e957fe5b01549150829050565b600081116123ff57600080fd5b336000908152600d60205260409020546001600160a01b031661242157600080fd5b336000908152600d602052604080822054600c548251632e1033cf60e11b8152633b9aca00909502600486018190526024860191909152915191936001600160a01b0391909116928392635c20679e92604480820193929182900301818387803b158015611df357600080fd5b336000908152600d60205260409020546001600160a01b03166124f0576040805162461bcd60e51b815260206004820152601560248201527455736572206d7573742068617665206120626f6f6b60581b604482015290519081900360640190fd5b60018161ffff16101561250257600080fd5b336000908152600d6020526040808220548151626dcb2760e11b815261ffff8516600482015291516001600160a01b0390911692839262db964e926024808301939282900301818387803b158015611df357600080fd5b6001600160a01b03166000908152600e60205260409020805434019055565b6001600160a01b038082166000908152600d602052604081205490911690808080808080808089156129c65760008a9050806001600160a01b03166345f2968660006040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156125ee57600080fd5b505afa158015612602573d6000803e3d6000fd5b505050506040513d602081101561261857600080fd5b5051604080516322f94b4360e11b8152600160048201529051919b506001600160a01b038316916345f2968691602480820192602092909190829003018186803b15801561266557600080fd5b505afa158015612679573d6000803e3d6000fd5b505050506040513d602081101561268f57600080fd5b5051604080516322f94b4360e11b8152600260048201529051919a506001600160a01b038316916345f2968691602480820192602092909190829003018186803b1580156126dc57600080fd5b505afa1580156126f0573d6000803e3d6000fd5b505050506040513d602081101561270657600080fd5b5051604080516322f94b4360e11b81526003600482015290519199506001600160a01b038316916345f2968691602480820192602092909190829003018186803b15801561275357600080fd5b505afa158015612767573d6000803e3d6000fd5b505050506040513d602081101561277d57600080fd5b50516040805163328b8fd560e21b815290519198506001600160a01b0383169163ca2e3f5491600480820192602092909190829003018186803b1580156127c357600080fd5b505afa1580156127d7573d6000803e3d6000fd5b505050506040513d60208110156127ed57600080fd5b5051604080516319ff274560e31b815260016004820152905161ffff90921697506001600160a01b0383169163cff93a2891602480820192602092909190829003018186803b15801561283f57600080fd5b505afa158015612853573d6000803e3d6000fd5b505050506040513d602081101561286957600080fd5b5051604080516319ff274560e31b81526000600482015290519196506001600160a01b0383169163cff93a2891602480820192602092909190829003018186803b1580156128b657600080fd5b505afa1580156128ca573d6000803e3d6000fd5b505050506040513d60208110156128e057600080fd5b505160408051632313771160e01b815290519195506001600160a01b03831691632313771191600480820192602092909190829003018186803b15801561292657600080fd5b505afa15801561293a573d6000803e3d6000fd5b505050506040513d602081101561295057600080fd5b5051604080516306aea6a160e21b815290519194506001600160a01b03831691631aba9a8491600480820192602092909190829003018186803b15801561299657600080fd5b505afa1580156129aa573d6000803e3d6000fd5b505050506040513d60208110156129c057600080fd5b50519150505b9193959799509193959799565b612b6b80612a3283390190565b8260058101928215612a0e579160200282015b82811115612a0e5782518255916020019190600101906129f3565b50611b7d92612a2e9250905b80821115611b7d5760008155600101612a1a565b9056fe608060405264e8d4a5100060075534801561001957600080fd5b50604051612b6b380380612b6b833981810160405260c081101561003c57600080fd5b508051602082015160408301516060840151608085015160a090950151600180546001600160a01b039586166001600160a01b031991821617825560008054969097169516949094178555600c805442600681905560ff90941663010000000263ff0000001961ffff96871661ffff19938416171617909155600b805497860b8516620100000263ffff0000199390960b909416961695909517949094169190911790556305aa3200909101600a55612a709081906100fb90396000f3fe60806040526004361061020e5760003560e01c80638d16406511610118578063ce74076a116100a0578063e130ce661161006f578063e130ce6614610817578063f2845bd014610876578063f6afd84d146108b6578063f9cdb2f6146108f5578063fecdab0c1461090a5761020e565b8063ce74076a1461076b578063cff93a2814610780578063d4dbfd31146107c3578063dd6bf029146107ed5761020e565b8063b1b71afa116100e7578063b1b71afa146106a0578063b769c441146106b5578063c12016fb146106ca578063c7ebf63b146106fa578063ca2e3f541461073f5761020e565b80638d164065146105b1578063985438c514610603578063aad1e2ed14610642578063ac462c4b146106835761020e565b806345f296861161019b578063538392361161016a57806353839236146105235780635c20679e1461055c5780636c734d3e1461058c5780637cef2178146105a15780638cb910f6146105a95761020e565b806345f296861461046d5780634a66aa2a146104975780634b3437ba146104ac578063521c5d38146104f95761020e565b80631d95807c116101e25780631d95807c146102f457806323137711146103875780632f0e22511461039c578063313c06a0146103d757806335c4479f146104085761020e565b8062db964e14610213578063095631be1461024357806315acdf75146102a25780631aba9a84146102c9575b600080fd5b34801561021f57600080fd5b506102416004803603602081101561023657600080fd5b503561ffff1661091f565b005b34801561024f57600080fd5b50610241600480360360a081101561026657600080fd5b810190808060a00190600580602002604051908101604052809291908260056020028082843760009201919091525091945061094e9350505050565b3480156102ae57600080fd5b506102b7610ba0565b60408051918252519081900360200190f35b3480156102d557600080fd5b506102de610ba6565b6040805160ff9092168252519081900360200190f35b34801561030057600080fd5b5061031e6004803603602081101561031757600080fd5b5035610bb5565b604080516001600160a01b03909a168a5260208a01989098528888019690965261ffff9094166060880152600192830b90920b608087015260ff90811660a087015290811660c08601521660e0840152600090810b900b61010083015251908190036101200190f35b34801561039357600080fd5b506102de610c23565b610241600480360360808110156103b257600080fd5b5080359060208101359060408101356001600160a01b0316906060013560ff16610c33565b3480156103e357600080fd5b506103ec611019565b604080516001600160a01b039092168252519081900360200190f35b34801561041457600080fd5b506104326004803603602081101561042b57600080fd5b5035611028565b6040805160ff968716815294861660208601529290941683830152600190810b900b6060830152911515608082015290519081900360a00190f35b34801561047957600080fd5b506102b76004803603602081101561049057600080fd5b5035611107565b3480156104a357600080fd5b506102b761111b565b3480156104b857600080fd5b506104c1611121565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b34801561050557600080fd5b506102416004803603602081101561051c57600080fd5b5035611142565b34801561052f57600080fd5b506102416004803603604081101561054657600080fd5b50803590602001356001600160a01b031661134c565b34801561056857600080fd5b506102416004803603604081101561057f57600080fd5b5080359060200135611599565b34801561059857600080fd5b506102b76116d2565b6102416116d8565b6102416117ff565b3480156105bd57600080fd5b506105db600480360360208110156105d457600080fd5b5035611820565b604080516001600160a01b039094168452602084019290925282820152519081900360600190f35b34801561060f57600080fd5b506102416004803603606081101561062657600080fd5b508035906001600160a01b0360208201351690604001356118de565b6102b7600480360360a081101561065857600080fd5b506001600160a01b038135169060208101359060408101359060ff60608201351690608001356119af565b6102416004803603602081101561069957600080fd5b5035611df8565b3480156106ac57600080fd5b506102b7611e45565b3480156106c157600080fd5b506103ec611e4b565b3480156106d657600080fd5b506102b7600480360360408110156106ed57600080fd5b5080359060200135611e5a565b34801561070657600080fd5b506102416004803603608081101561071d57600080fd5b50803590602081013590604081013590606001356001600160a01b0316611e88565b34801561074b57600080fd5b5061075461202b565b6040805161ffff9092168252519081900360200190f35b34801561077757600080fd5b50610241612035565b34801561078c57600080fd5b506107aa600480360360208110156107a357600080fd5b5035612072565b60408051600192830b90920b8252519081900360200190f35b3480156107cf57600080fd5b506102b7600480360360208110156107e657600080fd5b503561209c565b3480156107f957600080fd5b506102b76004803603602081101561081057600080fd5b50356120ba565b34801561082357600080fd5b50610241600480360360a081101561083a57600080fd5b810190808060a0019060058060200260405190810160405280929190826005602002808284376000920191909152509194506121ef9350505050565b34801561088257600080fd5b506102416004803603606081101561089957600080fd5b5060ff813516906020810135600190810b9160400135900b612419565b3480156108c257600080fd5b506102b7600480360360608110156108d957600080fd5b508035906001600160a01b036020820135169060400135612483565b34801561090157600080fd5b506102b761269b565b34801561091657600080fd5b506102416126a1565b6001546001600160a01b0316331461093657600080fd5b600c805461ffff191661ffff92909216919091179055565b6001546001600160a01b0316331461096557600080fd5b617530600854106109b4576040805162461bcd60e51b8152602060048201526014602482015273646f6e652077697468206e657720736574746c6560601b604482015290519081900360640190fd5b600854600090819081906109d290614d571901600d835b015461285b565b600854909150614e1f19015b81811015610b77576000601081600d810184815481106109fa57fe5b60009182526020808320909101548352820192909252604001902060038101805460ff60281b1916600160281b1790819055909150600160301b900460ff16600514610b6e5760028101546003820154612710620100008204600190810b900b8302059164e8d4a51000918990600160301b900460ff1660058110610a7b57fe5b60200201516003850154600160381b9004600090810b900b020281610a9c57fe5b0503945084840393506000851215610ac957610abf816001015486600003612874565b6001820155610aeb565b64e8d4a51000600754860281610adb57fe5b6001830180549290910490910190555b806002015481600101541015610b555760038101805460ff60281b1916650600000000001790819055600160381b9004600090810b900b60011415610b4557610b3d6002805b01548260020154612874565b600455610b55565b610b5160026001610b31565b6003555b60038101805460ff60301b191666050000000000001790555b506001016109de565b506008805460c80190819055600d5411610b92576175306008555b506009805490910190555050565b60085481565b600c5462010000900460ff1681565b6010602052600090815260408120805460018083015460028401546003909401546001600160a01b039093169490939261ffff811692620100008204900b9160ff6401000000008304811692600160281b8104821692600160301b820490921691600160381b909104900b89565b600c546301000000900460ff1681565b6001546001600160a01b03163314610c4a57600080fd5b60008381526010602052604090206006548510610cae576040805162461bcd60e51b815260206004820152601e60248201527f43616e6e6f7420646f20647572696e6720736574746c6520706572696f640000604482015290519081900360640190fd5b80546001600160a01b0384811691161480610cd657506000546001600160a01b038481169116145b610d27576040805162461bcd60e51b815260206004820152601960248201527f43616e63656c6c6572206e6f74204c50206f722074616b657200000000000000604482015290519081900360640190fd5b6003810154600160281b900460ff16600114610d81576040805162461bcd60e51b8152602060048201526014602482015273726564756e64616e74206f7220746f6f206e657760601b604482015290519081900360640190fd5b6000612710826002015460fa0281610d9557fe5b04905080600202341015610dea576040805162461bcd60e51b8152602060048201526017602482015276496e73756666696369656e742063616e63656c2066656560481b604482015290519081900360640190fd5b6002820154600383015460009161271091640100000000900460ff1602049050426224ea0001600a541015610e20575060009050805b82546001600160a01b038681169116148015610e3f57508360ff166005145b15610e605760038301805460ff60281b191665020000000000179055610f38565b82546001600160a01b0386811691161415610f0e5760028054610e879160035b0154612874565b836002015410610ede576040805162461bcd60e51b815260206004820152601d60248201527f496e73756666204c5020524d20666f7220696d6d65642063616e63656c000000604482015290519081900360640190fd5b5060038201805460ff60281b1916650400000000001760ff60301b1916600160301b60ff86160217905580610f38565b816002029150610f1e3483612874565b60038401805460ff60281b19166503000000000017905590505b610fbb82600160009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b815260040160206040518083038186803b158015610f8a57600080fd5b505afa158015610f9e573d6000803e3d6000fd5b505050506040513d6020811015610fb457600080fd5b505161288e565b600e80546001810182556000919091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01869055600280548201905561100434838301612874565b60019093018054909301909255505050505050565b6000546001600160a01b031681565b60008060008060006110386128ff565b50600086815260106020908152604080832081516101208101835281546001600160a01b03168152600180830154948201949094526002820154928101929092526003015461ffff81166060830152620100008104830b830b830b6080830181905260ff6401000000008304811660a08501819052600160281b8404821660c08601819052600160301b850490921660e08601819052600160381b909404870b870b870b6101008601819052919b50929950919750955090920b14156110fd57600191505b5091939590929450565b6002816004811061111457fe5b0154905081565b600a5481565b600f54600e54600d54600654600854600a5494959394929391929091479190565b6001546001600160a01b0316331461115957600080fd5b614e20600854106111b1576040805162461bcd60e51b815260206004820152601860248201527f646f6e65207769746820726f6c6c696e6720736574746c650000000000000000604482015290519081900360640190fd5b60008060006111ce6127106008540360fa01600f8054905061285b565b60085490915061270f19015b8181101561131d57600060106000600f84815481106111f557fe5b9060005260206000200154815260200190815260200160002090508060030160059054906101000a900460ff1660ff16600114156113145760028101546003820154612710620100008204600190810b900b8302059164e8d4a5100091600160381b9004600090810b900b890202050394508484039350600085121561129057611286816001015486600003612874565b60018201556112b2565b64e8d4a510006007548602816112a257fe5b6001830180549290910490910190555b8060020154816001015410156113145760038101805460ff60281b1916650600000000001790819055600160381b9004600090810b900b60011415611304576112fc600280610b31565b600455611314565b61131060026001610b31565b6003555b506001016111da565b506008805460fa8101909155600f546126151990910110610b9257614e20600855506009805490910190555050565b6001546001600160a01b0316331461136357600080fd5b600082815260106020526040902060038101546005600160281b90910460ff16118061139a5750600c5462010000900460ff166003145b6113a357600080fd5b6001810180546000918290556003830154909161ffff821691600160281b900460ff1660061480156113de5750600c5462010000900460ff16155b9050600060028560020154816113f057fe5b86546000805493909204935090916001600160a01b03918216918981169116141561143757611423866377359400612874565b600280549188039182019055958690039591505b600060106000600f6001600f80549050038154811061145257fe5b6000918252602080832091909101548352820192909252604001902060038101805461ffff191661ffff8916179055600f805491925090600019810190811061149757fe5b9060005260206000200154600f8761ffff16815481106114b357fe5b600091825260209091200155600f8054806114ca57fe5b6000828152602080822083016000199081018390559092019092558b8252601090526040812080546001600160a01b0319168155600181018290556002810191909155600301805467ffffffffffffffff1916905584156115835761152f8785612874565b965061158384600160009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b815260040160206040518083038186803b158015610f8a57600080fd5b61158d878361288e565b50505050505050505050565b6001546001600160a01b031633146115b057600080fd5b6002548211156115f15760405162461bcd60e51b81526004018080602001828103825260248152602001806129f56024913960400191505060405180910390fd5b600c5462010000900460ff166003146116a7576005546002546116149084612874565b10156116515760405162461bcd60e51b815260040180806020018281038252602281526020018061298e6022913960400191505060405180910390fd5b60065481106116a7576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f7420772f6420647572696e6720736574746c6520706572696f6400604482015290519081900360640190fd5b6002546116b49083612874565b6002556000546116ce9083906001600160a01b031661288e565b5050565b60095481565b6001546001600160a01b031633146116ef57600080fd5b6000612710611707600260010154600280015461285b565b6002800154600260010154010360fa028161171e57fe5b04905080341015611770576040805162461bcd60e51b8152602060048201526017602482015276496e73756666696369656e742063616e63656c2066656560481b604482015290519081900360640190fd5b600081340390506117c982600160009054906101000a90046001600160a01b03166001600160a01b031663412753586040518163ffffffff1660e01b815260040160206040518083038186803b158015610f8a57600080fd5b600a544211156117e957600c805462ff00001916620100001790556117f3565b6224ea004201600a555b60028054909101905550565b6001546001600160a01b0316331461181657600080fd5b6002805434019055565b600080600061182d6128ff565b50505060009182525060106020908152604080832081516101208101835281546001600160a01b0316808252600180840154958301869052600284015494830185905260039093015461ffff81166060840152620100008104840b840b90930b608083015260ff6401000000008404811660a0840152600160281b8404811660c0840152600160301b84041660e0830152600160381b909204850b850b90940b610100909401939093529192909190565b6001546001600160a01b031633146118f557600080fd5b600c5462010000900460ff166003141561190e57600080fd5b600083815260106020526040902080546001600160a01b0384811691161461193557600080fd5b600654821161194357600080fd5b6202a3006119514284612874565b1161195b57600080fd5b60006119726002825b01546005546002900461285b565b9050611984600260005b015482612874565b6002556000600555600c805462ff000019166203000017905560019190910180549091019055505050565b6001546000906001600160a01b031633146119c957600080fd5b600c5462010000900460ff1615611a27576040805162461bcd60e51b815260206004820152601f60248201527f626f6f6b206e6f206c6f6e6765722074616b696e6720706f736974696f6e7300604482015290519081900360640190fd5b600a54426224ea000110611a76576040805162461bcd60e51b81526020600482015260116024820152703137b7b59031b637b9b4b7339039b7b7b760791b604482015290519081900360640190fd5b600c5461ffff1664e8d4a5100002851015611ad8576040805162461bcd60e51b815260206004820152601d60248201527f6d7573742062652067726561746572207468616e20626f6f6b206d696e000000604482015290519081900360640190fd5b6006548410611b2e576040805162461bcd60e51b815260206004820152601e60248201527f43616e6e6f7420646f20647572696e6720736574746c6520706572696f640000604482015290519081900360640190fd5b600f54610fa011611b75576040805162461bcd60e51b815260206004820152600c60248201526b189bdbdac81a5cc8199d5b1b60a21b604482015290519081900360640190fd5b6000611ba260028460020360048110611b8a57fe5b015460028054040160028560010160048110610e8057fe5b9050808611158015611bb957506005546002540386105b611bc257600080fd5b80861115611bcf57600080fd5b8560028460010160048110611be057fe5b0180549091019055611bf06128ff565b604081018790523460208201526001600160a01b0388168152600284810260001901600090810b900b610100830152879060030180549091019055600f5460408051426020808301919091528183018490528251808303840181526060928301909352825192019190912061ffff9092169083015260ff861660e08301529250600b8460028110611c7d57fe5b60108082049290920154600f918216600290810261010090810a909204600190810b810b810b60808701908152600c546301000000900460ff90811660a0890190815260008b8152602098895260408082208b5181546001600160a01b0319166001600160a01b03909116178155998b01518a8701558a0151958901959095556060890151600390980180549351915160c08b015160e08c0151988c015161ffff1990961661ffff9b8c161763ffff000019166201000094880b9b909b16939093029990991764ff000000001916640100000000998416999099029890981760ff60281b1916600160281b918316919091021760ff60301b1916600160301b958216959095029490941767ff000000000000001916600160381b91840b9094160292909217909355815490810182559082527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80201849055600d0180546001810182556000918252602090912001839055505095945050505050565b6001546001600160a01b03163314611e0f57600080fd5b600081815260106020526040902060038101546002600160281b90910460ff1610611e3957600080fd5b60010180543401905550565b60075481565b6001546001600160a01b031681565b600d8260028110611e6757fe5b018181548110611e7357fe5b90600052602060002001600091509150505481565b6001546001600160a01b03163314611e9f57600080fd5b6006548210611ef5576040805162461bcd60e51b815260206004820152601f60248201527f43616e6e6f7420772f6420647572696e6720736574746c6520706572696f6400604482015290519081900360640190fd5b600084815260106020526040902060038101546006600160281b90910460ff1610611f60576040805162461bcd60e51b81526020600482015260166024820152757375626b20646561642c206d7573742072656465656d60501b604482015290519081900360640190fd5b80546001600160a01b03838116911614611fab5760405162461bcd60e51b81526004018080602001828103825260238152602001806129d26023913960400191505060405180910390fd5b8060020154611fbe826001015486612874565b1015611ffb5760405162461bcd60e51b8152600401808060200182810382526022815260200180612a196022913960400191505060405180910390fd5b612009816001015485612874565b600182015580546120249085906001600160a01b031661288e565b5050505050565b600c5461ffff1681565b6001546001600160a01b0316331461204c57600080fd5b600654620d2f0001421161205f57600080fd5b600c805462ff0000191662030000179055565b600b816002811061207f57fe5b60109182820401919006600202915054906101000a900460010b81565b600f81815481106120a957fe5b600091825260209091200154905081565b6001546000906001600160a01b031633146120d457600080fd5b600c5460ff62010000909104166002141561212b576040805162461bcd60e51b815260206004820152601260248201527163616e206f6e6c79206275726e206f6e636560701b604482015290519081900360640190fd5b600554600290048083101561217f576040805162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e74206275726e2066656560581b604482015290519081900360640190fd5b6121898382612874565b60035460045491925010156121c4576007546121bc906002805b015460055464e8d4a5100002816121b657fe5b04612874565b6007556121d8565b6007546121d490600260016121a3565b6007555b600c805462ff000019166202000017905592915050565b6001546001600160a01b0316331461220657600080fd5b600c5462010000900460ff166003148015906122255750612710600854105b612276576040805162461bcd60e51b815260206004820152601760248201527f646f6e6520776974682065787069727920736574746c65000000000000000000604482015290519081900360640190fd5b600080600061229260085460c801600d6001600281106109cb57fe5b6008549091505b818110156123f1576000601081600d60010184815481106122b657fe5b90600052602060002001548152602001908152602001600020905061271081600201548260030160029054906101000a900460010b60010b02816122f657fe5b0564e8d4a5100082600201548860018560030160069054906101000a900460ff160360ff166005811061232557fe5b60200201516003850154600160381b9004600090810b900b02028161234657fe5b050394508484039350600085121561237357612369816001015486600003612874565b6001820155612395565b64e8d4a5100060075486028161238557fe5b6001830180549290910490910190555b6003810154600160381b9004600090810b900b600114156123c3576123bb600280610b31565b6004556123d3565b6123cf60026001610b31565b6003555b600301805460ff60281b191665070000000000179055600101612299565b506008805460c80190819055600e5411610b9257612710600855506009805490910190555050565b6001546001600160a01b0316331461243057600080fd5b600b8054600192830b61ffff90811661ffff199092169190911763ffff00001916620100009490930b1692909202179055600c805463ff0000001916630100000060ff9390931692909202919091179055565b6001546000906001600160a01b0316331461249d57600080fd5b600084815260106020526040902080546001600160a01b0385811691161461250c576040805162461bcd60e51b815260206004820181905260248201527f6d75737420627920706172747920746f2068697320737562636f6e7472616374604482015290519081900360640190fd5b60085415612561576040805162461bcd60e51b815260206004820152601d60248201527f6e6f7420647572696e6720736574746c656d656e742070726f63657373000000604482015290519081900360640190fd5b60038101546005600160281b90910460ff16106125c5576040805162461bcd60e51b815260206004820181905260248201527f63616e206f6e6c79206275726e2061637469766520737562636f6e7472616374604482015290519081900360640190fd5b600060028260020154816125d557fe5b04905080841015612625576040805162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e74206275726e2066656560581b604482015290519081900360640190fd5b61262f8482612874565b60045460035491925010156126675760075461265f90600260015b0154846002015464e8d4a5100002816121b657fe5b60075561267a565b6007546126769060028061264a565b6007555b600391909101805460ff60281b191665050000000000179055949350505050565b60065481565b6001546001600160a01b031633146126b857600080fd5b600854617530146126fa5760405162461bcd60e51b81526004018080602001828103825260228152602001806129b06022913960400191505060405180910390fd5b60035460045411156127155760035460045403600555612720565b600454600354036005555b600060095412156127475761273f600260000154600954600003612874565b60025561276a565b64e8d4a51000600754600954028161275b57fe5b04600260000154016002600001555b600c5462010000900460ff161561279957600c805462ff00001916620300001790556000600260030155612826565b600554600254101561282657600c805462ff000019166203000017905560006127c3600282611964565b90506127d16002600061197c565b60025560015460408051630824ea6b60e31b8152905161281f9284926001600160a01b0390911691634127535891600480820192602092909190829003018186803b158015610f8a57600080fd5b5060006005555b6000600981905542600655600855600d60016128449101600061294b565b612850600d600061294b565b64e8d4a51000600755565b600081831161286b57508161286e565b50805b92915050565b60008282106128855750600061286e565b5080820361286e565b600154604080516001626074f160e11b031981526001600160a01b0384811660048301529151919092169163ff3f161e91859160248082019260009290919082900301818588803b1580156128e257600080fd5b505af11580156128f6573d6000803e3d6000fd5b50505050505050565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b5080546000825590600052602060002090810190612969919061296c565b50565b61298a91905b808211156129865760008155600101612972565b5090565b9056fe43616e6e6f7420772f64206d6f7265207468616e20657863657373206d617267696e6e6f7420646f6e65207769746820616c6c2074686520737562636f6e7472616374734d7573742062652074616b657220746f2063616c6c20746869732066756e6374696f6e43616e6e6f74207769746864726177206d6f7265207468616e20746865206d617267696e63616e6e6f7420772f64206d6f7265207468616e20657863657373206d617267696ea26469706673582212207a71c70efef0c7f61da40c4313bc6e58999d6154b2858cebd7ffa6596353c1fc64736f6c6343000603003355736572206d757374206e6f7420686176652061207072656578697374696e6720626f6f6b596f75206d6179206e6f742072656d6f766520796f757273656c6620617320616e2061646d696e2e43616e6e6f742063616e63656c20647572696e67203420504d20455420686f7572a2646970667358221220af1a70419ae5167800c073357e5f5c7742613ac71b28101920b46c987f48f72864736f6c63430006030033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b0009be42625f9ad53221dd0ac1bb1b799467ac000000000000000000000000000000000000000000000000000000000000000fa
-----Decoded View---------------
Arg [0] : priceOracle (address): 0xb0009Be42625f9AD53221DD0aC1BB1b799467AC0
Arg [1] : _levRatio (int256): 250
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b0009be42625f9ad53221dd0ac1bb1b799467ac0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000fa
Deployed Bytecode Sourcemap
1187:18814:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;9135:792:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9135:792:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9135:792:0;-1:-1:-1;;;;;9135:792:0;;:::i;:::-;;;;;;;;;;;;;;;;;;7458:345;;;:::i;:::-;;12223:318;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12223:318:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12223:318:0;;;-1:-1:-1;;;;;12223:318:0;;;;;;;;;;:::i;2688:218::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2688:218:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;2688:218:0;-1:-1:-1;;;;;2688:218:0;;:::i;6654:199::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;6654:199:0;-1:-1:-1;;;;;6654:199:0;;:::i;5048:138::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;5048:138:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5048:138:0;-1:-1:-1;;;;;5048:138:0;;:::i;1572:19::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1572:19:0;;;:::i;:::-;;;;;;;;;;;;;;;;5672:974;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;5672:974:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;5672:974:0;;;;;;;;;;;;;;6861:231;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;6861:231:0;;;;;;;;:::i;2010:33::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2010:33:0;;;:::i;15073:1103::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;15073:1103:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;15073:1103:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18470:280;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18470:280:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;18470:280:0;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;;18470:280:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;18470:280:0;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;18470:280:0;;-1:-1:-1;18470:280:0;;-1:-1:-1;;;;18470:280:0:i;9935:909::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9935:909:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9935:909:0;-1:-1:-1;;;;;9935:909:0;;:::i;13077:229::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;13077:229:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;13077:229:0;;;;;;;;:::i;12652:228::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12652:228:0;;;:::i;14633:432::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14633:432:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;14633:432:0;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;14633:432:0;;;;;;;;;;;;;;;;;;;;;;;;;3909:1131;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3909:1131:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;3909:1131:0;;;;;;;;;;;;:::i;3019:128::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3019:128:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;3019:128:0;-1:-1:-1;;;;;3019:128:0;;:::i;18758:1040::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;18758:1040:0;;;:::i;1734:40::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1734:40:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1734:40:0;-1:-1:-1;;;;;1734:40:0;;:::i;1918:46::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1918:46:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1918:46:0;-1:-1:-1;;;;;1918:46:0;;:::i;1464:20::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1464:20:0;;;:::i;7100:350::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;7100:350:0;;;;;;;;:::i;1826:48::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1826:48:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1826:48:0;-1:-1:-1;;;;;1826:48:0;;:::i;8257:242::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;8257:242:0;-1:-1:-1;;;;;8257:242:0;;:::i;12888:181::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12888:181:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12888:181:0;-1:-1:-1;;;;;12888:181:0;;:::i;1598:32::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1598:32:0;;;:::i;8507:258::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;8507:258:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;8507:258:0;;;;;;;;:::i;10852:969::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;10852:969:0;;;;;;;;;;;;;;;:::i;16184:1543::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16184:1543:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;16184:1543:0;-1:-1:-1;;;;;16184:1543:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7811:438;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;7811:438:0;;;;;;;;;;;;;;;:::i;1491:29::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1491:29:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1491:29:0;;;;;;;:::i;11938:277::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11938:277:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11938:277:0;;:::i;3155:247::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3155:247:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;3155:247:0;;;;:::i;5351:148::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5351:148:0;-1:-1:-1;;;;;5351:148:0;;:::i;13314:1311::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;13314:1311:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;13314:1311:0;-1:-1:-1;;;;;13314:1311:0;;:::i;:::-;;;;-1:-1:-1;;;;;13314:1311:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9135:792;-1:-1:-1;;;;;9246:10:0;;;9205:15;9246:10;;;:5;:10;;;;;;9205:15;;9246:10;9238:33;;12:1:-1;9;2:12;9238:33:0;-1:-1:-1;;;;;9296:10:0;;;9282:6;9296:10;;;:5;:10;;;;;;;;;9344:22;;-1:-1:-1;;;9344:22:0;;;;9296:10;;;;;9344:20;;:22;;;;;;;;;;;9296:10;9344:22;;;2:2:-1;;;;27:1;24;17:12;2:2;9344:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9344:22:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9344:22:0;9392:20;;9344:22;;-1:-1:-1;9415:8:0;9392:31;9385:3;:39;9377:48;;12:1:-1;9;2:12;9377:48:0;9467:18;9444:20;;:41;9436:73;;;;;-1:-1:-1;;;9436:73:0;;;;;;;;;;;;-1:-1:-1;;;9436:73:0;;;;;;;;;;;;;;;9520:15;9538:1;-1:-1:-1;;;;;9538:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9538:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9538:13:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9538:13:0;;-1:-1:-1;9579:3:0;9566:16;;9562:358;;;-1:-1:-1;;;;;9599:16:0;;;9616:12;;:15;;;;9599:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9599:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9599:33:0;;;;9562:358;;;9667:3;9654:10;:16;9650:270;;;9703:12;:18;9687:35;;;-1:-1:-1;;;9687:35:0;;;;;;;;;;-1:-1:-1;;;;;9687:15:0;;;;;:35;;;;;9716:1;;9687:35;;;;;;;9716:1;9687:15;:35;;;2:2:-1;;;;27:1;24;17:12;9650:270:0;9757:3;9744:10;:16;9740:180;;;-1:-1:-1;;;;;9777:11:0;;;9789:12;9802:1;9789:15;;9740:180;9827:10;9841:3;9827:17;9823:97;;;9861:1;-1:-1:-1;;;;;9861:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9861:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9861:15:0;;;;9904:4;9891:17;;9823:97;9135:792;;;;;;:::o;7458:345::-;7541:10;7564:1;7535:17;;;:5;:17;;;;;;-1:-1:-1;;;;;7535:17:0;7527:40;;12:1:-1;9;2:12;7527:40:0;7598:10;7578:6;7592:17;;;:5;:17;;;;;;;;;7635:23;;-1:-1:-1;;;7635:23:0;;7648:9;7635:23;;;;;;-1:-1:-1;;;;;7592:17:0;;;;7578:6;7592:17;;7635:12;;:23;;;;;7592:17;7635:23;;;;;7578:6;7592:17;7635:23;;;2:2:-1;;;;27:1;24;17:12;2:2;7635:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7635:23:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;7635:23:0;7700:46;;;7709:10;7700:46;;;7669:15;7635:23;7700:46;;;;;;;;;;;;7742:3;7700:46;;;;;;7635:23;;-1:-1:-1;7669:15:0;;7700:46;;;;;;;;;-1:-1:-1;7774:10:0;7757:28;;;;:16;:28;;;;;:38;;;;;;;-1:-1:-1;7458:345:0:o;12223:318::-;12339:1;12330:6;:10;12322:19;;12:1:-1;9;2:12;12322:19:0;-1:-1:-1;;;;;12360:10:0;;;12382:1;12360:10;;;:5;:10;;;;;;;12352:33;;12:1:-1;9;2:12;12352:33:0;-1:-1:-1;;;;;12410:10:0;;;12396:6;12410:10;;;:5;:10;;;;;;;12500:20;;12464:69;;-1:-1:-1;;;12464:69:0;;;;;;;;12441:3;:12;;;12464:69;;;;;;;;;;;;;12522:10;12464:69;;;;;;12441:12;;12410:10;;;;;12464:19;;:69;;;;;;;;;;12396:6;12410:10;12464:69;;;2:2:-1;;;;27:1;24;17:12;2:2;12464:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12464:69:0;;;;12223:318;;;;:::o;2688:218::-;2634:10;2619:26;;;;:14;:26;;;;;;;;2611:49;;;;;-1:-1:-1;;;2611:49:0;;;;;;;;;;;;-1:-1:-1;;;2611:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;2788:22:0;::::1;2800:10;2788:22;;2780:75;;;;-1:-1:-1::0;;;2780:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;2866:24:0::1;2893:5;2866:24:::0;;;:14:::1;:24;::::0;;;;:32;;-1:-1:-1;;2866:32:0::1;::::0;;2688:218::o;6654:199::-;-1:-1:-1;;;;;6742:10:0;;;6764:1;6742:10;;;:5;:10;;;;;;;6734:33;;12:1:-1;9;2:12;6734:33:0;-1:-1:-1;;;;;6792:10:0;;;6778:6;6792:10;;;:5;:10;;;;;;;6814:31;;-1:-1:-1;;;6814:31:0;;;;6792:10;;;;;6814:12;;6833:9;;6814:31;;;;;6778:6;6814:31;;;;;6833:9;6792:10;6814:31;;;2:2:-1;;;;27:1;24;17:12;2:2;6814:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6814:31:0;;;;;6654:199;;:::o;5048:138::-;2634:10;2619:26;;;;:14;:26;;;;;;;;2611:49;;;;;-1:-1:-1;;;2611:49:0;;;;;;;;;;;;-1:-1:-1;;;2611:49:0;;;;;;;;;;;;;;;5155:10:::1;:23:::0;;-1:-1:-1;;;;;;5155:23:0::1;-1:-1:-1::0;;;;;5155:23:0;;;::::1;::::0;;;::::1;::::0;;5048:138::o;1572:19::-;;;;:::o;5672:974::-;5846:10;5799:15;5840:17;;;:5;:17;;;;;;-1:-1:-1;;;;;5840:17:0;:31;5832:81;;;;-1:-1:-1;;;5832:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5950:4;5945:10;;5958:8;5945:21;5932:9;:34;;5924:65;;;;;-1:-1:-1;;;5924:65:0;;;;;;;;;;;;-1:-1:-1;;;5924:65:0;;;;;;;;;;;;;;;6016:1;6008:4;:9;;;;6000:18;;12:1:-1;9;2:12;6000:18:0;6029:14;6072:3;6061:8;;6052:6;:17;:23;;;;;;6029:47;;6087:15;6132:3;6121:8;;6111:7;:18;:24;;;;;;6087:49;;6147:14;6199:3;6187:8;;6170:9;:26;:32;;;;;;6147:56;;6234:3;6222:8;:15;;;;:35;;;;;-1:-1:-1;;6241:8:0;:16;;;;6222:35;6214:44;;12:1:-1;9;2:12;6214:44:0;6290:3;6277:9;:16;;;;:37;;;;;-1:-1:-1;;6297:9:0;:17;;;;6277:37;6269:46;;12:1:-1;9;2:12;6269:46:0;6346:3;6334:8;:15;;;;6326:24;;12:1:-1;9;2:12;6326:24:0;6398:10;6418:4;6425;6431:8;6441;6451:9;6389:72;;;;;:::i;:::-;-1:-1:-1;;;;;6389:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6389:72:0;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;6367:10:0;6361:17;;;;:5;:17;;;;;;:101;;-1:-1:-1;;;;;;6361:101:0;-1:-1:-1;;;;;6361:101:0;;;;;;;;6516:31;;-1:-1:-1;;;6516:31:0;;;;6487:17;;;;;6516:12;;6535:9;;6516:31;;;;;6361:17;6516:31;;;;;6535:9;6487:17;6516:31;;;2:2:-1;;;;27:1;24;17:12;2:2;6516:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;6573:10:0;6585:17;;;;:5;:17;;;;;;;;;;6563:40;;-1:-1:-1;;;;;6585:17:0;;;6563:40;;;;6573:10;;-1:-1:-1;6563:40:0;;-1:-1:-1;6563:40:0;;;;;;-1:-1:-1;6563:40:0;-1:-1:-1;;6627:10:0;6621:17;;;;:5;:17;;;;;;-1:-1:-1;;;;;6621:17:0;;5672:974;-1:-1:-1;;;;;;;5672:974:0:o;6861:231::-;-1:-1:-1;;;;;6972:10:0;;;6994:1;6972:10;;;:5;:10;;;;;;;6964:33;;12:1:-1;9;2:12;6964:33:0;-1:-1:-1;;;;;7022:10:0;;;7008:6;7022:10;;;:5;:10;;;;;;;7044:40;;-1:-1:-1;;;7044:40:0;;;;;;;;;;7022:10;;;;;7044:15;;7066:9;;7044:40;;;;;7008:6;7044:40;;;;;7066:9;7022:10;7044:40;;;2:2:-1;;;;27:1;24;17:12;2010:33:0;;;-1:-1:-1;;;;;2010:33:0;;:::o;15073:1103::-;-1:-1:-1;;;;;15961:10:0;;;15387:16;15961:10;;;:5;:10;;;;;;15387:16;;;;;;;;;;15961:10;15986:18;;15982:187;;16021:6;16035:4;16021:19;;16131:1;-1:-1:-1;;;;;16131:18:0;;16150:6;16131:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;16131:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16131:26:0;;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;16131:26:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16131:26:0;;-1:-1:-1;16131:26:0;-1:-1:-1;16131:26:0;;-1:-1:-1;16131:26:0;-1:-1:-1;;15982:187:0;15073:1103;;;;;;;;;:::o;18470:280::-;18617:6;;-1:-1:-1;;;;;18617:6:0;18595:10;:29;18587:38;;12:1:-1;9;2:12;18587:38:0;18636:29;:12;18654:11;18636:15;:29;:::i;:::-;-1:-1:-1;18676:29:0;:15;18694:11;18676:15;:29;:::i;:::-;-1:-1:-1;;18739:3:0;18716:20;:26;-1:-1:-1;18470:280:0:o;9935:909::-;-1:-1:-1;;;;;10011:10:0;;;10033:1;10011:10;;;:5;:10;;;;;;;10003:33;;12:1:-1;9;2:12;10003:33:0;-1:-1:-1;;;;;10061:10:0;;;10047:6;10061:10;;;:5;:10;;;;;;;;;10109:22;;-1:-1:-1;;;10109:22:0;;;;10061:10;;;;;10109:20;;:22;;;;;;;;;;;10061:10;10109:22;;;2:2:-1;;;;27:1;24;17:12;2:2;10109:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10109:22:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10109:22:0;10157:20;;10109:22;;-1:-1:-1;10180:8:0;10157:31;10150:3;:39;10142:48;;12:1:-1;9;2:12;10142:48:0;10232:18;10209:20;;:41;10201:73;;;;;-1:-1:-1;;;10201:73:0;;;;;;;;;;;;-1:-1:-1;;;10201:73:0;;;;;;;;;;;;;;;10469:33;;-1:-1:-1;;;10469:33:0;;-1:-1:-1;;;;;10469:16:0;;;;;10486:15;;10469:33;;;;;;10486:15;10469:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;10469:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;10578:12:0;:18;10562:35;;;-1:-1:-1;;;10562:35:0;;;;;;;;;;-1:-1:-1;;;;;10562:15:0;;;-1:-1:-1;10562:15:0;;-1:-1:-1;10562:35:0;;;;;10591:1;;10562:35;;;;;;;10591:1;10562:15;:35;;;2:2:-1;;;;27:1;24;17:12;2:2;10562:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;10782:28:0;;-1:-1:-1;;;10782:28:0;;-1:-1:-1;;;;;10782:11:0;;;-1:-1:-1;10782:11:0;;-1:-1:-1;10794:12:0;;10782:28;;;;;;10794:12;10782:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;10782:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10782:28:0;;;;10821:1;-1:-1:-1;;;;;10821:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;13077:229:0;-1:-1:-1;;;;;13168:10:0;;;13190:1;13168:10;;;:5;:10;;;;;;;13160:33;;12:1:-1;9;2:12;13160:33:0;-1:-1:-1;;;;;13218:10:0;;;13204:6;13218:10;;;:5;:10;;;;;;;13277:20;;13240:58;;-1:-1:-1;;;13240:58:0;;;;;;;;13265:10;13240:58;;;;;;;;;;;;;13218:10;;;;;13240:16;;:58;;;;;;;;;;;13204:6;13218:10;13240:58;;;2:2:-1;;;;27:1;24;17:12;12652:228:0;12750:10;12719:11;12733:28;;;:16;:28;;;;;;12780:10;12772:19;;12:1:-1;9;2:12;12772:19:0;12819:10;12833:1;12802:28;;;:16;:28;;;;;;:32;;;12845:27;;;;;;12865:6;;12845:27;;12833:1;12845:27;12865:6;12819:10;12845:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12845:27:0;12652:228;:::o;14633:432::-;-1:-1:-1;;;;;14892:10:0;;;14748:13;14892:10;;;:5;:10;;;;;;14748:13;;;;;;14892:10;14917:18;;14913:145;;14952:6;14966:4;14952:19;;15020:1;-1:-1:-1;;;;;15020:18:0;;15039:6;15020:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;15020:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15020:26:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;15020:26:0;;;;;;;;;;;;;-1:-1:-1;15020:26:0;;-1:-1:-1;15020:26:0;-1:-1:-1;;14913:145:0;14633:432;;;;;;:::o;3909:1131::-;4017:10;4040:1;4011:17;;;:5;:17;;;;;;-1:-1:-1;;;;;4011:17:0;4003:65;;;;;-1:-1:-1;;;4003:65:0;;;;;;;;;;;;-1:-1:-1;;;4003:65:0;;;;;;;;;;;;;;;4412:12;4447:3;4436:8;;4427:6;:17;:23;;;;;;4412:38;;4461:13;4498:3;4487:8;;4477:7;:18;:24;;;;;;4461:40;;4512:13;4556:3;4544:8;;4528;:25;:31;;;;;;4512:47;;4702:3;4690:8;:15;;4682:24;;12:1:-1;9;2:12;4682:24:0;4737:3;4725:8;:15;;:35;;;;;-1:-1:-1;;4744:8:0;:16;;4725:35;4717:44;;12:1:-1;9;2:12;4717:44:0;4793:3;4780:9;:16;;:37;;;;;-1:-1:-1;;4800:9:0;:17;;4780:37;4772:46;;12:1:-1;9;2:12;4772:46:0;4849:10;4829:6;4843:17;;;:5;:17;;;;;;;4872:68;;-1:-1:-1;;;4872:68:0;;;;;;;;;4843:17;4872:68;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4843:17:0;;;;;;4872:16;;:68;;;;;4829:6;4872:68;;;;;4829:6;4843:17;4872:68;;;2:2:-1;;;;27:1;24;17:12;2:2;4872:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;4956:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4969:10;;-1:-1:-1;4956:76:0;;-1:-1:-1;4956:76:0;;;;;;;;3909:1131;;;;;;;:::o;3019:128::-;2634:10;2619:26;;;;:14;:26;;;;;;;;2611:49;;;;;-1:-1:-1;;;2611:49:0;;;;;;;;;;;;-1:-1:-1;;;2611:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;3108:24:0::1;;::::0;;;:14:::1;:24;::::0;;;;:31;;-1:-1:-1;;3108:31:0::1;3135:4;3108:31;::::0;;3019:128::o;18758:1040::-;18826:10;18869:3;19583:1;19576:4;19567:5;19557:15;;19556:24;:28;19548:36;;19610:10;19600:7;:20;:44;;;;;19634:10;19624:7;:20;19600:44;19599:96;;;;19660:10;19650:7;:20;:44;;;;;19684:10;19674:7;:20;19650:44;19599:159;;;;19723:10;19713:7;:20;:44;;;;;19747:10;19737:7;:20;19713:44;19595:195;;;19781:5;19789:1;19781:9;19773:17;;19595:195;18758:1040;;:::o;1734:40::-;;;;;;;;;;;;-1:-1:-1;;;;;1734:40:0;;:::o;1918:46::-;;;;;;;;;;;;;;;:::o;1464:20::-;;;-1:-1:-1;;;;;1464:20:0;;:::o;7100:350::-;-1:-1:-1;;;;;7207:10:0;;;7229:1;7207:10;;;:5;:10;;;;;;;7199:33;;12:1:-1;9;2:12;7199:33:0;-1:-1:-1;;;;;7257:10:0;;;7243:6;7257:10;;;:5;:10;;;;;;;;;7293:46;;-1:-1:-1;;;7293:46:0;;;;;;;;7317:10;7293:46;;;;7329:9;7293:46;;;;;;7257:10;;;;;7293:15;;:46;;;;;;;;;;;7243:6;7257:10;7293:46;;;2:2:-1;;;;27:1;24;17:12;2:2;7293:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7293:46:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;7293:46:0;7355:38;;;-1:-1:-1;;;;;7355:38:0;;;;7293:46;7355:38;;;;;7377:10;7355:38;;;;7389:3;7355:38;;;;;;7293:46;;-1:-1:-1;7355:38:0;;;;;;;;;;7421:10;7404:28;;;;:16;:28;;;;;:38;;;;;;;-1:-1:-1;;;7100:350:0:o;1826:48::-;;;;;;;;;;;;;:::o;8257:242::-;8348:10;-1:-1:-1;;;;;8348:17:0;;;8340:26;;12:1:-1;9;2:12;8340:26:0;-1:-1:-1;;;;;8385:10:0;;;8407:1;8385:10;;;:5;:10;;;;;;;8377:33;;12:1:-1;9;2:12;8377:33:0;-1:-1:-1;;;;;8435:10:0;;;8421:6;8435:10;;;:5;:10;;;;;;;8457:34;;-1:-1:-1;;;8457:34:0;;;;8435:10;;;;;8457:15;;8479:9;;8457:34;;;;;8421:6;8457:34;;;;;8479:9;8435:10;8457:34;;;2:2:-1;;;;27:1;24;17:12;12888:181:0;-1:-1:-1;;;;;12967:10:0;;;12989:1;12967:10;;;:5;:10;;;;;;;12959:33;;12:1:-1;9;2:12;12959:33:0;-1:-1:-1;;;;;13017:10:0;;;13003:6;13017:10;;;:5;:10;;;;;;;13039:22;;-1:-1:-1;;;13039:22:0;;;;13017:10;;;;;13039:20;;:22;;;;;;;;;;;13003:6;13017:10;13039:22;;;2:2:-1;;;;27:1;24;17:12;2:2;13039:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13039:22:0;;;;12888:181;;:::o;1598:32::-;;;;:::o;8507:258::-;-1:-1:-1;;;;;8594:10:0;;;8616:1;8594:10;;;:5;:10;;;;;;;8586:33;;12:1:-1;9;2:12;8586:33:0;-1:-1:-1;;;;;8644:10:0;;;8630:6;8644:10;;;:5;:10;;;;;;;8666:32;;-1:-1:-1;;;8666:32:0;;;;;;;;8687:10;8666:32;;;;;;8644:10;;;;;8666:12;;:32;;;;;;;;;;;8630:6;8644:10;8666:32;;;2:2:-1;;;;27:1;24;17:12;2:2;8666:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;8714:43:0;;;;;;8751:5;8714:43;;;;;;8731:10;;-1:-1:-1;;;;;;8714:43:0;;;-1:-1:-1;8714:43:0;;;;;;;;;;;8507:258;;;:::o;10852:969::-;10959:17;11007:1;11002:2;:6;10994:33;;;;;-1:-1:-1;;;10994:33:0;;;;;;;;;;;;-1:-1:-1;;;10994:33:0;;;;;;;;;;;;;;;11180:7;11175:12;;;11228:1;;11219:6;;:10;11206:9;:23;;11198:62;;;;;-1:-1:-1;;;11198:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11279:11;:9;:11::i;:::-;11294:2;11279:17;;11271:61;;;;;-1:-1:-1;;;11271:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11345:14;11374:11;11370:85;;;-1:-1:-1;11412:1:0;11370:85;;;-1:-1:-1;11454:1:0;11370:85;11564:14;11581:6;;;;;;;;;-1:-1:-1;;;;;11581:6:0;-1:-1:-1;;;;;11581:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11581:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11581:20:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11581:20:0;-1:-1:-1;;;;;11629:10:0;;;11612:9;11629:10;;;:5;11581:20;11629:10;;;;;;;;;11710:20;;11663:89;;-1:-1:-1;;;11663:89:0;;11694:10;11663:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11581:20;;-1:-1:-1;11629:10:0;;;;;;11663:13;;11683:9;;11663:89;;;;;11581:20;11663:89;;;;;11683:9;11629:10;11663:89;;;2:2:-1;;;;27:1;24;17:12;2:2;11663:89:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11663:89:0;;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11663:89:0;11768:45;;;;;;11808:4;11663:89;11768:45;;;;;11663:89;;-1:-1:-1;11785:10:0;;-1:-1:-1;;;;;11768:45:0;;;;;;;;;;;10852:969;;;;;;;;:::o;16184:1543::-;-1:-1:-1;;;;;17470:10:0;;;16400:16;17470:10;;;:5;:10;;;;;;16400:16;;;;;;;;;;;;;;17470:10;17495:18;;17491:229;;17530:6;17544:4;17530:19;;17687:1;-1:-1:-1;;;;;17687:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;17687:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17687:21:0;;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;17687:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17687:21:0;;-1:-1:-1;17687:21:0;;-1:-1:-1;17687:21:0;-1:-1:-1;17687:21:0;-1:-1:-1;17687:21:0;;-1:-1:-1;17687:21:0;-1:-1:-1;;17491:229:0;16184:1543;;;;;;;;;;:::o;7811:438::-;7930:11;:9;:11::i;:::-;7945:2;7930:17;;7922:63;;;;-1:-1:-1;;;7922:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8010:10:0;;;7996:6;8010:10;;;:5;:10;;;;;;;;;8049:6;;:20;;-1:-1:-1;;;;;;8049:20:0;;;;8010:10;;;;8049:6;;:18;;:20;;;;;;;;;;;:6;:20;;;2:2:-1;;;;27:1;24;17:12;2:2;8049:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8049:20:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;8049:20:0;;-1:-1:-1;8095:1:0;8107:44;;;;-1:-1:-1;8143:8:0;8107:44;8192:20;;8162:79;;;-1:-1:-1;;;8162:79:0;;;;;;;;;;;;;;;8222:10;8162:79;;;;;;;;;;;;-1:-1:-1;;;;;8162:12:0;;;;;8181:9;;8162:79;;;;;-1:-1:-1;;8162:79:0;;;;;;;;8181:9;8162:12;:79;;;2:2:-1;;;;27:1;24;17:12;2:2;8162:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8162:79:0;;;;;7811:438;;;;;;:::o;1491:29::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1491:29:0;;-1:-1:-1;1491:29:0:o;11938:277::-;12022:1;12013:6;:10;12005:19;;12:1:-1;9;2:12;12005:19:0;12049:10;12072:1;12043:17;;;:5;:17;;;;;;-1:-1:-1;;;;;12043:17:0;12035:40;;12:1:-1;9;2:12;12035:40:0;12106:10;12086:6;12100:17;;;:5;:17;;;;;;;12186:20;;12161:46;;-1:-1:-1;;;12161:46:0;;12138:3;:12;;;12161:46;;;;;;;;;;;;;;;12138:12;;-1:-1:-1;;;;;12100:17:0;;;;;;;12161:16;;:46;;;;;12086:6;12161:46;;;;;;12086:6;12100:17;12161:46;;;2:2:-1;;;;27:1;24;17:12;3155:247:0;3237:10;3260:1;3231:17;;;:5;:17;;;;;;-1:-1:-1;;;;;3231:17:0;3223:65;;;;;-1:-1:-1;;;3223:65:0;;;;;;;;;;;;-1:-1:-1;;;3223:65:0;;;;;;;;;;;;;;;3315:1;3307:4;:9;;;;3299:18;;12:1:-1;9;2:12;3299:18:0;3348:10;3328:6;3342:17;;;:5;:17;;;;;;;3371:23;;-1:-1:-1;;;3371:23:0;;;;;;;;;;;-1:-1:-1;;;;;3342:17:0;;;;;;3371;;:23;;;;;3328:6;3371:23;;;;;3328:6;3342:17;3371:23;;;2:2:-1;;;;27:1;24;17:12;5351:148:0;-1:-1:-1;;;;;5451:27:0;;;;;:16;:27;;;;;:40;;5482:9;5451:40;;;5351:148::o;13314:1311::-;-1:-1:-1;;;;;14145:10:0;;;13398:12;14145:10;;;:5;:10;;;;;;;;;;13398:12;;;;;;;;14170:18;;14166:452;;14205:6;14219:4;14205:19;;14250:1;-1:-1:-1;;;;;14250:8:0;;14259:1;14250:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14250:11:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14250:11:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14250:11:0;14290;;;-1:-1:-1;;;14290:11:0;;14299:1;14290:11;;;;;;14250;;-1:-1:-1;;;;;;14290:8:0;;;;;:11;;;;;14250;;14290;;;;;;;;:8;:11;;;2:2:-1;;;;27:1;24;17:12;2:2;14290:11:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14290:11:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14290:11:0;14331;;;-1:-1:-1;;;14331:11:0;;14340:1;14331:11;;;;;;14290;;-1:-1:-1;;;;;;14331:8:0;;;;;:11;;;;;14290;;14331;;;;;;;;:8;:11;;;2:2:-1;;;;27:1;24;17:12;2:2;14331:11:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14331:11:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14331:11:0;14364;;;-1:-1:-1;;;14364:11:0;;14373:1;14364:11;;;;;;14331;;-1:-1:-1;;;;;;14364:8:0;;;;;:11;;;;;14331;;14364;;;;;;;;:8;:11;;;2:2:-1;;;;27:1;24;17:12;2:2;14364:11:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14364:11:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14364:11:0;14404:15;;;-1:-1:-1;;;14404:15:0;;;;14364:11;;-1:-1:-1;;;;;;14404:13:0;;;;;:15;;;;;14364:11;;14404:15;;;;;;;;:13;:15;;;2:2:-1;;;;27:1;24;17:12;2:2;14404:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14404:15:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14404:15:0;14452:17;;;-1:-1:-1;;;14452:17:0;;14467:1;14452:17;;;;;;14390:29;;;;;-1:-1:-1;;;;;;14452:14:0;;;;;:17;;;;;14404:15;;14452:17;;;;;;;;:14;:17;;;2:2:-1;;;;27:1;24;17:12;2:2;14452:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14452:17:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14452:17:0;14503;;;-1:-1:-1;;;14503:17:0;;14518:1;14503:17;;;;;;14452;;-1:-1:-1;;;;;;14503:14:0;;;;;:17;;;;;14452;;14503;;;;;;;;:14;:17;;;2:2:-1;;;;27:1;24;17:12;2:2;14503:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14503:17:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14503:17:0;14548:16;;;-1:-1:-1;;;14548:16:0;;;;14503:17;;-1:-1:-1;;;;;;14548:14:0;;;;;:16;;;;;14503:17;;14548:16;;;;;;;;:14;:16;;;2:2:-1;;;;27:1;24;17:12;2:2;14548:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14548:16:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14548:16:0;14592:14;;;-1:-1:-1;;;14592:14:0;;;;14548:16;;-1:-1:-1;;;;;;14592:12:0;;;;;:14;;;;;14548:16;;14592:14;;;;;;;;:12;:14;;;2:2:-1;;;;27:1;24;17:12;2:2;14592:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14592:14:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14592:14:0;;-1:-1:-1;;14166:452:0;13314:1311;;;;;;;;;;;:::o;1187:18814::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1187:18814:0;;;;-1:-1:-1;1187:18814:0;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://af1a70419ae5167800c073357e5f5c7742613ac71b28101920b46c987f48f728
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.