Source Code
Overview
ETH Balance
0 ETH
Token Holdings
More Info
ContractCreator
Multi Chain
Multichain Addresses
N/ALatest 11 from a total of 11 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Create Strategy | 8012262 | 370 days 10 hrs ago | IN | 0 ETH | 0.00129966 | ||||
Create Strategy | 8010830 | 370 days 16 hrs ago | IN | 0 ETH | 0.00273958 | ||||
Create Strategy | 7951815 | 380 days 14 hrs ago | IN | 0 ETH | 0.01180645 | ||||
Create Strategy | 7951805 | 380 days 15 hrs ago | IN | 0 ETH | 0.01426082 | ||||
Create Strategy | 7933698 | 383 days 15 hrs ago | IN | 0 ETH | 0.00019871 | ||||
Create Strategy | 7933669 | 383 days 15 hrs ago | IN | 0 ETH | 0.00022436 | ||||
Create Strategy | 7930628 | 384 days 3 hrs ago | IN | 0 ETH | 0.00019871 | ||||
Create Strategy | 7929219 | 384 days 9 hrs ago | IN | 0 ETH | 0.0002244 | ||||
Create Strategy | 7859031 | 395 days 21 hrs ago | IN | 0 ETH | 0.00013247 | ||||
Create Strategy | 7859031 | 395 days 21 hrs ago | IN | 0 ETH | 0.00016667 | ||||
0x60806040 | 7859017 | 395 days 21 hrs ago | IN | Create: Treasury | 0 ETH | 0.01243935 |
Latest 15 internal transactions
Advanced mode:
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
8012262 | 370 days 10 hrs ago | 0 ETH | ||||
8010830 | 370 days 16 hrs ago | 0 ETH | ||||
7951815 | 380 days 14 hrs ago | 0 ETH | ||||
7951805 | 380 days 15 hrs ago | 0 ETH | ||||
7933698 | 383 days 15 hrs ago | 0 ETH | ||||
7933669 | 383 days 15 hrs ago | 0 ETH | ||||
7930628 | 384 days 3 hrs ago | 0 ETH | ||||
7929219 | 384 days 9 hrs ago | 0 ETH | ||||
7859031 | 395 days 21 hrs ago | 0 ETH | ||||
7859031 | 395 days 21 hrs ago | 0 ETH | ||||
7859017 | 395 days 21 hrs ago | Contract Creation | 0 ETH | |||
7859017 | 395 days 21 hrs ago | Contract Creation | 0 ETH | |||
7859017 | 395 days 21 hrs ago | Contract Creation | 0 ETH | |||
7859017 | 395 days 21 hrs ago | Contract Creation | 0 ETH | |||
7859017 | 395 days 21 hrs ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
Treasury
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-30 */ pragma solidity >= "0.8.0"; /// @notice Modern and gas efficient ERC20 + EIP-2612 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol) /// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol) /// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it. abstract contract ERC20 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 amount); event Approval(address indexed owner, address indexed spender, uint256 amount); /*////////////////////////////////////////////////////////////// METADATA STORAGE //////////////////////////////////////////////////////////////*/ string public name; string public symbol; uint8 public immutable decimals; /*////////////////////////////////////////////////////////////// ERC20 STORAGE //////////////////////////////////////////////////////////////*/ uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; /*////////////////////////////////////////////////////////////// EIP-2612 STORAGE //////////////////////////////////////////////////////////////*/ uint256 internal immutable INITIAL_CHAIN_ID; bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR; mapping(address => uint256) public nonces; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor( string memory _name, string memory _symbol, uint8 _decimals ) { name = _name; symbol = _symbol; decimals = _decimals; INITIAL_CHAIN_ID = block.chainid; INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator(); } /*////////////////////////////////////////////////////////////// ERC20 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 amount) public virtual returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function transfer(address to, uint256 amount) public virtual returns (bool) { balanceOf[msg.sender] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(msg.sender, to, amount); return true; } function transferFrom( address from, address to, uint256 amount ) public virtual returns (bool) { uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals. if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount; balanceOf[from] -= amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(from, to, amount); return true; } /*////////////////////////////////////////////////////////////// EIP-2612 LOGIC //////////////////////////////////////////////////////////////*/ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual { require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED"); // Unchecked because the only math done is incrementing // the owner's nonce which cannot realistically overflow. unchecked { address recoveredAddress = ecrecover( keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR(), keccak256( abi.encode( keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ), owner, spender, value, nonces[owner]++, deadline ) ) ) ), v, r, s ); require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER"); allowance[recoveredAddress][spender] = value; } emit Approval(owner, spender, value); } function DOMAIN_SEPARATOR() public view virtual returns (bytes32) { return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator(); } function computeDomainSeparator() internal view virtual returns (bytes32) { return keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 amount) internal virtual { totalSupply += amount; // Cannot overflow because the sum of all user // balances can't exceed the max uint256 value. unchecked { balanceOf[to] += amount; } emit Transfer(address(0), to, amount); } function _burn(address from, uint256 amount) internal virtual { balanceOf[from] -= amount; // Cannot underflow because a user's balance // will never be larger than the total supply. unchecked { totalSupply -= amount; } emit Transfer(from, address(0), amount); } } contract Old is ERC20 { uint256 public currentSupply; constructor() ERC20("Strats", "STRT", 18) {} function mint(address to, uint256 value) public { currentSupply++; _mint(to, value); } function burn(address from, uint256 value) public { _burn(from, value); } } /// @notice Modern, minimalist, and gas efficient ERC-721 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol) abstract contract ERC721 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event Transfer(address indexed from, address indexed to, uint256 indexed id); event Approval(address indexed owner, address indexed spender, uint256 indexed id); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /*////////////////////////////////////////////////////////////// METADATA STORAGE/LOGIC //////////////////////////////////////////////////////////////*/ string public name; string public symbol; function tokenURI(uint256 id) public view virtual returns (string memory); /*////////////////////////////////////////////////////////////// ERC721 BALANCE/OWNER STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) internal _ownerOf; mapping(address => uint256) internal _balanceOf; function ownerOf(uint256 id) public view virtual returns (address owner) { require((owner = _ownerOf[id]) != address(0), "NOT_MINTED"); } function balanceOf(address owner) public view virtual returns (uint256) { require(owner != address(0), "ZERO_ADDRESS"); return _balanceOf[owner]; } /*////////////////////////////////////////////////////////////// ERC721 APPROVAL STORAGE //////////////////////////////////////////////////////////////*/ mapping(uint256 => address) public getApproved; mapping(address => mapping(address => bool)) public isApprovedForAll; /*////////////////////////////////////////////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////*/ constructor(string memory _name, string memory _symbol) { name = _name; symbol = _symbol; } /*////////////////////////////////////////////////////////////// ERC721 LOGIC //////////////////////////////////////////////////////////////*/ function approve(address spender, uint256 id) public virtual { address owner = _ownerOf[id]; require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED"); getApproved[id] = spender; emit Approval(owner, spender, id); } function setApprovalForAll(address operator, bool approved) public virtual { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } function transferFrom( address from, address to, uint256 id ) public virtual { require(from == _ownerOf[id], "WRONG_FROM"); require(to != address(0), "INVALID_RECIPIENT"); require( msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id], "NOT_AUTHORIZED" ); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. unchecked { _balanceOf[from]--; _balanceOf[to]++; } _ownerOf[id] = to; delete getApproved[id]; emit Transfer(from, to, id); } function safeTransferFrom( address from, address to, uint256 id ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function safeTransferFrom( address from, address to, uint256 id, bytes calldata data ) public virtual { transferFrom(from, to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } /*////////////////////////////////////////////////////////////// ERC165 LOGIC //////////////////////////////////////////////////////////////*/ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721 interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint(address to, uint256 id) internal virtual { require(to != address(0), "INVALID_RECIPIENT"); require(_ownerOf[id] == address(0), "ALREADY_MINTED"); // Counter overflow is incredibly unrealistic. unchecked { _balanceOf[to]++; } _ownerOf[id] = to; emit Transfer(address(0), to, id); } function _burn(uint256 id) internal virtual { address owner = _ownerOf[id]; require(owner != address(0), "NOT_MINTED"); // Ownership check above ensures no underflow. unchecked { _balanceOf[owner]--; } delete _ownerOf[id]; delete getApproved[id]; emit Transfer(owner, address(0), id); } /*////////////////////////////////////////////////////////////// INTERNAL SAFE MINT LOGIC //////////////////////////////////////////////////////////////*/ function _safeMint(address to, uint256 id) internal virtual { _mint(to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } function _safeMint( address to, uint256 id, bytes memory data ) internal virtual { _mint(to, id); require( to.code.length == 0 || ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) == ERC721TokenReceiver.onERC721Received.selector, "UNSAFE_RECIPIENT" ); } } /// @notice A generic interface for a contract which properly accepts ERC721 tokens. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol) abstract contract ERC721TokenReceiver { function onERC721Received( address, address, uint256, bytes calldata ) external virtual returns (bytes4) { return ERC721TokenReceiver.onERC721Received.selector; } } // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) // OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol) /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @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 up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (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; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 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. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); 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 (rounding == Rounding.Up && 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 down. * * 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 + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * 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 + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * 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 + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * 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 10, 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 + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @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) { 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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); 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); } } contract Strategies is ERC721 { using Strings for uint256; struct Strategy { uint256 amount1; uint256 amount2; uint256 amount3; } mapping(uint256 => Strategy) public strategies; string public baseURI; uint256 tokenId; constructor() ERC721("Strats", "STRT") { baseURI = "https://ipfs.io/ipfs/bafybeichnqc4nsgq632q4lzkw7niefhhlkx6uyunjpqfipibuqk6fivuoe/"; } function mint(address to, Strategy memory strategy) public returns (uint256) { _mint(to, ++tokenId); strategies[tokenId] = strategy; return tokenId; } function burn(uint256 _tokenId) public { _burn(_tokenId); } function tokenURI(uint256 _tokenId) public view override returns (string memory) { return string(abi.encodePacked(baseURI, _tokenId.toString())); } function getStrategy(uint256 chosenStrategy) public view returns (uint256[3] memory) { Strategy memory strategy; strategy = strategies[chosenStrategy]; return [strategy.amount1, strategy.amount2, strategy.amount3]; } } interface IMockStake { function stake() external payable returns (bool); function unstake(uint256 amount) external returns (bool); } abstract contract MockStake { uint256 public balance; uint256 public multiplier; constructor() {} function stake() public payable returns (bool) { balance = msg.value; return true; } function unstake(uint256 amount) public returns (bool) { balance -= amount; address payable spender = payable(msg.sender); spender.transfer(amount); return true; } function entropy(uint256 value) public payable returns (uint256) { balance = value * balance; } } contract MockLido is MockStake { constructor() MockStake() {} } contract MockRocketpool is MockStake { constructor() MockStake() {} } contract MockUniSwapV2 is MockStake { constructor() MockStake() {} } interface IStarknetCore { /** * Sends a message to an L2 contract. * Returns the hash of the message. */ function sendMessageToL2(uint256 toAddress, uint256 selector, uint256[] calldata payload) external payable returns (bytes32); /** * Consumes a message that was sent from an L2 contract. * Returns the hash of the message. */ function consumeMessageFromL2(uint256 fromAddress, uint256[] calldata payload) external returns (bytes32); } enum ChickenState { Egg, In, Out } contract Treasury { uint256 public lockedBucket; uint256 public recurrentAmount; uint256 public reserveBucket; uint256 public FundVirtualOldBalance; uint256 public StrategistVirtualOldBalance; uint256 public StrategistReserveClaim; ChickenState public StrategistChickenState; uint256 public chosenStrategy; mapping(uint256 => uint256) public strategyPledge; bool public StrategyPledgeLocked; uint256 public lockPeriod; uint256 public endPeriod; Old public old; Strategies public strategies; IMockStake[] public assets; IStarknetCore public starknetCore; event SubmitedStrategy(uint256 id, address strategist); uint256 constant MESSAGE_DEPOSIT = 0; uint256 constant MESSAGE_SET_STRATEGY = 1; uint256 constant MESSAGE_START = 2; constructor() { MockLido mockLido = new MockLido(); MockRocketpool mockRocketpool = new MockRocketpool(); MockUniSwapV2 mockUniSwapV2 = new MockUniSwapV2(); IMockStake[] memory _assets = new IMockStake[](3); _assets[0]=IMockStake(address(mockLido)); _assets[1]=IMockStake(address(mockRocketpool)); _assets[2]=IMockStake(address(mockUniSwapV2)); old = new Old(); strategies = new Strategies(); assets = _assets; starknetCore = IStarknetCore(0xa4eD3aD27c294565cB0DCc993BDdCC75432D498c); StrategyPledgeLocked = true; lockPeriod = 1669779861; endPeriod = 2298253461; } function createStrategy(Strategies.Strategy memory strategy) public payable returns (uint256) { uint256 id = strategies.mint(msg.sender, strategy); strategyPledge[id] = msg.value; emit SubmitedStrategy(id, msg.sender); return id; } function depositFundsFromL2(uint256 l2ContractAddress, uint256 amount) public returns (bool) { uint256[] memory payload = new uint256[](2); payload[0] = MESSAGE_DEPOSIT; payload[1] = amount; starknetCore.consumeMessageFromL2(l2ContractAddress, payload); lockedBucket += amount; recurrentAmount = amount; // update FundVirtualOldBalance += amount FundVirtualOldBalance += amount; return true; } function setStrategyFromL2(uint256 l2ContractAddress, uint256 strategyId) public { uint256[] memory payload = new uint256[](2); payload[0] = MESSAGE_SET_STRATEGY; payload[1] = strategyId; starknetCore.consumeMessageFromL2(l2ContractAddress, payload); chosenStrategy = strategyId; reserveBucket = strategyPledge[chosenStrategy]; StrategistReserveClaim = strategyPledge[chosenStrategy]; StrategistVirtualOldBalance += strategyPledge[chosenStrategy]; strategyPledge[chosenStrategy] = 0; StrategyPledgeLocked = false; } function applyStrategyFromL2(uint256 l2ContractAddress) public { uint256[] memory payload = new uint256[](1); payload[0] = MESSAGE_START; starknetCore.consumeMessageFromL2(l2ContractAddress, payload); //currentInvestment = lockedBucket; uint256 currentInvestment = lockedBucket; //get erc721 strategy array uint256[3] memory strategy; strategy = strategies.getStrategy(chosenStrategy); uint256 i = 0; uint256 assets_length = assets.length; // stake() foreach asset for (; i < assets_length; ++i) { assets[i].stake{value: (currentInvestment * strategy[i]) / 100}(); } } function rebalance(uint256[3] memory sell, uint256[3] memory buy, uint256 yieldAmount) public { //sell for first array amounts uint256 i = 0; uint256 assets_length = assets.length; for (; i < assets_length; ++i) { assets[i].unstake(sell[i]); } //buy for secund array amounts + erc721 strategy array with recurrentAmount i = 0; for (; i < assets_length; ++i) { assets[i].stake{value: buy[i]}(); } //transfer yieldAmount to reserve reserveBucket += yieldAmount; // update FundVirtualOldBalance += 0.8 * yieldAmount FundVirtualOldBalance += (80 * yieldAmount) / 100; // update StrategistVirtualOldBalance += 0.2 * yieldAmount StrategistVirtualOldBalance += (20 * yieldAmount) / 100; } function chickenIn() public { require(block.timestamp > lockPeriod); require(msg.sender == strategies.ownerOf(chosenStrategy)); require(StrategistChickenState == ChickenState.Egg); StrategistChickenState = ChickenState.In; StrategistReserveClaim = 0; uint256 balance = StrategistVirtualOldBalance; old.mint(msg.sender, balance); StrategistVirtualOldBalance = 0; } function chickenOut() public { require(block.timestamp > lockPeriod); require(msg.sender == strategies.ownerOf(chosenStrategy)); require(StrategistChickenState == ChickenState.Egg); StrategistChickenState = ChickenState.Out; payable(msg.sender).transfer(StrategistReserveClaim); StrategistReserveClaim = 0; StrategistVirtualOldBalance = 0; } function claimOld(uint256 amount) public { uint256 virtualOld = FundVirtualOldBalance + StrategistVirtualOldBalance; uint256 oldCurrentSupply = old.totalSupply(); uint256 etherToTransfer = (reserveBucket / virtualOld + oldCurrentSupply) * amount; reserveBucket -= etherToTransfer; old.transfer(address(this), amount); payable(msg.sender).transfer(etherToTransfer); } function retire() public { require(block.timestamp > endPeriod); //vende assets todos uint256 totalSaleETHAmount = 100; //sell(); payable(strategies.ownerOf(chosenStrategy)).transfer(StrategistReserveClaim); totalSaleETHAmount -= StrategistReserveClaim; StrategistReserveClaim = 0; totalSaleETHAmount -= lockedBucket; reserveBucket += totalSaleETHAmount; // update FundVirtualOldBalance += 0.8 * totalSaleETHAmount FundVirtualOldBalance += (80 * totalSaleETHAmount) / 100; // update StrategistVirtualOldBalance += 0.2 * totalSaleETHAmount StrategistVirtualOldBalance += (20 * totalSaleETHAmount) / 100; uint256 virtualOld = FundVirtualOldBalance + StrategistVirtualOldBalance; uint256 oldSupply = old.totalSupply(); uint256 etherToTransferFund = (reserveBucket / virtualOld + oldSupply) * FundVirtualOldBalance; uint256 etherToTransferStrategist = (reserveBucket / virtualOld + oldSupply) * StrategistVirtualOldBalance; reserveBucket -= etherToTransferFund; reserveBucket -= etherToTransferStrategist; //bridge para l2 etherToTransferFund payable(strategies.ownerOf(chosenStrategy)).transfer(etherToTransferStrategist); FundVirtualOldBalance = 0; StrategistVirtualOldBalance = 0; } function unpledge(uint256 id) public { require(StrategyPledgeLocked == false); require(msg.sender == strategies.ownerOf(id)); strategies.burn(id); uint256 amount = strategyPledge[chosenStrategy]; payable(msg.sender).transfer(amount); strategyPledge[chosenStrategy] = 0; } }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"strategist","type":"address"}],"name":"SubmitedStrategy","type":"event"},{"inputs":[],"name":"FundVirtualOldBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"StrategistChickenState","outputs":[{"internalType":"enum ChickenState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"StrategistReserveClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"StrategistVirtualOldBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"StrategyPledgeLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"l2ContractAddress","type":"uint256"}],"name":"applyStrategyFromL2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"assets","outputs":[{"internalType":"contract IMockStake","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chickenIn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"chickenOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"chosenStrategy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimOld","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amount1","type":"uint256"},{"internalType":"uint256","name":"amount2","type":"uint256"},{"internalType":"uint256","name":"amount3","type":"uint256"}],"internalType":"struct Strategies.Strategy","name":"strategy","type":"tuple"}],"name":"createStrategy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"l2ContractAddress","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositFundsFromL2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedBucket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"old","outputs":[{"internalType":"contract Old","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[3]","name":"sell","type":"uint256[3]"},{"internalType":"uint256[3]","name":"buy","type":"uint256[3]"},{"internalType":"uint256","name":"yieldAmount","type":"uint256"}],"name":"rebalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recurrentAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveBucket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"retire","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"l2ContractAddress","type":"uint256"},{"internalType":"uint256","name":"strategyId","type":"uint256"}],"name":"setStrategyFromL2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"starknetCore","outputs":[{"internalType":"contract IStarknetCore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategies","outputs":[{"internalType":"contract Strategies","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"strategyPledge","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"unpledge","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506000604051620000229062000267565b604051809103906000f0801580156200003f573d6000803e3d6000fd5b5090506000604051620000529062000275565b604051809103906000f0801580156200006f573d6000803e3d6000fd5b5090506000604051620000829062000283565b604051809103906000f0801580156200009f573d6000803e3d6000fd5b506040805160038082526080820190925291925060009190602082016060803683370190505090508381600081518110620000de57620000de6200032e565b60200260200101906001600160a01b031690816001600160a01b03168152505082816001815181106200011557620001156200032e565b60200260200101906001600160a01b031690816001600160a01b03168152505081816002815181106200014c576200014c6200032e565b60200260200101906001600160a01b031690816001600160a01b0316815250506040516200017a9062000291565b604051809103906000f08015801562000197573d6000803e3d6000fd5b50600c80546001600160a01b0319166001600160a01b0392909216919091179055604051620001c6906200029f565b604051809103906000f080158015620001e3573d6000803e3d6000fd5b50600d80546001600160a01b0319166001600160a01b039290921691909117905580516200021990600e906020840190620002ad565b5050600f80546001600160a01b03191673a4ed3ad27c294565cb0dcc993bddcc75432d498c17905550506009805460ff1916600117905550636386d195600a556388fc9095600b5562000344565b6102278062001bd183390190565b6102278062001df883390190565b610227806200201f83390190565b610fb0806200224683390190565b6116dd80620031f683390190565b82805482825590600052602060002090810192821562000305579160200282015b828111156200030557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620002ce565b506200031392915062000317565b5090565b5b8082111562000313576000815560010162000318565b634e487b7160e01b600052603260045260246000fd5b61187d80620003546000396000f3fe6080604052600436106101a15760003560e01c80638156ea26116100e1578063bcd73dfe1161008a578063cf35bdd011610064578063cf35bdd01461041f578063d9f9027f1461043f578063e20e1cea1461045f578063fd53e8fc1461048957600080fd5b8063bcd73dfe146103bf578063c7258ba6146103ec578063c80f3b921461040c57600080fd5b8063a4874d77116100bb578063a4874d7714610374578063ad89b67c14610389578063b83f86631461039f57600080fd5b80638156ea261461033457806399960e641461034a578063a3c13af11461035f57600080fd5b806339e730ab1161014e5780634a2bab98116101285780634a2bab98146102cb5780635faa65ff146102e157806369986e57146102f757806375e1252c1461030d57600080fd5b806339e730ab1461025d5780633fd8b02f14610295578063443cbec1146102ab57600080fd5b806328f3c5eb1161017f57806328f3c5eb14610207578063378077a11461022757806337946adb1461024757600080fd5b80630b18de51146101a65780630b9c2f41146101cf5780630dbf0a45146101f1575b600080fd5b3480156101b257600080fd5b506101bc60045481565b6040519081526020015b60405180910390f35b3480156101db57600080fd5b506101ef6101ea3660046114e2565b6104a9565b005b3480156101fd57600080fd5b506101bc60005481565b34801561021357600080fd5b506101ef610222366004611504565b6105d6565b34801561023357600080fd5b506101ef610242366004611504565b610767565b34801561025357600080fd5b506101bc60055481565b34801561026957600080fd5b50600f5461027d906001600160a01b031681565b6040516001600160a01b0390911681526020016101c6565b3480156102a157600080fd5b506101bc600a5481565b3480156102b757600080fd5b506101ef6102c63660046115ac565b610992565b3480156102d757600080fd5b506101bc60075481565b3480156102ed57600080fd5b506101bc600b5481565b34801561030357600080fd5b506101bc60035481565b34801561031957600080fd5b506006546103279060ff1681565b6040516101c69190611600565b34801561034057600080fd5b506101bc60025481565b34801561035657600080fd5b506101ef610b88565b34801561036b57600080fd5b506101ef610c94565b34801561038057600080fd5b506101ef610df7565b34801561039557600080fd5b506101bc60015481565b3480156103ab57600080fd5b50600c5461027d906001600160a01b031681565b3480156103cb57600080fd5b506101bc6103da366004611504565b60086020526000908152604090205481565b3480156103f857600080fd5b506101ef610407366004611504565b61111c565b6101bc61041a366004611628565b611284565b34801561042b57600080fd5b5061027d61043a366004611504565b611381565b34801561044b57600080fd5b50600d5461027d906001600160a01b031681565b34801561046b57600080fd5b506009546104799060ff1681565b60405190151581526020016101c6565b34801561049557600080fd5b506104796104a43660046114e2565b6113ab565b6040805160028082526060820183526000926020830190803683370190505090506001816000815181106104df576104df611684565b60200260200101818152505081816001815181106104ff576104ff611684565b6020908102919091010152600f5460405162b2775760e61b81526001600160a01b0390911690632c9dd5c09061053b908690859060040161169a565b6020604051808303816000875af115801561055a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057e91906116e8565b5060078290556000828152600860205260408120546002819055600581905560048054919290916105b0908490611717565b909155505060075460009081526008602052604081205550506009805460ff1916905550565b60006004546003546105e89190611717565b90506000600c60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561063f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066391906116e8565b90506000838284600254610677919061172f565b6106819190611717565b61068b9190611751565b9050806002600082825461069f9190611770565b9091555050600c546040517fa9059cbb000000000000000000000000000000000000000000000000000000008152306004820152602481018690526001600160a01b039091169063a9059cbb906044016020604051808303816000875af115801561070e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107329190611787565b50604051339082156108fc029083906000818181858888f19350505050158015610760573d6000803e3d6000fd5b5050505050565b6040805160018082528183019092526000916020808301908036833701905050905060028160008151811061079e5761079e611684565b6020908102919091010152600f5460405162b2775760e61b81526001600160a01b0390911690632c9dd5c0906107da908590859060040161169a565b6020604051808303816000875af11580156107f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081d91906116e8565b506000546108296114c4565b600d546007546040517fcfc0cc340000000000000000000000000000000000000000000000000000000081526001600160a01b039092169163cfc0cc34916108779160040190815260200190565b606060405180830381865afa158015610894573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b891906117b0565b600e549091506000905b8082101561098a57600e82815481106108dd576108dd611684565b6000918252602090912001546001600160a01b0316633a4b66f1606485856003811061090b5761090b611684565b602002015161091a9088611751565b610924919061172f565b6040518263ffffffff1660e01b815260040160206040518083038185885af1158015610954573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906109799190611787565b5061098382611805565b91506108c2565b505050505050565b600e546000905b80821015610a5757600e82815481106109b4576109b4611684565b6000918252602090912001546001600160a01b0316632e17de788684600381106109e0576109e0611684565b60200201516040518263ffffffff1660e01b8152600401610a0391815260200190565b6020604051808303816000875af1158015610a22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a469190611787565b50610a5082611805565b9150610999565b600091505b80821015610b0e57600e8281548110610a7757610a77611684565b6000918252602090912001546001600160a01b0316633a4b66f1858460038110610aa357610aa3611684565b60200201516040518263ffffffff1660e01b815260040160206040518083038185885af1158015610ad8573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610afd9190611787565b50610b0782611805565b9150610a5c565b8260026000828254610b209190611717565b9091555060649050610b33846050611751565b610b3d919061172f565b60036000828254610b4e9190611717565b9091555060649050610b61846014611751565b610b6b919061172f565b60046000828254610b7c9190611717565b90915550505050505050565b600a544211610b9657600080fd5b600d546007546040516331a9108f60e11b81526001600160a01b0390921691636352211e91610bcb9160040190815260200190565b602060405180830381865afa158015610be8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0c919061181e565b6001600160a01b0316336001600160a01b031614610c2957600080fd5b600060065460ff166002811115610c4257610c426115ea565b14610c4c57600080fd5b6006805460ff1916600217905560055460405133916108fc811502916000818181858888f19350505050158015610c87573d6000803e3d6000fd5b5060006005819055600455565b600a544211610ca257600080fd5b600d546007546040516331a9108f60e11b81526001600160a01b0390921691636352211e91610cd79160040190815260200190565b602060405180830381865afa158015610cf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d18919061181e565b6001600160a01b0316336001600160a01b031614610d3557600080fd5b600060065460ff166002811115610d4e57610d4e6115ea565b14610d5857600080fd5b6006805460ff19166001179055600060055560048054600c546040517f40c10f1900000000000000000000000000000000000000000000000000000000815233938101939093526024830182905290916001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015610dd757600080fd5b505af1158015610deb573d6000803e3d6000fd5b50506000600455505050565b600b544211610e0557600080fd5b600d546007546040516331a9108f60e11b815260048101919091526064916001600160a01b031690636352211e90602401602060405180830381865afa158015610e53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e77919061181e565b6001600160a01b03166108fc6005549081150290604051600060405180830381858888f19350505050158015610eb1573d6000803e3d6000fd5b50600554610ebf9082611770565b6000600581905554909150610ed49082611770565b90508060026000828254610ee89190611717565b9091555060649050610efb826050611751565b610f05919061172f565b60036000828254610f169190611717565b9091555060649050610f29826014611751565b610f33919061172f565b60046000828254610f449190611717565b9091555050600454600354600091610f5b91611717565b90506000600c60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd691906116e8565b905060006003548284600254610fec919061172f565b610ff69190611717565b6110009190611751565b905060006004548385600254611016919061172f565b6110209190611717565b61102a9190611751565b9050816002600082825461103e9190611770565b9250508190555080600260008282546110579190611770565b9091555050600d546007546040516331a9108f60e11b81526001600160a01b0390921691636352211e916110919160040190815260200190565b602060405180830381865afa1580156110ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d2919061181e565b6001600160a01b03166108fc829081150290604051600060405180830381858888f1935050505015801561110a573d6000803e3d6000fd5b50506000600381905560045550505050565b60095460ff161561112c57600080fd5b600d546040516331a9108f60e11b8152600481018390526001600160a01b0390911690636352211e90602401602060405180830381865afa158015611175573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611199919061181e565b6001600160a01b0316336001600160a01b0316146111b657600080fd5b600d546040517f42966c68000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b03909116906342966c6890602401600060405180830381600087803b15801561121557600080fd5b505af1158015611229573d6000803e3d6000fd5b505060075460009081526008602052604080822054905190935033925083156108fc0291849190818181858888f1935050505015801561126d573d6000803e3d6000fd5b505060075460009081526008602052604081205550565b600d54604080517fe7ed7a16000000000000000000000000000000000000000000000000000000008152336004820152835160248201526020840151604482015290830151606482015260009182916001600160a01b039091169063e7ed7a16906084016020604051808303816000875af1158015611307573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132b91906116e8565b600081815260086020908152604091829020349055815183815233918101919091529192507fd4d4139490bb68d51c7e44136824a141720db6547b332e8bb8f307453b0d9ca6910160405180910390a192915050565b600e818154811061139157600080fd5b6000918252602090912001546001600160a01b0316905081565b604080516002808252606082018352600092839291906020830190803683370190505090506000816000815181106113e5576113e5611684565b602002602001018181525050828160018151811061140557611405611684565b6020908102919091010152600f5460405162b2775760e61b81526001600160a01b0390911690632c9dd5c090611441908790859060040161169a565b6020604051808303816000875af1158015611460573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148491906116e8565b50826000808282546114969190611717565b90915550506001839055600380548491906000906114b5908490611717565b90915550600195945050505050565b60405180606001604052806003906020820280368337509192915050565b600080604083850312156114f557600080fd5b50508035926020909101359150565b60006020828403121561151657600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156115565761155661151d565b60405290565b600082601f83011261156d57600080fd5b611575611533565b80606084018581111561158757600080fd5b845b818110156115a1578035845260209384019301611589565b509095945050505050565b600080600060e084860312156115c157600080fd5b6115cb858561155c565b92506115da856060860161155c565b915060c084013590509250925092565b634e487b7160e01b600052602160045260246000fd5b602081016003831061162257634e487b7160e01b600052602160045260246000fd5b91905290565b60006060828403121561163a57600080fd5b6040516060810181811067ffffffffffffffff8211171561165d5761165d61151d565b80604052508235815260208301356020820152604083013560408201528091505092915050565b634e487b7160e01b600052603260045260246000fd5b6000604082018483526020604081850152818551808452606086019150828701935060005b818110156116db578451835293830193918301916001016116bf565b5090979650505050505050565b6000602082840312156116fa57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561172a5761172a611701565b500190565b60008261174c57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561176b5761176b611701565b500290565b60008282101561178257611782611701565b500390565b60006020828403121561179957600080fd5b815180151581146117a957600080fd5b9392505050565b6000606082840312156117c257600080fd5b82601f8301126117d157600080fd5b6117d9611533565b8060608401858111156117eb57600080fd5b845b818110156115a15780518452602093840193016117ed565b60006001820161181757611817611701565b5060010190565b60006020828403121561183057600080fd5b81516001600160a01b03811681146117a957600080fdfea2646970667358221220755641c1f51be0aa059bd178718c023e59009fcd6b6e0ebf0644acf0304d00e264736f6c634300080f0033608060405234801561001057600080fd5b50610207806100206000396000f3fe60806040526004361061005a5760003560e01c80632e17de78116100435780632e17de781461009b5780633a4b66f1146100cb578063b69ef8a8146100d657600080fd5b80631b3ed7221461005f57806329eb841d14610088575b600080fd5b34801561006b57600080fd5b5061007560015481565b6040519081526020015b60405180910390f35b610075610096366004610153565b6100ec565b3480156100a757600080fd5b506100bb6100b6366004610153565b610102565b604051901515815260200161007f565b3460005560016100bb565b3480156100e257600080fd5b5061007560005481565b600080546100fa908361019b565b600055919050565b60008160008082825461011591906101ba565b90915550506040513390819084156108fc029085906000818181858888f19350505050158015610149573d6000803e3d6000fd5b5060019392505050565b60006020828403121561016557600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160001904831182151516156101b5576101b561016c565b500290565b6000828210156101cc576101cc61016c565b50039056fea264697066735822122070b5ac47ceecbc353ca2e12879e75e767369bf4d01e4b3abe7572ed5ccc9bfe564736f6c634300080f0033608060405234801561001057600080fd5b50610207806100206000396000f3fe60806040526004361061005a5760003560e01c80632e17de78116100435780632e17de781461009b5780633a4b66f1146100cb578063b69ef8a8146100d657600080fd5b80631b3ed7221461005f57806329eb841d14610088575b600080fd5b34801561006b57600080fd5b5061007560015481565b6040519081526020015b60405180910390f35b610075610096366004610153565b6100ec565b3480156100a757600080fd5b506100bb6100b6366004610153565b610102565b604051901515815260200161007f565b3460005560016100bb565b3480156100e257600080fd5b5061007560005481565b600080546100fa908361019b565b600055919050565b60008160008082825461011591906101ba565b90915550506040513390819084156108fc029085906000818181858888f19350505050158015610149573d6000803e3d6000fd5b5060019392505050565b60006020828403121561016557600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160001904831182151516156101b5576101b561016c565b500290565b6000828210156101cc576101cc61016c565b50039056fea2646970667358221220e8ce3d9e3a05ac5085cac7fee4be1c484aee8dacbbead8f0b3234b692cd6493864736f6c634300080f0033608060405234801561001057600080fd5b50610207806100206000396000f3fe60806040526004361061005a5760003560e01c80632e17de78116100435780632e17de781461009b5780633a4b66f1146100cb578063b69ef8a8146100d657600080fd5b80631b3ed7221461005f57806329eb841d14610088575b600080fd5b34801561006b57600080fd5b5061007560015481565b6040519081526020015b60405180910390f35b610075610096366004610153565b6100ec565b3480156100a757600080fd5b506100bb6100b6366004610153565b610102565b604051901515815260200161007f565b3460005560016100bb565b3480156100e257600080fd5b5061007560005481565b600080546100fa908361019b565b600055919050565b60008160008082825461011591906101ba565b90915550506040513390819084156108fc029085906000818181858888f19350505050158015610149573d6000803e3d6000fd5b5060019392505050565b60006020828403121561016557600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160001904831182151516156101b5576101b561016c565b500290565b6000828210156101cc576101cc61016c565b50039056fea2646970667358221220c22c26294318db674ff61a94cdb1ec80fec1a8acd0657627d369c7178526038c64736f6c634300080f003360e06040523480156200001157600080fd5b506040518060400160405280600681526020016553747261747360d01b8152506040518060400160405280600481526020016314d5149560e21b81525060128260009081620000619190620001d4565b506001620000708382620001d4565b5060ff81166080524660a0526200008662000093565b60c052506200031e915050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051620000c79190620002a0565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200015a57607f821691505b6020821081036200017b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001cf57600081815260208120601f850160051c81016020861015620001aa5750805b601f850160051c820191505b81811015620001cb57828155600101620001b6565b5050505b505050565b81516001600160401b03811115620001f057620001f06200012f565b620002088162000201845462000145565b8462000181565b602080601f831160018114620002405760008415620002275750858301515b600019600386901b1c1916600185901b178555620001cb565b600085815260208120601f198616915b82811015620002715788860151825594840194600190910190840162000250565b5085821015620002905787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000808354620002b08162000145565b60018281168015620002cb5760018114620002e15762000312565b60ff198416875282151583028701945062000312565b8760005260208060002060005b85811015620003095781548a820152908401908201620002ee565b50505082870194505b50929695505050505050565b60805160a05160c051610c626200034e6000396000610495015260006104600152600061016a0152610c626000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806370a08231116100975780639dc29fac116100665780639dc29fac1461020c578063a9059cbb1461021f578063d505accf14610232578063dd62ed3e1461024557600080fd5b806370a08231146101bb578063771282f6146101db5780637ecebe00146101e457806395d89b411461020457600080fd5b806323b872dd116100d357806323b872dd14610152578063313ce567146101655780633644e5151461019e57806340c10f19146101a657600080fd5b806306fdde03146100fa578063095ea7b31461011857806318160ddd1461013b575b600080fd5b610102610270565b60405161010f9190610956565b60405180910390f35b61012b6101263660046109c7565b6102fe565b604051901515815260200161010f565b61014460025481565b60405190815260200161010f565b61012b6101603660046109f1565b61036a565b61018c7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff909116815260200161010f565b61014461045c565b6101b96101b43660046109c7565b6104b7565b005b6101446101c9366004610a2d565b60036020526000908152604090205481565b61014460065481565b6101446101f2366004610a2d565b60056020526000908152604090205481565b6101026104da565b6101b961021a3660046109c7565b6104e7565b61012b61022d3660046109c7565b6104f1565b6101b9610240366004610a4f565b610569565b610144610253366004610ac2565b600460209081526000928352604080842090915290825290205481565b6000805461027d90610af5565b80601f01602080910402602001604051908101604052809291908181526020018280546102a990610af5565b80156102f65780601f106102cb576101008083540402835291602001916102f6565b820191906000526020600020905b8154815290600101906020018083116102d957829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103599086815260200190565b60405180910390a350600192915050565b6001600160a01b038316600090815260046020908152604080832033845290915281205460001981146103c6576103a18382610b45565b6001600160a01b03861660009081526004602090815260408083203384529091529020555b6001600160a01b038516600090815260036020526040812080548592906103ee908490610b45565b90915550506001600160a01b03808516600081815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104499087815260200190565b60405180910390a3506001949350505050565b60007f000000000000000000000000000000000000000000000000000000000000000046146104925761048d6107dc565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b600680549060006104c783610b5c565b91905055506104d68282610876565b5050565b6001805461027d90610af5565b6104d682826108e2565b33600090815260036020526040812080548391908390610512908490610b45565b90915550506001600160a01b038316600081815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103599086815260200190565b428410156105be5760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b600060016105ca61045c565b6001600160a01b038a811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f19010000000000000000000000000000000000000000000000000000000000006101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156106f1573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906107275750876001600160a01b0316816001600160a01b0316145b6107735760405162461bcd60e51b815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105b5565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f600060405161080e9190610b75565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b80600260008282546108889190610c14565b90915550506001600160a01b0382166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b0382166000908152600360205260408120805483929061090a908490610b45565b90915550506002805482900390556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016108d6565b600060208083528351808285015260005b8181101561098357858101830151858201604001528201610967565b81811115610995576000604083870101525b50601f01601f1916929092016040019392505050565b80356001600160a01b03811681146109c257600080fd5b919050565b600080604083850312156109da57600080fd5b6109e3836109ab565b946020939093013593505050565b600080600060608486031215610a0657600080fd5b610a0f846109ab565b9250610a1d602085016109ab565b9150604084013590509250925092565b600060208284031215610a3f57600080fd5b610a48826109ab565b9392505050565b600080600080600080600060e0888a031215610a6a57600080fd5b610a73886109ab565b9650610a81602089016109ab565b95506040880135945060608801359350608088013560ff81168114610aa557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215610ad557600080fd5b610ade836109ab565b9150610aec602084016109ab565b90509250929050565b600181811c90821680610b0957607f821691505b602082108103610b2957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082821015610b5757610b57610b2f565b500390565b600060018201610b6e57610b6e610b2f565b5060010190565b600080835481600182811c915080831680610b9157607f831692505b60208084108203610bb057634e487b7160e01b86526022600452602486fd5b818015610bc45760018114610bd957610c06565b60ff1986168952841515850289019650610c06565b60008a81526020902060005b86811015610bfe5781548b820152908501908301610be5565b505084890196505b509498975050505050505050565b60008219821115610c2757610c27610b2f565b50019056fea264697066735822122066e1108cb3106bc8f3705d38ce5ae53e44e575ab5ac27c979445f477a3da96bd64736f6c634300080f003360806040523480156200001157600080fd5b506040518060400160405280600681526020016553747261747360d01b8152506040518060400160405280600481526020016314d5149560e21b81525081600090816200005f919062000146565b5060016200006e828262000146565b5050506040518060800160405280605181526020016200168c605191396007906200009a908262000146565b5062000212565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620000cc57607f821691505b602082108103620000ed57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200014157600081815260208120601f850160051c810160208610156200011c5750805b601f850160051c820191505b818110156200013d5782815560010162000128565b5050505b505050565b81516001600160401b03811115620001625762000162620000a1565b6200017a81620001738454620000b7565b84620000f3565b602080601f831160018114620001b25760008415620001995750858301515b600019600386901b1c1916600185901b1785556200013d565b600085815260208120601f198616915b82811015620001e357888601518255948401946001909101908401620001c2565b5085821015620002025787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61146a80620002226000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c806370a08231116100b2578063c87b56dd11610081578063d574ea3d11610066578063d574ea3d146102a4578063e7ed7a16146102ee578063e985e9c51461030157600080fd5b8063c87b56dd14610271578063cfc0cc341461028457600080fd5b806370a082311461022257806395d89b4114610243578063a22cb4651461024b578063b88d4fde1461025e57600080fd5b806323b872dd1161010957806342966c68116100ee57806342966c68146101f45780636352211e146102075780636c0360eb1461021a57600080fd5b806323b872dd146101ce57806342842e0e146101e157600080fd5b806301ffc9a71461013b57806306fdde0314610163578063081812fc14610178578063095ea7b3146101b9575b600080fd5b61014e610149366004610f85565b61032f565b60405190151581526020015b60405180910390f35b61016b6103cc565b60405161015a9190610fd9565b6101a161018636600461100c565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161015a565b6101cc6101c736600461103c565b61045a565b005b6101cc6101dc366004611066565b61055d565b6101cc6101ef366004611066565b61075f565b6101cc61020236600461100c565b610864565b6101a161021536600461100c565b610870565b61016b6108c7565b6102356102303660046110a2565b6108d4565b60405190815260200161015a565b61016b610948565b6101cc6102593660046110bd565b610955565b6101cc61026c3660046110f9565b6109c1565b61016b61027f36600461100c565b610ab6565b61029761029236600461100c565b610aea565b60405161015a9190611194565b6102d36102b236600461100c565b60066020526000908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161015a565b6102356102fc3660046111db565b610b6e565b61014e61030f366004611269565b600560209081526000928352604080842090915290825290205460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316148061039257507f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b806103c657507f5b5e139f000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b600080546103d99061129c565b80601f01602080910402602001604051908101604052809291908181526020018280546104059061129c565b80156104525780601f1061042757610100808354040283529160200191610452565b820191906000526020600020905b81548152906001019060200180831161043557829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b0316338114806104a357506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6104f45760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064015b60405180910390fd5b600082815260046020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000818152600260205260409020546001600160a01b038481169116146105c65760405162461bcd60e51b815260206004820152600a60248201527f57524f4e475f46524f4d0000000000000000000000000000000000000000000060448201526064016104eb565b6001600160a01b03821661061c5760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e5400000000000000000000000000000060448201526064016104eb565b336001600160a01b038416148061065657506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b8061067757506000818152600460205260409020546001600160a01b031633145b6106c35760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a454400000000000000000000000000000000000060448201526064016104eb565b6001600160a01b03808416600081815260036020908152604080832080546000190190559386168083528483208054600101905585835260028252848320805473ffffffffffffffffffffffffffffffffffffffff199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61076a83838361055d565b6001600160a01b0382163b15806108135750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af11580156107e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080791906112d6565b6001600160e01b031916145b61085f5760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016104eb565b505050565b61086d81610bc2565b50565b6000818152600260205260409020546001600160a01b0316806108c25760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b60448201526064016104eb565b919050565b600780546103d99061129c565b60006001600160a01b03821661092c5760405162461bcd60e51b815260206004820152600c60248201527f5a45524f5f41444452455353000000000000000000000000000000000000000060448201526064016104eb565b506001600160a01b031660009081526003602052604090205490565b600180546103d99061129c565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6109cc85858561055d565b6001600160a01b0384163b1580610a635750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610a149033908a908990899089906004016112f3565b6020604051808303816000875af1158015610a33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5791906112d6565b6001600160e01b031916145b610aaf5760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e540000000000000000000000000000000060448201526064016104eb565b5050505050565b60606007610ac383610c9c565b604051602001610ad4929190611363565b6040516020818303038152906040529050919050565b610af2610f51565b610b1660405180606001604052806000815260200160008152602001600081525090565b5050600090815260066020908152604091829020825160608082018552825482526001830154828501908152600290930154828601908152855191820186529151815291519282019290925290519181019190915290565b6000610b8d83600860008154610b839061140d565b9182905550610d3c565b506008805460009081526006602090815260409182902084518155908401516001820155908301516002909101555492915050565b6000818152600260205260409020546001600160a01b031680610c145760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b60448201526064016104eb565b6001600160a01b0381166000818152600360209081526040808320805460001901905585835260028252808320805473ffffffffffffffffffffffffffffffffffffffff1990811690915560049092528083208054909216909155518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60606000610ca983610e6f565b600101905060008167ffffffffffffffff811115610cc957610cc96111c5565b6040519080825280601f01601f191660200182016040528015610cf3576020820181803683370190505b5090508181016020015b600019017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084610cfd57509392505050565b6001600160a01b038216610d925760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e5400000000000000000000000000000060448201526064016104eb565b6000818152600260205260409020546001600160a01b031615610df75760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4d494e54454400000000000000000000000000000000000060448201526064016104eb565b6001600160a01b0382166000818152600360209081526040808320805460010190558483526002909152808220805473ffffffffffffffffffffffffffffffffffffffff19168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310610eb8577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310610ee4576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310610f0257662386f26fc10000830492506010015b6305f5e1008310610f1a576305f5e100830492506008015b6127108310610f2e57612710830492506004015b60648310610f40576064830492506002015b600a83106103c65760010192915050565b60405180606001604052806003906020820280368337509192915050565b6001600160e01b03198116811461086d57600080fd5b600060208284031215610f9757600080fd5b8135610fa281610f6f565b9392505050565b60005b83811015610fc4578181015183820152602001610fac565b83811115610fd3576000848401525b50505050565b6020815260008251806020840152610ff8816040850160208701610fa9565b601f01601f19169190910160400192915050565b60006020828403121561101e57600080fd5b5035919050565b80356001600160a01b03811681146108c257600080fd5b6000806040838503121561104f57600080fd5b61105883611025565b946020939093013593505050565b60008060006060848603121561107b57600080fd5b61108484611025565b925061109260208501611025565b9150604084013590509250925092565b6000602082840312156110b457600080fd5b610fa282611025565b600080604083850312156110d057600080fd5b6110d983611025565b9150602083013580151581146110ee57600080fd5b809150509250929050565b60008060008060006080868803121561111157600080fd5b61111a86611025565b945061112860208701611025565b935060408601359250606086013567ffffffffffffffff8082111561114c57600080fd5b818801915088601f83011261116057600080fd5b81358181111561116f57600080fd5b89602082850101111561118157600080fd5b9699959850939650602001949392505050565b60608101818360005b60038110156111bc57815183526020928301929091019060010161119d565b50505092915050565b634e487b7160e01b600052604160045260246000fd5b60008082840360808112156111ef57600080fd5b6111f884611025565b92506060601f198201121561120c57600080fd5b506040516060810181811067ffffffffffffffff8211171561123e57634e487b7160e01b600052604160045260246000fd5b8060405250602084013581526040840135602082015260608401356040820152809150509250929050565b6000806040838503121561127c57600080fd5b61128583611025565b915061129360208401611025565b90509250929050565b600181811c908216806112b057607f821691505b6020821081036112d057634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156112e857600080fd5b8151610fa281610f6f565b60006001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b60008151611359818560208601610fa9565b9290920192915050565b600080845481600182811c91508083168061137f57607f831692505b6020808410820361139e57634e487b7160e01b86526022600452602486fd5b8180156113b257600181146113c7576113f4565b60ff19861689528415158502890196506113f4565b60008b81526020902060005b868110156113ec5781548b8201529085019083016113d3565b505084890196505b5050505050506114048185611347565b95945050505050565b60006001820161142d57634e487b7160e01b600052601160045260246000fd5b506001019056fea26469706673582212208bf2c2f6fc485a14d6f65a5e0d27f8299631df7dd7d946132e2ddbe392d4c1e464736f6c634300080f003368747470733a2f2f697066732e696f2f697066732f6261667962656963686e7163346e73677136333271346c7a6b77376e69656668686c6b78367579756e6a7071666970696275716b36666976756f652f
Deployed Bytecode
0x6080604052600436106101a15760003560e01c80638156ea26116100e1578063bcd73dfe1161008a578063cf35bdd011610064578063cf35bdd01461041f578063d9f9027f1461043f578063e20e1cea1461045f578063fd53e8fc1461048957600080fd5b8063bcd73dfe146103bf578063c7258ba6146103ec578063c80f3b921461040c57600080fd5b8063a4874d77116100bb578063a4874d7714610374578063ad89b67c14610389578063b83f86631461039f57600080fd5b80638156ea261461033457806399960e641461034a578063a3c13af11461035f57600080fd5b806339e730ab1161014e5780634a2bab98116101285780634a2bab98146102cb5780635faa65ff146102e157806369986e57146102f757806375e1252c1461030d57600080fd5b806339e730ab1461025d5780633fd8b02f14610295578063443cbec1146102ab57600080fd5b806328f3c5eb1161017f57806328f3c5eb14610207578063378077a11461022757806337946adb1461024757600080fd5b80630b18de51146101a65780630b9c2f41146101cf5780630dbf0a45146101f1575b600080fd5b3480156101b257600080fd5b506101bc60045481565b6040519081526020015b60405180910390f35b3480156101db57600080fd5b506101ef6101ea3660046114e2565b6104a9565b005b3480156101fd57600080fd5b506101bc60005481565b34801561021357600080fd5b506101ef610222366004611504565b6105d6565b34801561023357600080fd5b506101ef610242366004611504565b610767565b34801561025357600080fd5b506101bc60055481565b34801561026957600080fd5b50600f5461027d906001600160a01b031681565b6040516001600160a01b0390911681526020016101c6565b3480156102a157600080fd5b506101bc600a5481565b3480156102b757600080fd5b506101ef6102c63660046115ac565b610992565b3480156102d757600080fd5b506101bc60075481565b3480156102ed57600080fd5b506101bc600b5481565b34801561030357600080fd5b506101bc60035481565b34801561031957600080fd5b506006546103279060ff1681565b6040516101c69190611600565b34801561034057600080fd5b506101bc60025481565b34801561035657600080fd5b506101ef610b88565b34801561036b57600080fd5b506101ef610c94565b34801561038057600080fd5b506101ef610df7565b34801561039557600080fd5b506101bc60015481565b3480156103ab57600080fd5b50600c5461027d906001600160a01b031681565b3480156103cb57600080fd5b506101bc6103da366004611504565b60086020526000908152604090205481565b3480156103f857600080fd5b506101ef610407366004611504565b61111c565b6101bc61041a366004611628565b611284565b34801561042b57600080fd5b5061027d61043a366004611504565b611381565b34801561044b57600080fd5b50600d5461027d906001600160a01b031681565b34801561046b57600080fd5b506009546104799060ff1681565b60405190151581526020016101c6565b34801561049557600080fd5b506104796104a43660046114e2565b6113ab565b6040805160028082526060820183526000926020830190803683370190505090506001816000815181106104df576104df611684565b60200260200101818152505081816001815181106104ff576104ff611684565b6020908102919091010152600f5460405162b2775760e61b81526001600160a01b0390911690632c9dd5c09061053b908690859060040161169a565b6020604051808303816000875af115801561055a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057e91906116e8565b5060078290556000828152600860205260408120546002819055600581905560048054919290916105b0908490611717565b909155505060075460009081526008602052604081205550506009805460ff1916905550565b60006004546003546105e89190611717565b90506000600c60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561063f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061066391906116e8565b90506000838284600254610677919061172f565b6106819190611717565b61068b9190611751565b9050806002600082825461069f9190611770565b9091555050600c546040517fa9059cbb000000000000000000000000000000000000000000000000000000008152306004820152602481018690526001600160a01b039091169063a9059cbb906044016020604051808303816000875af115801561070e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107329190611787565b50604051339082156108fc029083906000818181858888f19350505050158015610760573d6000803e3d6000fd5b5050505050565b6040805160018082528183019092526000916020808301908036833701905050905060028160008151811061079e5761079e611684565b6020908102919091010152600f5460405162b2775760e61b81526001600160a01b0390911690632c9dd5c0906107da908590859060040161169a565b6020604051808303816000875af11580156107f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081d91906116e8565b506000546108296114c4565b600d546007546040517fcfc0cc340000000000000000000000000000000000000000000000000000000081526001600160a01b039092169163cfc0cc34916108779160040190815260200190565b606060405180830381865afa158015610894573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b891906117b0565b600e549091506000905b8082101561098a57600e82815481106108dd576108dd611684565b6000918252602090912001546001600160a01b0316633a4b66f1606485856003811061090b5761090b611684565b602002015161091a9088611751565b610924919061172f565b6040518263ffffffff1660e01b815260040160206040518083038185885af1158015610954573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906109799190611787565b5061098382611805565b91506108c2565b505050505050565b600e546000905b80821015610a5757600e82815481106109b4576109b4611684565b6000918252602090912001546001600160a01b0316632e17de788684600381106109e0576109e0611684565b60200201516040518263ffffffff1660e01b8152600401610a0391815260200190565b6020604051808303816000875af1158015610a22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a469190611787565b50610a5082611805565b9150610999565b600091505b80821015610b0e57600e8281548110610a7757610a77611684565b6000918252602090912001546001600160a01b0316633a4b66f1858460038110610aa357610aa3611684565b60200201516040518263ffffffff1660e01b815260040160206040518083038185885af1158015610ad8573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610afd9190611787565b50610b0782611805565b9150610a5c565b8260026000828254610b209190611717565b9091555060649050610b33846050611751565b610b3d919061172f565b60036000828254610b4e9190611717565b9091555060649050610b61846014611751565b610b6b919061172f565b60046000828254610b7c9190611717565b90915550505050505050565b600a544211610b9657600080fd5b600d546007546040516331a9108f60e11b81526001600160a01b0390921691636352211e91610bcb9160040190815260200190565b602060405180830381865afa158015610be8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0c919061181e565b6001600160a01b0316336001600160a01b031614610c2957600080fd5b600060065460ff166002811115610c4257610c426115ea565b14610c4c57600080fd5b6006805460ff1916600217905560055460405133916108fc811502916000818181858888f19350505050158015610c87573d6000803e3d6000fd5b5060006005819055600455565b600a544211610ca257600080fd5b600d546007546040516331a9108f60e11b81526001600160a01b0390921691636352211e91610cd79160040190815260200190565b602060405180830381865afa158015610cf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d18919061181e565b6001600160a01b0316336001600160a01b031614610d3557600080fd5b600060065460ff166002811115610d4e57610d4e6115ea565b14610d5857600080fd5b6006805460ff19166001179055600060055560048054600c546040517f40c10f1900000000000000000000000000000000000000000000000000000000815233938101939093526024830182905290916001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015610dd757600080fd5b505af1158015610deb573d6000803e3d6000fd5b50506000600455505050565b600b544211610e0557600080fd5b600d546007546040516331a9108f60e11b815260048101919091526064916001600160a01b031690636352211e90602401602060405180830381865afa158015610e53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e77919061181e565b6001600160a01b03166108fc6005549081150290604051600060405180830381858888f19350505050158015610eb1573d6000803e3d6000fd5b50600554610ebf9082611770565b6000600581905554909150610ed49082611770565b90508060026000828254610ee89190611717565b9091555060649050610efb826050611751565b610f05919061172f565b60036000828254610f169190611717565b9091555060649050610f29826014611751565b610f33919061172f565b60046000828254610f449190611717565b9091555050600454600354600091610f5b91611717565b90506000600c60009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd691906116e8565b905060006003548284600254610fec919061172f565b610ff69190611717565b6110009190611751565b905060006004548385600254611016919061172f565b6110209190611717565b61102a9190611751565b9050816002600082825461103e9190611770565b9250508190555080600260008282546110579190611770565b9091555050600d546007546040516331a9108f60e11b81526001600160a01b0390921691636352211e916110919160040190815260200190565b602060405180830381865afa1580156110ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d2919061181e565b6001600160a01b03166108fc829081150290604051600060405180830381858888f1935050505015801561110a573d6000803e3d6000fd5b50506000600381905560045550505050565b60095460ff161561112c57600080fd5b600d546040516331a9108f60e11b8152600481018390526001600160a01b0390911690636352211e90602401602060405180830381865afa158015611175573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611199919061181e565b6001600160a01b0316336001600160a01b0316146111b657600080fd5b600d546040517f42966c68000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b03909116906342966c6890602401600060405180830381600087803b15801561121557600080fd5b505af1158015611229573d6000803e3d6000fd5b505060075460009081526008602052604080822054905190935033925083156108fc0291849190818181858888f1935050505015801561126d573d6000803e3d6000fd5b505060075460009081526008602052604081205550565b600d54604080517fe7ed7a16000000000000000000000000000000000000000000000000000000008152336004820152835160248201526020840151604482015290830151606482015260009182916001600160a01b039091169063e7ed7a16906084016020604051808303816000875af1158015611307573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132b91906116e8565b600081815260086020908152604091829020349055815183815233918101919091529192507fd4d4139490bb68d51c7e44136824a141720db6547b332e8bb8f307453b0d9ca6910160405180910390a192915050565b600e818154811061139157600080fd5b6000918252602090912001546001600160a01b0316905081565b604080516002808252606082018352600092839291906020830190803683370190505090506000816000815181106113e5576113e5611684565b602002602001018181525050828160018151811061140557611405611684565b6020908102919091010152600f5460405162b2775760e61b81526001600160a01b0390911690632c9dd5c090611441908790859060040161169a565b6020604051808303816000875af1158015611460573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148491906116e8565b50826000808282546114969190611717565b90915550506001839055600380548491906000906114b5908490611717565b90915550600195945050505050565b60405180606001604052806003906020820280368337509192915050565b600080604083850312156114f557600080fd5b50508035926020909101359150565b60006020828403121561151657600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156115565761155661151d565b60405290565b600082601f83011261156d57600080fd5b611575611533565b80606084018581111561158757600080fd5b845b818110156115a1578035845260209384019301611589565b509095945050505050565b600080600060e084860312156115c157600080fd5b6115cb858561155c565b92506115da856060860161155c565b915060c084013590509250925092565b634e487b7160e01b600052602160045260246000fd5b602081016003831061162257634e487b7160e01b600052602160045260246000fd5b91905290565b60006060828403121561163a57600080fd5b6040516060810181811067ffffffffffffffff8211171561165d5761165d61151d565b80604052508235815260208301356020820152604083013560408201528091505092915050565b634e487b7160e01b600052603260045260246000fd5b6000604082018483526020604081850152818551808452606086019150828701935060005b818110156116db578451835293830193918301916001016116bf565b5090979650505050505050565b6000602082840312156116fa57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561172a5761172a611701565b500190565b60008261174c57634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561176b5761176b611701565b500290565b60008282101561178257611782611701565b500390565b60006020828403121561179957600080fd5b815180151581146117a957600080fd5b9392505050565b6000606082840312156117c257600080fd5b82601f8301126117d157600080fd5b6117d9611533565b8060608401858111156117eb57600080fd5b845b818110156115a15780518452602093840193016117ed565b60006001820161181757611817611701565b5060010190565b60006020828403121561183057600080fd5b81516001600160a01b03811681146117a957600080fdfea2646970667358221220755641c1f51be0aa059bd178718c023e59009fcd6b6e0ebf0644acf0304d00e264736f6c634300080f0033
Deployed Bytecode Sourcemap
32537:7586:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32711:42;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;32711:42:0;;;;;;;;34855:614;;;;;;;;;;-1:-1:-1;34855:614:0;;;;;:::i;:::-;;:::i;:::-;;32562:27;;;;;;;;;;;;;;;;37937:431;;;;;;;;;;-1:-1:-1;37937:431:0;;;;;:::i;:::-;;:::i;35477:711::-;;;;;;;;;;-1:-1:-1;35477:711:0;;;;;:::i;:::-;;:::i;32760:37::-;;;;;;;;;;;;;;;;33136:33;;;;;;;;;;-1:-1:-1;33136:33:0;;;;-1:-1:-1;;;;;33136:33:0;;;;;;-1:-1:-1;;;;;820:55:1;;;802:74;;790:2;775:18;33136:33:0;634:248:1;32984:25:0;;;;;;;;;;;;;;;;36196:854;;;;;;;;;;-1:-1:-1;36196:854:0;;;;;:::i;:::-;;:::i;32853:29::-;;;;;;;;;;;;;;;;33016:24;;;;;;;;;;;;;;;;32668:36;;;;;;;;;;;;;;;;32804:42;;;;;;;;;;-1:-1:-1;32804:42:0;;;;;;;;;;;;;;;:::i;32633:28::-;;;;;;;;;;;;;;;;37516:413;;;;;;;;;;;;;:::i;37058:450::-;;;;;;;;;;;;;:::i;38376:1406::-;;;;;;;;;;;;;:::i;32596:30::-;;;;;;;;;;;;;;;;33047:14;;;;;;;;;;-1:-1:-1;33047:14:0;;;;-1:-1:-1;;;;;33047:14:0;;;32889:49;;;;;;;;;;-1:-1:-1;32889:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;39790:330;;;;;;;;;;-1:-1:-1;39790:330:0;;;;;:::i;:::-;;:::i;34080:272::-;;;;;;:::i;:::-;;:::i;33103:26::-;;;;;;;;;;-1:-1:-1;33103:26:0;;;;;:::i;:::-;;:::i;33068:28::-;;;;;;;;;;-1:-1:-1;33068:28:0;;;;-1:-1:-1;;;;;33068:28:0;;;32945:32;;;;;;;;;;-1:-1:-1;32945:32:0;;;;;;;;;;;4301:14:1;;4294:22;4276:41;;4264:2;4249:18;32945:32:0;4136:187:1;34360:487:0;;;;;;;;;;-1:-1:-1;34360:487:0;;;;;:::i;:::-;;:::i;34855:614::-;34974:16;;;34988:1;34974:16;;;;;;;;34947:24;;34974:16;;;;;;;;;;-1:-1:-1;34974:16:0;34947:43;;33324:1;35001:7;35009:1;35001:10;;;;;;;;:::i;:::-;;;;;;:33;;;;;35058:10;35045:7;35053:1;35045:10;;;;;;;;:::i;:::-;;;;;;;;;;:23;35081:12;;:61;;-1:-1:-1;;;35081:61:0;;-1:-1:-1;;;;;35081:12:0;;;;:33;;:61;;35115:17;;35134:7;;35081:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;35155:14:0;:27;;;35209:30;;;;:14;:30;;;;;;35193:13;:46;;;-1:-1:-1;35250:55:0;;;35316:27;:61;;35209:30;;35316:27;;:61;;35209:30;;35316:61;:::i;:::-;;;;-1:-1:-1;;35403:14:0;;35421:1;35388:30;;;:14;:30;;;;;:34;-1:-1:-1;;35433:20:0;:28;;-1:-1:-1;;35433:28:0;;;-1:-1:-1;34855:614:0:o;37937:431::-;37989:18;38034:27;;38010:21;;:51;;;;:::i;:::-;37989:72;;38072:24;38099:3;;;;;;;;;-1:-1:-1;;;;;38099:3:0;-1:-1:-1;;;;;38099:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38072:44;;38129:23;38205:6;38185:16;38172:10;38156:13;;:26;;;;:::i;:::-;:45;;;;:::i;:::-;38155:56;;;;:::i;:::-;38129:82;;38241:15;38224:13;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;38269:3:0;;:35;;;;;38290:4;38269:35;;;6681:74:1;6771:18;;;6764:34;;;-1:-1:-1;;;;;38269:3:0;;;;:12;;6654:18:1;;38269:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;38315:45:0;;38323:10;;38315:45;;;;;38344:15;;38315:45;;;;38344:15;38323:10;38315:45;;;;;;;;;;;;;;;;;;;;;37978:390;;;37937:431;:::o;35477:711::-;35578:16;;;35592:1;35578:16;;;;;;;;;35551:24;;35578:16;;;;;;;;;;;-1:-1:-1;35578:16:0;35551:43;;33365:1;35605:7;35613:1;35605:10;;;;;;;;:::i;:::-;;;;;;;;;;:26;35644:12;;:61;;-1:-1:-1;;;35644:61:0;;-1:-1:-1;;;;;35644:12:0;;;;:33;;:61;;35678:17;;35697:7;;35644:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;35763:25:0;35791:12;35851:26;;:::i;:::-;35901:10;;35924:14;;35901:38;;;;;-1:-1:-1;;;;;35901:10:0;;;;:22;;:38;;;;160:25:1;;;148:2;133:18;;14:177;35901:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36000:6;:13;35890:49;;-1:-1:-1;35952:9:0;;36058:123;36069:13;36065:1;:17;36058:123;;;36104:6;36111:1;36104:9;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;36104:9:0;:15;36163:3;36148:8;36157:1;36148:11;;;;;;;:::i;:::-;;;;;36128:31;;:17;:31;:::i;:::-;36127:39;;;;:::i;:::-;36104:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;36084:3:0;;;:::i;:::-;;;36058:123;;;35540:648;;;;;35477:711;:::o;36196:854::-;36391:6;:13;36343:9;;36415:84;36426:13;36422:1;:17;36415:84;;;36461:6;36468:1;36461:9;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;36461:9:0;:17;36479:4;36484:1;36479:7;;;;;;;:::i;:::-;;;;;36461:26;;;;;;;;;;;;;160:25:1;;148:2;133:18;;14:177;36461:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;36441:3:0;;;:::i;:::-;;;36415:84;;;36601:1;36597:5;;36613:90;36624:13;36620:1;:17;36613:90;;;36659:6;36666:1;36659:9;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;36659:9:0;:15;36682:3;36686:1;36682:6;;;;;;;:::i;:::-;;;;;36659:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;36639:3:0;;;:::i;:::-;;;36613:90;;;36775:11;36758:13;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;36905:3:0;;-1:-1:-1;36885:16:0;36890:11;36885:2;:16;:::i;:::-;36884:24;;;;:::i;:::-;36859:21;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;37039:3:0;;-1:-1:-1;37019:16:0;37024:11;37019:2;:16;:::i;:::-;37018:24;;;;:::i;:::-;36987:27;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;36196:854:0:o;37516:413::-;37582:10;;37564:15;:28;37556:37;;;;;;37626:10;;37645:14;;37626:34;;-1:-1:-1;;;37626:34:0;;-1:-1:-1;;;;;37626:10:0;;;;:18;;:34;;;;160:25:1;;;148:2;133:18;;14:177;37626:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;37612:48:0;:10;-1:-1:-1;;;;;37612:48:0;;37604:57;;;;;;37706:16;37680:22;;;;:42;;;;;;;;:::i;:::-;;37672:51;;;;;;37736:22;:41;;-1:-1:-1;;37736:41:0;37761:16;37736:41;;;37817:22;;37788:52;;37796:10;;37788:52;;;;;-1:-1:-1;37788:52:0;-1:-1:-1;37788:52:0;37817:22;37796:10;37788:52;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37878:1:0;37853:22;:26;;;37890:27;:31;37516:413::o;37058:450::-;37123:10;;37105:15;:28;37097:37;;;;;;37167:10;;37186:14;;37167:34;;-1:-1:-1;;;37167:34:0;;-1:-1:-1;;;;;37167:10:0;;;;:18;;:34;;;;160:25:1;;;148:2;133:18;;14:177;37167:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;37153:48:0;:10;-1:-1:-1;;;;;37153:48:0;;37145:57;;;;;;37247:16;37221:22;;;;:42;;;;;;;;:::i;:::-;;37213:51;;;;;;37277:22;:40;;-1:-1:-1;;37277:40:0;37302:15;37277:40;;;-1:-1:-1;37330:22:0;:26;37387:27;;;37427:3;;:29;;;;;37436:10;37427:29;;;6681:74:1;;;;6771:18;;;6764:34;;;37387:27:0;;-1:-1:-1;;;;;37427:3:0;;;;:8;;6654:18:1;;37427:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37499:1:0;37469:27;:31;-1:-1:-1;;;37058:450:0:o;38376:1406::-;38438:9;;38420:15;:27;38412:36;;;;;;38552:10;;38571:14;;38552:34;;-1:-1:-1;;;38552:34:0;;;;;160:25:1;;;;38518:3:0;;-1:-1:-1;;;;;38552:10:0;;:18;;133::1;;38552:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;38544:52:0;:76;38597:22;;38544:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38655:22:0;;38633:44;;;;:::i;:::-;38715:1;38690:22;:26;;;38751:12;38633:44;;-1:-1:-1;38729:34:0;;38633:44;38729:34;:::i;:::-;;;38793:18;38776:13;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;38946:3:0;;-1:-1:-1;38919:23:0;38924:18;38919:2;:23;:::i;:::-;38918:31;;;;:::i;:::-;38893:21;;:56;;;;;;;:::i;:::-;;;;-1:-1:-1;39094:3:0;;-1:-1:-1;39067:23:0;39072:18;39067:2;:23;:::i;:::-;39066:31;;;;:::i;:::-;39035:27;;:62;;;;;;;:::i;:::-;;;;-1:-1:-1;;39155:27:0;;39131:21;;39110:18;;39131:51;;;:::i;:::-;39110:72;;39193:17;39213:3;;;;;;;;;-1:-1:-1;;;;;39213:3:0;-1:-1:-1;;;;;39213:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39193:37;;39243:27;39316:21;;39303:9;39290:10;39274:13;;:26;;;;:::i;:::-;:38;;;;:::i;:::-;39273:64;;;;:::i;:::-;39243:94;;39348:33;39427:27;;39414:9;39401:10;39385:13;;:26;;;;:::i;:::-;:38;;;;:::i;:::-;39384:70;;;;:::i;:::-;39348:106;;39484:19;39467:13;;:36;;;;;;;:::i;:::-;;;;;;;;39531:25;39514:13;;:42;;;;;;;:::i;:::-;;;;-1:-1:-1;;39623:10:0;;39642:14;;39623:34;;-1:-1:-1;;;39623:34:0;;-1:-1:-1;;;;;39623:10:0;;;;:18;;:34;;;;160:25:1;;;148:2;133:18;;14:177;39623:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39615:52:0;:79;39668:25;39615:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39731:1:0;39707:21;:25;;;39743:27;:31;-1:-1:-1;;;;38376:1406:0:o;39790:330::-;39846:20;;;;:29;39838:38;;;;;;39909:10;;:22;;-1:-1:-1;;;39909:22:0;;;;;160:25:1;;;-1:-1:-1;;;;;39909:10:0;;;;:18;;133::1;;39909:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;39895:36:0;:10;-1:-1:-1;;;;;39895:36:0;;39887:45;;;;;;39943:10;;:19;;;;;;;;160:25:1;;;-1:-1:-1;;;;;39943:10:0;;;;:15;;133:18:1;;39943:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40005:14:0;;39973;39990:30;;;:14;:30;;;;;;;40031:36;;39990:30;;-1:-1:-1;40039:10:0;;-1:-1:-1;40031:36:0;;;;;39990:30;;40031:36;;39973:14;40031:36;39990:30;40039:10;40031:36;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40093:14:0;;40111:1;40078:30;;;:14;:30;;;;;:34;-1:-1:-1;39790:330:0:o;34080:272::-;34198:10;;:37;;;;;;34214:10;34198:37;;;8376:74:1;8486:13;;8466:18;;;8459:41;8481:2;8542:15;;8536:22;8516:18;;;8509:50;8601:15;;;8595:22;8575:18;;;8568:50;34165:7:0;;;;-1:-1:-1;;;;;34198:10:0;;;;:15;;8348:19:1;;34198:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34246:18;;;;:14;:18;;;;;;;;;34267:9;34246:30;;34292:32;;8803:25:1;;;34313:10:0;8844:18:1;;;8837:83;;;;34246:18:0;;-1:-1:-1;34292:32:0;;8776:18:1;34292:32:0;;;;;;;34342:2;34080:272;-1:-1:-1;;34080:272:0:o;33103:26::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33103:26:0;;-1:-1:-1;33103:26:0;:::o;34360:487::-;34491:16;;;34505:1;34491:16;;;;;;;;34447:4;;;;34491:16;34505:1;34491:16;;;;;;;;;;-1:-1:-1;34491:16:0;34464:43;;33276:1;34518:7;34526:1;34518:10;;;;;;;;:::i;:::-;;;;;;:28;;;;;34570:6;34557:7;34565:1;34557:10;;;;;;;;:::i;:::-;;;;;;;;;;:19;34589:12;;:61;;-1:-1:-1;;;34589:61:0;;-1:-1:-1;;;;;34589:12:0;;;;:33;;:61;;34623:17;;34642:7;;34589:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34679:6;34663:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;34696:15:0;:24;;;34784:21;:31;;34714:6;;34784:21;;;:31;;34714:6;;34784:31;:::i;:::-;;;;-1:-1:-1;34835:4:0;;34360:487;-1:-1:-1;;;;;34360:487:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;196:248:1:-;264:6;272;325:2;313:9;304:7;300:23;296:32;293:52;;;341:1;338;331:12;293:52;-1:-1:-1;;364:23:1;;;434:2;419:18;;;406:32;;-1:-1:-1;196:248:1:o;449:180::-;508:6;561:2;549:9;540:7;536:23;532:32;529:52;;;577:1;574;567:12;529:52;-1:-1:-1;600:23:1;;449:180;-1:-1:-1;449:180:1:o;887:184::-;-1:-1:-1;;;936:1:1;929:88;1036:4;1033:1;1026:15;1060:4;1057:1;1050:15;1076:246;1143:2;1137:9;1185:2;1173:15;;1218:18;1203:34;;1239:22;;;1200:62;1197:88;;;1265:18;;:::i;:::-;1301:2;1294:22;1076:246;:::o;1327:479::-;1377:5;1430:3;1423:4;1415:6;1411:17;1407:27;1397:55;;1448:1;1445;1438:12;1397:55;1472:17;;:::i;:::-;1511:3;1549:2;1541:6;1537:15;1575:3;1567:6;1564:15;1561:35;;;1592:1;1589;1582:12;1561:35;1616:6;1631:146;1647:6;1642:3;1639:15;1631:146;;;1715:17;;1703:30;;1762:4;1753:14;;;;1664;1631:146;;;-1:-1:-1;1795:5:1;;1327:479;-1:-1:-1;;;;;1327:479:1:o;1811:406::-;1934:6;1942;1950;2003:3;1991:9;1982:7;1978:23;1974:33;1971:53;;;2020:1;2017;2010:12;1971:53;2043:44;2079:7;2068:9;2043:44;:::i;:::-;2033:54;;2106:53;2151:7;2146:2;2135:9;2131:18;2106:53;:::i;:::-;2096:63;;2206:3;2195:9;2191:19;2178:33;2168:43;;1811:406;;;;;:::o;2222:184::-;-1:-1:-1;;;2271:1:1;2264:88;2371:4;2368:1;2361:15;2395:4;2392:1;2385:15;2411:402;2560:2;2545:18;;2593:1;2582:13;;2572:201;;-1:-1:-1;;;2626:1:1;2619:88;2730:4;2727:1;2720:15;2758:4;2755:1;2748:15;2572:201;2782:25;;;2411:402;:::o;3060:571::-;3145:6;3198:2;3186:9;3177:7;3173:23;3169:32;3166:52;;;3214:1;3211;3204:12;3166:52;3247:2;3241:9;3289:2;3281:6;3277:15;3358:6;3346:10;3343:22;3322:18;3310:10;3307:34;3304:62;3301:88;;;3369:18;;:::i;:::-;3409:10;3405:2;3398:22;;3457:9;3444:23;3436:6;3429:39;3529:2;3518:9;3514:18;3501:32;3496:2;3488:6;3484:15;3477:57;3595:2;3584:9;3580:18;3567:32;3562:2;3554:6;3550:15;3543:57;3619:6;3609:16;;;3060:571;;;;:::o;4328:184::-;-1:-1:-1;;;4377:1:1;4370:88;4477:4;4474:1;4467:15;4501:4;4498:1;4491:15;4517:703;4687:4;4735:2;4724:9;4720:18;4765:6;4754:9;4747:25;4791:2;4829;4824;4813:9;4809:18;4802:30;4852:6;4887;4881:13;4918:6;4910;4903:22;4956:2;4945:9;4941:18;4934:25;;4994:2;4986:6;4982:15;4968:29;;5015:1;5025:169;5039:6;5036:1;5033:13;5025:169;;;5100:13;;5088:26;;5169:15;;;;5134:12;;;;5061:1;5054:9;5025:169;;;-1:-1:-1;5211:3:1;;4517:703;-1:-1:-1;;;;;;;4517:703:1:o;5225:184::-;5295:6;5348:2;5336:9;5327:7;5323:23;5319:32;5316:52;;;5364:1;5361;5354:12;5316:52;-1:-1:-1;5387:16:1;;5225:184;-1:-1:-1;5225:184:1:o;5414:::-;-1:-1:-1;;;5463:1:1;5456:88;5563:4;5560:1;5553:15;5587:4;5584:1;5577:15;5603:128;5643:3;5674:1;5670:6;5667:1;5664:13;5661:39;;;5680:18;;:::i;:::-;-1:-1:-1;5716:9:1;;5603:128::o;5925:274::-;5965:1;5991;5981:189;;-1:-1:-1;;;6023:1:1;6016:88;6127:4;6124:1;6117:15;6155:4;6152:1;6145:15;5981:189;-1:-1:-1;6184:9:1;;5925:274::o;6204:168::-;6244:7;6310:1;6306;6302:6;6298:14;6295:1;6292:21;6287:1;6280:9;6273:17;6269:45;6266:71;;;6317:18;;:::i;:::-;-1:-1:-1;6357:9:1;;6204:168::o;6377:125::-;6417:4;6445:1;6442;6439:8;6436:34;;;6450:18;;:::i;:::-;-1:-1:-1;6487:9:1;;6377:125::o;6809:277::-;6876:6;6929:2;6917:9;6908:7;6904:23;6900:32;6897:52;;;6945:1;6942;6935:12;6897:52;6977:9;6971:16;7030:5;7023:13;7016:21;7009:5;7006:32;6996:60;;7052:1;7049;7042:12;6996:60;7075:5;6809:277;-1:-1:-1;;;6809:277:1:o;7091:595::-;7184:6;7237:2;7225:9;7216:7;7212:23;7208:32;7205:52;;;7253:1;7250;7243:12;7205:52;7302:7;7295:4;7284:9;7280:20;7276:34;7266:62;;7324:1;7321;7314:12;7266:62;7348:17;;:::i;:::-;7387:3;7428:2;7417:9;7413:18;7454:7;7446:6;7443:19;7440:39;;;7475:1;7472;7465:12;7440:39;7499:9;7517:139;7533:6;7528:3;7525:15;7517:139;;;7601:10;;7589:23;;7641:4;7632:14;;;;7550;7517:139;;7691:135;7730:3;7751:17;;;7748:43;;7771:18;;:::i;:::-;-1:-1:-1;7818:1:1;7807:13;;7691:135::o;7831:313::-;7901:6;7954:2;7942:9;7933:7;7929:23;7925:32;7922:52;;;7970:1;7967;7960:12;7922:52;8002:9;7996:16;-1:-1:-1;;;;;8045:5:1;8041:54;8034:5;8031:65;8021:93;;8110:1;8107;8100:12
Swarm Source
ipfs://8bf2c2f6fc485a14d6f65a5e0d27f8299631df7dd7d946132e2ddbe392d4c1e4
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.