Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 29 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Max Wallet A... | 19662874 | 206 days ago | IN | 0 ETH | 0.00215782 | ||||
Approve | 19662873 | 206 days ago | IN | 0 ETH | 0.00227884 | ||||
Approve | 19662873 | 206 days ago | IN | 0 ETH | 0.00227884 | ||||
Approve | 19662873 | 206 days ago | IN | 0 ETH | 0.00227884 | ||||
Approve | 19662873 | 206 days ago | IN | 0 ETH | 0.0027655 | ||||
Open Runebound | 19662872 | 206 days ago | IN | 0 ETH | 0.00194115 | ||||
Initialize Runes... | 19662833 | 206 days ago | IN | 0 ETH | 0.00086554 | ||||
Approve | 19662824 | 206 days ago | IN | 0 ETH | 0.00101403 | ||||
Approve | 19662824 | 206 days ago | IN | 0 ETH | 0.00101403 | ||||
Approve | 19662824 | 206 days ago | IN | 0 ETH | 0.00101403 | ||||
Approve | 19662824 | 206 days ago | IN | 0 ETH | 0.00101403 | ||||
Approve | 19662824 | 206 days ago | IN | 0 ETH | 0.00101403 | ||||
Approve | 19662823 | 206 days ago | IN | 0 ETH | 0.00095893 | ||||
Approve | 19662823 | 206 days ago | IN | 0 ETH | 0.00095893 | ||||
Approve | 19662823 | 206 days ago | IN | 0 ETH | 0.00095893 | ||||
Approve | 19662823 | 206 days ago | IN | 0 ETH | 0.00095893 | ||||
Approve | 19662823 | 206 days ago | IN | 0 ETH | 0.00095893 | ||||
Approve | 19662818 | 206 days ago | IN | 0 ETH | 0.00108876 | ||||
Approve | 19662818 | 206 days ago | IN | 0 ETH | 0.00108876 | ||||
Approve | 19662818 | 206 days ago | IN | 0 ETH | 0.00108876 | ||||
Approve | 19662818 | 206 days ago | IN | 0 ETH | 0.00108876 | ||||
Approve | 19662817 | 206 days ago | IN | 0 ETH | 0.00112266 | ||||
Approve | 19662813 | 206 days ago | IN | 0 ETH | 0.00126293 | ||||
Approve | 19662813 | 206 days ago | IN | 0 ETH | 0.00126293 | ||||
Approve | 19662813 | 206 days ago | IN | 0 ETH | 0.00126293 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Runebound
Compiler Version
v0.8.25+commit.b61c2a91
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-04-15 */ // SPDX-License-Identifier: MIT /* Website: https://www.runebound.io Twitter: https://x.com/PlayRunebound Telegram: https://t.me/PlayRunebound Whitepaper: https://runebound.gitbook.io/runebound-whitepaper Game Trailer: https://streamable.com/r512qx LinkTree: https://linktr.ee/runebound ᴇᴍʙᴀʀᴋ ᴏɴ ᴀ ʀᴏɢᴜᴇʟɪᴛᴇ ᴀᴅᴠᴇɴᴛᴜʀᴇ ꜰᴜʟʟ ᴏꜰ ʀᴜɴᴇꜱ, ᴘᴇʀɪʟꜱ ᴀɴᴅ ᴜɴᴋɴᴏᴡɴꜱ ʀᴜɴᴇʙᴏᴜɴᴅ ꜱᴛᴀɴᴅꜱ ᴀᴛ ᴛʜᴇ ꜰᴏʀᴇꜰʀᴏɴᴛ ᴏꜰ ʙʟᴏᴄᴋᴄʜᴀɪɴ ɢᴀᴍɪɴɢ, ʟᴇᴠᴇʀᴀɢɪɴɢ ᴇʀᴄ₄₀₄ ᴛᴇᴄʜɴᴏʟᴏɢʏ ᴡɪᴛʜ ʀᴜɴᴇꜱ ᴛᴏ ꜰᴜꜱᴇ ᴅʏɴᴀᴍɪᴄ ʙɪᴏᴍᴇꜱ ᴡɪᴛʜ ꜱᴛʀᴀᴛᴇɢɪᴄ ɢᴀᴍᴇᴘʟᴀʏ, ᴄʀᴀꜰᴛɪɴɢ ᴀ ᴜɴɪᴠᴇʀꜱᴇ ᴡʜᴇʀᴇ ʟᴇɢᴇɴᴅꜱ ᴀʀᴇ ʙᴏʀɴ. */ pragma solidity 0.8.25; library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } library Math { error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or * denominator == 0. * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by * Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. uint256 twos = denominator & (0 - denominator); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also // works in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded * towards zero. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } } library Strings { bytes16 private constant HEX_DIGITS = "0123456789abcdef"; uint8 private constant ADDRESS_LENGTH = 20; /** * @dev The `value` string doesn't fit in the specified `length`. */ error StringsInsufficientHexLength(uint256 value, uint256 length); /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), HEX_DIGITS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toStringSigned(int256 value) internal pure returns (string memory) { return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { uint256 localValue = value; bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = HEX_DIGITS[localValue & 0xf]; localValue >>= 4; } if (localValue != 0) { revert StringsInsufficientHexLength(value, length); } return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal * representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b)); } } abstract contract Ownable { event OwnershipTransferred(address indexed user, address indexed newOwner); error Unauthorized(); error InvalidOwner(); address public owner; modifier onlyOwner() virtual { if (msg.sender != owner) revert Unauthorized(); _; } constructor(address _owner) { if (_owner == address(0)) revert InvalidOwner(); owner = _owner; emit OwnershipTransferred(address(0), _owner); } function transferOwnership(address _owner) public virtual onlyOwner { if (_owner == address(0)) revert InvalidOwner(); owner = _owner; emit OwnershipTransferred(msg.sender, _owner); } function revokeOwnership() public virtual onlyOwner { owner = address(0); emit OwnershipTransferred(msg.sender, address(0)); } } interface IUniswapV2Factory { function createPair(address tokenA, address tokenB) external returns (address pair); } abstract contract ERC721Receiver { function onERC721Received( address, address, uint256, bytes calldata ) external virtual returns (bytes4) { return ERC721Receiver.onERC721Received.selector; } } interface IUniswapV2Router02 { function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); } abstract contract ERC404 is Ownable { // Events event ERC20Transfer( address indexed from, address indexed to, uint256 amount ); event Approval( address indexed owner, address indexed spender, uint256 amount ); event Transfer( address indexed from, address indexed to, uint256 indexed id ); event ERC721Approval( address indexed owner, address indexed spender, uint256 indexed id ); event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); // Errors error NotFound(); error AlreadyExists(); error InvalidRecipient(); error InvalidSender(); error UnsafeRecipient(); // Metadata /// @dev Token name string public name; /// @dev Token symbol string public symbol; /// @dev Decimals for fractional representation uint8 public immutable decimals; /// @dev Total supply in fractionalized representation uint256 public immutable totalSupply; /// @dev Current mint counter, monotonically increasing to ensure accurate ownership uint256 public minted; /// @dev MaxWallet, in order to have a smooth launch uint256 public maxWallet; bool public tradingOpen; // Mappings /// @dev Balance of user in fractional representation mapping(address => uint256) public balanceOf; /// @dev Allowance of user in fractional representation mapping(address => mapping(address => uint256)) public allowance; /// @dev Approval in native representaion mapping(uint256 => address) public getApproved; /// @dev Approval for all in native representation mapping(address => mapping(address => bool)) public isApprovedForAll; /// @dev Owner of id in native representation mapping(uint256 => address) internal _ownerOf; /// @dev Array of owned ids in native representation mapping(address => uint256[]) internal _owned; /// @dev Tracks indices for the _owned mapping mapping(uint256 => uint256) internal _ownedIndex; /// @dev Addresses whitelisted from minting / burning for gas savings (pairs, routers, etc) mapping(address => bool) public whitelist; mapping(address => bool) private maxHoldingWhitelist; mapping(address => bool) public _skipNftFlag; address public runesContract; address uniswapRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; address uniswapPair; // Constructor constructor( string memory _name, string memory _symbol, uint8 _decimals, uint256 _totalNativeSupply, address _owner, uint _maxWallet ) Ownable(_owner) { name = _name; symbol = _symbol; decimals = _decimals; totalSupply = _totalNativeSupply * (10 ** decimals); maxWallet = _maxWallet; whitelist[msg.sender] = true; maxHoldingWhitelist[msg.sender] = true; maxHoldingWhitelist[uniswapRouter] = true; whitelist[uniswapRouter] = true; uniswapPair = address(IUniswapV2Factory(IUniswapV2Router02(uniswapRouter).factory()).createPair(address(this), IUniswapV2Router02(uniswapRouter).WETH())); maxHoldingWhitelist[uniswapPair] = true; whitelist[uniswapPair] = true; } function openRunebound() external onlyOwner { tradingOpen = true; } function setMaxWalletAmount(uint value) external onlyOwner { maxWallet = value; } function updateWhitelist(address addr, bool value) external onlyOwner { maxHoldingWhitelist[addr] = value; } function setSkipNft(bool skipNFT) external { _skipNftFlag[msg.sender] = skipNFT; } /// @notice Initialization function to set pairs / etc /// saving gas by avoiding mint / burn on unnecessary targets function setWhitelist(address target, bool state) public onlyOwner { whitelist[target] = state; } /// @notice Function to find owner of a given native token function ownerOf(uint256 id) public view virtual returns (address owner) { owner = _ownerOf[id]; if (owner == address(0)) { revert NotFound(); } } /// @notice tokenURI must be implemented by child contract function tokenURI(uint256 id) public view virtual returns (string memory); /// @notice Function for token approvals /// @dev This function assumes id / native if amount less than or equal to current max id function approve( address spender, uint256 amountOrId ) public virtual returns (bool) { if (amountOrId <= minted && amountOrId > 0) { address owner = _ownerOf[amountOrId]; if (msg.sender != owner && !isApprovedForAll[owner][msg.sender]) { revert Unauthorized(); } getApproved[amountOrId] = spender; emit Approval(owner, spender, amountOrId); } else { allowance[msg.sender][spender] = amountOrId; emit Approval(msg.sender, spender, amountOrId); } return true; } function initializeRunesContract(address newAddress) external onlyOwner { runesContract = newAddress; } /// @notice Function native approvals function setApprovalForAll(address operator, bool approved) public virtual { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } /// @notice Function for mixed transfers /// @dev This function assumes id / native if amount less than or equal to current max id function transferFrom( address from, address to, uint256 amountOrId ) public virtual { if (amountOrId <= minted) { if (from != _ownerOf[amountOrId]) { revert InvalidSender(); } if (to == address(0)) { revert InvalidRecipient(); } if ( msg.sender != from && !isApprovedForAll[from][msg.sender] && msg.sender != getApproved[amountOrId] ) { revert Unauthorized(); } balanceOf[from] -= _getUnit(); unchecked { balanceOf[to] += _getUnit(); } _ownerOf[amountOrId] = to; delete getApproved[amountOrId]; // update _owned for sender uint256 updatedId = _owned[from][_owned[from].length - 1]; _owned[from][_ownedIndex[amountOrId]] = updatedId; // pop _owned[from].pop(); // update index for the moved id _ownedIndex[updatedId] = _ownedIndex[amountOrId]; // push token to to owned _owned[to].push(amountOrId); // update index for to owned _ownedIndex[amountOrId] = _owned[to].length - 1; emit Transfer(from, to, amountOrId); emit ERC20Transfer(from, to, _getUnit()); } else { uint256 allowed = allowance[from][msg.sender]; if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amountOrId; _transfer(from, to, amountOrId); } } /// @notice Function for fractional transfers function transfer( address to, uint256 amount ) public virtual returns (bool) { return _transfer(msg.sender, to, amount); } /// @notice Function for native transfers with contract support function safeTransferFrom( address from, address to, uint256 id ) public virtual { transferFrom(from, to, id); if ( to.code.length != 0 && ERC721Receiver(to).onERC721Received(msg.sender, from, id, "") != ERC721Receiver.onERC721Received.selector ) { revert UnsafeRecipient(); } } /// @notice Function for native transfers with contract support and callback data function safeTransferFrom( address from, address to, uint256 id, bytes calldata data ) public virtual { transferFrom(from, to, id); if ( to.code.length != 0 && ERC721Receiver(to).onERC721Received(msg.sender, from, id, data) != ERC721Receiver.onERC721Received.selector ) { revert UnsafeRecipient(); } } /// @notice Internal function for fractional transfers function _transfer( address from, address to, uint256 amount ) internal returns (bool) { uint256 unit = _getUnit(); uint256 balanceBeforeSender = balanceOf[from]; uint256 balanceBeforeReceiver = balanceOf[to]; if (from != owner && to != owner && from != uniswapRouter && to != uniswapRouter) { require(tradingOpen); } balanceOf[from] -= amount; unchecked { balanceOf[to] += amount; } if (!maxHoldingWhitelist[to]) { require(balanceOf[to] <= maxWallet, "Max wallet exceeded"); } // Skip burn for certain addresses to save gas if (!whitelist[from] && !whitelist[to]) { uint256 tokens_to_burn = (balanceBeforeSender / unit) - (balanceOf[from] / unit); if (from == address(0)) { revert InvalidSender(); } for (uint256 i = 0; i < tokens_to_burn; i++) { _burn(from); } } if (maxWallet >= totalSupply && to == uniswapPair && !whitelist[from]) { revert InvalidRecipient(); } // Skip minting for certain addresses to save gas if (!whitelist[to] && !whitelist[from]) { uint256 tokens_to_mint = (balanceOf[to] / unit) - (balanceBeforeReceiver / unit); if (to == address(0)) { revert InvalidRecipient(); } for (uint256 i = 0; i < tokens_to_mint; i++) { _mint(to); } } emit ERC20Transfer(from, to, amount); return true; } // Internal utility logic function _getUnit() internal view returns (uint256) { return 10 ** decimals; } function _mint(address to) internal virtual { unchecked { minted++; } uint256 id = minted; _ownerOf[id] = to; _owned[to].push(id); _ownedIndex[id] = _owned[to].length - 1; emit Transfer(address(0), to, id); } function _burn(address from) internal virtual { uint256 id = _owned[from][_owned[from].length - 1]; _owned[from].pop(); delete _ownedIndex[id]; delete _ownerOf[id]; delete getApproved[id]; emit Transfer(from, address(0), id); } function _setNameSymbol( string memory _name, string memory _symbol ) internal { name = _name; symbol = _symbol; } } contract Runebound is ERC404 { string public dataURI; string public baseTokenURI; constructor( ) ERC404("Runebound", "RUNE", 18, 4444, msg.sender, 4444 * 10 ** 18 / 1000) { balanceOf[msg.sender] = 4444 * 10 ** 18; } function setDataURI(string memory _dataURI) public onlyOwner { dataURI = _dataURI; } function setTokenURI(string memory _tokenURI) public onlyOwner { baseTokenURI = _tokenURI; } function setNameSymbol( string memory _name, string memory _symbol ) public onlyOwner { _setNameSymbol(_name, _symbol); } function tokenURI(uint256 id) public view override returns (string memory) { return string.concat(baseTokenURI, Strings.toString(id)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"NotFound","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsafeRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ERC721Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_skipNftFlag","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"initializeRunesContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openRunebound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"runesContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_dataURI","type":"string"}],"name":"setDataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"setNameSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"skipNFT","type":"bool"}],"name":"setSkipNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"updateWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c0604052601180546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d179055348015610035575f80fd5b506040805180820182526009815268149d5b99589bdd5b9960ba1b6020808301919091528251808401909352600483526352554e4560e01b9083015290601261115c33673dac427465d6000081806100a0576040516349e27cff60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b03831690811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060016100f487826103e5565b50600261010186826103e5565b5060ff8416608081905261011690600a61059a565b61012090846105af565b60a0526004818155335f908152600d602081815260408084208054600160ff199182168117909255600e84528286208054821683179055601180546001600160a01b039081168852848820805484168517905581548116885295855295839020805490911690911790559254835163c45a015560e01b8152935192169363c45a0155938082019391908290030181865afa1580156101c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101e491906105c6565b6001600160a01b031663c9c653963060115f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610243573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061026791906105c6565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af11580156102b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102d591906105c6565b601280546001600160a01b0319166001600160a01b0392831690811782555f908152600e60209081526040808320805460ff19908116600190811790925594549095168352600d8252808320805490941690941790925533815260069091522068f0e8e396adcbf000009055506105ec945050505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061037557607f821691505b60208210810361039357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156103e057805f5260205f20601f840160051c810160208510156103be5750805b601f840160051c820191505b818110156103dd575f81556001016103ca565b50505b505050565b81516001600160401b038111156103fe576103fe61034d565b6104128161040c8454610361565b84610399565b602080601f831160018114610445575f841561042e5750858301515b5f19600386901b1c1916600185901b17855561049c565b5f85815260208120601f198616915b8281101561047357888601518255948401946001909101908401610454565b508582101561049057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156104f257815f19048211156104d8576104d86104a4565b808516156104e557918102915b93841c93908002906104bd565b509250929050565b5f8261050857506001610594565b8161051457505f610594565b816001811461052a576002811461053457610550565b6001915050610594565b60ff841115610545576105456104a4565b50506001821b610594565b5060208310610133831016604e8410600b8410161715610573575081810a610594565b61057d83836104b8565b805f1904821115610590576105906104a4565b0290505b92915050565b5f6105a860ff8416836104fa565b9392505050565b8082028115828204841417610594576105946104a4565b5f602082840312156105d6575f80fd5b81516001600160a01b03811681146105a8575f80fd5b60805160a051611e6561061b5f395f81816102df01526112b101525f8181610368015261106b0152611e655ff3fe608060405234801561000f575f80fd5b5060043610610213575f3560e01c80638da5cb5b1161011f578063e0df5b6f116100a9578063f2fde38b11610079578063f2fde38b14610534578063f8b45b0514610547578063fa696bf014610550578063fad7b8d214610558578063ffb54a991461056b575f80fd5b8063e0df5b6f146104ca578063e2ff5ec4146104dd578063e985e9c5146104ff578063f28ca1dd1461052c575f80fd5b8063a9059cbb116100ef578063a9059cbb1461045f578063b88d4fde14610472578063c87b56dd14610485578063d547cfb714610498578063dd62ed3e146104a0575f80fd5b80638da5cb5b1461041057806395d89b41146104225780639b19251a1461042a578063a22cb4651461044c575f80fd5b8063292e8828116101a05780634f02c420116101705780634f02c420146103af578063504334c2146103b857806353d6fd59146103cb5780636352211e146103de57806370a08231146103f1575f80fd5b8063292e8828146103485780632b9689581461035b578063313ce5671461036357806342842e0e1461039c575f80fd5b806316878981116101e657806316878981146102ad57806318160ddd146102da57806318d217c31461030f57806323b872dd1461032257806327a14fc214610335575f80fd5b806306fdde0314610217578063081812fc14610235578063095ea7b3146102755780630d392cd914610298575b5f80fd5b61021f610578565b60405161022c9190611776565b60405180910390f35b61025d6102433660046117ab565b60086020525f90815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161022c565b6102886102833660046117d8565b610604565b604051901515815260200161022c565b6102ab6102a636600461180f565b61074f565b005b6102ab6102bb366004611840565b335f908152600f60205260409020805460ff1916911515919091179055565b6103017f000000000000000000000000000000000000000000000000000000000000000081565b60405190815260200161022c565b6102ab61031d3660046118f6565b6107a2565b6102ab610330366004611930565b6107db565b6102ab6103433660046117ab565b610b57565b60105461025d906001600160a01b031681565b6102ab610b85565b61038a7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff909116815260200161022c565b6102ab6103aa366004611930565b610be9565b61030160035481565b6102ab6103c6366004611969565b610cba565b6102ab6103d936600461180f565b610ced565b61025d6103ec3660046117ab565b610d40565b6103016103ff3660046119c9565b60066020525f908152604090205481565b5f5461025d906001600160a01b031681565b61021f610d7a565b6102886104383660046119c9565b600d6020525f908152604090205460ff1681565b6102ab61045a36600461180f565b610d87565b61028861046d3660046117d8565b610df2565b6102ab6104803660046119e2565b610e05565b61021f6104933660046117ab565b610ec5565b61021f610ef9565b6103016104ae366004611a75565b600760209081525f928352604080842090915290825290205481565b6102ab6104d83660046118f6565b610f06565b6102886104eb3660046119c9565b600f6020525f908152604090205460ff1681565b61028861050d366004611a75565b600960209081525f928352604080842090915290825290205460ff1681565b61021f610f3b565b6102ab6105423660046119c9565b610f48565b61030160045481565b6102ab610fe2565b6102ab6105663660046119c9565b61101a565b6005546102889060ff1681565b6001805461058590611a9d565b80601f01602080910402602001604051908101604052809291908181526020018280546105b190611a9d565b80156105fc5780601f106105d3576101008083540402835291602001916105fc565b820191905f5260205f20905b8154815290600101906020018083116105df57829003601f168201915b505050505081565b5f600354821115801561061657505f82115b156106ea575f828152600a60205260409020546001600160a01b031633811480159061066557506001600160a01b0381165f90815260096020908152604080832033845290915290205460ff16155b15610682576040516282b42960e81b815260040160405180910390fd5b5f8381526008602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610745565b335f8181526007602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b5f546001600160a01b03163314610778576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152600e60205260409020805460ff1916911515919091179055565b5f546001600160a01b031633146107cb576040516282b42960e81b815260040160405180910390fd5b60136107d78282611b19565b5050565b6003548111610aeb575f818152600a60205260409020546001600160a01b0384811691161461081d57604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b03821661084457604051634e46966960e11b815260040160405180910390fd5b336001600160a01b0384161480159061088057506001600160a01b0383165f90815260096020908152604080832033845290915290205460ff16155b80156108a257505f818152600860205260409020546001600160a01b03163314155b156108bf576040516282b42960e81b815260040160405180910390fd5b6108c7611065565b6001600160a01b0384165f90815260066020526040812080549091906108ee908490611bed565b909155506108fc9050611065565b6001600160a01b038084165f8181526006602090815260408083208054909601909555858252600a815284822080546001600160a01b031990811690941790556008815284822080549093169092559186168252600b9052908120805461096590600190611bed565b8154811061097557610975611c00565b5f9182526020808320909101546001600160a01b0387168352600b82526040808420868552600c909352909220548154929350839281106109b8576109b8611c00565b5f9182526020808320909101929092556001600160a01b0386168152600b909152604090208054806109ec576109ec611c14565b5f828152602080822083015f19908101839055909201909255838252600c8152604080832054848452818420556001600160a01b038616808452600b83529083208054600181810183558286529385200186905592529054610a4e9190611bed565b5f838152600c602052604080822092909255905183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4826001600160a01b0316846001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487610ad4611065565b60405190815260200160405180910390a350505050565b6001600160a01b0383165f9081526007602090815260408083203384529091529020545f198114610b4457610b208282611bed565b6001600160a01b0385165f9081526007602090815260408083203384529091529020555b610b4f848484611096565b50505b505050565b5f546001600160a01b03163314610b80576040516282b42960e81b815260040160405180910390fd5b600455565b5f546001600160a01b03163314610bae576040516282b42960e81b815260040160405180910390fd5b5f80546001600160a01b031916815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b610bf48383836107db565b6001600160a01b0382163b15801590610c9c5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610c6b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c8f9190611c28565b6001600160e01b03191614155b15610b5257604051633da6393160e01b815260040160405180910390fd5b5f546001600160a01b03163314610ce3576040516282b42960e81b815260040160405180910390fd5b6107d7828261144e565b5f546001600160a01b03163314610d16576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152600d60205260409020805460ff1916911515919091179055565b5f818152600a60205260409020546001600160a01b031680610d755760405163c5723b5160e01b815260040160405180910390fd5b919050565b6002805461058590611a9d565b335f8181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f610dfe338484611096565b9392505050565b610e108585856107db565b6001600160a01b0384163b15801590610ea75750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610e5a9033908a90899089908990600401611c4f565b6020604051808303815f875af1158015610e76573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9a9190611c28565b6001600160e01b03191614155b15610b4f57604051633da6393160e01b815260040160405180910390fd5b60606014610ed283611467565b604051602001610ee3929190611ca1565b6040516020818303038152906040529050919050565b6014805461058590611a9d565b5f546001600160a01b03163314610f2f576040516282b42960e81b815260040160405180910390fd5b60146107d78282611b19565b6013805461058590611a9d565b5f546001600160a01b03163314610f71576040516282b42960e81b815260040160405180910390fd5b6001600160a01b038116610f98576040516349e27cff60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b5f546001600160a01b0316331461100b576040516282b42960e81b815260040160405180910390fd5b6005805460ff19166001179055565b5f546001600160a01b03163314611043576040516282b42960e81b815260040160405180910390fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b5f6110917f0000000000000000000000000000000000000000000000000000000000000000600a611e02565b905090565b5f806110a0611065565b6001600160a01b038087165f8181526006602052604080822054898516835290822054915494955093909216148015906110e757505f546001600160a01b03878116911614155b801561110157506011546001600160a01b03888116911614155b801561111b57506011546001600160a01b03878116911614155b1561112e5760055460ff1661112e575f80fd5b6001600160a01b0387165f9081526006602052604081208054879290611155908490611bed565b90915550506001600160a01b0386165f908152600660209081526040808320805489019055600e90915290205460ff166111ec576004546001600160a01b0387165f9081526006602052604090205411156111ec5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b604482015260640160405180910390fd5b6001600160a01b0387165f908152600d602052604090205460ff1615801561122c57506001600160a01b0386165f908152600d602052604090205460ff16155b156112af576001600160a01b0387165f90815260066020526040812054611254908590611e10565b61125e8585611e10565b6112689190611bed565b90506001600160a01b03881661129157604051636edaef2f60e11b815260040160405180910390fd5b5f5b818110156112ac576112a4896114f7565b600101611293565b50505b7f0000000000000000000000000000000000000000000000000000000000000000600454101580156112ee57506012546001600160a01b038781169116145b801561131257506001600160a01b0387165f908152600d602052604090205460ff16155b1561133057604051634e46966960e11b815260040160405180910390fd5b6001600160a01b0386165f908152600d602052604090205460ff1615801561137057506001600160a01b0387165f908152600d602052604090205460ff16155b156113f4575f6113808483611e10565b6001600160a01b0388165f908152600660205260409020546113a3908690611e10565b6113ad9190611bed565b90506001600160a01b0387166113d657604051634e46966960e11b815260040160405180910390fd5b5f5b818110156113f1576113e9886115f1565b6001016113d8565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161143991815260200190565b60405180910390a35060019695505050505050565b600161145a8382611b19565b506002610b528282611b19565b60605f6114738361169f565b60010190505f8167ffffffffffffffff81111561149257611492611859565b6040519080825280601f01601f1916602001820160405280156114bc576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846114c657509392505050565b6001600160a01b0381165f908152600b60205260408120805461151c90600190611bed565b8154811061152c5761152c611c00565b905f5260205f2001549050600b5f836001600160a01b03166001600160a01b031681526020019081526020015f2080548061156957611569611c14565b5f828152602080822083015f19908101839055909201909255828252600c81526040808320839055600a825280832080546001600160a01b031990811690915560089092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600380546001908101918290555f828152600a6020908152604080832080546001600160a01b0319166001600160a01b038816908117909155808452600b835290832080548086018255818552928420909201859055909152546116559190611bed565b5f828152600c602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106116dd5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611709576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061172757662386f26fc10000830492506010015b6305f5e100831061173f576305f5e100830492506008015b612710831061175357612710830492506004015b60648310611765576064830492506002015b600a83106107495760010192915050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156117bb575f80fd5b5035919050565b80356001600160a01b0381168114610d75575f80fd5b5f80604083850312156117e9575f80fd5b6117f2836117c2565b946020939093013593505050565b80358015158114610d75575f80fd5b5f8060408385031215611820575f80fd5b611829836117c2565b915061183760208401611800565b90509250929050565b5f60208284031215611850575f80fd5b610dfe82611800565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261187c575f80fd5b813567ffffffffffffffff8082111561189757611897611859565b604051601f8301601f19908116603f011681019082821181831017156118bf576118bf611859565b816040528381528660208588010111156118d7575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f60208284031215611906575f80fd5b813567ffffffffffffffff81111561191c575f80fd5b6119288482850161186d565b949350505050565b5f805f60608486031215611942575f80fd5b61194b846117c2565b9250611959602085016117c2565b9150604084013590509250925092565b5f806040838503121561197a575f80fd5b823567ffffffffffffffff80821115611991575f80fd5b61199d8683870161186d565b935060208501359150808211156119b2575f80fd5b506119bf8582860161186d565b9150509250929050565b5f602082840312156119d9575f80fd5b610dfe826117c2565b5f805f805f608086880312156119f6575f80fd5b6119ff866117c2565b9450611a0d602087016117c2565b935060408601359250606086013567ffffffffffffffff80821115611a30575f80fd5b818801915088601f830112611a43575f80fd5b813581811115611a51575f80fd5b896020828501011115611a62575f80fd5b9699959850939650602001949392505050565b5f8060408385031215611a86575f80fd5b611a8f836117c2565b9150611837602084016117c2565b600181811c90821680611ab157607f821691505b602082108103611acf57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610b5257805f5260205f20601f840160051c81016020851015611afa5750805b601f840160051c820191505b81811015610b4f575f8155600101611b06565b815167ffffffffffffffff811115611b3357611b33611859565b611b4781611b418454611a9d565b84611ad5565b602080601f831160018114611b7a575f8415611b635750858301515b5f19600386901b1c1916600185901b178555611bd1565b5f85815260208120601f198616915b82811015611ba857888601518255948401946001909101908401611b89565b5085821015611bc557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561074957610749611bd9565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f60208284031215611c38575f80fd5b81516001600160e01b031981168114610dfe575f80fd5b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290525f828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b5f808454611cae81611a9d565b60018281168015611cc65760018114611cdb57611d07565b60ff1984168752821515830287019450611d07565b885f526020805f205f5b85811015611cfe5781548a820152908401908201611ce5565b50505082870194505b5050505083518060208601835e5f9101908152949350505050565b600181815b80851115611d5c57815f1904821115611d4257611d42611bd9565b80851615611d4f57918102915b93841c9390800290611d27565b509250929050565b5f82611d7257506001610749565b81611d7e57505f610749565b8160018114611d945760028114611d9e57611dba565b6001915050610749565b60ff841115611daf57611daf611bd9565b50506001821b610749565b5060208310610133831016604e8410600b8410161715611ddd575081810a610749565b611de78383611d22565b805f1904821115611dfa57611dfa611bd9565b029392505050565b5f610dfe60ff841683611d64565b5f82611e2a57634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212207a53407ddca24cbcfd3bb00bf1807e6085a41cc57e2ecac35f5768c6df3e979d64736f6c63430008190033
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610213575f3560e01c80638da5cb5b1161011f578063e0df5b6f116100a9578063f2fde38b11610079578063f2fde38b14610534578063f8b45b0514610547578063fa696bf014610550578063fad7b8d214610558578063ffb54a991461056b575f80fd5b8063e0df5b6f146104ca578063e2ff5ec4146104dd578063e985e9c5146104ff578063f28ca1dd1461052c575f80fd5b8063a9059cbb116100ef578063a9059cbb1461045f578063b88d4fde14610472578063c87b56dd14610485578063d547cfb714610498578063dd62ed3e146104a0575f80fd5b80638da5cb5b1461041057806395d89b41146104225780639b19251a1461042a578063a22cb4651461044c575f80fd5b8063292e8828116101a05780634f02c420116101705780634f02c420146103af578063504334c2146103b857806353d6fd59146103cb5780636352211e146103de57806370a08231146103f1575f80fd5b8063292e8828146103485780632b9689581461035b578063313ce5671461036357806342842e0e1461039c575f80fd5b806316878981116101e657806316878981146102ad57806318160ddd146102da57806318d217c31461030f57806323b872dd1461032257806327a14fc214610335575f80fd5b806306fdde0314610217578063081812fc14610235578063095ea7b3146102755780630d392cd914610298575b5f80fd5b61021f610578565b60405161022c9190611776565b60405180910390f35b61025d6102433660046117ab565b60086020525f90815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161022c565b6102886102833660046117d8565b610604565b604051901515815260200161022c565b6102ab6102a636600461180f565b61074f565b005b6102ab6102bb366004611840565b335f908152600f60205260409020805460ff1916911515919091179055565b6103017f0000000000000000000000000000000000000000000000f0e8e396adcbf0000081565b60405190815260200161022c565b6102ab61031d3660046118f6565b6107a2565b6102ab610330366004611930565b6107db565b6102ab6103433660046117ab565b610b57565b60105461025d906001600160a01b031681565b6102ab610b85565b61038a7f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff909116815260200161022c565b6102ab6103aa366004611930565b610be9565b61030160035481565b6102ab6103c6366004611969565b610cba565b6102ab6103d936600461180f565b610ced565b61025d6103ec3660046117ab565b610d40565b6103016103ff3660046119c9565b60066020525f908152604090205481565b5f5461025d906001600160a01b031681565b61021f610d7a565b6102886104383660046119c9565b600d6020525f908152604090205460ff1681565b6102ab61045a36600461180f565b610d87565b61028861046d3660046117d8565b610df2565b6102ab6104803660046119e2565b610e05565b61021f6104933660046117ab565b610ec5565b61021f610ef9565b6103016104ae366004611a75565b600760209081525f928352604080842090915290825290205481565b6102ab6104d83660046118f6565b610f06565b6102886104eb3660046119c9565b600f6020525f908152604090205460ff1681565b61028861050d366004611a75565b600960209081525f928352604080842090915290825290205460ff1681565b61021f610f3b565b6102ab6105423660046119c9565b610f48565b61030160045481565b6102ab610fe2565b6102ab6105663660046119c9565b61101a565b6005546102889060ff1681565b6001805461058590611a9d565b80601f01602080910402602001604051908101604052809291908181526020018280546105b190611a9d565b80156105fc5780601f106105d3576101008083540402835291602001916105fc565b820191905f5260205f20905b8154815290600101906020018083116105df57829003601f168201915b505050505081565b5f600354821115801561061657505f82115b156106ea575f828152600a60205260409020546001600160a01b031633811480159061066557506001600160a01b0381165f90815260096020908152604080832033845290915290205460ff16155b15610682576040516282b42960e81b815260040160405180910390fd5b5f8381526008602090815260409182902080546001600160a01b0319166001600160a01b038881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350610745565b335f8181526007602090815260408083206001600160a01b03881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b5f546001600160a01b03163314610778576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152600e60205260409020805460ff1916911515919091179055565b5f546001600160a01b031633146107cb576040516282b42960e81b815260040160405180910390fd5b60136107d78282611b19565b5050565b6003548111610aeb575f818152600a60205260409020546001600160a01b0384811691161461081d57604051636edaef2f60e11b815260040160405180910390fd5b6001600160a01b03821661084457604051634e46966960e11b815260040160405180910390fd5b336001600160a01b0384161480159061088057506001600160a01b0383165f90815260096020908152604080832033845290915290205460ff16155b80156108a257505f818152600860205260409020546001600160a01b03163314155b156108bf576040516282b42960e81b815260040160405180910390fd5b6108c7611065565b6001600160a01b0384165f90815260066020526040812080549091906108ee908490611bed565b909155506108fc9050611065565b6001600160a01b038084165f8181526006602090815260408083208054909601909555858252600a815284822080546001600160a01b031990811690941790556008815284822080549093169092559186168252600b9052908120805461096590600190611bed565b8154811061097557610975611c00565b5f9182526020808320909101546001600160a01b0387168352600b82526040808420868552600c909352909220548154929350839281106109b8576109b8611c00565b5f9182526020808320909101929092556001600160a01b0386168152600b909152604090208054806109ec576109ec611c14565b5f828152602080822083015f19908101839055909201909255838252600c8152604080832054848452818420556001600160a01b038616808452600b83529083208054600181810183558286529385200186905592529054610a4e9190611bed565b5f838152600c602052604080822092909255905183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4826001600160a01b0316846001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487610ad4611065565b60405190815260200160405180910390a350505050565b6001600160a01b0383165f9081526007602090815260408083203384529091529020545f198114610b4457610b208282611bed565b6001600160a01b0385165f9081526007602090815260408083203384529091529020555b610b4f848484611096565b50505b505050565b5f546001600160a01b03163314610b80576040516282b42960e81b815260040160405180910390fd5b600455565b5f546001600160a01b03163314610bae576040516282b42960e81b815260040160405180910390fd5b5f80546001600160a01b031916815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b610bf48383836107db565b6001600160a01b0382163b15801590610c9c5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610c6b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c8f9190611c28565b6001600160e01b03191614155b15610b5257604051633da6393160e01b815260040160405180910390fd5b5f546001600160a01b03163314610ce3576040516282b42960e81b815260040160405180910390fd5b6107d7828261144e565b5f546001600160a01b03163314610d16576040516282b42960e81b815260040160405180910390fd5b6001600160a01b03919091165f908152600d60205260409020805460ff1916911515919091179055565b5f818152600a60205260409020546001600160a01b031680610d755760405163c5723b5160e01b815260040160405180910390fd5b919050565b6002805461058590611a9d565b335f8181526009602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f610dfe338484611096565b9392505050565b610e108585856107db565b6001600160a01b0384163b15801590610ea75750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610e5a9033908a90899089908990600401611c4f565b6020604051808303815f875af1158015610e76573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9a9190611c28565b6001600160e01b03191614155b15610b4f57604051633da6393160e01b815260040160405180910390fd5b60606014610ed283611467565b604051602001610ee3929190611ca1565b6040516020818303038152906040529050919050565b6014805461058590611a9d565b5f546001600160a01b03163314610f2f576040516282b42960e81b815260040160405180910390fd5b60146107d78282611b19565b6013805461058590611a9d565b5f546001600160a01b03163314610f71576040516282b42960e81b815260040160405180910390fd5b6001600160a01b038116610f98576040516349e27cff60e01b815260040160405180910390fd5b5f80546001600160a01b0319166001600160a01b0383169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b5f546001600160a01b0316331461100b576040516282b42960e81b815260040160405180910390fd5b6005805460ff19166001179055565b5f546001600160a01b03163314611043576040516282b42960e81b815260040160405180910390fd5b601080546001600160a01b0319166001600160a01b0392909216919091179055565b5f6110917f0000000000000000000000000000000000000000000000000000000000000012600a611e02565b905090565b5f806110a0611065565b6001600160a01b038087165f8181526006602052604080822054898516835290822054915494955093909216148015906110e757505f546001600160a01b03878116911614155b801561110157506011546001600160a01b03888116911614155b801561111b57506011546001600160a01b03878116911614155b1561112e5760055460ff1661112e575f80fd5b6001600160a01b0387165f9081526006602052604081208054879290611155908490611bed565b90915550506001600160a01b0386165f908152600660209081526040808320805489019055600e90915290205460ff166111ec576004546001600160a01b0387165f9081526006602052604090205411156111ec5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b604482015260640160405180910390fd5b6001600160a01b0387165f908152600d602052604090205460ff1615801561122c57506001600160a01b0386165f908152600d602052604090205460ff16155b156112af576001600160a01b0387165f90815260066020526040812054611254908590611e10565b61125e8585611e10565b6112689190611bed565b90506001600160a01b03881661129157604051636edaef2f60e11b815260040160405180910390fd5b5f5b818110156112ac576112a4896114f7565b600101611293565b50505b7f0000000000000000000000000000000000000000000000f0e8e396adcbf00000600454101580156112ee57506012546001600160a01b038781169116145b801561131257506001600160a01b0387165f908152600d602052604090205460ff16155b1561133057604051634e46966960e11b815260040160405180910390fd5b6001600160a01b0386165f908152600d602052604090205460ff1615801561137057506001600160a01b0387165f908152600d602052604090205460ff16155b156113f4575f6113808483611e10565b6001600160a01b0388165f908152600660205260409020546113a3908690611e10565b6113ad9190611bed565b90506001600160a01b0387166113d657604051634e46966960e11b815260040160405180910390fd5b5f5b818110156113f1576113e9886115f1565b6001016113d8565b50505b856001600160a01b0316876001600160a01b03167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e0314878760405161143991815260200190565b60405180910390a35060019695505050505050565b600161145a8382611b19565b506002610b528282611b19565b60605f6114738361169f565b60010190505f8167ffffffffffffffff81111561149257611492611859565b6040519080825280601f01601f1916602001820160405280156114bc576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846114c657509392505050565b6001600160a01b0381165f908152600b60205260408120805461151c90600190611bed565b8154811061152c5761152c611c00565b905f5260205f2001549050600b5f836001600160a01b03166001600160a01b031681526020019081526020015f2080548061156957611569611c14565b5f828152602080822083015f19908101839055909201909255828252600c81526040808320839055600a825280832080546001600160a01b031990811690915560089092528083208054909216909155518291906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600380546001908101918290555f828152600a6020908152604080832080546001600160a01b0319166001600160a01b038816908117909155808452600b835290832080548086018255818552928420909201859055909152546116559190611bed565b5f828152600c602052604080822092909255905182916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106116dd5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611709576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061172757662386f26fc10000830492506010015b6305f5e100831061173f576305f5e100830492506008015b612710831061175357612710830492506004015b60648310611765576064830492506002015b600a83106107495760010192915050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156117bb575f80fd5b5035919050565b80356001600160a01b0381168114610d75575f80fd5b5f80604083850312156117e9575f80fd5b6117f2836117c2565b946020939093013593505050565b80358015158114610d75575f80fd5b5f8060408385031215611820575f80fd5b611829836117c2565b915061183760208401611800565b90509250929050565b5f60208284031215611850575f80fd5b610dfe82611800565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261187c575f80fd5b813567ffffffffffffffff8082111561189757611897611859565b604051601f8301601f19908116603f011681019082821181831017156118bf576118bf611859565b816040528381528660208588010111156118d7575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f60208284031215611906575f80fd5b813567ffffffffffffffff81111561191c575f80fd5b6119288482850161186d565b949350505050565b5f805f60608486031215611942575f80fd5b61194b846117c2565b9250611959602085016117c2565b9150604084013590509250925092565b5f806040838503121561197a575f80fd5b823567ffffffffffffffff80821115611991575f80fd5b61199d8683870161186d565b935060208501359150808211156119b2575f80fd5b506119bf8582860161186d565b9150509250929050565b5f602082840312156119d9575f80fd5b610dfe826117c2565b5f805f805f608086880312156119f6575f80fd5b6119ff866117c2565b9450611a0d602087016117c2565b935060408601359250606086013567ffffffffffffffff80821115611a30575f80fd5b818801915088601f830112611a43575f80fd5b813581811115611a51575f80fd5b896020828501011115611a62575f80fd5b9699959850939650602001949392505050565b5f8060408385031215611a86575f80fd5b611a8f836117c2565b9150611837602084016117c2565b600181811c90821680611ab157607f821691505b602082108103611acf57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610b5257805f5260205f20601f840160051c81016020851015611afa5750805b601f840160051c820191505b81811015610b4f575f8155600101611b06565b815167ffffffffffffffff811115611b3357611b33611859565b611b4781611b418454611a9d565b84611ad5565b602080601f831160018114611b7a575f8415611b635750858301515b5f19600386901b1c1916600185901b178555611bd1565b5f85815260208120601f198616915b82811015611ba857888601518255948401946001909101908401611b89565b5085821015611bc557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561074957610749611bd9565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f60208284031215611c38575f80fd5b81516001600160e01b031981168114610dfe575f80fd5b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290525f828460a08401375f60a0848401015260a0601f19601f85011683010190509695505050505050565b5f808454611cae81611a9d565b60018281168015611cc65760018114611cdb57611d07565b60ff1984168752821515830287019450611d07565b885f526020805f205f5b85811015611cfe5781548a820152908401908201611ce5565b50505082870194505b5050505083518060208601835e5f9101908152949350505050565b600181815b80851115611d5c57815f1904821115611d4257611d42611bd9565b80851615611d4f57918102915b93841c9390800290611d27565b509250929050565b5f82611d7257506001610749565b81611d7e57505f610749565b8160018114611d945760028114611d9e57611dba565b6001915050610749565b60ff841115611daf57611daf611bd9565b50506001821b610749565b5060208310610133831016604e8410600b8410161715611ddd575081810a610749565b611de78383611d22565b805f1904821115611dfa57611dfa611bd9565b029392505050565b5f610dfe60ff841683611d64565b5f82611e2a57634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212207a53407ddca24cbcfd3bb00bf1807e6085a41cc57e2ecac35f5768c6df3e979d64736f6c63430008190033
Deployed Bytecode Sourcemap
33679:798:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23023:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23857:46;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;23857:46:0;;;;;;-1:-1:-1;;;;;786:32:1;;;768:51;;756:2;741:18;23857:46:0;622:203:1;26858:642:0;;;;;;:::i;:::-;;:::i;:::-;;;1432:14:1;;1425:22;1407:41;;1395:2;1380:18;26858:642:0;1267:187:1;25818:122:0;;;;;;:::i;:::-;;:::i;:::-;;25948:96;;;;;;:::i;:::-;26015:10;26002:24;;;;:12;:24;;;;;:34;;-1:-1:-1;;26002:34:0;;;;;;;;;;25948:96;23259:36;;;;;;;;2214:25:1;;;2202:2;2187:18;23259:36:0;2068:177:1;33938:98:0;;;;;;:::i;:::-;;:::i;28032:1716::-;;;;;;:::i;:::-;;:::i;25715:95::-;;;;;;:::i;:::-;;:::i;24632:28::-;;;;;-1:-1:-1;;;;;24632:28:0;;;20977:151;;;:::i;23159:31::-;;;;;;;;3938:4:1;3926:17;;;3908:36;;3896:2;3881:18;23159:31:0;3766:184:1;30044:405:0;;;;;;:::i;:::-;;:::i;23394:21::-;;;;;;34158:158;;;;;;:::i;:::-;;:::i;26187:111::-;;;;;;:::i;:::-;;:::i;26370:193::-;;;;;;:::i;:::-;;:::i;23623:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;20418:20;;;;;-1:-1:-1;;;;;20418:20:0;;;23077;;;:::i;24468:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;27676:207;;;;;;:::i;:::-;;:::i;29807:160::-;;;;;;:::i;:::-;;:::i;30544:437::-;;;;;;:::i;:::-;;:::i;34324:150::-;;;;;;:::i;:::-;;:::i;33743:26::-;;;:::i;23737:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;34044:106;;;;;;:::i;:::-;;:::i;24579:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23968:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;33715:21;;;:::i;20750:219::-;;;;;;:::i;:::-;;:::i;23482:24::-;;;;;;25626:81;;;:::i;27508:117::-;;;;;;:::i;:::-;;:::i;23515:23::-;;;;;;;;;23023:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26858:642::-;26961:4;26996:6;;26982:10;:20;;:38;;;;;27019:1;27006:10;:14;26982:38;26978:491;;;27037:13;27053:20;;;:8;:20;;;;;;-1:-1:-1;;;;;27053:20:0;27094:10;:19;;;;;:59;;-1:-1:-1;;;;;;27118:23:0;;;;;;:16;:23;;;;;;;;27142:10;27118:35;;;;;;;;;;27117:36;27094:59;27090:121;;;27181:14;;-1:-1:-1;;;27181:14:0;;;;;;;;;;;27090:121;27227:23;;;;:11;:23;;;;;;;;;:33;;-1:-1:-1;;;;;;27227:33:0;-1:-1:-1;;;;;27227:33:0;;;;;;;;;27282:36;;2214:25:1;;;27282:36:0;;;;;;2187:18:1;27282:36:0;;;;;;;27022:308;26978:491;;;27361:10;27351:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;27351:30:0;;;;;;;;;;;;:43;;;27416:41;2214:25:1;;;27351:30:0;;27361:10;27416:41;;2187:18:1;27416:41:0;;;;;;;26978:491;-1:-1:-1;27488:4:0;26858:642;;;;;:::o;25818:122::-;20505:5;;-1:-1:-1;;;;;20505:5:0;20491:10;:19;20487:46;;20519:14;;-1:-1:-1;;;20519:14:0;;;;;;;;;;;20487:46;-1:-1:-1;;;;;25899:25:0;;;::::1;;::::0;;;:19:::1;:25;::::0;;;;:33;;-1:-1:-1;;25899:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;25818:122::o;33938:98::-;20505:5;;-1:-1:-1;;;;;20505:5:0;20491:10;:19;20487:46;;20519:14;;-1:-1:-1;;;20519:14:0;;;;;;;;;;;20487:46;34010:7:::1;:18;34020:8:::0;34010:7;:18:::1;:::i;:::-;;33938:98:::0;:::o;28032:1716::-;28178:6;;28164:10;:20;28160:1581;;28213:20;;;;:8;:20;;;;;;-1:-1:-1;;;;;28205:28:0;;;28213:20;;28205:28;28201:91;;28261:15;;-1:-1:-1;;;28261:15:0;;;;;;;;;;;28201:91;-1:-1:-1;;;;;28312:16:0;;28308:82;;28356:18;;-1:-1:-1;;;28356:18:0;;;;;;;;;;;28308:82;28428:10;-1:-1:-1;;;;;28428:18:0;;;;;;:74;;-1:-1:-1;;;;;;28468:22:0;;;;;;:16;:22;;;;;;;;28491:10;28468:34;;;;;;;;;;28467:35;28428:74;:132;;;;-1:-1:-1;28537:23:0;;;;:11;:23;;;;;;-1:-1:-1;;;;;28537:23:0;28523:10;:37;;28428:132;28406:226;;;28602:14;;-1:-1:-1;;;28602:14:0;;;;;;;;;;;28406:226;28667:10;:8;:10::i;:::-;-1:-1:-1;;;;;28648:15:0;;;;;;:9;:15;;;;;:29;;:15;;;:29;;;;;:::i;:::-;;;;-1:-1:-1;28740:10:0;;-1:-1:-1;28740:8:0;:10::i;:::-;-1:-1:-1;;;;;28723:13:0;;;;;;;:9;:13;;;;;;;;:27;;;;;;;;28782:20;;;:8;:20;;;;;:25;;-1:-1:-1;;;;;;28782:25:0;;;;;;;;28829:11;:23;;;;;28822:30;;;;;;;;28930:12;;;;;:6;:12;;;;;28943:19;;:23;;-1:-1:-1;;28943:23:0;:::i;:::-;28930:37;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;28982:12:0;;;;:6;:12;;;;;;28995:23;;;:11;:23;;;;;;;28982:37;;28930;;-1:-1:-1;28930:37:0;;28982;;;;;;:::i;:::-;;;;;;;;;;;;:49;;;;-1:-1:-1;;;;;29066:12:0;;;;:6;:12;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;29066:18:0;;;;;;;;;;;;29170:23;;;:11;:23;;;;;;;29145:22;;;;;;:48;-1:-1:-1;;;;;29247:10:0;;;;;:6;:10;;;;;:27;;29066:18;29247:27;;;;;;;;;;;;;;;29357:10;;:17;;:21;;29066:18;29357:21;:::i;:::-;29331:23;;;;:11;:23;;;;;;:47;;;;29400:30;;29343:10;;-1:-1:-1;;;;;29400:30:0;;;;;;;;;;;29470:2;-1:-1:-1;;;;;29450:35:0;29464:4;-1:-1:-1;;;;;29450:35:0;;29474:10;:8;:10::i;:::-;29450:35;;2214:25:1;;;2202:2;2187:18;29450:35:0;;;;;;;28186:1311;28032:1716;;;:::o;28160:1581::-;-1:-1:-1;;;;;29536:15:0;;29518;29536;;;:9;:15;;;;;;;;29552:10;29536:27;;;;;;;;-1:-1:-1;;29584:28:0;;29580:101;;29661:20;29671:10;29661:7;:20;:::i;:::-;-1:-1:-1;;;;;29631:15:0;;;;;;:9;:15;;;;;;;;29647:10;29631:27;;;;;;;:50;29580:101;29698:31;29708:4;29714:2;29718:10;29698:9;:31::i;:::-;;29503:238;28160:1581;28032:1716;;;:::o;25715:95::-;20505:5;;-1:-1:-1;;;;;20505:5:0;20491:10;:19;20487:46;;20519:14;;-1:-1:-1;;;20519:14:0;;;;;;;;;;;20487:46;25785:9:::1;:17:::0;25715:95::o;20977:151::-;20505:5;;-1:-1:-1;;;;;20505:5:0;20491:10;:19;20487:46;;20519:14;;-1:-1:-1;;;20519:14:0;;;;;;;;;;;20487:46;21056:1:::1;21040:18:::0;;-1:-1:-1;;;;;;21040:18:0::1;::::0;;21076:44:::1;::::0;21097:10:::1;::::0;21076:44:::1;::::0;21056:1;;21076:44:::1;20977:151::o:0;30044:405::-;30168:26;30181:4;30187:2;30191;30168:12;:26::i;:::-;-1:-1:-1;;;;;30225:14:0;;;:19;;;;:154;;-1:-1:-1;30261:61:0;;-1:-1:-1;;;30261:61:0;;;30297:10;30261:61;;;9161:34:1;-1:-1:-1;;;;;9231:15:1;;;9211:18;;;9204:43;9263:18;;;9256:34;;;9326:3;9306:18;;;9299:31;-1:-1:-1;9346:19:1;;;9339:30;30339:40:0;;30261:35;;;;30339:40;;9386:19:1;;30261:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;30261:118:0;;;30225:154;30207:235;;;30413:17;;-1:-1:-1;;;30413:17:0;;;;;;;;;;;34158:158;20505:5;;-1:-1:-1;;;;;20505:5:0;20491:10;:19;20487:46;;20519:14;;-1:-1:-1;;;20519:14:0;;;;;;;;;;;20487:46;34278:30:::1;34293:5;34300:7;34278:14;:30::i;26187:111::-:0;20505:5;;-1:-1:-1;;;;;20505:5:0;20491:10;:19;20487:46;;20519:14;;-1:-1:-1;;;20519:14:0;;;;;;;;;;;20487:46;-1:-1:-1;;;;;26265:17:0;;;::::1;;::::0;;;:9:::1;:17;::::0;;;;:25;;-1:-1:-1;;26265:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;26187:111::o;26370:193::-;26428:13;26462:12;;;:8;:12;;;;;;-1:-1:-1;;;;;26462:12:0;;26487:69;;26534:10;;-1:-1:-1;;;26534:10:0;;;;;;;;;;;26487:69;26370:193;;;:::o;23077:20::-;;;;;;;:::i;27676:207::-;27779:10;27762:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;27762:38:0;;;;;;;;;;;;:49;;-1:-1:-1;;27762:49:0;;;;;;;;;;27829:46;;1407:41:1;;;27762:38:0;;27779:10;27829:46;;1380:18:1;27829:46:0;;;;;;;27676:207;;:::o;29807:160::-;29902:4;29926:33;29936:10;29948:2;29952:6;29926:9;:33::i;:::-;29919:40;29807:160;-1:-1:-1;;;29807:160:0:o;30544:437::-;30698:26;30711:4;30717:2;30721;30698:12;:26::i;:::-;-1:-1:-1;;;;;30755:14:0;;;:19;;;;:156;;-1:-1:-1;30791:63:0;;-1:-1:-1;;;30791:63:0;;;30871:40;-1:-1:-1;;;;;30791:35:0;;;30871:40;;30791:63;;30827:10;;30839:4;;30845:2;;30849:4;;;;30791:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;30791:120:0;;;30755:156;30737:237;;;30945:17;;-1:-1:-1;;;30945:17:0;;;;;;;;;;;34324:150;34384:13;34431:12;34445:20;34462:2;34445:16;:20::i;:::-;34417:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34410:56;;34324:150;;;:::o;33743:26::-;;;;;;;:::i;34044:106::-;20505:5;;-1:-1:-1;;;;;20505:5:0;20491:10;:19;20487:46;;20519:14;;-1:-1:-1;;;20519:14:0;;;;;;;;;;;20487:46;34118:12:::1;:24;34133:9:::0;34118:12;:24:::1;:::i;33715:21::-:0;;;;;;;:::i;20750:219::-;20505:5;;-1:-1:-1;;;;;20505:5:0;20491:10;:19;20487:46;;20519:14;;-1:-1:-1;;;20519:14:0;;;;;;;;;;;20487:46;-1:-1:-1;;;;;20833:20:0;::::1;20829:47;;20862:14;;-1:-1:-1::0;;;20862:14:0::1;;;;;;;;;;;20829:47;20889:5;:14:::0;;-1:-1:-1;;;;;;20889:14:0::1;-1:-1:-1::0;;;;;20889:14:0;::::1;::::0;;::::1;::::0;;20921:40:::1;::::0;20889:14;;20942:10:::1;::::0;20921:40:::1;::::0;20889:5;20921:40:::1;20750:219:::0;:::o;25626:81::-;20505:5;;-1:-1:-1;;;;;20505:5:0;20491:10;:19;20487:46;;20519:14;;-1:-1:-1;;;20519:14:0;;;;;;;;;;;20487:46;25681:11:::1;:18:::0;;-1:-1:-1;;25681:18:0::1;25695:4;25681:18;::::0;;25626:81::o;27508:117::-;20505:5;;-1:-1:-1;;;;;20505:5:0;20491:10;:19;20487:46;;20519:14;;-1:-1:-1;;;20519:14:0;;;;;;;;;;;20487:46;27591:13:::1;:26:::0;;-1:-1:-1;;;;;;27591:26:0::1;-1:-1:-1::0;;;;;27591:26:0;;;::::1;::::0;;;::::1;::::0;;27508:117::o;32809:92::-;32852:7;32879:14;32885:8;32879:2;:14;:::i;:::-;32872:21;;32809:92;:::o;31049:1721::-;31162:4;31179:12;31194:10;:8;:10::i;:::-;-1:-1:-1;;;;;31245:15:0;;;31215:27;31245:15;;;:9;:15;;;;;;;31303:13;;;;;;;;;31339:5;;31179:25;;-1:-1:-1;31245:15:0;31303:13;;31339:5;31331:13;;;;:28;;-1:-1:-1;31354:5:0;;-1:-1:-1;;;;;31348:11:0;;;31354:5;;31348:11;;31331:28;:53;;;;-1:-1:-1;31371:13:0;;-1:-1:-1;;;;;31363:21:0;;;31371:13;;31363:21;;31331:53;:76;;;;-1:-1:-1;31394:13:0;;-1:-1:-1;;;;;31388:19:0;;;31394:13;;31388:19;;31331:76;31327:129;;;31432:11;;;;31424:20;;;;;;-1:-1:-1;;;;;31466:15:0;;;;;;:9;:15;;;;;:25;;31485:6;;31466:15;:25;;31485:6;;31466:25;:::i;:::-;;;;-1:-1:-1;;;;;;;31529:13:0;;;;;;:9;:13;;;;;;;;:23;;;;;;31581:19;:23;;;;;;;;31576:115;;31646:9;;-1:-1:-1;;;;;31629:13:0;;;;;;:9;:13;;;;;;:26;;31621:58;;;;-1:-1:-1;;;31621:58:0;;12997:2:1;31621:58:0;;;12979:21:1;13036:2;13016:18;;;13009:30;-1:-1:-1;;;13055:18:1;;;13048:49;13114:18;;31621:58:0;;;;;;;;-1:-1:-1;;;;;31764:15:0;;;;;;:9;:15;;;;;;;;31763:16;:34;;;;-1:-1:-1;;;;;;31784:13:0;;;;;;:9;:13;;;;;;;;31783:14;31763:34;31759:364;;;-1:-1:-1;;;;;31888:15:0;;31814:22;31888:15;;;:9;:15;;;;;;:22;;31906:4;;31888:22;:::i;:::-;31840:26;31862:4;31840:19;:26;:::i;:::-;31839:72;;;;:::i;:::-;31814:97;-1:-1:-1;;;;;;31930:18:0;;31926:81;;31976:15;;-1:-1:-1;;;31976:15:0;;;;;;;;;;;31926:81;32026:9;32021:91;32045:14;32041:1;:18;32021:91;;;32085:11;32091:4;32085:5;:11::i;:::-;32061:3;;32021:91;;;;31799:324;31759:364;32152:11;32139:9;;:24;;:45;;;;-1:-1:-1;32173:11:0;;-1:-1:-1;;;;;32167:17:0;;;32173:11;;32167:17;32139:45;:65;;;;-1:-1:-1;;;;;;32189:15:0;;;;;;:9;:15;;;;;;;;32188:16;32139:65;32135:123;;;32228:18;;-1:-1:-1;;;32228:18:0;;;;;;;;;;;32135:123;-1:-1:-1;;;;;32334:13:0;;;;;;:9;:13;;;;;;;;32333:14;:34;;;;-1:-1:-1;;;;;;32352:15:0;;;;;;:9;:15;;;;;;;;32351:16;32333:34;32329:363;;;32384:22;32452:28;32476:4;32452:21;:28;:::i;:::-;-1:-1:-1;;;;;32410:13:0;;;;;;:9;:13;;;;;;:20;;32426:4;;32410:20;:::i;:::-;32409:72;;;;:::i;:::-;32384:97;-1:-1:-1;;;;;;32500:16:0;;32496:82;;32544:18;;-1:-1:-1;;;32544:18:0;;;;;;;;;;;32496:82;32597:9;32592:89;32616:14;32612:1;:18;32592:89;;;32656:9;32662:2;32656:5;:9::i;:::-;32632:3;;32592:89;;;;32369:323;32329:363;32729:2;-1:-1:-1;;;;;32709:31:0;32723:4;-1:-1:-1;;;;;32709:31:0;;32733:6;32709:31;;;;2214:25:1;;2202:2;2187:18;;2068:177;32709:31:0;;;;;;;;-1:-1:-1;32758:4:0;;31049:1721;-1:-1:-1;;;;;;31049:1721:0:o;33512:160::-;33625:4;:12;33632:5;33625:4;:12;:::i;:::-;-1:-1:-1;33648:6:0;:16;33657:7;33648:6;:16;:::i;17711:718::-;17767:13;17818:14;17835:17;17846:5;17835:10;:17::i;:::-;17855:1;17835:21;17818:38;;17871:20;17905:6;17894:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17894:18:0;-1:-1:-1;17871:41:0;-1:-1:-1;18036:28:0;;;18052:2;18036:28;18093:290;-1:-1:-1;;18125:5:0;-1:-1:-1;;;18262:2:0;18251:14;;18246:32;18125:5;18233:46;18325:2;18316:11;;;-1:-1:-1;18346:21:0;18093:290;18346:21;-1:-1:-1;18404:6:0;17711:718;-1:-1:-1;;;17711:718:0:o;33214:290::-;-1:-1:-1;;;;;33286:12:0;;33273:10;33286:12;;;:6;:12;;;;;33299:19;;:23;;33321:1;;33299:23;:::i;:::-;33286:37;;;;;;;;:::i;:::-;;;;;;;;;33273:50;;33334:6;:12;33341:4;-1:-1:-1;;;;;33334:12:0;-1:-1:-1;;;;;33334:12:0;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;33334:18:0;;;;;;;;;;;;33370:15;;;:11;:15;;;;;;33363:22;;;33403:8;:12;;;;;33396:19;;-1:-1:-1;;;;;;33396:19:0;;;;;;33433:11;:15;;;;;;33426:22;;;;;;;;33466:30;33382:2;;33334:18;-1:-1:-1;;;;;33466:30:0;;;;;33334:18;;33466:30;33260:244;33214:290;:::o;32909:297::-;32991:6;:8;;;;;;;;;;-1:-1:-1;33055:12:0;;;:8;:12;;;;;;;;:17;;-1:-1:-1;;;;;;33055:17:0;-1:-1:-1;;;;;33055:17:0;;;;;;;;33083:10;;;:6;:10;;;;;:19;;;;;;;;;;;;;;;;;;;33131:10;;;:17;:21;;32991:8;33131:21;:::i;:::-;33113:15;;;;:11;:15;;;;;;:39;;;;33170:28;;33125:2;;-1:-1:-1;;;;;33170:28:0;;;;;33113:15;;33170:28;32953:253;32909:297;:::o;14312:948::-;14365:7;;-1:-1:-1;;;14443:17:0;;14439:106;;-1:-1:-1;;;14481:17:0;;;-1:-1:-1;14527:2:0;14517:12;14439:106;14572:8;14563:5;:17;14559:106;;14610:8;14601:17;;;-1:-1:-1;14647:2:0;14637:12;14559:106;14692:8;14683:5;:17;14679:106;;14730:8;14721:17;;;-1:-1:-1;14767:2:0;14757:12;14679:106;14812:7;14803:5;:16;14799:103;;14849:7;14840:16;;;-1:-1:-1;14885:1:0;14875:11;14799:103;14929:7;14920:5;:16;14916:103;;14966:7;14957:16;;;-1:-1:-1;15002:1:0;14992:11;14916:103;15046:7;15037:5;:16;15033:103;;15083:7;15074:16;;;-1:-1:-1;15119:1:0;15109:11;15033:103;15163:7;15154:5;:16;15150:68;;15201:1;15191:11;15246:6;14312:948;-1:-1:-1;;14312:948:0:o;14:418:1:-;163:2;152:9;145:21;126:4;195:6;189:13;238:6;233:2;222:9;218:18;211:34;297:6;292:2;284:6;280:15;275:2;264:9;260:18;254:50;353:1;348:2;339:6;328:9;324:22;320:31;313:42;423:2;416;412:7;407:2;399:6;395:15;391:29;380:9;376:45;372:54;364:62;;;14:418;;;;:::o;437:180::-;496:6;549:2;537:9;528:7;524:23;520:32;517:52;;;565:1;562;555:12;517:52;-1:-1:-1;588:23:1;;437:180;-1:-1:-1;437:180:1:o;830:173::-;898:20;;-1:-1:-1;;;;;947:31:1;;937:42;;927:70;;993:1;990;983:12;1008:254;1076:6;1084;1137:2;1125:9;1116:7;1112:23;1108:32;1105:52;;;1153:1;1150;1143:12;1105:52;1176:29;1195:9;1176:29;:::i;:::-;1166:39;1252:2;1237:18;;;;1224:32;;-1:-1:-1;;;1008:254:1:o;1459:160::-;1524:20;;1580:13;;1573:21;1563:32;;1553:60;;1609:1;1606;1599:12;1624:254;1689:6;1697;1750:2;1738:9;1729:7;1725:23;1721:32;1718:52;;;1766:1;1763;1756:12;1718:52;1789:29;1808:9;1789:29;:::i;:::-;1779:39;;1837:35;1868:2;1857:9;1853:18;1837:35;:::i;:::-;1827:45;;1624:254;;;;;:::o;1883:180::-;1939:6;1992:2;1980:9;1971:7;1967:23;1963:32;1960:52;;;2008:1;2005;1998:12;1960:52;2031:26;2047:9;2031:26;:::i;2250:127::-;2311:10;2306:3;2302:20;2299:1;2292:31;2342:4;2339:1;2332:15;2366:4;2363:1;2356:15;2382:719;2425:5;2478:3;2471:4;2463:6;2459:17;2455:27;2445:55;;2496:1;2493;2486:12;2445:55;2532:6;2519:20;2558:18;2595:2;2591;2588:10;2585:36;;;2601:18;;:::i;:::-;2676:2;2670:9;2644:2;2730:13;;-1:-1:-1;;2726:22:1;;;2750:2;2722:31;2718:40;2706:53;;;2774:18;;;2794:22;;;2771:46;2768:72;;;2820:18;;:::i;:::-;2860:10;2856:2;2849:22;2895:2;2887:6;2880:18;2941:3;2934:4;2929:2;2921:6;2917:15;2913:26;2910:35;2907:55;;;2958:1;2955;2948:12;2907:55;3022:2;3015:4;3007:6;3003:17;2996:4;2988:6;2984:17;2971:54;3069:1;3062:4;3057:2;3049:6;3045:15;3041:26;3034:37;3089:6;3080:15;;;;;;2382:719;;;;:::o;3106:322::-;3175:6;3228:2;3216:9;3207:7;3203:23;3199:32;3196:52;;;3244:1;3241;3234:12;3196:52;3284:9;3271:23;3317:18;3309:6;3306:30;3303:50;;;3349:1;3346;3339:12;3303:50;3372;3414:7;3405:6;3394:9;3390:22;3372:50;:::i;:::-;3362:60;3106:322;-1:-1:-1;;;;3106:322:1:o;3433:328::-;3510:6;3518;3526;3579:2;3567:9;3558:7;3554:23;3550:32;3547:52;;;3595:1;3592;3585:12;3547:52;3618:29;3637:9;3618:29;:::i;:::-;3608:39;;3666:38;3700:2;3689:9;3685:18;3666:38;:::i;:::-;3656:48;;3751:2;3740:9;3736:18;3723:32;3713:42;;3433:328;;;;;:::o;3955:543::-;4043:6;4051;4104:2;4092:9;4083:7;4079:23;4075:32;4072:52;;;4120:1;4117;4110:12;4072:52;4160:9;4147:23;4189:18;4230:2;4222:6;4219:14;4216:34;;;4246:1;4243;4236:12;4216:34;4269:50;4311:7;4302:6;4291:9;4287:22;4269:50;:::i;:::-;4259:60;;4372:2;4361:9;4357:18;4344:32;4328:48;;4401:2;4391:8;4388:16;4385:36;;;4417:1;4414;4407:12;4385:36;;4440:52;4484:7;4473:8;4462:9;4458:24;4440:52;:::i;:::-;4430:62;;;3955:543;;;;;:::o;4503:186::-;4562:6;4615:2;4603:9;4594:7;4590:23;4586:32;4583:52;;;4631:1;4628;4621:12;4583:52;4654:29;4673:9;4654:29;:::i;4694:808::-;4791:6;4799;4807;4815;4823;4876:3;4864:9;4855:7;4851:23;4847:33;4844:53;;;4893:1;4890;4883:12;4844:53;4916:29;4935:9;4916:29;:::i;:::-;4906:39;;4964:38;4998:2;4987:9;4983:18;4964:38;:::i;:::-;4954:48;;5049:2;5038:9;5034:18;5021:32;5011:42;;5104:2;5093:9;5089:18;5076:32;5127:18;5168:2;5160:6;5157:14;5154:34;;;5184:1;5181;5174:12;5154:34;5222:6;5211:9;5207:22;5197:32;;5267:7;5260:4;5256:2;5252:13;5248:27;5238:55;;5289:1;5286;5279:12;5238:55;5329:2;5316:16;5355:2;5347:6;5344:14;5341:34;;;5371:1;5368;5361:12;5341:34;5416:7;5411:2;5402:6;5398:2;5394:15;5390:24;5387:37;5384:57;;;5437:1;5434;5427:12;5384:57;4694:808;;;;-1:-1:-1;4694:808:1;;-1:-1:-1;5468:2:1;5460:11;;5490:6;4694:808;-1:-1:-1;;;4694:808:1:o;5507:260::-;5575:6;5583;5636:2;5624:9;5615:7;5611:23;5607:32;5604:52;;;5652:1;5649;5642:12;5604:52;5675:29;5694:9;5675:29;:::i;:::-;5665:39;;5723:38;5757:2;5746:9;5742:18;5723:38;:::i;5772:380::-;5851:1;5847:12;;;;5894;;;5915:61;;5969:4;5961:6;5957:17;5947:27;;5915:61;6022:2;6014:6;6011:14;5991:18;5988:38;5985:161;;6068:10;6063:3;6059:20;6056:1;6049:31;6103:4;6100:1;6093:15;6131:4;6128:1;6121:15;5985:161;;5772:380;;;:::o;6283:518::-;6385:2;6380:3;6377:11;6374:421;;;6421:5;6418:1;6411:16;6465:4;6462:1;6452:18;6535:2;6523:10;6519:19;6516:1;6512:27;6506:4;6502:38;6571:4;6559:10;6556:20;6553:47;;;-1:-1:-1;6594:4:1;6553:47;6649:2;6644:3;6640:12;6637:1;6633:20;6627:4;6623:31;6613:41;;6704:81;6722:2;6715:5;6712:13;6704:81;;;6781:1;6767:16;;6748:1;6737:13;6704:81;;6977:1345;7103:3;7097:10;7130:18;7122:6;7119:30;7116:56;;;7152:18;;:::i;:::-;7181:97;7271:6;7231:38;7263:4;7257:11;7231:38;:::i;:::-;7225:4;7181:97;:::i;:::-;7333:4;;7390:2;7379:14;;7407:1;7402:663;;;;8109:1;8126:6;8123:89;;;-1:-1:-1;8178:19:1;;;8172:26;8123:89;-1:-1:-1;;6934:1:1;6930:11;;;6926:24;6922:29;6912:40;6958:1;6954:11;;;6909:57;8225:81;;7372:944;;7402:663;6230:1;6223:14;;;6267:4;6254:18;;-1:-1:-1;;7438:20:1;;;7556:236;7570:7;7567:1;7564:14;7556:236;;;7659:19;;;7653:26;7638:42;;7751:27;;;;7719:1;7707:14;;;;7586:19;;7556:236;;;7560:3;7820:6;7811:7;7808:19;7805:201;;;7881:19;;;7875:26;-1:-1:-1;;7964:1:1;7960:14;;;7976:3;7956:24;7952:37;7948:42;7933:58;7918:74;;7805:201;;;8052:1;8043:6;8040:1;8036:14;8032:22;8026:4;8019:36;7372:944;;;;;6977:1345;;:::o;8327:127::-;8388:10;8383:3;8379:20;8376:1;8369:31;8419:4;8416:1;8409:15;8443:4;8440:1;8433:15;8459:128;8526:9;;;8547:11;;;8544:37;;;8561:18;;:::i;8592:127::-;8653:10;8648:3;8644:20;8641:1;8634:31;8684:4;8681:1;8674:15;8708:4;8705:1;8698:15;8724:127;8785:10;8780:3;8776:20;8773:1;8766:31;8816:4;8813:1;8806:15;8840:4;8837:1;8830:15;9416:290;9485:6;9538:2;9526:9;9517:7;9513:23;9509:32;9506:52;;;9554:1;9551;9544:12;9506:52;9580:16;;-1:-1:-1;;;;;;9625:32:1;;9615:43;;9605:71;;9672:1;9669;9662:12;9711:662;-1:-1:-1;;;;;9990:15:1;;;9972:34;;10042:15;;10037:2;10022:18;;10015:43;10089:2;10074:18;;10067:34;;;10137:3;10132:2;10117:18;;10110:31;;;10157:19;;10150:35;;;9915:4;10178:6;10228;9952:3;10207:19;;10194:49;10293:1;10287:3;10278:6;10267:9;10263:22;10259:32;10252:43;10363:3;10356:2;10352:7;10347:2;10339:6;10335:15;10331:29;10320:9;10316:45;10312:55;10304:63;;9711:662;;;;;;;;:::o;10378:1035::-;10554:3;10583:1;10616:6;10610:13;10646:36;10672:9;10646:36;:::i;:::-;10701:1;10718:17;;;10744:133;;;;10891:1;10886:358;;;;10711:533;;10744:133;-1:-1:-1;;10777:24:1;;10765:37;;10850:14;;10843:22;10831:35;;10822:45;;;-1:-1:-1;10744:133:1;;10886:358;10917:6;10914:1;10907:17;10947:4;10992;10989:1;10979:18;11019:1;11033:165;11047:6;11044:1;11041:13;11033:165;;;11125:14;;11112:11;;;11105:35;11168:16;;;;11062:10;;11033:165;;;11037:3;;;11227:6;11222:3;11218:16;11211:23;;10711:533;;;;;11275:6;11269:13;11321:8;11314:4;11306:6;11302:17;11297:3;11291:39;11387:1;11349:18;;11376:13;;;11349:18;10378:1035;-1:-1:-1;;;;10378:1035:1:o;11418:416::-;11507:1;11544:5;11507:1;11558:270;11579:7;11569:8;11566:21;11558:270;;;11638:4;11634:1;11630:6;11626:17;11620:4;11617:27;11614:53;;;11647:18;;:::i;:::-;11697:7;11687:8;11683:22;11680:55;;;11717:16;;;;11680:55;11796:22;;;;11756:15;;;;11558:270;;;11562:3;11418:416;;;;;:::o;11839:806::-;11888:5;11918:8;11908:80;;-1:-1:-1;11959:1:1;11973:5;;11908:80;12007:4;11997:76;;-1:-1:-1;12044:1:1;12058:5;;11997:76;12089:4;12107:1;12102:59;;;;12175:1;12170:130;;;;12082:218;;12102:59;12132:1;12123:10;;12146:5;;;12170:130;12207:3;12197:8;12194:17;12191:43;;;12214:18;;:::i;:::-;-1:-1:-1;;12270:1:1;12256:16;;12285:5;;12082:218;;12384:2;12374:8;12371:16;12365:3;12359:4;12356:13;12352:36;12346:2;12336:8;12333:16;12328:2;12322:4;12319:12;12315:35;12312:77;12309:159;;;-1:-1:-1;12421:19:1;;;12453:5;;12309:159;12500:34;12525:8;12519:4;12500:34;:::i;:::-;12570:6;12566:1;12562:6;12558:19;12549:7;12546:32;12543:58;;;12581:18;;:::i;:::-;12619:20;;11839:806;-1:-1:-1;;;11839:806:1:o;12650:140::-;12708:5;12737:47;12778:4;12768:8;12764:19;12758:4;12737:47;:::i;13275:217::-;13315:1;13341;13331:132;;13385:10;13380:3;13376:20;13373:1;13366:31;13420:4;13417:1;13410:15;13448:4;13445:1;13438:15;13331:132;-1:-1:-1;13477:9:1;;13275:217::o
Swarm Source
ipfs://7a53407ddca24cbcfd3bb00bf1807e6085a41cc57e2ecac35f5768c6df3e979d
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.