Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 10929836 | 1513 days ago | IN | 0 ETH | 0.13219446 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MainnetCUsdtToUsdtAssimilator
Compiler Version
v0.5.15+commit.6a57276f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-09-25 */ // hevm: flattened sources of src/assimilators/mainnet/usdtReserves/mainnetCUsdtToUsdtAssimilator.sol pragma solidity >0.4.13 >=0.4.23 >=0.5.0 <0.6.0 >=0.5.7 <0.6.0; ////// lib/abdk-libraries-solidity/src/ABDKMath64x64.sol /* * ABDK Math 64.64 Smart Contract Library. Copyright © 2019 by ABDK Consulting. * Author: Mikhail Vladimirov <[email protected]> */ /* pragma solidity ^0.5.7; */ /** * Smart contract library of mathematical functions operating with signed * 64.64-bit fixed point numbers. Signed 64.64-bit fixed point number is * basically a simple fraction whose numerator is signed 128-bit integer and * denominator is 2^64. As long as denominator is always the same, there is no * need to store it, thus in Solidity signed 64.64-bit fixed point numbers are * represented by int128 type holding only the numerator. */ library ABDKMath64x64 { /** * Minimum value signed 64.64-bit fixed point number may have. */ int128 private constant MIN_64x64 = -0x80000000000000000000000000000000; /** * Maximum value signed 64.64-bit fixed point number may have. */ int128 private constant MAX_64x64 = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; /** * Convert signed 256-bit integer number into signed 64.64-bit fixed point * number. Revert on overflow. * * @param x signed 256-bit integer number * @return signed 64.64-bit fixed point number */ function fromInt (int256 x) internal pure returns (int128) { require (x >= -0x8000000000000000 && x <= 0x7FFFFFFFFFFFFFFF); return int128 (x << 64); } /** * Convert signed 64.64 fixed point number into signed 64-bit integer number * rounding down. * * @param x signed 64.64-bit fixed point number * @return signed 64-bit integer number */ function toInt (int128 x) internal pure returns (int64) { return int64 (x >> 64); } /** * Convert unsigned 256-bit integer number into signed 64.64-bit fixed point * number. Revert on overflow. * * @param x unsigned 256-bit integer number * @return signed 64.64-bit fixed point number */ function fromUInt (uint256 x) internal pure returns (int128) { require (x <= 0x7FFFFFFFFFFFFFFF); return int128 (x << 64); } /** * Convert signed 64.64 fixed point number into unsigned 64-bit integer * number rounding down. Revert on underflow. * * @param x signed 64.64-bit fixed point number * @return unsigned 64-bit integer number */ function toUInt (int128 x) internal pure returns (uint64) { require (x >= 0); return uint64 (x >> 64); } /** * Convert signed 128.128 fixed point number into signed 64.64-bit fixed point * number rounding down. Revert on overflow. * * @param x signed 128.128-bin fixed point number * @return signed 64.64-bit fixed point number */ function from128x128 (int256 x) internal pure returns (int128) { int256 result = x >> 64; require (result >= MIN_64x64 && result <= MAX_64x64); return int128 (result); } /** * Convert signed 64.64 fixed point number into signed 128.128 fixed point * number. * * @param x signed 64.64-bit fixed point number * @return signed 128.128 fixed point number */ function to128x128 (int128 x) internal pure returns (int256) { return int256 (x) << 64; } /** * Calculate x + y. Revert on overflow. * * @param x signed 64.64-bit fixed point number * @param y signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function add (int128 x, int128 y) internal pure returns (int128) { int256 result = int256(x) + y; require (result >= MIN_64x64 && result <= MAX_64x64); return int128 (result); } /** * Calculate x - y. Revert on overflow. * * @param x signed 64.64-bit fixed point number * @param y signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function sub (int128 x, int128 y) internal pure returns (int128) { int256 result = int256(x) - y; require (result >= MIN_64x64 && result <= MAX_64x64); return int128 (result); } /** * Calculate x * y rounding down. Revert on overflow. * * @param x signed 64.64-bit fixed point number * @param y signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function mul (int128 x, int128 y) internal pure returns (int128) { int256 result = int256(x) * y >> 64; require (result >= MIN_64x64 && result <= MAX_64x64); return int128 (result); } /** * Calculate x * y rounding towards zero, where x is signed 64.64 fixed point * number and y is signed 256-bit integer number. Revert on overflow. * * @param x signed 64.64 fixed point number * @param y signed 256-bit integer number * @return signed 256-bit integer number */ function muli (int128 x, int256 y) internal pure returns (int256) { if (x == MIN_64x64) { require (y >= -0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF && y <= 0x1000000000000000000000000000000000000000000000000); return -y << 63; } else { bool negativeResult = false; if (x < 0) { x = -x; negativeResult = true; } if (y < 0) { y = -y; // We rely on overflow behavior here negativeResult = !negativeResult; } uint256 absoluteResult = mulu (x, uint256 (y)); if (negativeResult) { require (absoluteResult <= 0x8000000000000000000000000000000000000000000000000000000000000000); return -int256 (absoluteResult); // We rely on overflow behavior here } else { require (absoluteResult <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); return int256 (absoluteResult); } } } /** * Calculate x * y rounding down, where x is signed 64.64 fixed point number * and y is unsigned 256-bit integer number. Revert on overflow. * * @param x signed 64.64 fixed point number * @param y unsigned 256-bit integer number * @return unsigned 256-bit integer number */ function mulu (int128 x, uint256 y) internal pure returns (uint256) { if (y == 0) return 0; require (x >= 0); uint256 lo = (uint256 (x) * (y & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)) >> 64; uint256 hi = uint256 (x) * (y >> 128); require (hi <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); hi <<= 64; require (hi <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - lo); return hi + lo; } /** * Calculate x / y rounding towards zero. Revert on overflow or when y is * zero. * * @param x signed 64.64-bit fixed point number * @param y signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function div (int128 x, int128 y) internal pure returns (int128) { require (y != 0); int256 result = (int256 (x) << 64) / y; require (result >= MIN_64x64 && result <= MAX_64x64); return int128 (result); } /** * Calculate x / y rounding towards zero, where x and y are signed 256-bit * integer numbers. Revert on overflow or when y is zero. * * @param x signed 256-bit integer number * @param y signed 256-bit integer number * @return signed 64.64-bit fixed point number */ function divi (int256 x, int256 y) internal pure returns (int128) { require (y != 0); bool negativeResult = false; if (x < 0) { x = -x; // We rely on overflow behavior here negativeResult = true; } if (y < 0) { y = -y; // We rely on overflow behavior here negativeResult = !negativeResult; } uint128 absoluteResult = divuu (uint256 (x), uint256 (y)); if (negativeResult) { require (absoluteResult <= 0x80000000000000000000000000000000); return -int128 (absoluteResult); // We rely on overflow behavior here } else { require (absoluteResult <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); return int128 (absoluteResult); // We rely on overflow behavior here } } /** * Calculate x / y rounding towards zero, where x and y are unsigned 256-bit * integer numbers. Revert on overflow or when y is zero. * * @param x unsigned 256-bit integer number * @param y unsigned 256-bit integer number * @return signed 64.64-bit fixed point number */ function divu (uint256 x, uint256 y) internal pure returns (int128) { require (y != 0); uint128 result = divuu (x, y); require (result <= uint128 (MAX_64x64)); return int128 (result); } /** * Calculate -x. Revert on overflow. * * @param x signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function neg (int128 x) internal pure returns (int128) { require (x != MIN_64x64); return -x; } /** * Calculate |x|. Revert on overflow. * * @param x signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function abs (int128 x) internal pure returns (int128) { require (x != MIN_64x64); return x < 0 ? -x : x; } /** * Calculate 1 / x rounding towards zero. Revert on overflow or when x is * zero. * * @param x signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function inv (int128 x) internal pure returns (int128) { require (x != 0); int256 result = int256 (0x100000000000000000000000000000000) / x; require (result >= MIN_64x64 && result <= MAX_64x64); return int128 (result); } /** * Calculate arithmetics average of x and y, i.e. (x + y) / 2 rounding down. * * @param x signed 64.64-bit fixed point number * @param y signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function avg (int128 x, int128 y) internal pure returns (int128) { return int128 ((int256 (x) + int256 (y)) >> 1); } /** * Calculate geometric average of x and y, i.e. sqrt (x * y) rounding down. * Revert on overflow or in case x * y is negative. * * @param x signed 64.64-bit fixed point number * @param y signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function gavg (int128 x, int128 y) internal pure returns (int128) { int256 m = int256 (x) * int256 (y); require (m >= 0); require (m < 0x4000000000000000000000000000000000000000000000000000000000000000); return int128 (sqrtu (uint256 (m), uint256 (x) + uint256 (y) >> 1)); } /** * Calculate x^y assuming 0^0 is 1, where x is signed 64.64 fixed point number * and y is unsigned 256-bit integer number. Revert on overflow. * * @param x signed 64.64-bit fixed point number * @param y uint256 value * @return signed 64.64-bit fixed point number */ function pow (int128 x, uint256 y) internal pure returns (int128) { uint256 absoluteResult; bool negativeResult = false; if (x >= 0) { absoluteResult = powu (uint256 (x) << 63, y); } else { // We rely on overflow behavior here absoluteResult = powu (uint256 (uint128 (-x)) << 63, y); negativeResult = y & 1 > 0; } absoluteResult >>= 63; if (negativeResult) { require (absoluteResult <= 0x80000000000000000000000000000000); return -int128 (absoluteResult); // We rely on overflow behavior here } else { require (absoluteResult <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); return int128 (absoluteResult); // We rely on overflow behavior here } } /** * Calculate sqrt (x) rounding down. Revert if x < 0. * * @param x signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function sqrt (int128 x) internal pure returns (int128) { require (x >= 0); return int128 (sqrtu (uint256 (x) << 64, 0x10000000000000000)); } /** * Calculate binary logarithm of x. Revert if x <= 0. * * @param x signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function log_2 (int128 x) internal pure returns (int128) { require (x > 0); int256 msb = 0; int256 xc = x; if (xc >= 0x10000000000000000) { xc >>= 64; msb += 64; } if (xc >= 0x100000000) { xc >>= 32; msb += 32; } if (xc >= 0x10000) { xc >>= 16; msb += 16; } if (xc >= 0x100) { xc >>= 8; msb += 8; } if (xc >= 0x10) { xc >>= 4; msb += 4; } if (xc >= 0x4) { xc >>= 2; msb += 2; } if (xc >= 0x2) msb += 1; // No need to shift xc anymore int256 result = msb - 64 << 64; uint256 ux = uint256 (x) << 127 - msb; for (int256 bit = 0x8000000000000000; bit > 0; bit >>= 1) { ux *= ux; uint256 b = ux >> 255; ux >>= 127 + b; result += bit * int256 (b); } return int128 (result); } /** * Calculate natural logarithm of x. Revert if x <= 0. * * @param x signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function ln (int128 x) internal pure returns (int128) { require (x > 0); return int128 ( uint256 (log_2 (x)) * 0xB17217F7D1CF79ABC9E3B39803F2F6AF >> 128); } /** * Calculate binary exponent of x. Revert on overflow. * * @param x signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function exp_2 (int128 x) internal pure returns (int128) { require (x < 0x400000000000000000); // Overflow if (x < -0x400000000000000000) return 0; // Underflow uint256 result = 0x80000000000000000000000000000000; if (x & 0x8000000000000000 > 0) result = result * 0x16A09E667F3BCC908B2FB1366EA957D3E >> 128; if (x & 0x4000000000000000 > 0) result = result * 0x1306FE0A31B7152DE8D5A46305C85EDEC >> 128; if (x & 0x2000000000000000 > 0) result = result * 0x1172B83C7D517ADCDF7C8C50EB14A791F >> 128; if (x & 0x1000000000000000 > 0) result = result * 0x10B5586CF9890F6298B92B71842A98363 >> 128; if (x & 0x800000000000000 > 0) result = result * 0x1059B0D31585743AE7C548EB68CA417FD >> 128; if (x & 0x400000000000000 > 0) result = result * 0x102C9A3E778060EE6F7CACA4F7A29BDE8 >> 128; if (x & 0x200000000000000 > 0) result = result * 0x10163DA9FB33356D84A66AE336DCDFA3F >> 128; if (x & 0x100000000000000 > 0) result = result * 0x100B1AFA5ABCBED6129AB13EC11DC9543 >> 128; if (x & 0x80000000000000 > 0) result = result * 0x10058C86DA1C09EA1FF19D294CF2F679B >> 128; if (x & 0x40000000000000 > 0) result = result * 0x1002C605E2E8CEC506D21BFC89A23A00F >> 128; if (x & 0x20000000000000 > 0) result = result * 0x100162F3904051FA128BCA9C55C31E5DF >> 128; if (x & 0x10000000000000 > 0) result = result * 0x1000B175EFFDC76BA38E31671CA939725 >> 128; if (x & 0x8000000000000 > 0) result = result * 0x100058BA01FB9F96D6CACD4B180917C3D >> 128; if (x & 0x4000000000000 > 0) result = result * 0x10002C5CC37DA9491D0985C348C68E7B3 >> 128; if (x & 0x2000000000000 > 0) result = result * 0x1000162E525EE054754457D5995292026 >> 128; if (x & 0x1000000000000 > 0) result = result * 0x10000B17255775C040618BF4A4ADE83FC >> 128; if (x & 0x800000000000 > 0) result = result * 0x1000058B91B5BC9AE2EED81E9B7D4CFAB >> 128; if (x & 0x400000000000 > 0) result = result * 0x100002C5C89D5EC6CA4D7C8ACC017B7C9 >> 128; if (x & 0x200000000000 > 0) result = result * 0x10000162E43F4F831060E02D839A9D16D >> 128; if (x & 0x100000000000 > 0) result = result * 0x100000B1721BCFC99D9F890EA06911763 >> 128; if (x & 0x80000000000 > 0) result = result * 0x10000058B90CF1E6D97F9CA14DBCC1628 >> 128; if (x & 0x40000000000 > 0) result = result * 0x1000002C5C863B73F016468F6BAC5CA2B >> 128; if (x & 0x20000000000 > 0) result = result * 0x100000162E430E5A18F6119E3C02282A5 >> 128; if (x & 0x10000000000 > 0) result = result * 0x1000000B1721835514B86E6D96EFD1BFE >> 128; if (x & 0x8000000000 > 0) result = result * 0x100000058B90C0B48C6BE5DF846C5B2EF >> 128; if (x & 0x4000000000 > 0) result = result * 0x10000002C5C8601CC6B9E94213C72737A >> 128; if (x & 0x2000000000 > 0) result = result * 0x1000000162E42FFF037DF38AA2B219F06 >> 128; if (x & 0x1000000000 > 0) result = result * 0x10000000B17217FBA9C739AA5819F44F9 >> 128; if (x & 0x800000000 > 0) result = result * 0x1000000058B90BFCDEE5ACD3C1CEDC823 >> 128; if (x & 0x400000000 > 0) result = result * 0x100000002C5C85FE31F35A6A30DA1BE50 >> 128; if (x & 0x200000000 > 0) result = result * 0x10000000162E42FF0999CE3541B9FFFCF >> 128; if (x & 0x100000000 > 0) result = result * 0x100000000B17217F80F4EF5AADDA45554 >> 128; if (x & 0x80000000 > 0) result = result * 0x10000000058B90BFBF8479BD5A81B51AD >> 128; if (x & 0x40000000 > 0) result = result * 0x1000000002C5C85FDF84BD62AE30A74CC >> 128; if (x & 0x20000000 > 0) result = result * 0x100000000162E42FEFB2FED257559BDAA >> 128; if (x & 0x10000000 > 0) result = result * 0x1000000000B17217F7D5A7716BBA4A9AE >> 128; if (x & 0x8000000 > 0) result = result * 0x100000000058B90BFBE9DDBAC5E109CCE >> 128; if (x & 0x4000000 > 0) result = result * 0x10000000002C5C85FDF4B15DE6F17EB0D >> 128; if (x & 0x2000000 > 0) result = result * 0x1000000000162E42FEFA494F1478FDE05 >> 128; if (x & 0x1000000 > 0) result = result * 0x10000000000B17217F7D20CF927C8E94C >> 128; if (x & 0x800000 > 0) result = result * 0x1000000000058B90BFBE8F71CB4E4B33D >> 128; if (x & 0x400000 > 0) result = result * 0x100000000002C5C85FDF477B662B26945 >> 128; if (x & 0x200000 > 0) result = result * 0x10000000000162E42FEFA3AE53369388C >> 128; if (x & 0x100000 > 0) result = result * 0x100000000000B17217F7D1D351A389D40 >> 128; if (x & 0x80000 > 0) result = result * 0x10000000000058B90BFBE8E8B2D3D4EDE >> 128; if (x & 0x40000 > 0) result = result * 0x1000000000002C5C85FDF4741BEA6E77E >> 128; if (x & 0x20000 > 0) result = result * 0x100000000000162E42FEFA39FE95583C2 >> 128; if (x & 0x10000 > 0) result = result * 0x1000000000000B17217F7D1CFB72B45E1 >> 128; if (x & 0x8000 > 0) result = result * 0x100000000000058B90BFBE8E7CC35C3F0 >> 128; if (x & 0x4000 > 0) result = result * 0x10000000000002C5C85FDF473E242EA38 >> 128; if (x & 0x2000 > 0) result = result * 0x1000000000000162E42FEFA39F02B772C >> 128; if (x & 0x1000 > 0) result = result * 0x10000000000000B17217F7D1CF7D83C1A >> 128; if (x & 0x800 > 0) result = result * 0x1000000000000058B90BFBE8E7BDCBE2E >> 128; if (x & 0x400 > 0) result = result * 0x100000000000002C5C85FDF473DEA871F >> 128; if (x & 0x200 > 0) result = result * 0x10000000000000162E42FEFA39EF44D91 >> 128; if (x & 0x100 > 0) result = result * 0x100000000000000B17217F7D1CF79E949 >> 128; if (x & 0x80 > 0) result = result * 0x10000000000000058B90BFBE8E7BCE544 >> 128; if (x & 0x40 > 0) result = result * 0x1000000000000002C5C85FDF473DE6ECA >> 128; if (x & 0x20 > 0) result = result * 0x100000000000000162E42FEFA39EF366F >> 128; if (x & 0x10 > 0) result = result * 0x1000000000000000B17217F7D1CF79AFA >> 128; if (x & 0x8 > 0) result = result * 0x100000000000000058B90BFBE8E7BCD6D >> 128; if (x & 0x4 > 0) result = result * 0x10000000000000002C5C85FDF473DE6B2 >> 128; if (x & 0x2 > 0) result = result * 0x1000000000000000162E42FEFA39EF358 >> 128; if (x & 0x1 > 0) result = result * 0x10000000000000000B17217F7D1CF79AB >> 128; result >>= 63 - (x >> 64); require (result <= uint256 (MAX_64x64)); return int128 (result); } /** * Calculate natural exponent of x. Revert on overflow. * * @param x signed 64.64-bit fixed point number * @return signed 64.64-bit fixed point number */ function exp (int128 x) internal pure returns (int128) { require (x < 0x400000000000000000); // Overflow if (x < -0x400000000000000000) return 0; // Underflow return exp_2 ( int128 (int256 (x) * 0x171547652B82FE1777D0FFDA0D23A7D12 >> 128)); } /** * Calculate x / y rounding towards zero, where x and y are unsigned 256-bit * integer numbers. Revert on overflow or when y is zero. * * @param x unsigned 256-bit integer number * @param y unsigned 256-bit integer number * @return unsigned 64.64-bit fixed point number */ function divuu (uint256 x, uint256 y) private pure returns (uint128) { require (y != 0); uint256 result; if (x <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) result = (x << 64) / y; else { uint256 msb = 192; uint256 xc = x >> 192; if (xc >= 0x100000000) { xc >>= 32; msb += 32; } if (xc >= 0x10000) { xc >>= 16; msb += 16; } if (xc >= 0x100) { xc >>= 8; msb += 8; } if (xc >= 0x10) { xc >>= 4; msb += 4; } if (xc >= 0x4) { xc >>= 2; msb += 2; } if (xc >= 0x2) msb += 1; // No need to shift xc anymore result = (x << 255 - msb) / ((y - 1 >> msb - 191) + 1); require (result <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); uint256 hi = result * (y >> 128); uint256 lo = result * (y & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); uint256 xh = x >> 192; uint256 xl = x << 64; if (xl < lo) xh -= 1; xl -= lo; // We rely on overflow behavior here lo = hi << 128; if (xl < lo) xh -= 1; xl -= lo; // We rely on overflow behavior here assert (xh == hi >> 128); result += xl / y; } require (result <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); return uint128 (result); } /** * Calculate x^y assuming 0^0 is 1, where x is unsigned 129.127 fixed point * number and y is unsigned 256-bit integer number. Revert on overflow. * * @param x unsigned 129.127-bit fixed point number * @param y uint256 value * @return unsigned 129.127-bit fixed point number */ function powu (uint256 x, uint256 y) private pure returns (uint256) { if (y == 0) return 0x80000000000000000000000000000000; else if (x == 0) return 0; else { int256 msb = 0; uint256 xc = x; if (xc >= 0x100000000000000000000000000000000) { xc >>= 128; msb += 128; } if (xc >= 0x10000000000000000) { xc >>= 64; msb += 64; } if (xc >= 0x100000000) { xc >>= 32; msb += 32; } if (xc >= 0x10000) { xc >>= 16; msb += 16; } if (xc >= 0x100) { xc >>= 8; msb += 8; } if (xc >= 0x10) { xc >>= 4; msb += 4; } if (xc >= 0x4) { xc >>= 2; msb += 2; } if (xc >= 0x2) msb += 1; // No need to shift xc anymore int256 xe = msb - 127; if (xe > 0) x >>= xe; else x <<= -xe; uint256 result = 0x80000000000000000000000000000000; int256 re = 0; while (y > 0) { if (y & 1 > 0) { result = result * x; y -= 1; re += xe; if (result >= 0x8000000000000000000000000000000000000000000000000000000000000000) { result >>= 128; re += 1; } else result >>= 127; if (re < -127) return 0; // Underflow require (re < 128); // Overflow } else { x = x * x; y >>= 1; xe <<= 1; if (x >= 0x8000000000000000000000000000000000000000000000000000000000000000) { x >>= 128; xe += 1; } else x >>= 127; if (xe < -127) return 0; // Underflow require (xe < 128); // Overflow } } if (re > 0) result <<= re; else if (re < 0) result >>= -re; return result; } } /** * Calculate sqrt (x) rounding down, where x is unsigned 256-bit integer * number. * * @param x unsigned 256-bit integer number * @return unsigned 128-bit integer number */ function sqrtu (uint256 x, uint256 r) private pure returns (uint128) { if (x == 0) return 0; else { require (r > 0); while (true) { uint256 rr = x / r; if (r == rr || r + 1 == rr) return uint128 (r); else if (r == rr + 1) return uint128 (rr); r = r + rr + 1 >> 1; } } } } ////// src/interfaces/IAssimilator.sol // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. /* pragma solidity ^0.5.0; */ interface IAssimilator { function intakeRaw (uint256 amount) external returns (int128); function intakeRawAndGetBalance (uint256 amount) external returns (int128, int128); function intakeNumeraire (int128 amount) external returns (uint256); function outputRaw (address dst, uint256 amount) external returns (int128); function outputRawAndGetBalance (address dst, uint256 amount) external returns (int128, int128); function outputNumeraire (address dst, int128 amount) external returns (uint256); function viewRawAmount (int128) external view returns (uint256); function viewNumeraireAmount (uint256) external view returns (int128); function viewNumeraireBalance (address) external view returns (int128); function viewNumeraireAmountAndBalance (address, uint256) external view returns (int128, int128); } ////// src/interfaces/ICToken.sol /* pragma solidity ^0.5.0; */ interface ICToken { function mint(uint mintAmount) external returns (uint); function redeem(uint redeemTokens) external returns (uint); function redeemUnderlying(uint redeemAmount) external returns (uint); function borrow(uint borrowAmount) external returns (uint); function repayBorrow(uint repayAmount) external returns (uint); function repayBorrowBehalf(address borrower, uint repayAmount) external returns (uint); function getCash() external view returns (uint); function exchangeRateCurrent() external returns (uint); function exchangeRateStored() external view returns (uint); function supplyRatePerBlock() external view returns (uint); function accrualBlockNumber() external view returns (uint); function transfer(address recipient, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function balanceOfUnderlying(address account) external returns (uint256); function allowance(address owner, address spender) external view returns (uint256); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } ////// src/interfaces/IERC20NoBool.sol /* pragma solidity ^0.5.0; */ /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20NoBool { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external; /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external; /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external; /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } ////// src/assimilators/mainnet/usdtReserves/mainnetCUsdtToUsdtAssimilator.sol // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. /* pragma solidity ^0.5.0; */ /* import "abdk-libraries-solidity/ABDKMath64x64.sol"; */ /* import "../../../interfaces/ICToken.sol"; */ /* import "../../../interfaces/IERC20NoBool.sol"; */ /* import "../../../interfaces/IAssimilator.sol"; */ contract MainnetCUsdtToUsdtAssimilator is IAssimilator { using ABDKMath64x64 for int128; using ABDKMath64x64 for uint256; IERC20NoBool constant usdt = IERC20NoBool(0xdAC17F958D2ee523a2206206994597C13D831ec7); ICToken constant cusdt = ICToken(0xf650C3d88D12dB855b8bf7D11Be6C55A4e07dCC9); constructor () public { } // takes raw cusdt amount and transfers it in function intakeRawAndGetBalance (uint256 _amount) public returns (int128 amount_, int128 balance_) { bool _transferSuccess = cusdt.transferFrom(msg.sender, address(this), _amount); require(_transferSuccess, "Shell/cUSDT-transfer-from-failed"); uint _redeemSuccess = cusdt.redeem(_amount); require(_redeemSuccess == 0, "Shell/cUSDT-redeem-failed"); uint256 _balance = usdt.balanceOf(address(this)); uint256 _rate = cusdt.exchangeRateStored(); balance_ = _balance.divu(1e6); amount_ = ( ( _amount * _rate) / 1e18).divu(1e6); } // takes raw cusdt amount and transfers it in function intakeRaw (uint256 _amount) public returns (int128 amount_) { bool _transferSuccess = cusdt.transferFrom(msg.sender, address(this), _amount); require(_transferSuccess, "Shell/cUSDT-transfer-from-failed"); uint _redeemSuccess = cusdt.redeem(_amount); require(_redeemSuccess == 0, "Shell/cUSDT-redeem-failed"); uint256 _rate = cusdt.exchangeRateStored(); amount_ = ( ( _amount * _rate ) / 1e18 ).divu(1e6); } // takes numeraire amount and transfers corresponding cusdt in function intakeNumeraire (int128 _amount) public returns (uint256 amount_) { uint256 _rate = cusdt.exchangeRateCurrent(); amount_ = ( _amount.mulu(1e6) * 1e18 ) / _rate; bool _transferSuccess = cusdt.transferFrom(msg.sender, address(this), amount_); require(_transferSuccess, "Shell/cUSDT-transfer-from-failed"); uint _redeemSuccess = cusdt.redeem(amount_); require(_redeemSuccess == 0, "Shell/cUSDT-redeem-failed"); } // takes numeraire amount // transfers corresponding cusdt to destination function outputNumeraire (address _dst, int128 _amount) public returns (uint256 amount_) { uint _mintSuccess = cusdt.mint( _amount.mulu(1e6) ); require(_mintSuccess == 0, "Shell/cUSDT-mint-failed"); amount_ = cusdt.balanceOf(address(this)); bool _transferSuccess = cusdt.transfer(_dst, amount_); require(_transferSuccess, "Shell/cUSDT-transfer-failed"); } // takes raw amount // transfers that amount to destination function outputRawAndGetBalance (address _dst, uint256 _amount) public returns (int128 amount_, int128 balance_) { uint256 _rate = cusdt.exchangeRateCurrent(); uint256 _usdcAmount = ( _amount * _rate ) / 1e18; uint _mintSuccess = cusdt.mint(_usdcAmount); require(_mintSuccess == 0, "Shell/cUSDT-mint-failed"); _amount = cusdt.balanceOf(address(this)); bool _transferSuccess = cusdt.transfer(_dst, _amount); require(_transferSuccess, "Shell/cUSDT-transfer-failed"); uint256 _balance = usdt.balanceOf(address(this)); amount_ = _usdcAmount.divu(1e6); balance_ = _balance.divu(1e6); } // takes raw amount // transfers that amount to destination function outputRaw (address _dst, uint256 _amount) public returns (int128 amount_) { uint256 _rate = cusdt.exchangeRateCurrent(); uint256 _usdcAmount = ( _amount * _rate ) / 1e18; uint _mintSuccess = cusdt.mint(_usdcAmount); _amount = cusdt.balanceOf(address(this)); require(_mintSuccess == 0, "Shell/cUSDT-mint-failed"); bool _transferSuccess = cusdt.transfer(_dst, _amount); require(_transferSuccess, "Shell/cUSDT-transfer-failed"); amount_ = _amount.divu(1e6); } // takes raw amount of cUsdc, returns numeraire amount function viewRawAmount (int128 _amount) public view returns (uint256 amount_) { uint256 _rate = cusdt.exchangeRateStored(); uint256 _supplyRate = cusdt.supplyRatePerBlock(); uint256 _prevBlock = cusdt.accrualBlockNumber(); _rate += _rate * _supplyRate * (block.number - _prevBlock) / 1e18; amount_ = ( _amount.mulu(1e6) * 1e18 ) / _rate; } // takes numeraire amount, returns raw amount of cUsdc function viewNumeraireAmount (uint256 _amount) public view returns (int128 amount_) { uint256 _rate = cusdt.exchangeRateStored(); uint256 _supplyRate = cusdt.supplyRatePerBlock(); uint256 _prevBlock = cusdt.accrualBlockNumber(); _rate += _rate * _supplyRate * (block.number - _prevBlock) / 1e18; amount_ = ( ( _amount * _rate ) / 1e18 ).divu(1e6); } // returns numeraire balance of reserve, in this case cUsdc function viewNumeraireBalance (address _addr) public view returns (int128 balance_) { uint256 _balance = usdt.balanceOf(_addr); balance_ = _balance.divu(1e6); } // takes numeraire amount, returns raw amount of cUsdc function viewNumeraireAmountAndBalance (address _addr, uint256 _amount) public view returns (int128 amount_, int128 balance_) { uint256 _rate = cusdt.exchangeRateStored(); uint256 _supplyRate = cusdt.supplyRatePerBlock(); uint256 _prevBlock = cusdt.accrualBlockNumber(); _rate += _rate * _supplyRate * (block.number - _prevBlock) / 1e18; amount_ = ( ( _amount * _rate ) / 1e18 ).divu(1e6); uint256 _balance = usdt.balanceOf(_addr); balance_ = _balance.divu(1e6); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"constant":false,"inputs":[{"internalType":"int128","name":"_amount","type":"int128"}],"name":"intakeNumeraire","outputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"intakeRaw","outputs":[{"internalType":"int128","name":"amount_","type":"int128"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"intakeRawAndGetBalance","outputs":[{"internalType":"int128","name":"amount_","type":"int128"},{"internalType":"int128","name":"balance_","type":"int128"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_dst","type":"address"},{"internalType":"int128","name":"_amount","type":"int128"}],"name":"outputNumeraire","outputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_dst","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"outputRaw","outputs":[{"internalType":"int128","name":"amount_","type":"int128"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_dst","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"outputRawAndGetBalance","outputs":[{"internalType":"int128","name":"amount_","type":"int128"},{"internalType":"int128","name":"balance_","type":"int128"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"viewNumeraireAmount","outputs":[{"internalType":"int128","name":"amount_","type":"int128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"viewNumeraireAmountAndBalance","outputs":[{"internalType":"int128","name":"amount_","type":"int128"},{"internalType":"int128","name":"balance_","type":"int128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"viewNumeraireBalance","outputs":[{"internalType":"int128","name":"balance_","type":"int128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"int128","name":"_amount","type":"int128"}],"name":"viewRawAmount","outputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506126fc806100206000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c80637f328ecc116100665780637f328ecc1461027c578063ac969a73146102d1578063f09a3fc31461032f578063f5e6c0ca14610397578063fa00102a146103df5761009e565b80630271c3c8146100a35780631e9b2cba146100e8578063523bf2571461015d5780636b677a8f146101d25780636fc3905214610217575b600080fd5b6100d2600480360360208110156100b957600080fd5b810190808035600f0b9060200190929190505050610427565b6040518082815260200191505060405180910390f35b610134600480360360408110156100fe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610796565b6040518083600f0b600f0b815260200182600f0b600f0b81526020019250505060405180910390f35b6101a96004803603604081101561017357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610a9e565b6040518083600f0b600f0b815260200182600f0b600f0b81526020019250505060405180910390f35b610201600480360360208110156101e857600080fd5b810190808035600f0b9060200190929190505050610f97565b6040518082815260200191505060405180910390f35b6102666004803603604081101561022d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035600f0b90602001909291905050506111b5565b6040518082815260200191505060405180910390f35b6102a86004803603602081101561029257600080fd5b810190808035906020019092919050505061150d565b6040518083600f0b600f0b815260200182600f0b600f0b81526020019250505060405180910390f35b610313600480360360208110156102e757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611962565b6040518082600f0b600f0b815260200191505060405180910390f35b61037b6004803603604081101561034557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a51565b6040518082600f0b600f0b815260200191505060405180910390f35b6103c3600480360360208110156103ad57600080fd5b8101908080359060200190929190505050611e5e565b6040518082600f0b600f0b815260200191505060405180910390f35b61040b600480360360208110156103f557600080fd5b8101908080359060200190929190505050612079565b6040518082600f0b600f0b815260200191505060405180910390f35b60008073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663bd6d894d6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561048657600080fd5b505af115801561049a573d6000803e3d6000fd5b505050506040513d60208110156104b057600080fd5b8101908080519060200190929190505050905080670de0b6b3a76400006104e6620f424086600f0b6123e390919063ffffffff16565b02816104ee57fe5b049150600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156105c257600080fd5b505af11580156105d6573d6000803e3d6000fd5b505050506040513d60208110156105ec57600080fd5b8101908080519060200190929190505050905080610672576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5368656c6c2f63555344542d7472616e736665722d66726f6d2d6661696c656481525060200191505060405180910390fd5b600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663db006a75856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156106db57600080fd5b505af11580156106ef573d6000803e3d6000fd5b505050506040513d602081101561070557600080fd5b810190808051906020019092919050505090506000811461078e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5368656c6c2f63555344542d72656465656d2d6661696c65640000000000000081525060200191505060405180910390fd5b505050919050565b600080600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b1580156107f557600080fd5b505afa158015610809573d6000803e3d6000fd5b505050506040513d602081101561081f57600080fd5b81019080805190602001909291905050509050600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663ae9d70b06040518163ffffffff1660e01b815260040160206040518083038186803b15801561088e57600080fd5b505afa1580156108a2573d6000803e3d6000fd5b505050506040513d60208110156108b857600080fd5b81019080805190602001909291905050509050600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff16636c540baf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561092757600080fd5b505afa15801561093b573d6000803e3d6000fd5b505050506040513d602081101561095157600080fd5b81019080805190602001909291905050509050670de0b6b3a7640000814303838502028161097b57fe5b04830192506109a9620f4240670de0b6b3a76400008589028161099a57fe5b0461249e90919063ffffffff16565b9450600073dac17f958d2ee523a2206206994597c13d831ec773ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610a3e57600080fd5b505afa158015610a52573d6000803e3d6000fd5b505050506040513d6020811015610a6857600080fd5b81019080805190602001909291905050509050610a91620f42408261249e90919063ffffffff16565b9450505050509250929050565b600080600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663bd6d894d6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610aff57600080fd5b505af1158015610b13573d6000803e3d6000fd5b505050506040513d6020811015610b2957600080fd5b810190808051906020019092919050505090506000670de0b6b3a764000082860281610b5157fe5b049050600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015610bbd57600080fd5b505af1158015610bd1573d6000803e3d6000fd5b505050506040513d6020811015610be757600080fd5b8101908080519060200190929190505050905060008114610c70576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f5368656c6c2f63555344542d6d696e742d6661696c656400000000000000000081525060200191505060405180910390fd5b73f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610d0157600080fd5b505afa158015610d15573d6000803e3d6000fd5b505050506040513d6020811015610d2b57600080fd5b81019080805190602001909291905050509550600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663a9059cbb89896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610ddb57600080fd5b505af1158015610def573d6000803e3d6000fd5b505050506040513d6020811015610e0557600080fd5b8101908080519060200190929190505050905080610e8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f5368656c6c2f63555344542d7472616e736665722d6661696c6564000000000081525060200191505060405180910390fd5b600073dac17f958d2ee523a2206206994597c13d831ec773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610f1e57600080fd5b505afa158015610f32573d6000803e3d6000fd5b505050506040513d6020811015610f4857600080fd5b81019080805190602001909291905050509050610f71620f42408561249e90919063ffffffff16565b9650610f89620f42408261249e90919063ffffffff16565b955050505050509250929050565b60008073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b158015610ff457600080fd5b505afa158015611008573d6000803e3d6000fd5b505050506040513d602081101561101e57600080fd5b81019080805190602001909291905050509050600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663ae9d70b06040518163ffffffff1660e01b815260040160206040518083038186803b15801561108d57600080fd5b505afa1580156110a1573d6000803e3d6000fd5b505050506040513d60208110156110b757600080fd5b81019080805190602001909291905050509050600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff16636c540baf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561112657600080fd5b505afa15801561113a573d6000803e3d6000fd5b505050506040513d602081101561115057600080fd5b81019080805190602001909291905050509050670de0b6b3a7640000814303838502028161117a57fe5b048301925082670de0b6b3a76400006111a2620f424088600f0b6123e390919063ffffffff16565b02816111aa57fe5b049350505050919050565b60008073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663a0712d68611201620f424086600f0b6123e390919063ffffffff16565b6040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561123757600080fd5b505af115801561124b573d6000803e3d6000fd5b505050506040513d602081101561126157600080fd5b81019080805190602001909291905050509050600081146112ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f5368656c6c2f63555344542d6d696e742d6661696c656400000000000000000081525060200191505060405180910390fd5b73f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561137b57600080fd5b505afa15801561138f573d6000803e3d6000fd5b505050506040513d60208110156113a557600080fd5b81019080805190602001909291905050509150600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561145557600080fd5b505af1158015611469573d6000803e3d6000fd5b505050506040513d602081101561147f57600080fd5b8101908080519060200190929190505050905080611505576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f5368656c6c2f63555344542d7472616e736665722d6661696c6564000000000081525060200191505060405180910390fd5b505092915050565b600080600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156115e157600080fd5b505af11580156115f5573d6000803e3d6000fd5b505050506040513d602081101561160b57600080fd5b8101908080519060200190929190505050905080611691576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5368656c6c2f63555344542d7472616e736665722d66726f6d2d6661696c656481525060200191505060405180910390fd5b600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663db006a75866040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156116fa57600080fd5b505af115801561170e573d6000803e3d6000fd5b505050506040513d602081101561172457600080fd5b81019080805190602001909291905050509050600081146117ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5368656c6c2f63555344542d72656465656d2d6661696c65640000000000000081525060200191505060405180910390fd5b600073dac17f958d2ee523a2206206994597c13d831ec773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561184057600080fd5b505afa158015611854573d6000803e3d6000fd5b505050506040513d602081101561186a57600080fd5b81019080805190602001909291905050509050600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b1580156118d957600080fd5b505afa1580156118ed573d6000803e3d6000fd5b505050506040513d602081101561190357600080fd5b8101908080519060200190929190505050905061192c620f42408361249e90919063ffffffff16565b9450611957620f4240670de0b6b3a7640000838a028161194857fe5b0461249e90919063ffffffff16565b955050505050915091565b60008073dac17f958d2ee523a2206206994597c13d831ec773ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119f657600080fd5b505afa158015611a0a573d6000803e3d6000fd5b505050506040513d6020811015611a2057600080fd5b81019080805190602001909291905050509050611a49620f42408261249e90919063ffffffff16565b915050919050565b60008073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663bd6d894d6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611ab057600080fd5b505af1158015611ac4573d6000803e3d6000fd5b505050506040513d6020811015611ada57600080fd5b810190808051906020019092919050505090506000670de0b6b3a764000082850281611b0257fe5b049050600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015611b6e57600080fd5b505af1158015611b82573d6000803e3d6000fd5b505050506040513d6020811015611b9857600080fd5b8101908080519060200190929190505050905073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611c3c57600080fd5b505afa158015611c50573d6000803e3d6000fd5b505050506040513d6020811015611c6657600080fd5b8101908080519060200190929190505050945060008114611cef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f5368656c6c2f63555344542d6d696e742d6661696c656400000000000000000081525060200191505060405180910390fd5b600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663a9059cbb88886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611d8c57600080fd5b505af1158015611da0573d6000803e3d6000fd5b505050506040513d6020811015611db657600080fd5b8101908080519060200190929190505050905080611e3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f5368656c6c2f63555344542d7472616e736665722d6661696c6564000000000081525060200191505060405180910390fd5b611e52620f42408761249e90919063ffffffff16565b94505050505092915050565b60008073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b158015611ebb57600080fd5b505afa158015611ecf573d6000803e3d6000fd5b505050506040513d6020811015611ee557600080fd5b81019080805190602001909291905050509050600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663ae9d70b06040518163ffffffff1660e01b815260040160206040518083038186803b158015611f5457600080fd5b505afa158015611f68573d6000803e3d6000fd5b505050506040513d6020811015611f7e57600080fd5b81019080805190602001909291905050509050600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff16636c540baf6040518163ffffffff1660e01b815260040160206040518083038186803b158015611fed57600080fd5b505afa158015612001573d6000803e3d6000fd5b505050506040513d602081101561201757600080fd5b81019080805190602001909291905050509050670de0b6b3a7640000814303838502028161204157fe5b048301925061206f620f4240670de0b6b3a76400008588028161206057fe5b0461249e90919063ffffffff16565b9350505050919050565b60008073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561214b57600080fd5b505af115801561215f573d6000803e3d6000fd5b505050506040513d602081101561217557600080fd5b81019080805190602001909291905050509050806121fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5368656c6c2f63555344542d7472616e736665722d66726f6d2d6661696c656481525060200191505060405180910390fd5b600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663db006a75856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561226457600080fd5b505af1158015612278573d6000803e3d6000fd5b505050506040513d602081101561228e57600080fd5b8101908080519060200190929190505050905060008114612317576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5368656c6c2f63555344542d72656465656d2d6661696c65640000000000000081525060200191505060405180910390fd5b600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561237357600080fd5b505afa158015612387573d6000803e3d6000fd5b505050506040513d602081101561239d57600080fd5b810190808051906020019092919050505090506123d9620f4240670de0b6b3a7640000838802816123ca57fe5b0461249e90919063ffffffff16565b9350505050919050565b6000808214156123f65760009050612498565b600083600f0b121561240757600080fd5b600060406fffffffffffffffffffffffffffffffff841685600f0b02901c90506000608084901c85600f0b02905077ffffffffffffffffffffffffffffffffffffffffffffffff81111561245a57600080fd5b604081901b9050817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0381111561249057600080fd5b818101925050505b92915050565b6000808214156124ad57600080fd5b60006124b98484612506565b90506f7fffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff1611156124fc57600080fd5b8091505092915050565b60008082141561251557600080fd5b600077ffffffffffffffffffffffffffffffffffffffffffffffff841161254b5782604085901b8161254357fe5b0490506126a0565b600060c09050600060c086901c9050640100000000811061257457602081901c90506020820191505b62010000811061258c57601081901c90506010820191505b61010081106125a357600881901c90506008820191505b601081106125b957600481901c90506004820191505b600481106125cf57600281901c90506002820191505b600281106125de576001820191505b600160bf830360018703901c018260ff0387901b816125f957fe5b0492506fffffffffffffffffffffffffffffffff83111561261957600080fd5b6000608086901c8402905060006fffffffffffffffffffffffffffffffff871685029050600060c089901c9050600060408a901b90508281101561265e576001820391505b8281039050608084901b925082811015612679576001820391505b8281039050608084901c821461268b57fe5b88818161269457fe5b04870196505050505050505b6fffffffffffffffffffffffffffffffff8111156126bd57600080fd5b809150509291505056fea265627a7a723158209de5921bcb5de110ca42224df6b069e4b551e1a6bfceb7d77f3f1cb9a76f3a0864736f6c634300050f0032
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061009e5760003560e01c80637f328ecc116100665780637f328ecc1461027c578063ac969a73146102d1578063f09a3fc31461032f578063f5e6c0ca14610397578063fa00102a146103df5761009e565b80630271c3c8146100a35780631e9b2cba146100e8578063523bf2571461015d5780636b677a8f146101d25780636fc3905214610217575b600080fd5b6100d2600480360360208110156100b957600080fd5b810190808035600f0b9060200190929190505050610427565b6040518082815260200191505060405180910390f35b610134600480360360408110156100fe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610796565b6040518083600f0b600f0b815260200182600f0b600f0b81526020019250505060405180910390f35b6101a96004803603604081101561017357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610a9e565b6040518083600f0b600f0b815260200182600f0b600f0b81526020019250505060405180910390f35b610201600480360360208110156101e857600080fd5b810190808035600f0b9060200190929190505050610f97565b6040518082815260200191505060405180910390f35b6102666004803603604081101561022d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035600f0b90602001909291905050506111b5565b6040518082815260200191505060405180910390f35b6102a86004803603602081101561029257600080fd5b810190808035906020019092919050505061150d565b6040518083600f0b600f0b815260200182600f0b600f0b81526020019250505060405180910390f35b610313600480360360208110156102e757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611962565b6040518082600f0b600f0b815260200191505060405180910390f35b61037b6004803603604081101561034557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611a51565b6040518082600f0b600f0b815260200191505060405180910390f35b6103c3600480360360208110156103ad57600080fd5b8101908080359060200190929190505050611e5e565b6040518082600f0b600f0b815260200191505060405180910390f35b61040b600480360360208110156103f557600080fd5b8101908080359060200190929190505050612079565b6040518082600f0b600f0b815260200191505060405180910390f35b60008073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663bd6d894d6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561048657600080fd5b505af115801561049a573d6000803e3d6000fd5b505050506040513d60208110156104b057600080fd5b8101908080519060200190929190505050905080670de0b6b3a76400006104e6620f424086600f0b6123e390919063ffffffff16565b02816104ee57fe5b049150600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156105c257600080fd5b505af11580156105d6573d6000803e3d6000fd5b505050506040513d60208110156105ec57600080fd5b8101908080519060200190929190505050905080610672576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5368656c6c2f63555344542d7472616e736665722d66726f6d2d6661696c656481525060200191505060405180910390fd5b600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663db006a75856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156106db57600080fd5b505af11580156106ef573d6000803e3d6000fd5b505050506040513d602081101561070557600080fd5b810190808051906020019092919050505090506000811461078e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5368656c6c2f63555344542d72656465656d2d6661696c65640000000000000081525060200191505060405180910390fd5b505050919050565b600080600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b1580156107f557600080fd5b505afa158015610809573d6000803e3d6000fd5b505050506040513d602081101561081f57600080fd5b81019080805190602001909291905050509050600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663ae9d70b06040518163ffffffff1660e01b815260040160206040518083038186803b15801561088e57600080fd5b505afa1580156108a2573d6000803e3d6000fd5b505050506040513d60208110156108b857600080fd5b81019080805190602001909291905050509050600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff16636c540baf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561092757600080fd5b505afa15801561093b573d6000803e3d6000fd5b505050506040513d602081101561095157600080fd5b81019080805190602001909291905050509050670de0b6b3a7640000814303838502028161097b57fe5b04830192506109a9620f4240670de0b6b3a76400008589028161099a57fe5b0461249e90919063ffffffff16565b9450600073dac17f958d2ee523a2206206994597c13d831ec773ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610a3e57600080fd5b505afa158015610a52573d6000803e3d6000fd5b505050506040513d6020811015610a6857600080fd5b81019080805190602001909291905050509050610a91620f42408261249e90919063ffffffff16565b9450505050509250929050565b600080600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663bd6d894d6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610aff57600080fd5b505af1158015610b13573d6000803e3d6000fd5b505050506040513d6020811015610b2957600080fd5b810190808051906020019092919050505090506000670de0b6b3a764000082860281610b5157fe5b049050600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015610bbd57600080fd5b505af1158015610bd1573d6000803e3d6000fd5b505050506040513d6020811015610be757600080fd5b8101908080519060200190929190505050905060008114610c70576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f5368656c6c2f63555344542d6d696e742d6661696c656400000000000000000081525060200191505060405180910390fd5b73f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610d0157600080fd5b505afa158015610d15573d6000803e3d6000fd5b505050506040513d6020811015610d2b57600080fd5b81019080805190602001909291905050509550600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663a9059cbb89896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610ddb57600080fd5b505af1158015610def573d6000803e3d6000fd5b505050506040513d6020811015610e0557600080fd5b8101908080519060200190929190505050905080610e8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f5368656c6c2f63555344542d7472616e736665722d6661696c6564000000000081525060200191505060405180910390fd5b600073dac17f958d2ee523a2206206994597c13d831ec773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610f1e57600080fd5b505afa158015610f32573d6000803e3d6000fd5b505050506040513d6020811015610f4857600080fd5b81019080805190602001909291905050509050610f71620f42408561249e90919063ffffffff16565b9650610f89620f42408261249e90919063ffffffff16565b955050505050509250929050565b60008073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b158015610ff457600080fd5b505afa158015611008573d6000803e3d6000fd5b505050506040513d602081101561101e57600080fd5b81019080805190602001909291905050509050600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663ae9d70b06040518163ffffffff1660e01b815260040160206040518083038186803b15801561108d57600080fd5b505afa1580156110a1573d6000803e3d6000fd5b505050506040513d60208110156110b757600080fd5b81019080805190602001909291905050509050600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff16636c540baf6040518163ffffffff1660e01b815260040160206040518083038186803b15801561112657600080fd5b505afa15801561113a573d6000803e3d6000fd5b505050506040513d602081101561115057600080fd5b81019080805190602001909291905050509050670de0b6b3a7640000814303838502028161117a57fe5b048301925082670de0b6b3a76400006111a2620f424088600f0b6123e390919063ffffffff16565b02816111aa57fe5b049350505050919050565b60008073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663a0712d68611201620f424086600f0b6123e390919063ffffffff16565b6040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561123757600080fd5b505af115801561124b573d6000803e3d6000fd5b505050506040513d602081101561126157600080fd5b81019080805190602001909291905050509050600081146112ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f5368656c6c2f63555344542d6d696e742d6661696c656400000000000000000081525060200191505060405180910390fd5b73f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561137b57600080fd5b505afa15801561138f573d6000803e3d6000fd5b505050506040513d60208110156113a557600080fd5b81019080805190602001909291905050509150600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561145557600080fd5b505af1158015611469573d6000803e3d6000fd5b505050506040513d602081101561147f57600080fd5b8101908080519060200190929190505050905080611505576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f5368656c6c2f63555344542d7472616e736665722d6661696c6564000000000081525060200191505060405180910390fd5b505092915050565b600080600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156115e157600080fd5b505af11580156115f5573d6000803e3d6000fd5b505050506040513d602081101561160b57600080fd5b8101908080519060200190929190505050905080611691576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5368656c6c2f63555344542d7472616e736665722d66726f6d2d6661696c656481525060200191505060405180910390fd5b600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663db006a75866040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b1580156116fa57600080fd5b505af115801561170e573d6000803e3d6000fd5b505050506040513d602081101561172457600080fd5b81019080805190602001909291905050509050600081146117ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5368656c6c2f63555344542d72656465656d2d6661696c65640000000000000081525060200191505060405180910390fd5b600073dac17f958d2ee523a2206206994597c13d831ec773ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561184057600080fd5b505afa158015611854573d6000803e3d6000fd5b505050506040513d602081101561186a57600080fd5b81019080805190602001909291905050509050600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b1580156118d957600080fd5b505afa1580156118ed573d6000803e3d6000fd5b505050506040513d602081101561190357600080fd5b8101908080519060200190929190505050905061192c620f42408361249e90919063ffffffff16565b9450611957620f4240670de0b6b3a7640000838a028161194857fe5b0461249e90919063ffffffff16565b955050505050915091565b60008073dac17f958d2ee523a2206206994597c13d831ec773ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119f657600080fd5b505afa158015611a0a573d6000803e3d6000fd5b505050506040513d6020811015611a2057600080fd5b81019080805190602001909291905050509050611a49620f42408261249e90919063ffffffff16565b915050919050565b60008073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663bd6d894d6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611ab057600080fd5b505af1158015611ac4573d6000803e3d6000fd5b505050506040513d6020811015611ada57600080fd5b810190808051906020019092919050505090506000670de0b6b3a764000082850281611b0257fe5b049050600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015611b6e57600080fd5b505af1158015611b82573d6000803e3d6000fd5b505050506040513d6020811015611b9857600080fd5b8101908080519060200190929190505050905073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611c3c57600080fd5b505afa158015611c50573d6000803e3d6000fd5b505050506040513d6020811015611c6657600080fd5b8101908080519060200190929190505050945060008114611cef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f5368656c6c2f63555344542d6d696e742d6661696c656400000000000000000081525060200191505060405180910390fd5b600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663a9059cbb88886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611d8c57600080fd5b505af1158015611da0573d6000803e3d6000fd5b505050506040513d6020811015611db657600080fd5b8101908080519060200190929190505050905080611e3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f5368656c6c2f63555344542d7472616e736665722d6661696c6564000000000081525060200191505060405180910390fd5b611e52620f42408761249e90919063ffffffff16565b94505050505092915050565b60008073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b158015611ebb57600080fd5b505afa158015611ecf573d6000803e3d6000fd5b505050506040513d6020811015611ee557600080fd5b81019080805190602001909291905050509050600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663ae9d70b06040518163ffffffff1660e01b815260040160206040518083038186803b158015611f5457600080fd5b505afa158015611f68573d6000803e3d6000fd5b505050506040513d6020811015611f7e57600080fd5b81019080805190602001909291905050509050600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff16636c540baf6040518163ffffffff1660e01b815260040160206040518083038186803b158015611fed57600080fd5b505afa158015612001573d6000803e3d6000fd5b505050506040513d602081101561201757600080fd5b81019080805190602001909291905050509050670de0b6b3a7640000814303838502028161204157fe5b048301925061206f620f4240670de0b6b3a76400008588028161206057fe5b0461249e90919063ffffffff16565b9350505050919050565b60008073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561214b57600080fd5b505af115801561215f573d6000803e3d6000fd5b505050506040513d602081101561217557600080fd5b81019080805190602001909291905050509050806121fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f5368656c6c2f63555344542d7472616e736665722d66726f6d2d6661696c656481525060200191505060405180910390fd5b600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663db006a75856040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561226457600080fd5b505af1158015612278573d6000803e3d6000fd5b505050506040513d602081101561228e57600080fd5b8101908080519060200190929190505050905060008114612317576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5368656c6c2f63555344542d72656465656d2d6661696c65640000000000000081525060200191505060405180910390fd5b600073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561237357600080fd5b505afa158015612387573d6000803e3d6000fd5b505050506040513d602081101561239d57600080fd5b810190808051906020019092919050505090506123d9620f4240670de0b6b3a7640000838802816123ca57fe5b0461249e90919063ffffffff16565b9350505050919050565b6000808214156123f65760009050612498565b600083600f0b121561240757600080fd5b600060406fffffffffffffffffffffffffffffffff841685600f0b02901c90506000608084901c85600f0b02905077ffffffffffffffffffffffffffffffffffffffffffffffff81111561245a57600080fd5b604081901b9050817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0381111561249057600080fd5b818101925050505b92915050565b6000808214156124ad57600080fd5b60006124b98484612506565b90506f7fffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff1611156124fc57600080fd5b8091505092915050565b60008082141561251557600080fd5b600077ffffffffffffffffffffffffffffffffffffffffffffffff841161254b5782604085901b8161254357fe5b0490506126a0565b600060c09050600060c086901c9050640100000000811061257457602081901c90506020820191505b62010000811061258c57601081901c90506010820191505b61010081106125a357600881901c90506008820191505b601081106125b957600481901c90506004820191505b600481106125cf57600281901c90506002820191505b600281106125de576001820191505b600160bf830360018703901c018260ff0387901b816125f957fe5b0492506fffffffffffffffffffffffffffffffff83111561261957600080fd5b6000608086901c8402905060006fffffffffffffffffffffffffffffffff871685029050600060c089901c9050600060408a901b90508281101561265e576001820391505b8281039050608084901b925082811015612679576001820391505b8281039050608084901c821461268b57fe5b88818161269457fe5b04870196505050505050505b6fffffffffffffffffffffffffffffffff8111156126bd57600080fd5b809150509291505056fea265627a7a723158209de5921bcb5de110ca42224df6b069e4b551e1a6bfceb7d77f3f1cb9a76f3a0864736f6c634300050f0032
Deployed Bytecode Sourcemap
31989:5936:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31989:5936:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33633:491;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33633:491:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37364:556;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37364:556:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34711:713;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34711:713:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36138:409;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36138:409:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34216:417;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34216:417:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32391:619;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32391:619:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37107:189;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37107:189:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;35502:568;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35502:568:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;36615:419;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36615:419:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33069:488;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33069:488:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33633:491;33691:15;33721:13;32255:42;33737:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33737:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33737:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33737:27:0;;;;;;;;;;;;;;;;33721:43;;33818:5;33809:4;33789:17;33802:3;33789:7;:12;;;;:17;;;;:::i;:::-;:24;33787:36;;;;;;33777:46;;33836:21;32255:42;33860:18;;;33879:10;33899:4;33906:7;33860:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33860:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33860:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33860:54:0;;;;;;;;;;;;;;;;33836:78;;33935:16;33927:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34001:19;32255:42;34023:12;;;34036:7;34023:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34023:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34023:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34023:21:0;;;;;;;;;;;;;;;;34001:43;;34083:1;34065:14;:19;34057:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33633:491;;;;;;:::o;37364:556::-;37457:14;37473:15;37503:13;32255:42;37519:24;;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37519:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37519:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37519:26:0;;;;;;;;;;;;;;;;37503:42;;37566:19;32255:42;37588:24;;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37588:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37588:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37588:26:0;;;;;;;;;;;;;;;;37566:48;;37627:18;32255:42;37648:24;;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37648:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37648:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37648:26:0;;;;;;;;;;;;;;;;37627:47;;37748:4;37734:10;37719:12;:25;37704:11;37696:5;:19;:49;:56;;;;;;37687:65;;;;37775:40;37811:3;37799:4;37789:5;37779:7;:15;37777:26;;;;;;37775:35;;:40;;;;:::i;:::-;37765:50;;37828:16;32172:42;37847:14;;;37862:5;37847:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37847:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37847:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37847:21:0;;;;;;;;;;;;;;;;37828:40;;37892:18;37906:3;37892:8;:13;;:18;;;;:::i;:::-;37881:29;;37364:556;;;;;;;;;:::o;34711:713::-;34791:14;34807:15;34837:13;32255:42;34853:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34853:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34853:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34853:27:0;;;;;;;;;;;;;;;;34837:43;;34893:19;34937:4;34927:5;34917:7;:15;34915:26;;;;;;34893:48;;34954:17;32255:42;34974:10;;;34985:11;34974:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34974:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34974:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34974:23:0;;;;;;;;;;;;;;;;34954:43;;35042:1;35026:12;:17;35018:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32255:42;35102:15;;;35126:4;35102:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35102:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35102:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35102:30:0;;;;;;;;;;;;;;;;35092:40;;35145:21;32255:42;35169:14;;;35184:4;35190:7;35169:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35169:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35169:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35169:29:0;;;;;;;;;;;;;;;;35145:53;;35219:16;35211:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35280:16;32172:42;35299:14;;;35322:4;35299:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35299:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35299:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35299:29:0;;;;;;;;;;;;;;;;35280:48;;35351:21;35368:3;35351:11;:16;;:21;;;;:::i;:::-;35341:31;;35396:18;35410:3;35396:8;:13;;:18;;;;:::i;:::-;35385:29;;34711:713;;;;;;;;;;:::o;36138:409::-;36199:15;36229:13;32255:42;36245:24;;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36245:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36245:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36245:26:0;;;;;;;;;;;;;;;;36229:42;;36292:19;32255:42;36314:24;;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36314:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36314:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36314:26:0;;;;;;;;;;;;;;;;36292:48;;36353:18;32255:42;36374:24;;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36374:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36374:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36374:26:0;;;;;;;;;;;;;;;;36353:47;;36474:4;36460:10;36445:12;:25;36430:11;36422:5;:19;:49;:56;;;;;;36413:65;;;;36532:5;36523:4;36503:17;36516:3;36503:7;:12;;;;:17;;;;:::i;:::-;:24;36501:36;;;;;;36491:46;;36138:409;;;;;;:::o;34216:417::-;34288:15;34318:17;32255:42;34338:10;;;34350:17;34363:3;34350:7;:12;;;;:17;;;;:::i;:::-;34338:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34338:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34338:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34338:31:0;;;;;;;;;;;;;;;;34318:51;;34406:1;34390:12;:17;34382:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32255:42;34458:15;;;34482:4;34458:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34458:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34458:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34458:30:0;;;;;;;;;;;;;;;;34448:40;;34501:21;32255:42;34525:14;;;34540:4;34546:7;34525:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34525:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34525:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34525:29:0;;;;;;;;;;;;;;;;34501:53;;34575:16;34567:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34216:417;;;;;;:::o;32391:619::-;32457:14;32473:15;32503:21;32255:42;32527:18;;;32546:10;32566:4;32573:7;32527:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32527:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32527:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32527:54:0;;;;;;;;;;;;;;;;32503:78;;32602:16;32594:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32668:19;32255:42;32690:12;;;32703:7;32690:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32690:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32690:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32690:21:0;;;;;;;;;;;;;;;;32668:43;;32750:1;32732:14;:19;32724:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32794:16;32172:42;32813:14;;;32836:4;32813:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32813:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32813:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32813:29:0;;;;;;;;;;;;;;;;32794:48;;32855:13;32255:42;32871:24;;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32871:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32871:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32871:26:0;;;;;;;;;;;;;;;;32855:42;;32921:18;32935:3;32921:8;:13;;:18;;;;:::i;:::-;32910:29;;32962:38;32996:3;32985:4;32976:5;32966:7;:15;32964:25;;;;;;32962:33;;:38;;;;:::i;:::-;32952:48;;32391:619;;;;;;;:::o;37107:189::-;37174:15;37204:16;32172:42;37223:14;;;37238:5;37223:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37223:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37223:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37223:21:0;;;;;;;;;;;;;;;;37204:40;;37268:18;37282:3;37268:8;:13;;:18;;;;:::i;:::-;37257:29;;37107:189;;;;:::o;35502:568::-;35569:14;35598:13;32255:42;35614:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35614:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35614:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35614:27:0;;;;;;;;;;;;;;;;35598:43;;35654:19;35698:4;35688:5;35678:7;:15;35676:26;;;;;;35654:48;;35715:17;32255:42;35735:10;;;35746:11;35735:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35735:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35735:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35735:23:0;;;;;;;;;;;;;;;;35715:43;;32255:42;35789:15;;;35813:4;35789:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35789:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35789:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35789:30:0;;;;;;;;;;;;;;;;35779:40;;35856:1;35840:12;:17;35832:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35898:21;32255:42;35922:14;;;35937:4;35943:7;35922:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35922:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35922:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35922:29:0;;;;;;;;;;;;;;;;35898:53;;35972:16;35964:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36043:17;36056:3;36043:7;:12;;:17;;;;:::i;:::-;36033:27;;35502:568;;;;;;;;:::o;36615:419::-;36683:14;36712:13;32255:42;36728:24;;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36728:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36728:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36728:26:0;;;;;;;;;;;;;;;;36712:42;;36775:19;32255:42;36797:24;;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36797:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36797:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36797:26:0;;;;;;;;;;;;;;;;36775:48;;36836:18;32255:42;36857:24;;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36857:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36857:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36857:26:0;;;;;;;;;;;;;;;;36836:47;;36957:4;36943:10;36928:12;:25;36913:11;36905:5;:19;:49;:56;;;;;;36896:65;;;;36984:40;37020:3;37008:4;36998:5;36988:7;:15;36986:26;;;;;;36984:35;;:40;;;;:::i;:::-;36974:50;;36615:419;;;;;;:::o;33069:488::-;33122:14;33151:21;32255:42;33175:18;;;33194:10;33214:4;33221:7;33175:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33175:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33175:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33175:54:0;;;;;;;;;;;;;;;;33151:78;;33250:16;33242:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33316:19;32255:42;33338:12;;;33351:7;33338:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33338:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33338:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33338:21:0;;;;;;;;;;;;;;;;33316:43;;33398:1;33380:14;:19;33372:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33442:13;32255:42;33458:24;;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33458:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33458:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;33458:26:0;;;;;;;;;;;;;;;;33442:42;;33507:40;33543:3;33531:4;33521:5;33511:7;:15;33509:26;;;;;;33507:35;;:40;;;;:::i;:::-;33497:50;;33069:488;;;;;;:::o;6312:469::-;6371:7;6396:1;6391;:6;6387:20;;;6406:1;6399:8;;;;6387:20;6430:1;6425;:6;;;;6416:16;;;;;;6441:10;6514:2;6474:34;6470:1;:38;6464:1;6455:11;;:54;6454:62;;6441:75;;6523:10;6556:3;6551:1;:8;;6545:1;6536:11;;:24;6523:37;;6584:50;6578:2;:56;;6569:66;;;;;;6649:2;6642:9;;;;;6751:2;6682:66;:71;6669:2;:84;;6660:94;;;;;;6773:2;6768;:7;6761:14;;;;6312:469;;;;;:::o;8657:208::-;8717:6;8746:1;8741;:6;;8732:16;;;;;;8755:14;8772:12;8779:1;8782;8772:5;:12::i;:::-;8755:29;;1176:34;8800:29;;:6;:29;;;;8791:39;;;;;;8852:6;8837:22;;;8657:208;;;;:::o;21229:1257::-;21289:7;21319:1;21314;:6;;21305:16;;;;;;21330:14;21362:50;21357:1;:55;21353:1035;;21442:1;21436:2;21431:1;:7;;21430:13;;;;;;21421:22;;21353:1035;;;21464:11;21478:3;21464:17;;21490:10;21508:3;21503:1;:8;;21490:21;;21530:11;21524:2;:17;21520:48;;21552:2;21545:9;;;;;21563:2;21556:9;;;;21520:48;21586:7;21580:2;:13;21576:44;;21604:2;21597:9;;;;;21615:2;21608:9;;;;21576:44;21638:5;21632:2;:11;21628:40;;21654:1;21647:8;;;;;21664:1;21657:8;;;;21628:40;21686:4;21680:2;:10;21676:39;;21701:1;21694:8;;;;;21711:1;21704:8;;;;21676:39;21733:3;21727:2;:9;21723:38;;21747:1;21740:8;;;;;21757:1;21750:8;;;;21723:38;21779:3;21773:2;:9;21769:23;;21791:1;21784:8;;;;21769:23;21887:1;21880:3;21874;:9;21869:1;21865;:5;:18;;21864:24;21856:3;21850;:9;21845:1;:14;;21844:45;;;;;;21835:54;;21917:34;21907:6;:44;;21898:54;;;;;;21963:10;21991:3;21986:1;:8;;21976:6;:19;21963:32;;22004:10;22031:34;22027:1;:38;22017:6;:49;22004:62;;22077:10;22095:3;22090:1;:8;;22077:21;;22107:10;22125:2;22120:1;:7;;22107:20;;22147:2;22142;:7;22138:20;;;22157:1;22151:7;;;;22138:20;22173:2;22167:8;;;;22232:3;22226:2;:9;;22221:14;;22253:2;22248;:7;22244:20;;;22263:1;22257:7;;;;22244:20;22279:2;22273:8;;;;22349:3;22343:2;:9;;22337:2;:15;22329:24;;;;22379:1;22374:2;:6;;;;;;22364:16;;;;21353:1035;;;;;;;22415:34;22405:6;:44;;22396:54;;;;;;22473:6;22457:23;;;21229:1257;;;;:::o
Swarm Source
bzzr://9de5921bcb5de110ca42224df6b069e4b551e1a6bfceb7d77f3f1cb9a76f3a08
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.