Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MainnetADaiToDaiAssimilator
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/daiReserves/mainnetADaiToDaiAssimilator.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/assimilators/aaveResources/ILendingPool.sol /* pragma solidity ^0.5.0; */ interface ILendingPool { function deposit(address _reserve, uint256 _amount, uint16 _referralCode) external payable; function redeemUnderlying(address _reserve, address payable _user, uint256 _amount, uint256 _aTokenBalanceAfterRedeem) external; function borrow(address _reserve, uint256 _amount, uint256 _interestRateMode, uint16 _referralCode) external; function repay(address _reserve, uint256 _amount, address payable _onBehalfOf) external payable; function swapBorrowRateMode(address _reserve) external; function rebalanceStableBorrowRate(address _reserve, address _user) external; function setUserUseReserveAsCollateral(address _reserve, bool _useAsCollateral) external; function liquidationCall(address _collateral, address _reserve, address _user, uint256 _purchaseAmount, bool _receiveAToken) external payable; function flashLoan(address _receiver, address _reserve, uint256 _amount, bytes calldata _params) external; function getReserveConfigurationData(address _reserve) external view returns ( uint256 ltv, uint256 liquidationThreshold, uint256 liquidationBonus, address interestRateStrategyAddress, bool usageAsCollateralEnabled, bool borrowingEnabled, bool stableBorrowRateEnabled, bool isActive ); function getReserveData(address _reserve) external view returns ( uint256 totalLiquidity, uint256 availableLiquidity, uint256 totalBorrowsStable, uint256 totalBorrowsVariable, uint256 liquidityRate, uint256 variableBorrowRate, uint256 stableBorrowRate, uint256 averageStableBorrowRate, uint256 utilizationRate, uint256 liquidityIndex, uint256 variableBorrowIndex, address aTokenAddress, uint40 lastUpdateTimestamp ); function getUserAccountData(address _user) external view returns ( uint256 totalLiquidityETH, uint256 totalCollateralETH, uint256 totalBorrowsETH, uint256 totalFeesETH, uint256 availableBorrowsETH, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor ); function getUserReserveData(address _reserve, address _user) external view returns ( uint256 currentATokenBalance, uint256 currentBorrowBalance, uint256 principalBorrowBalance, uint256 borrowRateMode, uint256 borrowRate, uint256 liquidityRate, uint256 originationFee, uint256 variableBorrowIndex, uint256 lastUpdateTimestamp, bool usageAsCollateralEnabled ); function getReserves() external view returns (address[] memory); } ////// src/assimilators/aaveResources/ILendingPoolAddressesProvider.sol /* pragma solidity ^0.5.0; */ /** @title ILendingPoolAddressesProvider interface @notice provides the interface to fetch the LendingPoolCore address */ interface ILendingPoolAddressesProvider { function getLendingPool() external view returns (address); function setLendingPoolImpl(address _pool) external; function getLendingPoolCore() external view returns (address payable); function setLendingPoolCoreImpl(address _lendingPoolCore) external; function getLendingPoolConfigurator() external view returns (address); function setLendingPoolConfiguratorImpl(address _configurator) external; function getLendingPoolDataProvider() external view returns (address); function setLendingPoolDataProviderImpl(address _provider) external; function getLendingPoolParametersProvider() external view returns (address); function setLendingPoolParametersProviderImpl(address _parametersProvider) external; function getTokenDistributor() external view returns (address); function setTokenDistributor(address _tokenDistributor) external; function getFeeProvider() external view returns (address); function setFeeProviderImpl(address _feeProvider) external; function getLendingPoolLiquidationManager() external view returns (address); function setLendingPoolLiquidationManager(address _manager) external; function getLendingPoolManager() external view returns (address); function setLendingPoolManager(address _lendingPoolManager) external; function getPriceOracle() external view returns (address); function setPriceOracle(address _priceOracle) external; function getLendingRateOracle() external view returns (address); function setLendingRateOracle(address _lendingRateOracle) external; } ////// src/interfaces/IAToken.sol /* pragma solidity ^0.5.0; */ interface IAToken { function transfer(address recipient, uint256 amount) external returns (bool); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function redirectInterestStream(address _to) external; function redirectInterestStreamOf(address _from, address _to) external; function allowInterestRedirectionTo(address _to) external; function redeem(uint256 _amount) external; function balanceOf(address _user) external view returns(uint256); function principalBalanceOf(address _user) external view returns(uint256); function totalSupply() external view returns(uint256); function isTransferAllowed(address _user, uint256 _amount) external view returns (bool); function getUserIndex(address _user) external view returns(uint256); function getInterestRedirectionAddress(address _user) external view returns(address); function getRedirectedBalance(address _user) external view returns(uint256); function decimals () external view returns (uint256); function deposit(uint256 _amount) external; } ////// 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/IERC20.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 IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * 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 returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } ////// src/assimilators/mainnet/daiReserves/mainnetADaiToDaiAssimilator.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 "../../aaveResources/ILendingPoolAddressesProvider.sol"; */ /* import "../../aaveResources/ILendingPool.sol"; */ /* import "../../../interfaces/IAToken.sol"; */ /* import "../../../interfaces/IERC20.sol"; */ /* import "../../../interfaces/IAssimilator.sol"; */ contract MainnetADaiToDaiAssimilator is IAssimilator { using ABDKMath64x64 for int128; using ABDKMath64x64 for uint256; IERC20 constant dai = IERC20(0x6B175474E89094C44Da98b954EedeAC495271d0F); ILendingPoolAddressesProvider constant lpProvider = ILendingPoolAddressesProvider(0x24a42fD28C976A61Df5D00D0599C34c4f90748c8); constructor () public { } function getADai () public view returns (IAToken) { ILendingPool pool = ILendingPool(lpProvider.getLendingPool()); (,,,,,,,,,,,address aTokenAddress,) = pool.getReserveData(address(dai)); return IAToken(aTokenAddress); } // intakes raw amount of ASUsd and returns the corresponding raw amount function intakeRawAndGetBalance (uint256 _amount) public returns (int128 amount_, int128 balance_) { IAToken _adai = getADai(); bool _success = _adai.transferFrom(msg.sender, address(this), _amount); require(_success, "Shell/aDAI-transfer-from-failed"); _adai.redeem(_amount); uint256 _balance = dai.balanceOf(address(this)); amount_ = _amount.divu(1e18); balance_ = _balance.divu(1e18); } // intakes raw amount of ASUsd and returns the corresponding raw amount function intakeRaw (uint256 _amount) public returns (int128 amount_) { IAToken _adai = getADai(); bool _success = _adai.transferFrom(msg.sender, address(this), _amount); require(_success, "Shell/aDAI-transfer-from-failed"); _adai.redeem(_amount); amount_ = _amount.divu(1e18); } // intakes a numeraire amount of ASUsd and returns the corresponding raw amount function intakeNumeraire (int128 _amount) public returns (uint256 amount_) { amount_ = _amount.mulu(1e18); IAToken _adai = getADai(); bool _success = _adai.transferFrom(msg.sender, address(this), amount_); require(_success, "Shell/aDAI-transfer-from-failed"); _adai.redeem(amount_); } // outputs a raw amount of ASUsd and returns the corresponding numeraire amount function outputRawAndGetBalance (address _dst, uint256 _amount) public returns (int128 amount_, int128 balance_) { ILendingPool pool = ILendingPool(lpProvider.getLendingPool()); pool.deposit(address(dai), _amount, 0); IAToken _adai = getADai(); bool _success = _adai.transfer(_dst, _amount); require(_success, "Shell/aDAI-transfer-failed"); uint256 _balance = dai.balanceOf(address(this)); amount_ = _amount.divu(1e18); balance_ = _balance.divu(1e18); } // outputs a raw amount of ASUsd and returns the corresponding numeraire amount function outputRaw (address _dst, uint256 _amount) public returns (int128 amount_) { IAToken _adai = getADai(); ILendingPool pool = ILendingPool(lpProvider.getLendingPool()); pool.deposit(address(dai), _amount, 0); bool _success = _adai.transfer(_dst, _amount); require(_success, "Shell/aDAI-transfer-failed"); amount_ = _amount.divu(1e18); } // outputs a numeraire amount of ASUsd and returns the corresponding numeraire amount function outputNumeraire (address _dst, int128 _amount) public returns (uint256 amount_) { amount_ = _amount.mulu(1e18); ILendingPool pool = ILendingPool(lpProvider.getLendingPool()); pool.deposit(address(dai), amount_, 0); IAToken _adai = getADai(); bool _success = _adai.transfer(_dst, amount_); require(_success, "Shell/aDAI-transfer-failed"); } // takes a numeraire amount and returns the raw amount function viewRawAmount (int128 _amount) public view returns (uint256 amount_) { amount_ = _amount.mulu(1e18); } // takes a raw amount and returns the numeraire amount function viewNumeraireAmount (uint256 _amount) public view returns (int128 amount_) { amount_ = _amount.divu(1e18); } // views the numeraire value of the current balance of the reserve, in this case ASUsd function viewNumeraireBalance (address _addr) public view returns (int128 amount_) { uint256 _balance = dai.balanceOf(_addr); amount_ = _balance.divu(1e18); } // takes a raw amount and returns the numeraire amount function viewNumeraireAmountAndBalance (address _addr, uint256 _amount) public view returns (int128 amount_, int128 balance_) { amount_ = _amount.divu(1e18); uint256 _balance = dai.balanceOf(_addr); balance_ = _balance.divu(1e18); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"constant":true,"inputs":[],"name":"getADai","outputs":[{"internalType":"contract IAToken","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"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":"amount_","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
608060405234801561001057600080fd5b50611c34806100206000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80637f328ecc116100715780637f328ecc14610287578063ac969a73146102dc578063af02cdc81461033a578063f09a3fc314610384578063f5e6c0ca146103ec578063fa00102a14610434576100a9565b80630271c3c8146100ae5780631e9b2cba146100f3578063523bf257146101685780636b677a8f146101dd5780636fc3905214610222575b600080fd5b6100dd600480360360208110156100c457600080fd5b810190808035600f0b906020019092919050505061047c565b6040518082815260200191505060405180910390f35b61013f6004803603604081101561010957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610689565b6040518083600f0b600f0b815260200182600f0b600f0b81526020019250505060405180910390f35b6101b46004803603604081101561017e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061079e565b6040518083600f0b600f0b815260200182600f0b600f0b81526020019250505060405180910390f35b61020c600480360360208110156101f357600080fd5b810190808035600f0b9060200190929190505050610b54565b6040518082815260200191505060405180910390f35b6102716004803603604081101561023857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035600f0b9060200190929190505050610b7b565b6040518082815260200191505060405180910390f35b6102b36004803603602081101561029d57600080fd5b8101908080359060200190929190505050610e44565b6040518083600f0b600f0b815260200182600f0b600f0b81526020019250505060405180910390f35b61031e600480360360208110156102f257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061113d565b6040518082600f0b600f0b815260200191505060405180910390f35b610342611231565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103d06004803603604081101561039a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611429565b6040518082600f0b600f0b815260200191505060405180910390f35b6104186004803603602081101561040257600080fd5b81019080803590602001909291905050506116ee565b6040518082600f0b600f0b815260200191505060405180910390f35b6104606004803603602081101561044a57600080fd5b8101908080359060200190929190505050611712565b6040518082600f0b600f0b815260200191505060405180910390f35b600061049c670de0b6b3a764000083600f0b61191b90919063ffffffff16565b905060006104a8611231565b905060008173ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561056757600080fd5b505af115801561057b573d6000803e3d6000fd5b505050506040513d602081101561059157600080fd5b8101908080519060200190929190505050905080610617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5368656c6c2f614441492d7472616e736665722d66726f6d2d6661696c65640081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663db006a75846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561066a57600080fd5b505af115801561067e573d6000803e3d6000fd5b505050505050919050565b6000806106a7670de0b6b3a7640000846119d690919063ffffffff16565b91506000736b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561073c57600080fd5b505afa158015610750573d6000803e3d6000fd5b505050506040513d602081101561076657600080fd5b81019080805190602001909291905050509050610794670de0b6b3a7640000826119d690919063ffffffff16565b9150509250929050565b60008060007324a42fd28c976a61df5d00d0599c34c4f90748c873ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156107fd57600080fd5b505afa158015610811573d6000803e3d6000fd5b505050506040513d602081101561082757600080fd5b810190808051906020019092919050505090508073ffffffffffffffffffffffffffffffffffffffff1663d2d0e066736b175474e89094c44da98b954eedeac495271d0f8660006040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018261ffff1681526020019350505050600060405180830381600087803b1580156108e257600080fd5b505af11580156108f6573d6000803e3d6000fd5b505050506000610904611231565b905060008173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb88886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561098f57600080fd5b505af11580156109a3573d6000803e3d6000fd5b505050506040513d60208110156109b957600080fd5b8101908080519060200190929190505050905080610a3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f5368656c6c2f614441492d7472616e736665722d6661696c656400000000000081525060200191505060405180910390fd5b6000736b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610ad257600080fd5b505afa158015610ae6573d6000803e3d6000fd5b505050506040513d6020811015610afc57600080fd5b81019080805190602001909291905050509050610b2a670de0b6b3a7640000886119d690919063ffffffff16565b9550610b47670de0b6b3a7640000826119d690919063ffffffff16565b9450505050509250929050565b6000610b74670de0b6b3a764000083600f0b61191b90919063ffffffff16565b9050919050565b6000610b9b670de0b6b3a764000083600f0b61191b90919063ffffffff16565b905060007324a42fd28c976a61df5d00d0599c34c4f90748c873ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610bf957600080fd5b505afa158015610c0d573d6000803e3d6000fd5b505050506040513d6020811015610c2357600080fd5b810190808051906020019092919050505090508073ffffffffffffffffffffffffffffffffffffffff1663d2d0e066736b175474e89094c44da98b954eedeac495271d0f8460006040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018261ffff1681526020019350505050600060405180830381600087803b158015610cde57600080fd5b505af1158015610cf2573d6000803e3d6000fd5b505050506000610d00611231565b905060008173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610d8b57600080fd5b505af1158015610d9f573d6000803e3d6000fd5b505050506040513d6020811015610db557600080fd5b8101908080519060200190929190505050905080610e3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f5368656c6c2f614441492d7472616e736665722d6661696c656400000000000081525060200191505060405180910390fd5b50505092915050565b6000806000610e51611231565b905060008173ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015610f1057600080fd5b505af1158015610f24573d6000803e3d6000fd5b505050506040513d6020811015610f3a57600080fd5b8101908080519060200190929190505050905080610fc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5368656c6c2f614441492d7472616e736665722d66726f6d2d6661696c65640081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663db006a75866040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561101357600080fd5b505af1158015611027573d6000803e3d6000fd5b505050506000736b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156110be57600080fd5b505afa1580156110d2573d6000803e3d6000fd5b505050506040513d60208110156110e857600080fd5b81019080805190602001909291905050509050611116670de0b6b3a7640000876119d690919063ffffffff16565b9450611133670de0b6b3a7640000826119d690919063ffffffff16565b9350505050915091565b600080736b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156111d157600080fd5b505afa1580156111e5573d6000803e3d6000fd5b505050506040513d60208110156111fb57600080fd5b81019080805190602001909291905050509050611229670de0b6b3a7640000826119d690919063ffffffff16565b915050919050565b6000807324a42fd28c976a61df5d00d0599c34c4f90748c873ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561128e57600080fd5b505afa1580156112a2573d6000803e3d6000fd5b505050506040513d60208110156112b857600080fd5b8101908080519060200190929190505050905060008173ffffffffffffffffffffffffffffffffffffffff166335ea6a75736b175474e89094c44da98b954eedeac495271d0f6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019150506101a06040518083038186803b15801561135f57600080fd5b505afa158015611373573d6000803e3d6000fd5b505050506040513d6101a081101561138a57600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050509b505050505050505050505050809250505090565b600080611434611231565b905060007324a42fd28c976a61df5d00d0599c34c4f90748c873ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561149257600080fd5b505afa1580156114a6573d6000803e3d6000fd5b505050506040513d60208110156114bc57600080fd5b810190808051906020019092919050505090508073ffffffffffffffffffffffffffffffffffffffff1663d2d0e066736b175474e89094c44da98b954eedeac495271d0f8660006040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018261ffff1681526020019350505050600060405180830381600087803b15801561157757600080fd5b505af115801561158b573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87876040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561161857600080fd5b505af115801561162c573d6000803e3d6000fd5b505050506040513d602081101561164257600080fd5b81019080805190602001909291905050509050806116c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f5368656c6c2f614441492d7472616e736665722d6661696c656400000000000081525060200191505060405180910390fd5b6116e3670de0b6b3a7640000866119d690919063ffffffff16565b935050505092915050565b600061170b670de0b6b3a7640000836119d690919063ffffffff16565b9050919050565b60008061171d611231565b905060008173ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156117dc57600080fd5b505af11580156117f0573d6000803e3d6000fd5b505050506040513d602081101561180657600080fd5b810190808051906020019092919050505090508061188c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5368656c6c2f614441492d7472616e736665722d66726f6d2d6661696c65640081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663db006a75856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156118df57600080fd5b505af11580156118f3573d6000803e3d6000fd5b50505050611912670de0b6b3a7640000856119d690919063ffffffff16565b92505050919050565b60008082141561192e57600090506119d0565b600083600f0b121561193f57600080fd5b600060406fffffffffffffffffffffffffffffffff841685600f0b02901c90506000608084901c85600f0b02905077ffffffffffffffffffffffffffffffffffffffffffffffff81111561199257600080fd5b604081901b9050817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038111156119c857600080fd5b818101925050505b92915050565b6000808214156119e557600080fd5b60006119f18484611a3e565b90506f7fffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff161115611a3457600080fd5b8091505092915050565b600080821415611a4d57600080fd5b600077ffffffffffffffffffffffffffffffffffffffffffffffff8411611a835782604085901b81611a7b57fe5b049050611bd8565b600060c09050600060c086901c90506401000000008110611aac57602081901c90506020820191505b620100008110611ac457601081901c90506010820191505b6101008110611adb57600881901c90506008820191505b60108110611af157600481901c90506004820191505b60048110611b0757600281901c90506002820191505b60028110611b16576001820191505b600160bf830360018703901c018260ff0387901b81611b3157fe5b0492506fffffffffffffffffffffffffffffffff831115611b5157600080fd5b6000608086901c8402905060006fffffffffffffffffffffffffffffffff871685029050600060c089901c9050600060408a901b905082811015611b96576001820391505b8281039050608084901b925082811015611bb1576001820391505b8281039050608084901c8214611bc357fe5b888181611bcc57fe5b04870196505050505050505b6fffffffffffffffffffffffffffffffff811115611bf557600080fd5b809150509291505056fea265627a7a72315820829d1a1cdbf00164bf954a19ae8515faa81e67fe1cffec97824c4ae71a74eeba64736f6c634300050f0032
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80637f328ecc116100715780637f328ecc14610287578063ac969a73146102dc578063af02cdc81461033a578063f09a3fc314610384578063f5e6c0ca146103ec578063fa00102a14610434576100a9565b80630271c3c8146100ae5780631e9b2cba146100f3578063523bf257146101685780636b677a8f146101dd5780636fc3905214610222575b600080fd5b6100dd600480360360208110156100c457600080fd5b810190808035600f0b906020019092919050505061047c565b6040518082815260200191505060405180910390f35b61013f6004803603604081101561010957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610689565b6040518083600f0b600f0b815260200182600f0b600f0b81526020019250505060405180910390f35b6101b46004803603604081101561017e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061079e565b6040518083600f0b600f0b815260200182600f0b600f0b81526020019250505060405180910390f35b61020c600480360360208110156101f357600080fd5b810190808035600f0b9060200190929190505050610b54565b6040518082815260200191505060405180910390f35b6102716004803603604081101561023857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035600f0b9060200190929190505050610b7b565b6040518082815260200191505060405180910390f35b6102b36004803603602081101561029d57600080fd5b8101908080359060200190929190505050610e44565b6040518083600f0b600f0b815260200182600f0b600f0b81526020019250505060405180910390f35b61031e600480360360208110156102f257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061113d565b6040518082600f0b600f0b815260200191505060405180910390f35b610342611231565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103d06004803603604081101561039a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611429565b6040518082600f0b600f0b815260200191505060405180910390f35b6104186004803603602081101561040257600080fd5b81019080803590602001909291905050506116ee565b6040518082600f0b600f0b815260200191505060405180910390f35b6104606004803603602081101561044a57600080fd5b8101908080359060200190929190505050611712565b6040518082600f0b600f0b815260200191505060405180910390f35b600061049c670de0b6b3a764000083600f0b61191b90919063ffffffff16565b905060006104a8611231565b905060008173ffffffffffffffffffffffffffffffffffffffff166323b872dd3330866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561056757600080fd5b505af115801561057b573d6000803e3d6000fd5b505050506040513d602081101561059157600080fd5b8101908080519060200190929190505050905080610617576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5368656c6c2f614441492d7472616e736665722d66726f6d2d6661696c65640081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663db006a75846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561066a57600080fd5b505af115801561067e573d6000803e3d6000fd5b505050505050919050565b6000806106a7670de0b6b3a7640000846119d690919063ffffffff16565b91506000736b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561073c57600080fd5b505afa158015610750573d6000803e3d6000fd5b505050506040513d602081101561076657600080fd5b81019080805190602001909291905050509050610794670de0b6b3a7640000826119d690919063ffffffff16565b9150509250929050565b60008060007324a42fd28c976a61df5d00d0599c34c4f90748c873ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156107fd57600080fd5b505afa158015610811573d6000803e3d6000fd5b505050506040513d602081101561082757600080fd5b810190808051906020019092919050505090508073ffffffffffffffffffffffffffffffffffffffff1663d2d0e066736b175474e89094c44da98b954eedeac495271d0f8660006040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018261ffff1681526020019350505050600060405180830381600087803b1580156108e257600080fd5b505af11580156108f6573d6000803e3d6000fd5b505050506000610904611231565b905060008173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb88886040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561098f57600080fd5b505af11580156109a3573d6000803e3d6000fd5b505050506040513d60208110156109b957600080fd5b8101908080519060200190929190505050905080610a3f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f5368656c6c2f614441492d7472616e736665722d6661696c656400000000000081525060200191505060405180910390fd5b6000736b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610ad257600080fd5b505afa158015610ae6573d6000803e3d6000fd5b505050506040513d6020811015610afc57600080fd5b81019080805190602001909291905050509050610b2a670de0b6b3a7640000886119d690919063ffffffff16565b9550610b47670de0b6b3a7640000826119d690919063ffffffff16565b9450505050509250929050565b6000610b74670de0b6b3a764000083600f0b61191b90919063ffffffff16565b9050919050565b6000610b9b670de0b6b3a764000083600f0b61191b90919063ffffffff16565b905060007324a42fd28c976a61df5d00d0599c34c4f90748c873ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610bf957600080fd5b505afa158015610c0d573d6000803e3d6000fd5b505050506040513d6020811015610c2357600080fd5b810190808051906020019092919050505090508073ffffffffffffffffffffffffffffffffffffffff1663d2d0e066736b175474e89094c44da98b954eedeac495271d0f8460006040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018261ffff1681526020019350505050600060405180830381600087803b158015610cde57600080fd5b505af1158015610cf2573d6000803e3d6000fd5b505050506000610d00611231565b905060008173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610d8b57600080fd5b505af1158015610d9f573d6000803e3d6000fd5b505050506040513d6020811015610db557600080fd5b8101908080519060200190929190505050905080610e3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f5368656c6c2f614441492d7472616e736665722d6661696c656400000000000081525060200191505060405180910390fd5b50505092915050565b6000806000610e51611231565b905060008173ffffffffffffffffffffffffffffffffffffffff166323b872dd3330886040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015610f1057600080fd5b505af1158015610f24573d6000803e3d6000fd5b505050506040513d6020811015610f3a57600080fd5b8101908080519060200190929190505050905080610fc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5368656c6c2f614441492d7472616e736665722d66726f6d2d6661696c65640081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663db006a75866040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561101357600080fd5b505af1158015611027573d6000803e3d6000fd5b505050506000736b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156110be57600080fd5b505afa1580156110d2573d6000803e3d6000fd5b505050506040513d60208110156110e857600080fd5b81019080805190602001909291905050509050611116670de0b6b3a7640000876119d690919063ffffffff16565b9450611133670de0b6b3a7640000826119d690919063ffffffff16565b9350505050915091565b600080736b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156111d157600080fd5b505afa1580156111e5573d6000803e3d6000fd5b505050506040513d60208110156111fb57600080fd5b81019080805190602001909291905050509050611229670de0b6b3a7640000826119d690919063ffffffff16565b915050919050565b6000807324a42fd28c976a61df5d00d0599c34c4f90748c873ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561128e57600080fd5b505afa1580156112a2573d6000803e3d6000fd5b505050506040513d60208110156112b857600080fd5b8101908080519060200190929190505050905060008173ffffffffffffffffffffffffffffffffffffffff166335ea6a75736b175474e89094c44da98b954eedeac495271d0f6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019150506101a06040518083038186803b15801561135f57600080fd5b505afa158015611373573d6000803e3d6000fd5b505050506040513d6101a081101561138a57600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050509b505050505050505050505050809250505090565b600080611434611231565b905060007324a42fd28c976a61df5d00d0599c34c4f90748c873ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561149257600080fd5b505afa1580156114a6573d6000803e3d6000fd5b505050506040513d60208110156114bc57600080fd5b810190808051906020019092919050505090508073ffffffffffffffffffffffffffffffffffffffff1663d2d0e066736b175474e89094c44da98b954eedeac495271d0f8660006040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018261ffff1681526020019350505050600060405180830381600087803b15801561157757600080fd5b505af115801561158b573d6000803e3d6000fd5b5050505060008273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87876040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561161857600080fd5b505af115801561162c573d6000803e3d6000fd5b505050506040513d602081101561164257600080fd5b81019080805190602001909291905050509050806116c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f5368656c6c2f614441492d7472616e736665722d6661696c656400000000000081525060200191505060405180910390fd5b6116e3670de0b6b3a7640000866119d690919063ffffffff16565b935050505092915050565b600061170b670de0b6b3a7640000836119d690919063ffffffff16565b9050919050565b60008061171d611231565b905060008173ffffffffffffffffffffffffffffffffffffffff166323b872dd3330876040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156117dc57600080fd5b505af11580156117f0573d6000803e3d6000fd5b505050506040513d602081101561180657600080fd5b810190808051906020019092919050505090508061188c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5368656c6c2f614441492d7472616e736665722d66726f6d2d6661696c65640081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663db006a75856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156118df57600080fd5b505af11580156118f3573d6000803e3d6000fd5b50505050611912670de0b6b3a7640000856119d690919063ffffffff16565b92505050919050565b60008082141561192e57600090506119d0565b600083600f0b121561193f57600080fd5b600060406fffffffffffffffffffffffffffffffff841685600f0b02901c90506000608084901c85600f0b02905077ffffffffffffffffffffffffffffffffffffffffffffffff81111561199257600080fd5b604081901b9050817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038111156119c857600080fd5b818101925050505b92915050565b6000808214156119e557600080fd5b60006119f18484611a3e565b90506f7fffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff161115611a3457600080fd5b8091505092915050565b600080821415611a4d57600080fd5b600077ffffffffffffffffffffffffffffffffffffffffffffffff8411611a835782604085901b81611a7b57fe5b049050611bd8565b600060c09050600060c086901c90506401000000008110611aac57602081901c90506020820191505b620100008110611ac457601081901c90506010820191505b6101008110611adb57600881901c90506008820191505b60108110611af157600481901c90506004820191505b60048110611b0757600281901c90506002820191505b60028110611b16576001820191505b600160bf830360018703901c018260ff0387901b81611b3157fe5b0492506fffffffffffffffffffffffffffffffff831115611b5157600080fd5b6000608086901c8402905060006fffffffffffffffffffffffffffffffff871685029050600060c089901c9050600060408a901b905082811015611b96576001820391505b8281039050608084901b925082811015611bb1576001820391505b8281039050608084901c8214611bc357fe5b888181611bcc57fe5b04870196505050505050505b6fffffffffffffffffffffffffffffffff811115611bf557600080fd5b809150509291505056fea265627a7a72315820829d1a1cdbf00164bf954a19ae8515faa81e67fe1cffec97824c4ae71a74eeba64736f6c634300050f0032
Deployed Bytecode Sourcemap
37000:4766:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37000:4766:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38717:346;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38717:346:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41487:272;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41487:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39156:548;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39156:548:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40800:129;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40800:129:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40311:421;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40311:421:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37726:473;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37726:473:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41232:187;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41232:187:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;37385:256;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;39797:415;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39797:415:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;40997:135;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40997:135:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;38284:340;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38284:340:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;38717:346;38775:15;38815:18;38828:4;38815:7;:12;;;;:18;;;;:::i;:::-;38805:28;;38846:13;38862:9;:7;:9::i;:::-;38846:25;;38884:13;38900:5;:18;;;38919:10;38939:4;38946:7;38900:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38900:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38900:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38900:54:0;;;;;;;;;;;;;;;;38884:70;;38975:8;38967:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39032:5;:12;;;39045:7;39032:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39032:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39032:21:0;;;;38717:346;;;;;:::o;41487:272::-;41580:14;41596:15;41636:18;41649:4;41636:7;:12;;:18;;;;:::i;:::-;41626:28;;41667:16;37168:42;41686:13;;;41700:5;41686:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41686:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41686:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41686:20:0;;;;;;;;;;;;;;;;41667:39;;41730:19;41744:4;41730:8;:13;;:19;;;;:::i;:::-;41719:30;;41487:272;;;;;;:::o;39156:548::-;39236:14;39252:15;39282:17;37300:42;39315:25;;;:27;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39315:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39315:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39315:27:0;;;;;;;;;;;;;;;;39282:61;;39356:4;:12;;;37168:42;39383:7;39392:1;39356:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39356:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39356:38:0;;;;39407:13;39423:9;:7;:9::i;:::-;39407:25;;39445:13;39461:5;:14;;;39476:4;39482:7;39461:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39461:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39461:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39461:29:0;;;;;;;;;;;;;;;;39445:45;;39511:8;39503:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39563:16;37168:42;39582:13;;;39604:4;39582:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39582:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39582:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39582:28:0;;;;;;;;;;;;;;;;39563:47;;39633:18;39646:4;39633:7;:12;;:18;;;;:::i;:::-;39623:28;;39675:19;39689:4;39675:8;:13;;:19;;;;:::i;:::-;39664:30;;39156:548;;;;;;;;;:::o;40800:129::-;40861:15;40901:18;40914:4;40901:7;:12;;;;:18;;;;:::i;:::-;40891:28;;40800:129;;;:::o;40311:421::-;40383:15;40423:18;40436:4;40423:7;:12;;;;:18;;;;:::i;:::-;40413:28;;40454:17;37300:42;40487:25;;;:27;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40487:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40487:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40487:27:0;;;;;;;;;;;;;;;;40454:61;;40528:4;:12;;;37168:42;40555:7;40564:1;40528:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40528:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40528:38:0;;;;40579:13;40595:9;:7;:9::i;:::-;40579:25;;40617:13;40633:5;:14;;;40648:4;40654:7;40633:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40633:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40633:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40633:29:0;;;;;;;;;;;;;;;;40617:45;;40683:8;40675:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40311:421;;;;;;;:::o;37726:473::-;37792:14;37808:15;37838:13;37854:9;:7;:9::i;:::-;37838:25;;37876:13;37892:5;:18;;;37911:10;37931:4;37938:7;37892:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37892:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37892:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37892:54:0;;;;;;;;;;;;;;;;37876:70;;37967:8;37959:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38024:5;:12;;;38037:7;38024:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38024:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38024:21:0;;;;38058:16;37168:42;38077:13;;;38099:4;38077:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38077:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38077:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38077:28:0;;;;;;;;;;;;;;;;38058:47;;38128:18;38141:4;38128:7;:12;;:18;;;;:::i;:::-;38118:28;;38170:19;38184:4;38170:8;:13;;:19;;;;:::i;:::-;38159:30;;37726:473;;;;;;:::o;41232:187::-;41299:14;41328:16;37168:42;41347:13;;;41361:5;41347:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41347:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41347:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41347:20:0;;;;;;;;;;;;;;;;41328:39;;41390:19;41404:4;41390:8;:13;;:19;;;;:::i;:::-;41380:29;;41232:187;;;;:::o;37385:256::-;37426:7;37448:17;37300:42;37481:25;;;:27;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37481:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37481:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37481:27:0;;;;;;;;;;;;;;;;37448:61;;37532:21;37558:4;:19;;;37168:42;37558:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37558:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37558:33:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;37558:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37520:71;;;;;;;;;;;;;;37617:13;37602:29;;;;37385:256;:::o;39797:415::-;39864:14;39893:13;39909:9;:7;:9::i;:::-;39893:25;;39931:17;37300:42;39964:25;;;:27;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39964:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39964:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39964:27:0;;;;;;;;;;;;;;;;39931:61;;40005:4;:12;;;37168:42;40032:7;40041:1;40005:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40005:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40005:38:0;;;;40056:13;40072:5;:14;;;40087:4;40093:7;40072:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40072:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40072:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40072:29:0;;;;;;;;;;;;;;;;40056:45;;40122:8;40114:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40184:18;40197:4;40184:7;:12;;:18;;;;:::i;:::-;40174:28;;39797:415;;;;;;;:::o;40997:135::-;41065:14;41104:18;41117:4;41104:7;:12;;:18;;;;:::i;:::-;41094:28;;40997:135;;;:::o;38284:340::-;38337:14;38366:13;38382:9;:7;:9::i;:::-;38366:25;;38404:13;38420:5;:18;;;38439:10;38459:4;38466:7;38420:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38420:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38420:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38420:54:0;;;;;;;;;;;;;;;;38404:70;;38495:8;38487:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38552:5;:12;;;38565:7;38552:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38552:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38552:21:0;;;;38596:18;38609:4;38596:7;:12;;:18;;;;:::i;:::-;38586:28;;38284:340;;;;;:::o;6309:469::-;6368:7;6393:1;6388;:6;6384:20;;;6403:1;6396:8;;;;6384:20;6427:1;6422;:6;;;;6413:16;;;;;;6438:10;6511:2;6471:34;6467:1;:38;6461:1;6452:11;;:54;6451:62;;6438:75;;6520:10;6553:3;6548:1;:8;;6542:1;6533:11;;:24;6520:37;;6581:50;6575:2;:56;;6566:66;;;;;;6646:2;6639:9;;;;;6748:2;6679:66;:71;6666:2;:84;;6657:94;;;;;;6770:2;6765;:7;6758:14;;;;6309:469;;;;;:::o;8654:208::-;8714:6;8743:1;8738;:6;;8729:16;;;;;;8752:14;8769:12;8776:1;8779;8769:5;:12::i;:::-;8752:29;;1173:34;8797:29;;:6;:29;;;;8788:39;;;;;;8849:6;8834:22;;;8654:208;;;;:::o;21226:1257::-;21286:7;21316:1;21311;:6;;21302:16;;;;;;21327:14;21359:50;21354:1;:55;21350:1035;;21439:1;21433:2;21428:1;:7;;21427:13;;;;;;21418:22;;21350:1035;;;21461:11;21475:3;21461:17;;21487:10;21505:3;21500:1;:8;;21487:21;;21527:11;21521:2;:17;21517:48;;21549:2;21542:9;;;;;21560:2;21553:9;;;;21517:48;21583:7;21577:2;:13;21573:44;;21601:2;21594:9;;;;;21612:2;21605:9;;;;21573:44;21635:5;21629:2;:11;21625:40;;21651:1;21644:8;;;;;21661:1;21654:8;;;;21625:40;21683:4;21677:2;:10;21673:39;;21698:1;21691:8;;;;;21708:1;21701:8;;;;21673:39;21730:3;21724:2;:9;21720:38;;21744:1;21737:8;;;;;21754:1;21747:8;;;;21720:38;21776:3;21770:2;:9;21766:23;;21788:1;21781:8;;;;21766:23;21884:1;21877:3;21871;:9;21866:1;21862;:5;:18;;21861:24;21853:3;21847;:9;21842:1;:14;;21841:45;;;;;;21832:54;;21914:34;21904:6;:44;;21895:54;;;;;;21960:10;21988:3;21983:1;:8;;21973:6;:19;21960:32;;22001:10;22028:34;22024:1;:38;22014:6;:49;22001:62;;22074:10;22092:3;22087:1;:8;;22074:21;;22104:10;22122:2;22117:1;:7;;22104:20;;22144:2;22139;:7;22135:20;;;22154:1;22148:7;;;;22135:20;22170:2;22164:8;;;;22229:3;22223:2;:9;;22218:14;;22250:2;22245;:7;22241:20;;;22260:1;22254:7;;;;22241:20;22276:2;22270:8;;;;22346:3;22340:2;:9;;22334:2;:15;22326:24;;;;22376:1;22371:2;:6;;;;;;22361:16;;;;21350:1035;;;;;;;22412:34;22402:6;:44;;22393:54;;;;;;22470:6;22454:23;;;21226:1257;;;;:::o
Swarm Source
bzzr://829d1a1cdbf00164bf954a19ae8515faa81e67fe1cffec97824c4ae71a74eeba
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.