Last active
October 11, 2021 16:15
-
-
Save PatrickAlphaC/ad0c4081cf73db1fd7beeec36926f9ae to your computer and use it in GitHub Desktop.
Created using remix-ide: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://remix.ethereum.org/#version=soljson-v0.6.12+commit.27d51765.js&optimize=false&runs=200&gist=
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.24; | |
import { CBOR as CBOR_Chainlink } from "./vendor/CBOR.sol"; | |
import { Buffer as Buffer_Chainlink } from "./vendor/Buffer.sol"; | |
/** | |
* @title Library for common Chainlink functions | |
* @dev Uses imported CBOR library for encoding to buffer | |
*/ | |
library Chainlink { | |
uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase | |
using CBOR_Chainlink for Buffer_Chainlink.buffer; | |
struct Request { | |
bytes32 id; | |
address callbackAddress; | |
bytes4 callbackFunctionId; | |
uint256 nonce; | |
Buffer_Chainlink.buffer buf; | |
} | |
/** | |
* @notice Initializes a Chainlink request | |
* @dev Sets the ID, callback address, and callback function signature on the request | |
* @param self The uninitialized request | |
* @param _id The Job Specification ID | |
* @param _callbackAddress The callback address | |
* @param _callbackFunction The callback function signature | |
* @return The initialized request | |
*/ | |
function initialize( | |
Request memory self, | |
bytes32 _id, | |
address _callbackAddress, | |
bytes4 _callbackFunction | |
) internal pure returns (Chainlink.Request memory) { | |
Buffer_Chainlink.init(self.buf, defaultBufferSize); | |
self.id = _id; | |
self.callbackAddress = _callbackAddress; | |
self.callbackFunctionId = _callbackFunction; | |
return self; | |
} | |
/** | |
* @notice Sets the data for the buffer without encoding CBOR on-chain | |
* @dev CBOR can be closed with curly-brackets {} or they can be left off | |
* @param self The initialized request | |
* @param _data The CBOR data | |
*/ | |
function setBuffer(Request memory self, bytes _data) | |
internal pure | |
{ | |
Buffer_Chainlink.init(self.buf, _data.length); | |
Buffer_Chainlink.append(self.buf, _data); | |
} | |
/** | |
* @notice Adds a string value to the request with a given key name | |
* @param self The initialized request | |
* @param _key The name of the key | |
* @param _value The string value to add | |
*/ | |
function add(Request memory self, string _key, string _value) | |
internal pure | |
{ | |
self.buf.encodeString(_key); | |
self.buf.encodeString(_value); | |
} | |
/** | |
* @notice Adds a bytes value to the request with a given key name | |
* @param self The initialized request | |
* @param _key The name of the key | |
* @param _value The bytes value to add | |
*/ | |
function addBytes(Request memory self, string _key, bytes _value) | |
internal pure | |
{ | |
self.buf.encodeString(_key); | |
self.buf.encodeBytes(_value); | |
} | |
/** | |
* @notice Adds a int256 value to the request with a given key name | |
* @param self The initialized request | |
* @param _key The name of the key | |
* @param _value The int256 value to add | |
*/ | |
function addInt(Request memory self, string _key, int256 _value) | |
internal pure | |
{ | |
self.buf.encodeString(_key); | |
self.buf.encodeInt(_value); | |
} | |
/** | |
* @notice Adds a uint256 value to the request with a given key name | |
* @param self The initialized request | |
* @param _key The name of the key | |
* @param _value The uint256 value to add | |
*/ | |
function addUint(Request memory self, string _key, uint256 _value) | |
internal pure | |
{ | |
self.buf.encodeString(_key); | |
self.buf.encodeUInt(_value); | |
} | |
/** | |
* @notice Adds an array of strings to the request with a given key name | |
* @param self The initialized request | |
* @param _key The name of the key | |
* @param _values The array of string values to add | |
*/ | |
function addStringArray(Request memory self, string _key, string[] memory _values) | |
internal pure | |
{ | |
self.buf.encodeString(_key); | |
self.buf.startArray(); | |
for (uint256 i = 0; i < _values.length; i++) { | |
self.buf.encodeString(_values[i]); | |
} | |
self.buf.endSequence(); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.24; | |
import "./Chainlink.sol"; | |
import "./interfaces/ENSInterface.sol"; | |
import "./interfaces/LinkTokenInterface.sol"; | |
import "./interfaces/ChainlinkRequestInterface.sol"; | |
import "./interfaces/PointerInterface.sol"; | |
import { ENSResolver as ENSResolver_Chainlink } from "./vendor/ENSResolver.sol"; | |
/** | |
* @title The ChainlinkClient contract | |
* @notice Contract writers can inherit this contract in order to create requests for the | |
* Chainlink network | |
*/ | |
contract ChainlinkClient { | |
using Chainlink for Chainlink.Request; | |
uint256 constant internal LINK = 10**18; | |
uint256 constant private AMOUNT_OVERRIDE = 0; | |
address constant private SENDER_OVERRIDE = 0x0; | |
uint256 constant private ARGS_VERSION = 1; | |
bytes32 constant private ENS_TOKEN_SUBNAME = keccak256("link"); | |
bytes32 constant private ENS_ORACLE_SUBNAME = keccak256("oracle"); | |
address constant private LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571; | |
ENSInterface private ens; | |
bytes32 private ensNode; | |
LinkTokenInterface private link; | |
ChainlinkRequestInterface private oracle; | |
uint256 private requests = 1; | |
mapping(bytes32 => address) private pendingRequests; | |
event ChainlinkRequested(bytes32 indexed id); | |
event ChainlinkFulfilled(bytes32 indexed id); | |
event ChainlinkCancelled(bytes32 indexed id); | |
/** | |
* @notice Creates a request that can hold additional parameters | |
* @param _specId The Job Specification ID that the request will be created for | |
* @param _callbackAddress The callback address that the response will be sent to | |
* @param _callbackFunctionSignature The callback function signature to use for the callback address | |
* @return A Chainlink Request struct in memory | |
*/ | |
function buildChainlinkRequest( | |
bytes32 _specId, | |
address _callbackAddress, | |
bytes4 _callbackFunctionSignature | |
) internal pure returns (Chainlink.Request memory) { | |
Chainlink.Request memory req; | |
return req.initialize(_specId, _callbackAddress, _callbackFunctionSignature); | |
} | |
/** | |
* @notice Creates a Chainlink request to the stored oracle address | |
* @dev Calls `chainlinkRequestTo` with the stored oracle address | |
* @param _req The initialized Chainlink Request | |
* @param _payment The amount of LINK to send for the request | |
* @return The request ID | |
*/ | |
function sendChainlinkRequest(Chainlink.Request memory _req, uint256 _payment) | |
internal | |
returns (bytes32) | |
{ | |
return sendChainlinkRequestTo(oracle, _req, _payment); | |
} | |
/** | |
* @notice Creates a Chainlink request to the specified oracle address | |
* @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to | |
* send LINK which creates a request on the target oracle contract. | |
* Emits ChainlinkRequested event. | |
* @param _oracle The address of the oracle for the request | |
* @param _req The initialized Chainlink Request | |
* @param _payment The amount of LINK to send for the request | |
* @return The request ID | |
*/ | |
function sendChainlinkRequestTo(address _oracle, Chainlink.Request memory _req, uint256 _payment) | |
internal | |
returns (bytes32 requestId) | |
{ | |
requestId = keccak256(abi.encodePacked(this, requests)); | |
_req.nonce = requests; | |
pendingRequests[requestId] = _oracle; | |
emit ChainlinkRequested(requestId); | |
require(link.transferAndCall(_oracle, _payment, encodeRequest(_req)), "unable to transferAndCall to oracle"); | |
requests += 1; | |
return requestId; | |
} | |
/** | |
* @notice Allows a request to be cancelled if it has not been fulfilled | |
* @dev Requires keeping track of the expiration value emitted from the oracle contract. | |
* Deletes the request from the `pendingRequests` mapping. | |
* Emits ChainlinkCancelled event. | |
* @param _requestId The request ID | |
* @param _payment The amount of LINK sent for the request | |
* @param _callbackFunc The callback function specified for the request | |
* @param _expiration The time of the expiration for the request | |
*/ | |
function cancelChainlinkRequest( | |
bytes32 _requestId, | |
uint256 _payment, | |
bytes4 _callbackFunc, | |
uint256 _expiration | |
) | |
internal | |
{ | |
ChainlinkRequestInterface requested = ChainlinkRequestInterface(pendingRequests[_requestId]); | |
delete pendingRequests[_requestId]; | |
emit ChainlinkCancelled(_requestId); | |
requested.cancelOracleRequest(_requestId, _payment, _callbackFunc, _expiration); | |
} | |
/** | |
* @notice Sets the stored oracle address | |
* @param _oracle The address of the oracle contract | |
*/ | |
function setChainlinkOracle(address _oracle) internal { | |
oracle = ChainlinkRequestInterface(_oracle); | |
} | |
/** | |
* @notice Sets the LINK token address | |
* @param _link The address of the LINK token contract | |
*/ | |
function setChainlinkToken(address _link) internal { | |
link = LinkTokenInterface(_link); | |
} | |
/** | |
* @notice Sets the Chainlink token address for the public | |
* network as given by the Pointer contract | |
*/ | |
function setPublicChainlinkToken() internal { | |
setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress()); | |
} | |
/** | |
* @notice Retrieves the stored address of the LINK token | |
* @return The address of the LINK token | |
*/ | |
function chainlinkTokenAddress() | |
internal | |
view | |
returns (address) | |
{ | |
return address(link); | |
} | |
/** | |
* @notice Retrieves the stored address of the oracle contract | |
* @return The address of the oracle contract | |
*/ | |
function chainlinkOracleAddress() | |
internal | |
view | |
returns (address) | |
{ | |
return address(oracle); | |
} | |
/** | |
* @notice Allows for a request which was created on another contract to be fulfilled | |
* on this contract | |
* @param _oracle The address of the oracle contract that will fulfill the request | |
* @param _requestId The request ID used for the response | |
*/ | |
function addChainlinkExternalRequest(address _oracle, bytes32 _requestId) | |
internal | |
notPendingRequest(_requestId) | |
{ | |
pendingRequests[_requestId] = _oracle; | |
} | |
/** | |
* @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS | |
* @dev Accounts for subnodes having different resolvers | |
* @param _ens The address of the ENS contract | |
* @param _node The ENS node hash | |
*/ | |
function useChainlinkWithENS(address _ens, bytes32 _node) | |
internal | |
{ | |
ens = ENSInterface(_ens); | |
ensNode = _node; | |
bytes32 linkSubnode = keccak256(abi.encodePacked(ensNode, ENS_TOKEN_SUBNAME)); | |
ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(linkSubnode)); | |
setChainlinkToken(resolver.addr(linkSubnode)); | |
updateChainlinkOracleWithENS(); | |
} | |
/** | |
* @notice Sets the stored oracle contract with the address resolved by ENS | |
* @dev This may be called on its own as long as `useChainlinkWithENS` has been called previously | |
*/ | |
function updateChainlinkOracleWithENS() | |
internal | |
{ | |
bytes32 oracleSubnode = keccak256(abi.encodePacked(ensNode, ENS_ORACLE_SUBNAME)); | |
ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(oracleSubnode)); | |
setChainlinkOracle(resolver.addr(oracleSubnode)); | |
} | |
/** | |
* @notice Encodes the request to be sent to the oracle contract | |
* @dev The Chainlink node expects values to be in order for the request to be picked up. Order of types | |
* will be validated in the oracle contract. | |
* @param _req The initialized Chainlink Request | |
* @return The bytes payload for the `transferAndCall` method | |
*/ | |
function encodeRequest(Chainlink.Request memory _req) | |
private | |
view | |
returns (bytes memory) | |
{ | |
return abi.encodeWithSelector( | |
oracle.oracleRequest.selector, | |
SENDER_OVERRIDE, // Sender value - overridden by onTokenTransfer by the requesting contract's address | |
AMOUNT_OVERRIDE, // Amount value - overridden by onTokenTransfer by the actual amount of LINK sent | |
_req.id, | |
_req.callbackAddress, | |
_req.callbackFunctionId, | |
_req.nonce, | |
ARGS_VERSION, | |
_req.buf.buf); | |
} | |
/** | |
* @notice Ensures that the fulfillment is valid for this contract | |
* @dev Use if the contract developer prefers methods instead of modifiers for validation | |
* @param _requestId The request ID for fulfillment | |
*/ | |
function validateChainlinkCallback(bytes32 _requestId) | |
internal | |
recordChainlinkFulfillment(_requestId) | |
// solhint-disable-next-line no-empty-blocks | |
{} | |
/** | |
* @dev Reverts if the sender is not the oracle of the request. | |
* Emits ChainlinkFulfilled event. | |
* @param _requestId The request ID for fulfillment | |
*/ | |
modifier recordChainlinkFulfillment(bytes32 _requestId) { | |
require(msg.sender == pendingRequests[_requestId], "Source must be the oracle of the request"); | |
delete pendingRequests[_requestId]; | |
emit ChainlinkFulfilled(_requestId); | |
_; | |
} | |
/** | |
* @dev Reverts if the request is already pending | |
* @param _requestId The request ID for fulfillment | |
*/ | |
modifier notPendingRequest(bytes32 _requestId) { | |
require(pendingRequests[_requestId] == address(0), "Request is already pending"); | |
_; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity >=0.4.24; | |
interface AggregatorInterface { | |
function latestAnswer() external view returns (int256); | |
function latestTimestamp() external view returns (uint256); | |
function latestRound() external view returns (uint256); | |
function getAnswer(uint256 roundId) external view returns (int256); | |
function getTimestamp(uint256 roundId) external view returns (uint256); | |
event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); | |
event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity >=0.4.24; | |
interface AggregatorV3Interface { | |
function decimals() external view returns (uint8); | |
function description() external view returns (string memory); | |
function version() external view returns (uint256); | |
// getRoundData and latestRoundData should both raise "No data present" | |
// if they do not have data to report, instead of returning unset values | |
// which could be misinterpreted as actual reported values. | |
function getRoundData(uint80 _roundId) | |
external | |
view | |
returns ( | |
uint80 roundId, | |
int256 answer, | |
uint256 startedAt, | |
uint256 updatedAt, | |
uint80 answeredInRound | |
); | |
function latestRoundData() | |
external | |
view | |
returns ( | |
uint80 roundId, | |
int256 answer, | |
uint256 startedAt, | |
uint256 updatedAt, | |
uint80 answeredInRound | |
); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.24; | |
interface ChainlinkRequestInterface { | |
function oracleRequest( | |
address sender, | |
uint256 payment, | |
bytes32 id, | |
address callbackAddress, | |
bytes4 callbackFunctionId, | |
uint256 nonce, | |
uint256 version, | |
bytes data | |
) external; | |
function cancelOracleRequest( | |
bytes32 requestId, | |
uint256 payment, | |
bytes4 callbackFunctionId, | |
uint256 expiration | |
) external; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.24; | |
interface ENSInterface { | |
// Logged when the owner of a node assigns a new owner to a subnode. | |
event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner); | |
// Logged when the owner of a node transfers ownership to a new account. | |
event Transfer(bytes32 indexed node, address owner); | |
// Logged when the resolver for a node changes. | |
event NewResolver(bytes32 indexed node, address resolver); | |
// Logged when the TTL of a node changes | |
event NewTTL(bytes32 indexed node, uint64 ttl); | |
function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external; | |
function setResolver(bytes32 node, address resolver) external; | |
function setOwner(bytes32 node, address owner) external; | |
function setTTL(bytes32 node, uint64 ttl) external; | |
function owner(bytes32 node) external view returns (address); | |
function resolver(bytes32 node) external view returns (address); | |
function ttl(bytes32 node) external view returns (uint64); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.24; | |
interface LinkTokenInterface { | |
function allowance(address owner, address spender) external view returns (uint256 remaining); | |
function approve(address spender, uint256 value) external returns (bool success); | |
function balanceOf(address owner) external view returns (uint256 balance); | |
function decimals() external view returns (uint8 decimalPlaces); | |
function decreaseApproval(address spender, uint256 addedValue) external returns (bool success); | |
function increaseApproval(address spender, uint256 subtractedValue) external; | |
function name() external view returns (string tokenName); | |
function symbol() external view returns (string tokenSymbol); | |
function totalSupply() external view returns (uint256 totalTokensIssued); | |
function transfer(address to, uint256 value) external returns (bool success); | |
function transferAndCall(address to, uint256 value, bytes data) external returns (bool success); | |
function transferFrom(address from, address to, uint256 value) external returns (bool success); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.24; | |
interface PointerInterface { | |
function getAddress() external view returns (address); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity >0.4.18; | |
/** | |
* @dev A library for working with mutable byte buffers in Solidity. | |
* | |
* Byte buffers are mutable and expandable, and provide a variety of primitives | |
* for writing to them. At any time you can fetch a bytes object containing the | |
* current contents of the buffer. The bytes object should not be stored between | |
* operations, as it may change due to resizing of the buffer. | |
*/ | |
library Buffer { | |
/** | |
* @dev Represents a mutable buffer. Buffers have a current value (buf) and | |
* a capacity. The capacity may be longer than the current value, in | |
* which case it can be extended without the need to allocate more memory. | |
*/ | |
struct buffer { | |
bytes buf; | |
uint capacity; | |
} | |
/** | |
* @dev Initializes a buffer with an initial capacity. | |
* @param buf The buffer to initialize. | |
* @param capacity The number of bytes of space to allocate the buffer. | |
* @return The buffer, for chaining. | |
*/ | |
function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) { | |
if (capacity % 32 != 0) { | |
capacity += 32 - (capacity % 32); | |
} | |
// Allocate space for the buffer data | |
buf.capacity = capacity; | |
assembly { | |
let ptr := mload(0x40) | |
mstore(buf, ptr) | |
mstore(ptr, 0) | |
mstore(0x40, add(32, add(ptr, capacity))) | |
} | |
return buf; | |
} | |
/** | |
* @dev Initializes a new buffer from an existing bytes object. | |
* Changes to the buffer may mutate the original value. | |
* @param b The bytes object to initialize the buffer with. | |
* @return A new buffer. | |
*/ | |
function fromBytes(bytes memory b) internal pure returns(buffer memory) { | |
buffer memory buf; | |
buf.buf = b; | |
buf.capacity = b.length; | |
return buf; | |
} | |
function resize(buffer memory buf, uint capacity) private pure { | |
bytes memory oldbuf = buf.buf; | |
init(buf, capacity); | |
append(buf, oldbuf); | |
} | |
function max(uint a, uint b) private pure returns(uint) { | |
if (a > b) { | |
return a; | |
} | |
return b; | |
} | |
/** | |
* @dev Sets buffer length to 0. | |
* @param buf The buffer to truncate. | |
* @return The original buffer, for chaining.. | |
*/ | |
function truncate(buffer memory buf) internal pure returns (buffer memory) { | |
assembly { | |
let bufptr := mload(buf) | |
mstore(bufptr, 0) | |
} | |
return buf; | |
} | |
/** | |
* @dev Writes a byte string to a buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The start offset to write to. | |
* @param data The data to append. | |
* @param len The number of bytes to copy. | |
* @return The original buffer, for chaining. | |
*/ | |
function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) { | |
require(len <= data.length); | |
if (off + len > buf.capacity) { | |
resize(buf, max(buf.capacity, len + off) * 2); | |
} | |
uint dest; | |
uint src; | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Length of existing buffer data | |
let buflen := mload(bufptr) | |
// Start address = buffer address + offset + sizeof(buffer length) | |
dest := add(add(bufptr, 32), off) | |
// Update buffer length if we're extending it | |
if gt(add(len, off), buflen) { | |
mstore(bufptr, add(len, off)) | |
} | |
src := add(data, 32) | |
} | |
// Copy word-length chunks while possible | |
for (; len >= 32; len -= 32) { | |
assembly { | |
mstore(dest, mload(src)) | |
} | |
dest += 32; | |
src += 32; | |
} | |
// Copy remaining bytes | |
uint mask = 256 ** (32 - len) - 1; | |
assembly { | |
let srcpart := and(mload(src), not(mask)) | |
let destpart := and(mload(dest), mask) | |
mstore(dest, or(destpart, srcpart)) | |
} | |
return buf; | |
} | |
/** | |
* @dev Appends a byte string to a buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @param len The number of bytes to copy. | |
* @return The original buffer, for chaining. | |
*/ | |
function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) { | |
return write(buf, buf.buf.length, data, len); | |
} | |
/** | |
* @dev Appends a byte string to a buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) { | |
return write(buf, buf.buf.length, data, data.length); | |
} | |
/** | |
* @dev Writes a byte to the buffer. Resizes if doing so would exceed the | |
* capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write the byte at. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) { | |
if (off >= buf.capacity) { | |
resize(buf, buf.capacity * 2); | |
} | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Length of existing buffer data | |
let buflen := mload(bufptr) | |
// Address = buffer address + sizeof(buffer length) + off | |
let dest := add(add(bufptr, off), 32) | |
mstore8(dest, data) | |
// Update buffer length if we extended it | |
if eq(off, buflen) { | |
mstore(bufptr, add(buflen, 1)) | |
} | |
} | |
return buf; | |
} | |
/** | |
* @dev Appends a byte to the buffer. Resizes if doing so would exceed the | |
* capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) { | |
return writeUint8(buf, buf.buf.length, data); | |
} | |
/** | |
* @dev Writes up to 32 bytes to the buffer. Resizes if doing so would | |
* exceed the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write at. | |
* @param data The data to append. | |
* @param len The number of bytes to write (left-aligned). | |
* @return The original buffer, for chaining. | |
*/ | |
function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) { | |
if (len + off > buf.capacity) { | |
resize(buf, (len + off) * 2); | |
} | |
uint mask = 256 ** len - 1; | |
// Right-align data | |
data = data >> (8 * (32 - len)); | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Address = buffer address + sizeof(buffer length) + off + len | |
let dest := add(add(bufptr, off), len) | |
mstore(dest, or(and(mload(dest), not(mask)), data)) | |
// Update buffer length if we extended it | |
if gt(add(off, len), mload(bufptr)) { | |
mstore(bufptr, add(off, len)) | |
} | |
} | |
return buf; | |
} | |
/** | |
* @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the | |
* capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write at. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) { | |
return write(buf, off, bytes32(data), 20); | |
} | |
/** | |
* @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chhaining. | |
*/ | |
function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) { | |
return write(buf, buf.buf.length, bytes32(data), 20); | |
} | |
/** | |
* @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) { | |
return write(buf, buf.buf.length, data, 32); | |
} | |
/** | |
* @dev Writes an integer to the buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write at. | |
* @param data The data to append. | |
* @param len The number of bytes to write (right-aligned). | |
* @return The original buffer, for chaining. | |
*/ | |
function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) { | |
if (len + off > buf.capacity) { | |
resize(buf, (len + off) * 2); | |
} | |
uint mask = 256 ** len - 1; | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Address = buffer address + off + sizeof(buffer length) + len | |
let dest := add(add(bufptr, off), len) | |
mstore(dest, or(and(mload(dest), not(mask)), data)) | |
// Update buffer length if we extended it | |
if gt(add(off, len), mload(bufptr)) { | |
mstore(bufptr, add(off, len)) | |
} | |
} | |
return buf; | |
} | |
/** | |
* @dev Appends a byte to the end of the buffer. Resizes if doing so would | |
* exceed the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer. | |
*/ | |
function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) { | |
return writeInt(buf, buf.buf.length, data, len); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity >= 0.4.19 < 0.7.0; | |
import { Buffer as BufferChainlink } from "./Buffer.sol"; | |
library CBOR { | |
using BufferChainlink for BufferChainlink.buffer; | |
uint8 private constant MAJOR_TYPE_INT = 0; | |
uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1; | |
uint8 private constant MAJOR_TYPE_BYTES = 2; | |
uint8 private constant MAJOR_TYPE_STRING = 3; | |
uint8 private constant MAJOR_TYPE_ARRAY = 4; | |
uint8 private constant MAJOR_TYPE_MAP = 5; | |
uint8 private constant MAJOR_TYPE_TAG = 6; | |
uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7; | |
uint8 private constant TAG_TYPE_BIGNUM = 2; | |
uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3; | |
function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure { | |
if(value <= 23) { | |
buf.appendUint8(uint8((major << 5) | value)); | |
} else if(value <= 0xFF) { | |
buf.appendUint8(uint8((major << 5) | 24)); | |
buf.appendInt(value, 1); | |
} else if(value <= 0xFFFF) { | |
buf.appendUint8(uint8((major << 5) | 25)); | |
buf.appendInt(value, 2); | |
} else if(value <= 0xFFFFFFFF) { | |
buf.appendUint8(uint8((major << 5) | 26)); | |
buf.appendInt(value, 4); | |
} else if(value <= 0xFFFFFFFFFFFFFFFF) { | |
buf.appendUint8(uint8((major << 5) | 27)); | |
buf.appendInt(value, 8); | |
} | |
} | |
function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure { | |
buf.appendUint8(uint8((major << 5) | 31)); | |
} | |
function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure { | |
encodeType(buf, MAJOR_TYPE_INT, value); | |
} | |
function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure { | |
if(value < -0x10000000000000000) { | |
encodeSignedBigNum(buf, value); | |
} else if(value > 0xFFFFFFFFFFFFFFFF) { | |
encodeBigNum(buf, value); | |
} else if(value >= 0) { | |
encodeType(buf, MAJOR_TYPE_INT, uint(value)); | |
} else { | |
encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value)); | |
} | |
} | |
function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure { | |
encodeType(buf, MAJOR_TYPE_BYTES, value.length); | |
buf.append(value); | |
} | |
function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure { | |
buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM)); | |
encodeBytes(buf, abi.encode(uint(value))); | |
} | |
function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure { | |
buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM)); | |
encodeBytes(buf, abi.encode(uint(-1 - input))); | |
} | |
function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure { | |
encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length); | |
buf.append(bytes(value)); | |
} | |
function startArray(BufferChainlink.buffer memory buf) internal pure { | |
encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY); | |
} | |
function startMap(BufferChainlink.buffer memory buf) internal pure { | |
encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP); | |
} | |
function endSequence(BufferChainlink.buffer memory buf) internal pure { | |
encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity 0.4.24; | |
contract ENSResolver { | |
function addr(bytes32 node) public view returns (address); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.24; | |
/** | |
* @title Ownable | |
* @dev The Ownable contract has an owner address, and provides basic authorization control | |
* functions, this simplifies the implementation of "user permissions". | |
*/ | |
contract Ownable { | |
address public owner; | |
event OwnershipRenounced(address indexed previousOwner); | |
event OwnershipTransferred( | |
address indexed previousOwner, | |
address indexed newOwner | |
); | |
/** | |
* @dev The Ownable constructor sets the original `owner` of the contract to the sender | |
* account. | |
*/ | |
constructor() public { | |
owner = msg.sender; | |
} | |
/** | |
* @dev Throws if called by any account other than the owner. | |
*/ | |
modifier onlyOwner() { | |
require(msg.sender == owner); | |
_; | |
} | |
/** | |
* @dev Allows the current owner to relinquish control of the contract. | |
* @notice Renouncing to ownership will leave the contract without an owner. | |
* It will not be possible to call the functions with the `onlyOwner` | |
* modifier anymore. | |
*/ | |
function renounceOwnership() public onlyOwner { | |
emit OwnershipRenounced(owner); | |
owner = address(0); | |
} | |
/** | |
* @dev Allows the current owner to transfer control of the contract to a newOwner. | |
* @param _newOwner The address to transfer ownership to. | |
*/ | |
function transferOwnership(address _newOwner) public onlyOwner { | |
_transferOwnership(_newOwner); | |
} | |
/** | |
* @dev Transfers control of the contract to a newOwner. | |
* @param _newOwner The address to transfer ownership to. | |
*/ | |
function _transferOwnership(address _newOwner) internal { | |
require(_newOwner != address(0)); | |
emit OwnershipTransferred(owner, _newOwner); | |
owner = _newOwner; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.11; | |
/** | |
* @title SafeMath | |
* @dev Math operations with safety checks that throw on error | |
*/ | |
library SafeMathChainlink { | |
/** | |
* @dev Multiplies two numbers, throws on overflow. | |
*/ | |
function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) { | |
// Gas optimization: this is cheaper than asserting 'a' not being zero, but the | |
// benefit is lost if 'b' is also tested. | |
// See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 | |
if (_a == 0) { | |
return 0; | |
} | |
c = _a * _b; | |
assert(c / _a == _b); | |
return c; | |
} | |
/** | |
* @dev Integer division of two numbers, truncating the quotient. | |
*/ | |
function div(uint256 _a, uint256 _b) internal pure returns (uint256) { | |
// assert(_b > 0); // Solidity automatically throws when dividing by 0 | |
// uint256 c = _a / _b; | |
// assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold | |
return _a / _b; | |
} | |
/** | |
* @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). | |
*/ | |
function sub(uint256 _a, uint256 _b) internal pure returns (uint256) { | |
assert(_b <= _a); | |
return _a - _b; | |
} | |
/** | |
* @dev Adds two numbers, throws on overflow. | |
*/ | |
function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) { | |
c = _a + _b; | |
assert(c >= _a); | |
return c; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.6.0; | |
import { CBORChainlink } from "./vendor/CBORChainlink.sol"; | |
import { BufferChainlink } from "./vendor/BufferChainlink.sol"; | |
/** | |
* @title Library for common Chainlink functions | |
* @dev Uses imported CBOR library for encoding to buffer | |
*/ | |
library Chainlink { | |
uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase | |
using CBORChainlink for BufferChainlink.buffer; | |
struct Request { | |
bytes32 id; | |
address callbackAddress; | |
bytes4 callbackFunctionId; | |
uint256 nonce; | |
BufferChainlink.buffer buf; | |
} | |
/** | |
* @notice Initializes a Chainlink request | |
* @dev Sets the ID, callback address, and callback function signature on the request | |
* @param self The uninitialized request | |
* @param _id The Job Specification ID | |
* @param _callbackAddress The callback address | |
* @param _callbackFunction The callback function signature | |
* @return The initialized request | |
*/ | |
function initialize( | |
Request memory self, | |
bytes32 _id, | |
address _callbackAddress, | |
bytes4 _callbackFunction | |
) internal pure returns (Chainlink.Request memory) { | |
BufferChainlink.init(self.buf, defaultBufferSize); | |
self.id = _id; | |
self.callbackAddress = _callbackAddress; | |
self.callbackFunctionId = _callbackFunction; | |
return self; | |
} | |
/** | |
* @notice Sets the data for the buffer without encoding CBOR on-chain | |
* @dev CBOR can be closed with curly-brackets {} or they can be left off | |
* @param self The initialized request | |
* @param _data The CBOR data | |
*/ | |
function setBuffer(Request memory self, bytes memory _data) | |
internal pure | |
{ | |
BufferChainlink.init(self.buf, _data.length); | |
BufferChainlink.append(self.buf, _data); | |
} | |
/** | |
* @notice Adds a string value to the request with a given key name | |
* @param self The initialized request | |
* @param _key The name of the key | |
* @param _value The string value to add | |
*/ | |
function add(Request memory self, string memory _key, string memory _value) | |
internal pure | |
{ | |
self.buf.encodeString(_key); | |
self.buf.encodeString(_value); | |
} | |
/** | |
* @notice Adds a bytes value to the request with a given key name | |
* @param self The initialized request | |
* @param _key The name of the key | |
* @param _value The bytes value to add | |
*/ | |
function addBytes(Request memory self, string memory _key, bytes memory _value) | |
internal pure | |
{ | |
self.buf.encodeString(_key); | |
self.buf.encodeBytes(_value); | |
} | |
/** | |
* @notice Adds a int256 value to the request with a given key name | |
* @param self The initialized request | |
* @param _key The name of the key | |
* @param _value The int256 value to add | |
*/ | |
function addInt(Request memory self, string memory _key, int256 _value) | |
internal pure | |
{ | |
self.buf.encodeString(_key); | |
self.buf.encodeInt(_value); | |
} | |
/** | |
* @notice Adds a uint256 value to the request with a given key name | |
* @param self The initialized request | |
* @param _key The name of the key | |
* @param _value The uint256 value to add | |
*/ | |
function addUint(Request memory self, string memory _key, uint256 _value) | |
internal pure | |
{ | |
self.buf.encodeString(_key); | |
self.buf.encodeUInt(_value); | |
} | |
/** | |
* @notice Adds an array of strings to the request with a given key name | |
* @param self The initialized request | |
* @param _key The name of the key | |
* @param _values The array of string values to add | |
*/ | |
function addStringArray(Request memory self, string memory _key, string[] memory _values) | |
internal pure | |
{ | |
self.buf.encodeString(_key); | |
self.buf.startArray(); | |
for (uint256 i = 0; i < _values.length; i++) { | |
self.buf.encodeString(_values[i]); | |
} | |
self.buf.endSequence(); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.6.0; | |
import "./Chainlink.sol"; | |
import "./interfaces/ENSInterface.sol"; | |
import "./interfaces/LinkTokenInterface.sol"; | |
import "./interfaces/ChainlinkRequestInterface.sol"; | |
import "./interfaces/PointerInterface.sol"; | |
import { ENSResolver as ENSResolver_Chainlink } from "./vendor/ENSResolver.sol"; | |
/** | |
* @title The ChainlinkClient contract | |
* @notice Contract writers can inherit this contract in order to create requests for the | |
* Chainlink network | |
*/ | |
contract ChainlinkClient { | |
using Chainlink for Chainlink.Request; | |
uint256 constant internal LINK = 10**18; | |
uint256 constant private AMOUNT_OVERRIDE = 0; | |
address constant private SENDER_OVERRIDE = address(0); | |
uint256 constant private ARGS_VERSION = 1; | |
bytes32 constant private ENS_TOKEN_SUBNAME = keccak256("link"); | |
bytes32 constant private ENS_ORACLE_SUBNAME = keccak256("oracle"); | |
address constant private LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571; | |
ENSInterface private ens; | |
bytes32 private ensNode; | |
LinkTokenInterface private link; | |
ChainlinkRequestInterface private oracle; | |
uint256 private requestCount = 1; | |
mapping(bytes32 => address) private pendingRequests; | |
event ChainlinkRequested(bytes32 indexed id); | |
event ChainlinkFulfilled(bytes32 indexed id); | |
event ChainlinkCancelled(bytes32 indexed id); | |
/** | |
* @notice Creates a request that can hold additional parameters | |
* @param _specId The Job Specification ID that the request will be created for | |
* @param _callbackAddress The callback address that the response will be sent to | |
* @param _callbackFunctionSignature The callback function signature to use for the callback address | |
* @return A Chainlink Request struct in memory | |
*/ | |
function buildChainlinkRequest( | |
bytes32 _specId, | |
address _callbackAddress, | |
bytes4 _callbackFunctionSignature | |
) internal pure returns (Chainlink.Request memory) { | |
Chainlink.Request memory req; | |
return req.initialize(_specId, _callbackAddress, _callbackFunctionSignature); | |
} | |
/** | |
* @notice Creates a Chainlink request to the stored oracle address | |
* @dev Calls `chainlinkRequestTo` with the stored oracle address | |
* @param _req The initialized Chainlink Request | |
* @param _payment The amount of LINK to send for the request | |
* @return requestId The request ID | |
*/ | |
function sendChainlinkRequest(Chainlink.Request memory _req, uint256 _payment) | |
internal | |
returns (bytes32) | |
{ | |
return sendChainlinkRequestTo(address(oracle), _req, _payment); | |
} | |
/** | |
* @notice Creates a Chainlink request to the specified oracle address | |
* @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to | |
* send LINK which creates a request on the target oracle contract. | |
* Emits ChainlinkRequested event. | |
* @param _oracle The address of the oracle for the request | |
* @param _req The initialized Chainlink Request | |
* @param _payment The amount of LINK to send for the request | |
* @return requestId The request ID | |
*/ | |
function sendChainlinkRequestTo(address _oracle, Chainlink.Request memory _req, uint256 _payment) | |
internal | |
returns (bytes32 requestId) | |
{ | |
requestId = keccak256(abi.encodePacked(this, requestCount)); | |
_req.nonce = requestCount; | |
pendingRequests[requestId] = _oracle; | |
emit ChainlinkRequested(requestId); | |
require(link.transferAndCall(_oracle, _payment, encodeRequest(_req)), "unable to transferAndCall to oracle"); | |
requestCount += 1; | |
return requestId; | |
} | |
/** | |
* @notice Allows a request to be cancelled if it has not been fulfilled | |
* @dev Requires keeping track of the expiration value emitted from the oracle contract. | |
* Deletes the request from the `pendingRequests` mapping. | |
* Emits ChainlinkCancelled event. | |
* @param _requestId The request ID | |
* @param _payment The amount of LINK sent for the request | |
* @param _callbackFunc The callback function specified for the request | |
* @param _expiration The time of the expiration for the request | |
*/ | |
function cancelChainlinkRequest( | |
bytes32 _requestId, | |
uint256 _payment, | |
bytes4 _callbackFunc, | |
uint256 _expiration | |
) | |
internal | |
{ | |
ChainlinkRequestInterface requested = ChainlinkRequestInterface(pendingRequests[_requestId]); | |
delete pendingRequests[_requestId]; | |
emit ChainlinkCancelled(_requestId); | |
requested.cancelOracleRequest(_requestId, _payment, _callbackFunc, _expiration); | |
} | |
/** | |
* @notice Sets the stored oracle address | |
* @param _oracle The address of the oracle contract | |
*/ | |
function setChainlinkOracle(address _oracle) internal { | |
oracle = ChainlinkRequestInterface(_oracle); | |
} | |
/** | |
* @notice Sets the LINK token address | |
* @param _link The address of the LINK token contract | |
*/ | |
function setChainlinkToken(address _link) internal { | |
link = LinkTokenInterface(_link); | |
} | |
/** | |
* @notice Sets the Chainlink token address for the public | |
* network as given by the Pointer contract | |
*/ | |
function setPublicChainlinkToken() internal { | |
setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress()); | |
} | |
/** | |
* @notice Retrieves the stored address of the LINK token | |
* @return The address of the LINK token | |
*/ | |
function chainlinkTokenAddress() | |
internal | |
view | |
returns (address) | |
{ | |
return address(link); | |
} | |
/** | |
* @notice Retrieves the stored address of the oracle contract | |
* @return The address of the oracle contract | |
*/ | |
function chainlinkOracleAddress() | |
internal | |
view | |
returns (address) | |
{ | |
return address(oracle); | |
} | |
/** | |
* @notice Allows for a request which was created on another contract to be fulfilled | |
* on this contract | |
* @param _oracle The address of the oracle contract that will fulfill the request | |
* @param _requestId The request ID used for the response | |
*/ | |
function addChainlinkExternalRequest(address _oracle, bytes32 _requestId) | |
internal | |
notPendingRequest(_requestId) | |
{ | |
pendingRequests[_requestId] = _oracle; | |
} | |
/** | |
* @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS | |
* @dev Accounts for subnodes having different resolvers | |
* @param _ens The address of the ENS contract | |
* @param _node The ENS node hash | |
*/ | |
function useChainlinkWithENS(address _ens, bytes32 _node) | |
internal | |
{ | |
ens = ENSInterface(_ens); | |
ensNode = _node; | |
bytes32 linkSubnode = keccak256(abi.encodePacked(ensNode, ENS_TOKEN_SUBNAME)); | |
ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(linkSubnode)); | |
setChainlinkToken(resolver.addr(linkSubnode)); | |
updateChainlinkOracleWithENS(); | |
} | |
/** | |
* @notice Sets the stored oracle contract with the address resolved by ENS | |
* @dev This may be called on its own as long as `useChainlinkWithENS` has been called previously | |
*/ | |
function updateChainlinkOracleWithENS() | |
internal | |
{ | |
bytes32 oracleSubnode = keccak256(abi.encodePacked(ensNode, ENS_ORACLE_SUBNAME)); | |
ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(oracleSubnode)); | |
setChainlinkOracle(resolver.addr(oracleSubnode)); | |
} | |
/** | |
* @notice Encodes the request to be sent to the oracle contract | |
* @dev The Chainlink node expects values to be in order for the request to be picked up. Order of types | |
* will be validated in the oracle contract. | |
* @param _req The initialized Chainlink Request | |
* @return The bytes payload for the `transferAndCall` method | |
*/ | |
function encodeRequest(Chainlink.Request memory _req) | |
private | |
view | |
returns (bytes memory) | |
{ | |
return abi.encodeWithSelector( | |
oracle.oracleRequest.selector, | |
SENDER_OVERRIDE, // Sender value - overridden by onTokenTransfer by the requesting contract's address | |
AMOUNT_OVERRIDE, // Amount value - overridden by onTokenTransfer by the actual amount of LINK sent | |
_req.id, | |
_req.callbackAddress, | |
_req.callbackFunctionId, | |
_req.nonce, | |
ARGS_VERSION, | |
_req.buf.buf); | |
} | |
/** | |
* @notice Ensures that the fulfillment is valid for this contract | |
* @dev Use if the contract developer prefers methods instead of modifiers for validation | |
* @param _requestId The request ID for fulfillment | |
*/ | |
function validateChainlinkCallback(bytes32 _requestId) | |
internal | |
recordChainlinkFulfillment(_requestId) | |
// solhint-disable-next-line no-empty-blocks | |
{} | |
/** | |
* @dev Reverts if the sender is not the oracle of the request. | |
* Emits ChainlinkFulfilled event. | |
* @param _requestId The request ID for fulfillment | |
*/ | |
modifier recordChainlinkFulfillment(bytes32 _requestId) { | |
require(msg.sender == pendingRequests[_requestId], | |
"Source must be the oracle of the request"); | |
delete pendingRequests[_requestId]; | |
emit ChainlinkFulfilled(_requestId); | |
_; | |
} | |
/** | |
* @dev Reverts if the request is already pending | |
* @param _requestId The request ID for fulfillment | |
*/ | |
modifier notPendingRequest(bytes32 _requestId) { | |
require(pendingRequests[_requestId] == address(0), "Request is already pending"); | |
_; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity >=0.6.0; | |
interface AggregatorV3Interface { | |
function decimals() external view returns (uint8); | |
function description() external view returns (string memory); | |
function version() external view returns (uint256); | |
// getRoundData and latestRoundData should both raise "No data present" | |
// if they do not have data to report, instead of returning unset values | |
// which could be misinterpreted as actual reported values. | |
function getRoundData(uint80 _roundId) | |
external | |
view | |
returns ( | |
uint80 roundId, | |
int256 answer, | |
uint256 startedAt, | |
uint256 updatedAt, | |
uint80 answeredInRound | |
); | |
function latestRoundData() | |
external | |
view | |
returns ( | |
uint80 roundId, | |
int256 answer, | |
uint256 startedAt, | |
uint256 updatedAt, | |
uint80 answeredInRound | |
); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.6.0; | |
interface ChainlinkRequestInterface { | |
function oracleRequest( | |
address sender, | |
uint256 requestPrice, | |
bytes32 serviceAgreementID, | |
address callbackAddress, | |
bytes4 callbackFunctionId, | |
uint256 nonce, | |
uint256 dataVersion, | |
bytes calldata data | |
) external; | |
function cancelOracleRequest( | |
bytes32 requestId, | |
uint256 payment, | |
bytes4 callbackFunctionId, | |
uint256 expiration | |
) external; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.6.0; | |
interface ENSInterface { | |
// Logged when the owner of a node assigns a new owner to a subnode. | |
event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner); | |
// Logged when the owner of a node transfers ownership to a new account. | |
event Transfer(bytes32 indexed node, address owner); | |
// Logged when the resolver for a node changes. | |
event NewResolver(bytes32 indexed node, address resolver); | |
// Logged when the TTL of a node changes | |
event NewTTL(bytes32 indexed node, uint64 ttl); | |
function setSubnodeOwner(bytes32 node, bytes32 label, address _owner) external; | |
function setResolver(bytes32 node, address _resolver) external; | |
function setOwner(bytes32 node, address _owner) external; | |
function setTTL(bytes32 node, uint64 _ttl) external; | |
function owner(bytes32 node) external view returns (address); | |
function resolver(bytes32 node) external view returns (address); | |
function ttl(bytes32 node) external view returns (uint64); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.6.0; | |
interface LinkTokenInterface { | |
function allowance(address owner, address spender) external view returns (uint256 remaining); | |
function approve(address spender, uint256 value) external returns (bool success); | |
function balanceOf(address owner) external view returns (uint256 balance); | |
function decimals() external view returns (uint8 decimalPlaces); | |
function decreaseApproval(address spender, uint256 addedValue) external returns (bool success); | |
function increaseApproval(address spender, uint256 subtractedValue) external; | |
function name() external view returns (string memory tokenName); | |
function symbol() external view returns (string memory tokenSymbol); | |
function totalSupply() external view returns (uint256 totalTokensIssued); | |
function transfer(address to, uint256 value) external returns (bool success); | |
function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success); | |
function transferFrom(address from, address to, uint256 value) external returns (bool success); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.6.0; | |
interface PointerInterface { | |
function getAddress() external view returns (address); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.6.0; | |
/** | |
* @dev A library for working with mutable byte buffers in Solidity. | |
* | |
* Byte buffers are mutable and expandable, and provide a variety of primitives | |
* for writing to them. At any time you can fetch a bytes object containing the | |
* current contents of the buffer. The bytes object should not be stored between | |
* operations, as it may change due to resizing of the buffer. | |
*/ | |
library BufferChainlink { | |
/** | |
* @dev Represents a mutable buffer. Buffers have a current value (buf) and | |
* a capacity. The capacity may be longer than the current value, in | |
* which case it can be extended without the need to allocate more memory. | |
*/ | |
struct buffer { | |
bytes buf; | |
uint capacity; | |
} | |
/** | |
* @dev Initializes a buffer with an initial capacity. | |
* @param buf The buffer to initialize. | |
* @param capacity The number of bytes of space to allocate the buffer. | |
* @return The buffer, for chaining. | |
*/ | |
function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) { | |
if (capacity % 32 != 0) { | |
capacity += 32 - (capacity % 32); | |
} | |
// Allocate space for the buffer data | |
buf.capacity = capacity; | |
assembly { | |
let ptr := mload(0x40) | |
mstore(buf, ptr) | |
mstore(ptr, 0) | |
mstore(0x40, add(32, add(ptr, capacity))) | |
} | |
return buf; | |
} | |
/** | |
* @dev Initializes a new buffer from an existing bytes object. | |
* Changes to the buffer may mutate the original value. | |
* @param b The bytes object to initialize the buffer with. | |
* @return A new buffer. | |
*/ | |
function fromBytes(bytes memory b) internal pure returns(buffer memory) { | |
buffer memory buf; | |
buf.buf = b; | |
buf.capacity = b.length; | |
return buf; | |
} | |
function resize(buffer memory buf, uint capacity) private pure { | |
bytes memory oldbuf = buf.buf; | |
init(buf, capacity); | |
append(buf, oldbuf); | |
} | |
function max(uint a, uint b) private pure returns(uint) { | |
if (a > b) { | |
return a; | |
} | |
return b; | |
} | |
/** | |
* @dev Sets buffer length to 0. | |
* @param buf The buffer to truncate. | |
* @return The original buffer, for chaining.. | |
*/ | |
function truncate(buffer memory buf) internal pure returns (buffer memory) { | |
assembly { | |
let bufptr := mload(buf) | |
mstore(bufptr, 0) | |
} | |
return buf; | |
} | |
/** | |
* @dev Writes a byte string to a buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The start offset to write to. | |
* @param data The data to append. | |
* @param len The number of bytes to copy. | |
* @return The original buffer, for chaining. | |
*/ | |
function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) { | |
require(len <= data.length); | |
if (off + len > buf.capacity) { | |
resize(buf, max(buf.capacity, len + off) * 2); | |
} | |
uint dest; | |
uint src; | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Length of existing buffer data | |
let buflen := mload(bufptr) | |
// Start address = buffer address + offset + sizeof(buffer length) | |
dest := add(add(bufptr, 32), off) | |
// Update buffer length if we're extending it | |
if gt(add(len, off), buflen) { | |
mstore(bufptr, add(len, off)) | |
} | |
src := add(data, 32) | |
} | |
// Copy word-length chunks while possible | |
for (; len >= 32; len -= 32) { | |
assembly { | |
mstore(dest, mload(src)) | |
} | |
dest += 32; | |
src += 32; | |
} | |
// Copy remaining bytes | |
uint mask = 256 ** (32 - len) - 1; | |
assembly { | |
let srcpart := and(mload(src), not(mask)) | |
let destpart := and(mload(dest), mask) | |
mstore(dest, or(destpart, srcpart)) | |
} | |
return buf; | |
} | |
/** | |
* @dev Appends a byte string to a buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @param len The number of bytes to copy. | |
* @return The original buffer, for chaining. | |
*/ | |
function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) { | |
return write(buf, buf.buf.length, data, len); | |
} | |
/** | |
* @dev Appends a byte string to a buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) { | |
return write(buf, buf.buf.length, data, data.length); | |
} | |
/** | |
* @dev Writes a byte to the buffer. Resizes if doing so would exceed the | |
* capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write the byte at. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) { | |
if (off >= buf.capacity) { | |
resize(buf, buf.capacity * 2); | |
} | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Length of existing buffer data | |
let buflen := mload(bufptr) | |
// Address = buffer address + sizeof(buffer length) + off | |
let dest := add(add(bufptr, off), 32) | |
mstore8(dest, data) | |
// Update buffer length if we extended it | |
if eq(off, buflen) { | |
mstore(bufptr, add(buflen, 1)) | |
} | |
} | |
return buf; | |
} | |
/** | |
* @dev Appends a byte to the buffer. Resizes if doing so would exceed the | |
* capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) { | |
return writeUint8(buf, buf.buf.length, data); | |
} | |
/** | |
* @dev Writes up to 32 bytes to the buffer. Resizes if doing so would | |
* exceed the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write at. | |
* @param data The data to append. | |
* @param len The number of bytes to write (left-aligned). | |
* @return The original buffer, for chaining. | |
*/ | |
function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) { | |
if (len + off > buf.capacity) { | |
resize(buf, (len + off) * 2); | |
} | |
uint mask = 256 ** len - 1; | |
// Right-align data | |
data = data >> (8 * (32 - len)); | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Address = buffer address + sizeof(buffer length) + off + len | |
let dest := add(add(bufptr, off), len) | |
mstore(dest, or(and(mload(dest), not(mask)), data)) | |
// Update buffer length if we extended it | |
if gt(add(off, len), mload(bufptr)) { | |
mstore(bufptr, add(off, len)) | |
} | |
} | |
return buf; | |
} | |
/** | |
* @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the | |
* capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write at. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) { | |
return write(buf, off, bytes32(data), 20); | |
} | |
/** | |
* @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chhaining. | |
*/ | |
function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) { | |
return write(buf, buf.buf.length, bytes32(data), 20); | |
} | |
/** | |
* @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) { | |
return write(buf, buf.buf.length, data, 32); | |
} | |
/** | |
* @dev Writes an integer to the buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write at. | |
* @param data The data to append. | |
* @param len The number of bytes to write (right-aligned). | |
* @return The original buffer, for chaining. | |
*/ | |
function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) { | |
if (len + off > buf.capacity) { | |
resize(buf, (len + off) * 2); | |
} | |
uint mask = 256 ** len - 1; | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Address = buffer address + off + sizeof(buffer length) + len | |
let dest := add(add(bufptr, off), len) | |
mstore(dest, or(and(mload(dest), not(mask)), data)) | |
// Update buffer length if we extended it | |
if gt(add(off, len), mload(bufptr)) { | |
mstore(bufptr, add(off, len)) | |
} | |
} | |
return buf; | |
} | |
/** | |
* @dev Appends a byte to the end of the buffer. Resizes if doing so would | |
* exceed the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer. | |
*/ | |
function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) { | |
return writeInt(buf, buf.buf.length, data, len); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity >= 0.4.19 < 0.7.0; | |
import { BufferChainlink } from "./BufferChainlink.sol"; | |
library CBORChainlink { | |
using BufferChainlink for BufferChainlink.buffer; | |
uint8 private constant MAJOR_TYPE_INT = 0; | |
uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1; | |
uint8 private constant MAJOR_TYPE_BYTES = 2; | |
uint8 private constant MAJOR_TYPE_STRING = 3; | |
uint8 private constant MAJOR_TYPE_ARRAY = 4; | |
uint8 private constant MAJOR_TYPE_MAP = 5; | |
uint8 private constant MAJOR_TYPE_TAG = 6; | |
uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7; | |
uint8 private constant TAG_TYPE_BIGNUM = 2; | |
uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3; | |
function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure { | |
if(value <= 23) { | |
buf.appendUint8(uint8((major << 5) | value)); | |
} else if(value <= 0xFF) { | |
buf.appendUint8(uint8((major << 5) | 24)); | |
buf.appendInt(value, 1); | |
} else if(value <= 0xFFFF) { | |
buf.appendUint8(uint8((major << 5) | 25)); | |
buf.appendInt(value, 2); | |
} else if(value <= 0xFFFFFFFF) { | |
buf.appendUint8(uint8((major << 5) | 26)); | |
buf.appendInt(value, 4); | |
} else if(value <= 0xFFFFFFFFFFFFFFFF) { | |
buf.appendUint8(uint8((major << 5) | 27)); | |
buf.appendInt(value, 8); | |
} | |
} | |
function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure { | |
buf.appendUint8(uint8((major << 5) | 31)); | |
} | |
function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure { | |
encodeType(buf, MAJOR_TYPE_INT, value); | |
} | |
function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure { | |
if(value < -0x10000000000000000) { | |
encodeSignedBigNum(buf, value); | |
} else if(value > 0xFFFFFFFFFFFFFFFF) { | |
encodeBigNum(buf, value); | |
} else if(value >= 0) { | |
encodeType(buf, MAJOR_TYPE_INT, uint(value)); | |
} else { | |
encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value)); | |
} | |
} | |
function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure { | |
encodeType(buf, MAJOR_TYPE_BYTES, value.length); | |
buf.append(value); | |
} | |
function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure { | |
buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM)); | |
encodeBytes(buf, abi.encode(uint(value))); | |
} | |
function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure { | |
buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM)); | |
encodeBytes(buf, abi.encode(uint(-1 - input))); | |
} | |
function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure { | |
encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length); | |
buf.append(bytes(value)); | |
} | |
function startArray(BufferChainlink.buffer memory buf) internal pure { | |
encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY); | |
} | |
function startMap(BufferChainlink.buffer memory buf) internal pure { | |
encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP); | |
} | |
function endSequence(BufferChainlink.buffer memory buf) internal pure { | |
encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.6.0; | |
abstract contract ENSResolver { | |
function addr(bytes32 node) public view virtual returns (address); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.7.0; | |
import { CBORChainlink } from "./vendor/CBORChainlink.sol"; | |
import { BufferChainlink } from "./vendor/BufferChainlink.sol"; | |
/** | |
* @title Library for common Chainlink functions | |
* @dev Uses imported CBOR library for encoding to buffer | |
*/ | |
library Chainlink { | |
uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase | |
using CBORChainlink for BufferChainlink.buffer; | |
struct Request { | |
bytes32 id; | |
address callbackAddress; | |
bytes4 callbackFunctionId; | |
uint256 nonce; | |
BufferChainlink.buffer buf; | |
} | |
/** | |
* @notice Initializes a Chainlink request | |
* @dev Sets the ID, callback address, and callback function signature on the request | |
* @param self The uninitialized request | |
* @param jobId The Job Specification ID | |
* @param callbackAddr The callback address | |
* @param callbackFunc The callback function signature | |
* @return The initialized request | |
*/ | |
function initialize( | |
Request memory self, | |
bytes32 jobId, | |
address callbackAddr, | |
bytes4 callbackFunc | |
) | |
internal | |
pure | |
returns ( | |
Chainlink.Request memory | |
) | |
{ | |
BufferChainlink.init(self.buf, defaultBufferSize); | |
self.id = jobId; | |
self.callbackAddress = callbackAddr; | |
self.callbackFunctionId = callbackFunc; | |
return self; | |
} | |
/** | |
* @notice Sets the data for the buffer without encoding CBOR on-chain | |
* @dev CBOR can be closed with curly-brackets {} or they can be left off | |
* @param self The initialized request | |
* @param data The CBOR data | |
*/ | |
function setBuffer( | |
Request memory self, | |
bytes memory data | |
) | |
internal | |
pure | |
{ | |
BufferChainlink.init(self.buf, data.length); | |
BufferChainlink.append(self.buf, data); | |
} | |
/** | |
* @notice Adds a string value to the request with a given key name | |
* @param self The initialized request | |
* @param key The name of the key | |
* @param value The string value to add | |
*/ | |
function add( | |
Request memory self, | |
string memory key, | |
string memory value | |
) | |
internal | |
pure | |
{ | |
self.buf.encodeString(key); | |
self.buf.encodeString(value); | |
} | |
/** | |
* @notice Adds a bytes value to the request with a given key name | |
* @param self The initialized request | |
* @param key The name of the key | |
* @param value The bytes value to add | |
*/ | |
function addBytes( | |
Request memory self, | |
string memory key, | |
bytes memory value | |
) | |
internal | |
pure | |
{ | |
self.buf.encodeString(key); | |
self.buf.encodeBytes(value); | |
} | |
/** | |
* @notice Adds a int256 value to the request with a given key name | |
* @param self The initialized request | |
* @param key The name of the key | |
* @param value The int256 value to add | |
*/ | |
function addInt( | |
Request memory self, | |
string memory key, | |
int256 value | |
) | |
internal | |
pure | |
{ | |
self.buf.encodeString(key); | |
self.buf.encodeInt(value); | |
} | |
/** | |
* @notice Adds a uint256 value to the request with a given key name | |
* @param self The initialized request | |
* @param key The name of the key | |
* @param value The uint256 value to add | |
*/ | |
function addUint( | |
Request memory self, | |
string memory key, | |
uint256 value | |
) | |
internal | |
pure | |
{ | |
self.buf.encodeString(key); | |
self.buf.encodeUInt(value); | |
} | |
/** | |
* @notice Adds an array of strings to the request with a given key name | |
* @param self The initialized request | |
* @param key The name of the key | |
* @param values The array of string values to add | |
*/ | |
function addStringArray( | |
Request memory self, | |
string memory key, | |
string[] memory values | |
) | |
internal | |
pure | |
{ | |
self.buf.encodeString(key); | |
self.buf.startArray(); | |
for (uint256 i = 0; i < values.length; i++) { | |
self.buf.encodeString(values[i]); | |
} | |
self.buf.endSequence(); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.7.0; | |
import "./Chainlink.sol"; | |
import "./interfaces/ENSInterface.sol"; | |
import "./interfaces/LinkTokenInterface.sol"; | |
import "./interfaces/ChainlinkRequestInterface.sol"; | |
import "./interfaces/PointerInterface.sol"; | |
import { ENSResolver as ENSResolver_Chainlink } from "./vendor/ENSResolver.sol"; | |
/** | |
* @title The ChainlinkClient contract | |
* @notice Contract writers can inherit this contract in order to create requests for the | |
* Chainlink network | |
*/ | |
contract ChainlinkClient { | |
using Chainlink for Chainlink.Request; | |
uint256 constant internal LINK_DIVISIBILITY = 10**18; | |
uint256 constant private AMOUNT_OVERRIDE = 0; | |
address constant private SENDER_OVERRIDE = address(0); | |
uint256 constant private ARGS_VERSION = 2; | |
bytes32 constant private ENS_TOKEN_SUBNAME = keccak256("link"); | |
bytes32 constant private ENS_ORACLE_SUBNAME = keccak256("oracle"); | |
address constant private LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571; | |
ENSInterface private ens; | |
bytes32 private ensNode; | |
LinkTokenInterface private link; | |
ChainlinkRequestInterface private oracle; | |
uint256 private requestCount = 1; | |
mapping(bytes32 => address) private pendingRequests; | |
event ChainlinkRequested( | |
bytes32 indexed id | |
); | |
event ChainlinkFulfilled( | |
bytes32 indexed id | |
); | |
event ChainlinkCancelled( | |
bytes32 indexed id | |
); | |
/** | |
* @notice Creates a request that can hold additional parameters | |
* @param specId The Job Specification ID that the request will be created for | |
* @param callbackAddress The callback address that the response will be sent to | |
* @param callbackFunctionSignature The callback function signature to use for the callback address | |
* @return A Chainlink Request struct in memory | |
*/ | |
function buildChainlinkRequest( | |
bytes32 specId, | |
address callbackAddress, | |
bytes4 callbackFunctionSignature | |
) | |
internal | |
pure | |
returns ( | |
Chainlink.Request memory | |
) | |
{ | |
Chainlink.Request memory req; | |
return req.initialize(specId, callbackAddress, callbackFunctionSignature); | |
} | |
/** | |
* @notice Creates a Chainlink request to the stored oracle address | |
* @dev Calls `chainlinkRequestTo` with the stored oracle address | |
* @param req The initialized Chainlink Request | |
* @param payment The amount of LINK to send for the request | |
* @return requestId The request ID | |
*/ | |
function sendChainlinkRequest( | |
Chainlink.Request memory req, | |
uint256 payment | |
) | |
internal | |
returns ( | |
bytes32 | |
) | |
{ | |
return sendChainlinkRequestTo(address(oracle), req, payment); | |
} | |
/** | |
* @notice Creates a Chainlink request to the specified oracle address | |
* @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to | |
* send LINK which creates a request on the target oracle contract. | |
* Emits ChainlinkRequested event. | |
* @param oracleAddress The address of the oracle for the request | |
* @param req The initialized Chainlink Request | |
* @param payment The amount of LINK to send for the request | |
* @return requestId The request ID | |
*/ | |
function sendChainlinkRequestTo( | |
address oracleAddress, | |
Chainlink.Request memory req, | |
uint256 payment | |
) | |
internal | |
returns ( | |
bytes32 requestId | |
) | |
{ | |
requestId = keccak256(abi.encodePacked(this, requestCount)); | |
req.nonce = requestCount; | |
pendingRequests[requestId] = oracleAddress; | |
emit ChainlinkRequested(requestId); | |
require(link.transferAndCall(oracleAddress, payment, encodeRequest(req, ARGS_VERSION)), "unable to transferAndCall to oracle"); | |
requestCount += 1; | |
return requestId; | |
} | |
/** | |
* @notice Allows a request to be cancelled if it has not been fulfilled | |
* @dev Requires keeping track of the expiration value emitted from the oracle contract. | |
* Deletes the request from the `pendingRequests` mapping. | |
* Emits ChainlinkCancelled event. | |
* @param requestId The request ID | |
* @param payment The amount of LINK sent for the request | |
* @param callbackFunc The callback function specified for the request | |
* @param expiration The time of the expiration for the request | |
*/ | |
function cancelChainlinkRequest( | |
bytes32 requestId, | |
uint256 payment, | |
bytes4 callbackFunc, | |
uint256 expiration | |
) | |
internal | |
{ | |
ChainlinkRequestInterface requested = ChainlinkRequestInterface(pendingRequests[requestId]); | |
delete pendingRequests[requestId]; | |
emit ChainlinkCancelled(requestId); | |
requested.cancelOracleRequest(requestId, payment, callbackFunc, expiration); | |
} | |
/** | |
* @notice Sets the stored oracle address | |
* @param oracleAddress The address of the oracle contract | |
*/ | |
function setChainlinkOracle( | |
address oracleAddress | |
) | |
internal | |
{ | |
oracle = ChainlinkRequestInterface(oracleAddress); | |
} | |
/** | |
* @notice Sets the LINK token address | |
* @param linkAddress The address of the LINK token contract | |
*/ | |
function setChainlinkToken( | |
address linkAddress | |
) | |
internal | |
{ | |
link = LinkTokenInterface(linkAddress); | |
} | |
/** | |
* @notice Sets the Chainlink token address for the public | |
* network as given by the Pointer contract | |
*/ | |
function setPublicChainlinkToken() | |
internal | |
{ | |
setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress()); | |
} | |
/** | |
* @notice Retrieves the stored address of the LINK token | |
* @return The address of the LINK token | |
*/ | |
function chainlinkTokenAddress() | |
internal | |
view | |
returns ( | |
address | |
) | |
{ | |
return address(link); | |
} | |
/** | |
* @notice Retrieves the stored address of the oracle contract | |
* @return The address of the oracle contract | |
*/ | |
function chainlinkOracleAddress() | |
internal | |
view | |
returns ( | |
address | |
) | |
{ | |
return address(oracle); | |
} | |
/** | |
* @notice Allows for a request which was created on another contract to be fulfilled | |
* on this contract | |
* @param oracleAddress The address of the oracle contract that will fulfill the request | |
* @param requestId The request ID used for the response | |
*/ | |
function addChainlinkExternalRequest( | |
address oracleAddress, | |
bytes32 requestId | |
) | |
internal | |
notPendingRequest(requestId) | |
{ | |
pendingRequests[requestId] = oracleAddress; | |
} | |
/** | |
* @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS | |
* @dev Accounts for subnodes having different resolvers | |
* @param ensAddress The address of the ENS contract | |
* @param node The ENS node hash | |
*/ | |
function useChainlinkWithENS( | |
address ensAddress, | |
bytes32 node | |
) | |
internal | |
{ | |
ens = ENSInterface(ensAddress); | |
ensNode = node; | |
bytes32 linkSubnode = keccak256(abi.encodePacked(ensNode, ENS_TOKEN_SUBNAME)); | |
ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(linkSubnode)); | |
setChainlinkToken(resolver.addr(linkSubnode)); | |
updateChainlinkOracleWithENS(); | |
} | |
/** | |
* @notice Sets the stored oracle contract with the address resolved by ENS | |
* @dev This may be called on its own as long as `useChainlinkWithENS` has been called previously | |
*/ | |
function updateChainlinkOracleWithENS() | |
internal | |
{ | |
bytes32 oracleSubnode = keccak256(abi.encodePacked(ensNode, ENS_ORACLE_SUBNAME)); | |
ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(oracleSubnode)); | |
setChainlinkOracle(resolver.addr(oracleSubnode)); | |
} | |
/** | |
* @notice Encodes the request to be sent to the oracle contract | |
* @dev The Chainlink node expects values to be in order for the request to be picked up. Order of types | |
* will be validated in the oracle contract. | |
* @param req The initialized Chainlink Request | |
* @param dataVersion The request data version | |
* @return The bytes payload for the `transferAndCall` method | |
*/ | |
function encodeRequest( | |
Chainlink.Request memory req, | |
uint256 dataVersion | |
) | |
private | |
view | |
returns ( | |
bytes memory | |
) | |
{ | |
return abi.encodeWithSelector( | |
oracle.oracleRequest.selector, | |
SENDER_OVERRIDE, // Sender value - overridden by onTokenTransfer by the requesting contract's address | |
AMOUNT_OVERRIDE, // Amount value - overridden by onTokenTransfer by the actual amount of LINK sent | |
req.id, | |
req.callbackAddress, | |
req.callbackFunctionId, | |
req.nonce, | |
dataVersion, | |
req.buf.buf); | |
} | |
/** | |
* @notice Ensures that the fulfillment is valid for this contract | |
* @dev Use if the contract developer prefers methods instead of modifiers for validation | |
* @param requestId The request ID for fulfillment | |
*/ | |
function validateChainlinkCallback( | |
bytes32 requestId | |
) | |
internal | |
recordChainlinkFulfillment(requestId) | |
// solhint-disable-next-line no-empty-blocks | |
{} | |
/** | |
* @dev Reverts if the sender is not the oracle of the request. | |
* Emits ChainlinkFulfilled event. | |
* @param requestId The request ID for fulfillment | |
*/ | |
modifier recordChainlinkFulfillment( | |
bytes32 requestId | |
) | |
{ | |
require(msg.sender == pendingRequests[requestId], | |
"Source must be the oracle of the request"); | |
delete pendingRequests[requestId]; | |
emit ChainlinkFulfilled(requestId); | |
_; | |
} | |
/** | |
* @dev Reverts if the request is already pending | |
* @param requestId The request ID for fulfillment | |
*/ | |
modifier notPendingRequest( | |
bytes32 requestId | |
) | |
{ | |
require(pendingRequests[requestId] == address(0), "Request is already pending"); | |
_; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.7.0; | |
interface ChainlinkRequestInterface { | |
function oracleRequest( | |
address sender, | |
uint256 requestPrice, | |
bytes32 serviceAgreementID, | |
address callbackAddress, | |
bytes4 callbackFunctionId, | |
uint256 nonce, | |
uint256 dataVersion, | |
bytes calldata data | |
) external; | |
function cancelOracleRequest( | |
bytes32 requestId, | |
uint256 payment, | |
bytes4 callbackFunctionId, | |
uint256 expiration | |
) external; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.7.0; | |
interface ENSInterface { | |
// Logged when the owner of a node assigns a new owner to a subnode. | |
event NewOwner( | |
bytes32 indexed node, | |
bytes32 indexed label, | |
address owner | |
); | |
// Logged when the owner of a node transfers ownership to a new account. | |
event Transfer( | |
bytes32 indexed node, | |
address owner | |
); | |
// Logged when the resolver for a node changes. | |
event NewResolver( | |
bytes32 indexed node, | |
address resolver | |
); | |
// Logged when the TTL of a node changes | |
event NewTTL( | |
bytes32 indexed node, | |
uint64 ttl | |
); | |
function setSubnodeOwner( | |
bytes32 node, | |
bytes32 label, | |
address owner | |
) external; | |
function setResolver( | |
bytes32 node, | |
address resolver | |
) external; | |
function setOwner( | |
bytes32 node, | |
address owner | |
) external; | |
function setTTL( | |
bytes32 node, | |
uint64 ttl | |
) external; | |
function owner( | |
bytes32 node | |
) | |
external | |
view | |
returns ( | |
address | |
); | |
function resolver( | |
bytes32 node | |
) | |
external | |
view | |
returns ( | |
address | |
); | |
function ttl( | |
bytes32 node | |
) | |
external | |
view | |
returns ( | |
uint64 | |
); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.7.0; | |
interface LinkTokenInterface { | |
function allowance( | |
address owner, | |
address spender | |
) | |
external | |
view | |
returns ( | |
uint256 remaining | |
); | |
function approve( | |
address spender, | |
uint256 value | |
) | |
external | |
returns ( | |
bool success | |
); | |
function balanceOf( | |
address owner | |
) | |
external | |
view | |
returns ( | |
uint256 balance | |
); | |
function decimals() | |
external | |
view | |
returns ( | |
uint8 decimalPlaces | |
); | |
function decreaseApproval( | |
address spender, | |
uint256 addedValue | |
) | |
external | |
returns ( | |
bool success | |
); | |
function increaseApproval( | |
address spender, | |
uint256 subtractedValue | |
) external; | |
function name() | |
external | |
view | |
returns ( | |
string memory tokenName | |
); | |
function symbol() | |
external | |
view | |
returns ( | |
string memory tokenSymbol | |
); | |
function totalSupply() | |
external | |
view | |
returns ( | |
uint256 totalTokensIssued | |
); | |
function transfer( | |
address to, | |
uint256 value | |
) | |
external | |
returns ( | |
bool success | |
); | |
function transferAndCall( | |
address to, | |
uint256 value, | |
bytes calldata data | |
) | |
external | |
returns ( | |
bool success | |
); | |
function transferFrom( | |
address from, | |
address to, | |
uint256 value | |
) | |
external | |
returns ( | |
bool success | |
); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.7.0; | |
interface PointerInterface { | |
function getAddress() | |
external | |
view | |
returns ( | |
address | |
); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.7.0; | |
/** | |
* @dev A library for working with mutable byte buffers in Solidity. | |
* | |
* Byte buffers are mutable and expandable, and provide a variety of primitives | |
* for writing to them. At any time you can fetch a bytes object containing the | |
* current contents of the buffer. The bytes object should not be stored between | |
* operations, as it may change due to resizing of the buffer. | |
*/ | |
library BufferChainlink { | |
/** | |
* @dev Represents a mutable buffer. Buffers have a current value (buf) and | |
* a capacity. The capacity may be longer than the current value, in | |
* which case it can be extended without the need to allocate more memory. | |
*/ | |
struct buffer { | |
bytes buf; | |
uint capacity; | |
} | |
/** | |
* @dev Initializes a buffer with an initial capacity. | |
* @param buf The buffer to initialize. | |
* @param capacity The number of bytes of space to allocate the buffer. | |
* @return The buffer, for chaining. | |
*/ | |
function init( | |
buffer memory buf, | |
uint capacity | |
) | |
internal | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
if (capacity % 32 != 0) { | |
capacity += 32 - (capacity % 32); | |
} | |
// Allocate space for the buffer data | |
buf.capacity = capacity; | |
assembly { | |
let ptr := mload(0x40) | |
mstore(buf, ptr) | |
mstore(ptr, 0) | |
mstore(0x40, add(32, add(ptr, capacity))) | |
} | |
return buf; | |
} | |
/** | |
* @dev Initializes a new buffer from an existing bytes object. | |
* Changes to the buffer may mutate the original value. | |
* @param b The bytes object to initialize the buffer with. | |
* @return A new buffer. | |
*/ | |
function fromBytes( | |
bytes memory b | |
) | |
internal | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
buffer memory buf; | |
buf.buf = b; | |
buf.capacity = b.length; | |
return buf; | |
} | |
function resize( | |
buffer memory buf, | |
uint capacity | |
) | |
private | |
pure | |
{ | |
bytes memory oldbuf = buf.buf; | |
init(buf, capacity); | |
append(buf, oldbuf); | |
} | |
function max( | |
uint a, | |
uint b | |
) | |
private | |
pure | |
returns( | |
uint | |
) | |
{ | |
if (a > b) { | |
return a; | |
} | |
return b; | |
} | |
/** | |
* @dev Sets buffer length to 0. | |
* @param buf The buffer to truncate. | |
* @return The original buffer, for chaining.. | |
*/ | |
function truncate( | |
buffer memory buf | |
) | |
internal | |
pure | |
returns ( | |
buffer memory | |
) | |
{ | |
assembly { | |
let bufptr := mload(buf) | |
mstore(bufptr, 0) | |
} | |
return buf; | |
} | |
/** | |
* @dev Writes a byte string to a buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The start offset to write to. | |
* @param data The data to append. | |
* @param len The number of bytes to copy. | |
* @return The original buffer, for chaining. | |
*/ | |
function write( | |
buffer memory buf, | |
uint off, | |
bytes memory data, | |
uint len | |
) | |
internal | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
require(len <= data.length); | |
if (off + len > buf.capacity) { | |
resize(buf, max(buf.capacity, len + off) * 2); | |
} | |
uint dest; | |
uint src; | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Length of existing buffer data | |
let buflen := mload(bufptr) | |
// Start address = buffer address + offset + sizeof(buffer length) | |
dest := add(add(bufptr, 32), off) | |
// Update buffer length if we're extending it | |
if gt(add(len, off), buflen) { | |
mstore(bufptr, add(len, off)) | |
} | |
src := add(data, 32) | |
} | |
// Copy word-length chunks while possible | |
for (; len >= 32; len -= 32) { | |
assembly { | |
mstore(dest, mload(src)) | |
} | |
dest += 32; | |
src += 32; | |
} | |
// Copy remaining bytes | |
uint mask = 256 ** (32 - len) - 1; | |
assembly { | |
let srcpart := and(mload(src), not(mask)) | |
let destpart := and(mload(dest), mask) | |
mstore(dest, or(destpart, srcpart)) | |
} | |
return buf; | |
} | |
/** | |
* @dev Appends a byte string to a buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @param len The number of bytes to copy. | |
* @return The original buffer, for chaining. | |
*/ | |
function append( | |
buffer memory buf, | |
bytes memory data, | |
uint len | |
) | |
internal | |
pure | |
returns ( | |
buffer memory | |
) | |
{ | |
return write(buf, buf.buf.length, data, len); | |
} | |
/** | |
* @dev Appends a byte string to a buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function append( | |
buffer memory buf, | |
bytes memory data | |
) | |
internal | |
pure | |
returns ( | |
buffer memory | |
) | |
{ | |
return write(buf, buf.buf.length, data, data.length); | |
} | |
/** | |
* @dev Writes a byte to the buffer. Resizes if doing so would exceed the | |
* capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write the byte at. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function writeUint8( | |
buffer memory buf, | |
uint off, | |
uint8 data | |
) | |
internal | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
if (off >= buf.capacity) { | |
resize(buf, buf.capacity * 2); | |
} | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Length of existing buffer data | |
let buflen := mload(bufptr) | |
// Address = buffer address + sizeof(buffer length) + off | |
let dest := add(add(bufptr, off), 32) | |
mstore8(dest, data) | |
// Update buffer length if we extended it | |
if eq(off, buflen) { | |
mstore(bufptr, add(buflen, 1)) | |
} | |
} | |
return buf; | |
} | |
/** | |
* @dev Appends a byte to the buffer. Resizes if doing so would exceed the | |
* capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function appendUint8( | |
buffer memory buf, | |
uint8 data | |
) | |
internal | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
return writeUint8(buf, buf.buf.length, data); | |
} | |
/** | |
* @dev Writes up to 32 bytes to the buffer. Resizes if doing so would | |
* exceed the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write at. | |
* @param data The data to append. | |
* @param len The number of bytes to write (left-aligned). | |
* @return The original buffer, for chaining. | |
*/ | |
function write( | |
buffer memory buf, | |
uint off, | |
bytes32 data, | |
uint len | |
) | |
private | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
if (len + off > buf.capacity) { | |
resize(buf, (len + off) * 2); | |
} | |
uint mask = 256 ** len - 1; | |
// Right-align data | |
data = data >> (8 * (32 - len)); | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Address = buffer address + sizeof(buffer length) + off + len | |
let dest := add(add(bufptr, off), len) | |
mstore(dest, or(and(mload(dest), not(mask)), data)) | |
// Update buffer length if we extended it | |
if gt(add(off, len), mload(bufptr)) { | |
mstore(bufptr, add(off, len)) | |
} | |
} | |
return buf; | |
} | |
/** | |
* @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the | |
* capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write at. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function writeBytes20( | |
buffer memory buf, | |
uint off, | |
bytes20 data | |
) | |
internal | |
pure | |
returns ( | |
buffer memory | |
) | |
{ | |
return write(buf, off, bytes32(data), 20); | |
} | |
/** | |
* @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chhaining. | |
*/ | |
function appendBytes20( | |
buffer memory buf, | |
bytes20 data | |
) | |
internal | |
pure | |
returns ( | |
buffer memory | |
) | |
{ | |
return write(buf, buf.buf.length, bytes32(data), 20); | |
} | |
/** | |
* @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function appendBytes32( | |
buffer memory buf, | |
bytes32 data | |
) | |
internal | |
pure | |
returns ( | |
buffer memory | |
) | |
{ | |
return write(buf, buf.buf.length, data, 32); | |
} | |
/** | |
* @dev Writes an integer to the buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write at. | |
* @param data The data to append. | |
* @param len The number of bytes to write (right-aligned). | |
* @return The original buffer, for chaining. | |
*/ | |
function writeInt( | |
buffer memory buf, | |
uint off, | |
uint data, | |
uint len | |
) | |
private | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
if (len + off > buf.capacity) { | |
resize(buf, (len + off) * 2); | |
} | |
uint mask = 256 ** len - 1; | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Address = buffer address + off + sizeof(buffer length) + len | |
let dest := add(add(bufptr, off), len) | |
mstore(dest, or(and(mload(dest), not(mask)), data)) | |
// Update buffer length if we extended it | |
if gt(add(off, len), mload(bufptr)) { | |
mstore(bufptr, add(off, len)) | |
} | |
} | |
return buf; | |
} | |
/** | |
* @dev Appends a byte to the end of the buffer. Resizes if doing so would | |
* exceed the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer. | |
*/ | |
function appendInt( | |
buffer memory buf, | |
uint data, | |
uint len | |
) | |
internal | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
return writeInt(buf, buf.buf.length, data, len); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity >= 0.4.19; | |
import { BufferChainlink } from "./BufferChainlink.sol"; | |
library CBORChainlink { | |
using BufferChainlink for BufferChainlink.buffer; | |
uint8 private constant MAJOR_TYPE_INT = 0; | |
uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1; | |
uint8 private constant MAJOR_TYPE_BYTES = 2; | |
uint8 private constant MAJOR_TYPE_STRING = 3; | |
uint8 private constant MAJOR_TYPE_ARRAY = 4; | |
uint8 private constant MAJOR_TYPE_MAP = 5; | |
uint8 private constant MAJOR_TYPE_TAG = 6; | |
uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7; | |
uint8 private constant TAG_TYPE_BIGNUM = 2; | |
uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3; | |
function encodeType( | |
BufferChainlink.buffer memory buf, | |
uint8 major, | |
uint value | |
) | |
private | |
pure | |
{ | |
if(value <= 23) { | |
buf.appendUint8(uint8((major << 5) | value)); | |
} else if(value <= 0xFF) { | |
buf.appendUint8(uint8((major << 5) | 24)); | |
buf.appendInt(value, 1); | |
} else if(value <= 0xFFFF) { | |
buf.appendUint8(uint8((major << 5) | 25)); | |
buf.appendInt(value, 2); | |
} else if(value <= 0xFFFFFFFF) { | |
buf.appendUint8(uint8((major << 5) | 26)); | |
buf.appendInt(value, 4); | |
} else if(value <= 0xFFFFFFFFFFFFFFFF) { | |
buf.appendUint8(uint8((major << 5) | 27)); | |
buf.appendInt(value, 8); | |
} | |
} | |
function encodeIndefiniteLengthType( | |
BufferChainlink.buffer memory buf, | |
uint8 major | |
) | |
private | |
pure | |
{ | |
buf.appendUint8(uint8((major << 5) | 31)); | |
} | |
function encodeUInt( | |
BufferChainlink.buffer memory buf, | |
uint value | |
) | |
internal | |
pure | |
{ | |
encodeType(buf, MAJOR_TYPE_INT, value); | |
} | |
function encodeInt( | |
BufferChainlink.buffer memory buf, | |
int value | |
) | |
internal | |
pure | |
{ | |
if(value < -0x10000000000000000) { | |
encodeSignedBigNum(buf, value); | |
} else if(value > 0xFFFFFFFFFFFFFFFF) { | |
encodeBigNum(buf, value); | |
} else if(value >= 0) { | |
encodeType(buf, MAJOR_TYPE_INT, uint(value)); | |
} else { | |
encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value)); | |
} | |
} | |
function encodeBytes( | |
BufferChainlink.buffer memory buf, | |
bytes memory value | |
) | |
internal | |
pure | |
{ | |
encodeType(buf, MAJOR_TYPE_BYTES, value.length); | |
buf.append(value); | |
} | |
function encodeBigNum( | |
BufferChainlink.buffer memory buf, | |
int value | |
) | |
internal | |
pure | |
{ | |
buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM)); | |
encodeBytes(buf, abi.encode(uint(value))); | |
} | |
function encodeSignedBigNum( | |
BufferChainlink.buffer memory buf, | |
int input | |
) | |
internal | |
pure | |
{ | |
buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM)); | |
encodeBytes(buf, abi.encode(uint(-1 - input))); | |
} | |
function encodeString( | |
BufferChainlink.buffer memory buf, | |
string memory value | |
) | |
internal | |
pure | |
{ | |
encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length); | |
buf.append(bytes(value)); | |
} | |
function startArray( | |
BufferChainlink.buffer memory buf | |
) | |
internal | |
pure | |
{ | |
encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY); | |
} | |
function startMap( | |
BufferChainlink.buffer memory buf | |
) | |
internal | |
pure | |
{ | |
encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP); | |
} | |
function endSequence( | |
BufferChainlink.buffer memory buf | |
) | |
internal | |
pure | |
{ | |
encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.7.0; | |
abstract contract ENSResolver { | |
function addr( | |
bytes32 node | |
) | |
public | |
view | |
virtual | |
returns ( | |
address | |
); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity >=0.6.0 <0.8.0; | |
import "../utils/Context.sol"; | |
/** | |
* @dev Contract module which provides a basic access control mechanism, where | |
* there is an account (an owner) that can be granted exclusive access to | |
* specific functions. | |
* | |
* By default, the owner account will be the one that deploys the contract. This | |
* can later be changed with {transferOwnership}. | |
* | |
* This module is used through inheritance. It will make available the modifier | |
* `onlyOwner`, which can be applied to your functions to restrict their use to | |
* the owner. | |
*/ | |
abstract contract Ownable is Context { | |
address private _owner; | |
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); | |
/** | |
* @dev Initializes the contract setting the deployer as the initial owner. | |
*/ | |
constructor () internal { | |
address msgSender = _msgSender(); | |
_owner = msgSender; | |
emit OwnershipTransferred(address(0), msgSender); | |
} | |
/** | |
* @dev Returns the address of the current owner. | |
*/ | |
function owner() public view virtual returns (address) { | |
return _owner; | |
} | |
/** | |
* @dev Throws if called by any account other than the owner. | |
*/ | |
modifier onlyOwner() { | |
require(owner() == _msgSender(), "Ownable: caller is not the owner"); | |
_; | |
} | |
/** | |
* @dev Leaves the contract without owner. It will not be possible to call | |
* `onlyOwner` functions anymore. Can only be called by the current owner. | |
* | |
* NOTE: Renouncing ownership will leave the contract without an owner, | |
* thereby removing any functionality that is only available to the owner. | |
*/ | |
function renounceOwnership() public virtual onlyOwner { | |
emit OwnershipTransferred(_owner, address(0)); | |
_owner = address(0); | |
} | |
/** | |
* @dev Transfers ownership of the contract to a new account (`newOwner`). | |
* Can only be called by the current owner. | |
*/ | |
function transferOwnership(address newOwner) public virtual onlyOwner { | |
require(newOwner != address(0), "Ownable: new owner is the zero address"); | |
emit OwnershipTransferred(_owner, newOwner); | |
_owner = newOwner; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity >=0.6.0 <0.8.0; | |
/* | |
* @dev Provides information about the current execution context, including the | |
* sender of the transaction and its data. While these are generally available | |
* via msg.sender and msg.data, they should not be accessed in such a direct | |
* manner, since when dealing with GSN meta-transactions the account sending and | |
* paying for execution may not be the actual sender (as far as an application | |
* is concerned). | |
* | |
* This contract is only required for intermediate, library-like contracts. | |
*/ | |
abstract contract Context { | |
function _msgSender() internal view virtual returns (address payable) { | |
return msg.sender; | |
} | |
function _msgData() internal view virtual returns (bytes memory) { | |
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 | |
return msg.data; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.7.0; | |
import { CBORChainlink } from "./vendor/CBORChainlink.sol"; | |
import { BufferChainlink } from "./vendor/BufferChainlink.sol"; | |
/** | |
* @title Library for common Chainlink functions | |
* @dev Uses imported CBOR library for encoding to buffer | |
*/ | |
library Chainlink { | |
uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase | |
using CBORChainlink for BufferChainlink.buffer; | |
struct Request { | |
bytes32 id; | |
address callbackAddress; | |
bytes4 callbackFunctionId; | |
uint256 nonce; | |
BufferChainlink.buffer buf; | |
} | |
/** | |
* @notice Initializes a Chainlink request | |
* @dev Sets the ID, callback address, and callback function signature on the request | |
* @param self The uninitialized request | |
* @param jobId The Job Specification ID | |
* @param callbackAddr The callback address | |
* @param callbackFunc The callback function signature | |
* @return The initialized request | |
*/ | |
function initialize( | |
Request memory self, | |
bytes32 jobId, | |
address callbackAddr, | |
bytes4 callbackFunc | |
) | |
internal | |
pure | |
returns ( | |
Chainlink.Request memory | |
) | |
{ | |
BufferChainlink.init(self.buf, defaultBufferSize); | |
self.id = jobId; | |
self.callbackAddress = callbackAddr; | |
self.callbackFunctionId = callbackFunc; | |
return self; | |
} | |
/** | |
* @notice Sets the data for the buffer without encoding CBOR on-chain | |
* @dev CBOR can be closed with curly-brackets {} or they can be left off | |
* @param self The initialized request | |
* @param data The CBOR data | |
*/ | |
function setBuffer( | |
Request memory self, | |
bytes memory data | |
) | |
internal | |
pure | |
{ | |
BufferChainlink.init(self.buf, data.length); | |
BufferChainlink.append(self.buf, data); | |
} | |
/** | |
* @notice Adds a string value to the request with a given key name | |
* @param self The initialized request | |
* @param key The name of the key | |
* @param value The string value to add | |
*/ | |
function add( | |
Request memory self, | |
string memory key, | |
string memory value | |
) | |
internal | |
pure | |
{ | |
self.buf.encodeString(key); | |
self.buf.encodeString(value); | |
} | |
/** | |
* @notice Adds a bytes value to the request with a given key name | |
* @param self The initialized request | |
* @param key The name of the key | |
* @param value The bytes value to add | |
*/ | |
function addBytes( | |
Request memory self, | |
string memory key, | |
bytes memory value | |
) | |
internal | |
pure | |
{ | |
self.buf.encodeString(key); | |
self.buf.encodeBytes(value); | |
} | |
/** | |
* @notice Adds a int256 value to the request with a given key name | |
* @param self The initialized request | |
* @param key The name of the key | |
* @param value The int256 value to add | |
*/ | |
function addInt( | |
Request memory self, | |
string memory key, | |
int256 value | |
) | |
internal | |
pure | |
{ | |
self.buf.encodeString(key); | |
self.buf.encodeInt(value); | |
} | |
/** | |
* @notice Adds a uint256 value to the request with a given key name | |
* @param self The initialized request | |
* @param key The name of the key | |
* @param value The uint256 value to add | |
*/ | |
function addUint( | |
Request memory self, | |
string memory key, | |
uint256 value | |
) | |
internal | |
pure | |
{ | |
self.buf.encodeString(key); | |
self.buf.encodeUInt(value); | |
} | |
/** | |
* @notice Adds an array of strings to the request with a given key name | |
* @param self The initialized request | |
* @param key The name of the key | |
* @param values The array of string values to add | |
*/ | |
function addStringArray( | |
Request memory self, | |
string memory key, | |
string[] memory values | |
) | |
internal | |
pure | |
{ | |
self.buf.encodeString(key); | |
self.buf.startArray(); | |
for (uint256 i = 0; i < values.length; i++) { | |
self.buf.encodeString(values[i]); | |
} | |
self.buf.endSequence(); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.7.0; | |
import "./Chainlink.sol"; | |
import "./interfaces/ENSInterface.sol"; | |
import "./interfaces/LinkTokenInterface.sol"; | |
import "./interfaces/ChainlinkRequestInterface.sol"; | |
import "./interfaces/PointerInterface.sol"; | |
import { ENSResolver as ENSResolver_Chainlink } from "./vendor/ENSResolver.sol"; | |
/** | |
* @title The ChainlinkClient contract | |
* @notice Contract writers can inherit this contract in order to create requests for the | |
* Chainlink network | |
*/ | |
contract ChainlinkClient { | |
using Chainlink for Chainlink.Request; | |
uint256 constant internal LINK_DIVISIBILITY = 10**18; | |
uint256 constant private AMOUNT_OVERRIDE = 0; | |
address constant private SENDER_OVERRIDE = address(0); | |
uint256 constant private ARGS_VERSION = 2; | |
bytes32 constant private ENS_TOKEN_SUBNAME = keccak256("link"); | |
bytes32 constant private ENS_ORACLE_SUBNAME = keccak256("oracle"); | |
address constant private LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571; | |
ENSInterface private ens; | |
bytes32 private ensNode; | |
LinkTokenInterface private link; | |
ChainlinkRequestInterface private oracle; | |
uint256 private requestCount = 1; | |
mapping(bytes32 => address) private pendingRequests; | |
event ChainlinkRequested( | |
bytes32 indexed id | |
); | |
event ChainlinkFulfilled( | |
bytes32 indexed id | |
); | |
event ChainlinkCancelled( | |
bytes32 indexed id | |
); | |
/** | |
* @notice Creates a request that can hold additional parameters | |
* @param specId The Job Specification ID that the request will be created for | |
* @param callbackAddress The callback address that the response will be sent to | |
* @param callbackFunctionSignature The callback function signature to use for the callback address | |
* @return A Chainlink Request struct in memory | |
*/ | |
function buildChainlinkRequest( | |
bytes32 specId, | |
address callbackAddress, | |
bytes4 callbackFunctionSignature | |
) | |
internal | |
pure | |
returns ( | |
Chainlink.Request memory | |
) | |
{ | |
Chainlink.Request memory req; | |
return req.initialize(specId, callbackAddress, callbackFunctionSignature); | |
} | |
/** | |
* @notice Creates a Chainlink request to the stored oracle address | |
* @dev Calls `chainlinkRequestTo` with the stored oracle address | |
* @param req The initialized Chainlink Request | |
* @param payment The amount of LINK to send for the request | |
* @return requestId The request ID | |
*/ | |
function sendChainlinkRequest( | |
Chainlink.Request memory req, | |
uint256 payment | |
) | |
internal | |
returns ( | |
bytes32 | |
) | |
{ | |
return sendChainlinkRequestTo(address(oracle), req, payment); | |
} | |
/** | |
* @notice Creates a Chainlink request to the specified oracle address | |
* @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to | |
* send LINK which creates a request on the target oracle contract. | |
* Emits ChainlinkRequested event. | |
* @param oracleAddress The address of the oracle for the request | |
* @param req The initialized Chainlink Request | |
* @param payment The amount of LINK to send for the request | |
* @return requestId The request ID | |
*/ | |
function sendChainlinkRequestTo( | |
address oracleAddress, | |
Chainlink.Request memory req, | |
uint256 payment | |
) | |
internal | |
returns ( | |
bytes32 requestId | |
) | |
{ | |
requestId = keccak256(abi.encodePacked(this, requestCount)); | |
req.nonce = requestCount; | |
pendingRequests[requestId] = oracleAddress; | |
emit ChainlinkRequested(requestId); | |
require(link.transferAndCall(oracleAddress, payment, encodeRequest(req, ARGS_VERSION)), "unable to transferAndCall to oracle"); | |
requestCount += 1; | |
return requestId; | |
} | |
/** | |
* @notice Allows a request to be cancelled if it has not been fulfilled | |
* @dev Requires keeping track of the expiration value emitted from the oracle contract. | |
* Deletes the request from the `pendingRequests` mapping. | |
* Emits ChainlinkCancelled event. | |
* @param requestId The request ID | |
* @param payment The amount of LINK sent for the request | |
* @param callbackFunc The callback function specified for the request | |
* @param expiration The time of the expiration for the request | |
*/ | |
function cancelChainlinkRequest( | |
bytes32 requestId, | |
uint256 payment, | |
bytes4 callbackFunc, | |
uint256 expiration | |
) | |
internal | |
{ | |
ChainlinkRequestInterface requested = ChainlinkRequestInterface(pendingRequests[requestId]); | |
delete pendingRequests[requestId]; | |
emit ChainlinkCancelled(requestId); | |
requested.cancelOracleRequest(requestId, payment, callbackFunc, expiration); | |
} | |
/** | |
* @notice Sets the stored oracle address | |
* @param oracleAddress The address of the oracle contract | |
*/ | |
function setChainlinkOracle( | |
address oracleAddress | |
) | |
internal | |
{ | |
oracle = ChainlinkRequestInterface(oracleAddress); | |
} | |
/** | |
* @notice Sets the LINK token address | |
* @param linkAddress The address of the LINK token contract | |
*/ | |
function setChainlinkToken( | |
address linkAddress | |
) | |
internal | |
{ | |
link = LinkTokenInterface(linkAddress); | |
} | |
/** | |
* @notice Sets the Chainlink token address for the public | |
* network as given by the Pointer contract | |
*/ | |
function setPublicChainlinkToken() | |
internal | |
{ | |
setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress()); | |
} | |
/** | |
* @notice Retrieves the stored address of the LINK token | |
* @return The address of the LINK token | |
*/ | |
function chainlinkTokenAddress() | |
internal | |
view | |
returns ( | |
address | |
) | |
{ | |
return address(link); | |
} | |
/** | |
* @notice Retrieves the stored address of the oracle contract | |
* @return The address of the oracle contract | |
*/ | |
function chainlinkOracleAddress() | |
internal | |
view | |
returns ( | |
address | |
) | |
{ | |
return address(oracle); | |
} | |
/** | |
* @notice Allows for a request which was created on another contract to be fulfilled | |
* on this contract | |
* @param oracleAddress The address of the oracle contract that will fulfill the request | |
* @param requestId The request ID used for the response | |
*/ | |
function addChainlinkExternalRequest( | |
address oracleAddress, | |
bytes32 requestId | |
) | |
internal | |
notPendingRequest(requestId) | |
{ | |
pendingRequests[requestId] = oracleAddress; | |
} | |
/** | |
* @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS | |
* @dev Accounts for subnodes having different resolvers | |
* @param ensAddress The address of the ENS contract | |
* @param node The ENS node hash | |
*/ | |
function useChainlinkWithENS( | |
address ensAddress, | |
bytes32 node | |
) | |
internal | |
{ | |
ens = ENSInterface(ensAddress); | |
ensNode = node; | |
bytes32 linkSubnode = keccak256(abi.encodePacked(ensNode, ENS_TOKEN_SUBNAME)); | |
ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(linkSubnode)); | |
setChainlinkToken(resolver.addr(linkSubnode)); | |
updateChainlinkOracleWithENS(); | |
} | |
/** | |
* @notice Sets the stored oracle contract with the address resolved by ENS | |
* @dev This may be called on its own as long as `useChainlinkWithENS` has been called previously | |
*/ | |
function updateChainlinkOracleWithENS() | |
internal | |
{ | |
bytes32 oracleSubnode = keccak256(abi.encodePacked(ensNode, ENS_ORACLE_SUBNAME)); | |
ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(oracleSubnode)); | |
setChainlinkOracle(resolver.addr(oracleSubnode)); | |
} | |
/** | |
* @notice Encodes the request to be sent to the oracle contract | |
* @dev The Chainlink node expects values to be in order for the request to be picked up. Order of types | |
* will be validated in the oracle contract. | |
* @param req The initialized Chainlink Request | |
* @param dataVersion The request data version | |
* @return The bytes payload for the `transferAndCall` method | |
*/ | |
function encodeRequest( | |
Chainlink.Request memory req, | |
uint256 dataVersion | |
) | |
private | |
view | |
returns ( | |
bytes memory | |
) | |
{ | |
return abi.encodeWithSelector( | |
oracle.oracleRequest.selector, | |
SENDER_OVERRIDE, // Sender value - overridden by onTokenTransfer by the requesting contract's address | |
AMOUNT_OVERRIDE, // Amount value - overridden by onTokenTransfer by the actual amount of LINK sent | |
req.id, | |
req.callbackAddress, | |
req.callbackFunctionId, | |
req.nonce, | |
dataVersion, | |
req.buf.buf); | |
} | |
/** | |
* @notice Ensures that the fulfillment is valid for this contract | |
* @dev Use if the contract developer prefers methods instead of modifiers for validation | |
* @param requestId The request ID for fulfillment | |
*/ | |
function validateChainlinkCallback( | |
bytes32 requestId | |
) | |
internal | |
recordChainlinkFulfillment(requestId) | |
// solhint-disable-next-line no-empty-blocks | |
{} | |
/** | |
* @dev Reverts if the sender is not the oracle of the request. | |
* Emits ChainlinkFulfilled event. | |
* @param requestId The request ID for fulfillment | |
*/ | |
modifier recordChainlinkFulfillment( | |
bytes32 requestId | |
) | |
{ | |
require(msg.sender == pendingRequests[requestId], | |
"Source must be the oracle of the request"); | |
delete pendingRequests[requestId]; | |
emit ChainlinkFulfilled(requestId); | |
_; | |
} | |
/** | |
* @dev Reverts if the request is already pending | |
* @param requestId The request ID for fulfillment | |
*/ | |
modifier notPendingRequest( | |
bytes32 requestId | |
) | |
{ | |
require(pendingRequests[requestId] == address(0), "Request is already pending"); | |
_; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.7.0; | |
interface ChainlinkRequestInterface { | |
function oracleRequest( | |
address sender, | |
uint256 requestPrice, | |
bytes32 serviceAgreementID, | |
address callbackAddress, | |
bytes4 callbackFunctionId, | |
uint256 nonce, | |
uint256 dataVersion, | |
bytes calldata data | |
) external; | |
function cancelOracleRequest( | |
bytes32 requestId, | |
uint256 payment, | |
bytes4 callbackFunctionId, | |
uint256 expiration | |
) external; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.7.0; | |
interface ENSInterface { | |
// Logged when the owner of a node assigns a new owner to a subnode. | |
event NewOwner( | |
bytes32 indexed node, | |
bytes32 indexed label, | |
address owner | |
); | |
// Logged when the owner of a node transfers ownership to a new account. | |
event Transfer( | |
bytes32 indexed node, | |
address owner | |
); | |
// Logged when the resolver for a node changes. | |
event NewResolver( | |
bytes32 indexed node, | |
address resolver | |
); | |
// Logged when the TTL of a node changes | |
event NewTTL( | |
bytes32 indexed node, | |
uint64 ttl | |
); | |
function setSubnodeOwner( | |
bytes32 node, | |
bytes32 label, | |
address owner | |
) external; | |
function setResolver( | |
bytes32 node, | |
address resolver | |
) external; | |
function setOwner( | |
bytes32 node, | |
address owner | |
) external; | |
function setTTL( | |
bytes32 node, | |
uint64 ttl | |
) external; | |
function owner( | |
bytes32 node | |
) | |
external | |
view | |
returns ( | |
address | |
); | |
function resolver( | |
bytes32 node | |
) | |
external | |
view | |
returns ( | |
address | |
); | |
function ttl( | |
bytes32 node | |
) | |
external | |
view | |
returns ( | |
uint64 | |
); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.7.0; | |
interface LinkTokenInterface { | |
function allowance( | |
address owner, | |
address spender | |
) | |
external | |
view | |
returns ( | |
uint256 remaining | |
); | |
function approve( | |
address spender, | |
uint256 value | |
) | |
external | |
returns ( | |
bool success | |
); | |
function balanceOf( | |
address owner | |
) | |
external | |
view | |
returns ( | |
uint256 balance | |
); | |
function decimals() | |
external | |
view | |
returns ( | |
uint8 decimalPlaces | |
); | |
function decreaseApproval( | |
address spender, | |
uint256 addedValue | |
) | |
external | |
returns ( | |
bool success | |
); | |
function increaseApproval( | |
address spender, | |
uint256 subtractedValue | |
) external; | |
function name() | |
external | |
view | |
returns ( | |
string memory tokenName | |
); | |
function symbol() | |
external | |
view | |
returns ( | |
string memory tokenSymbol | |
); | |
function totalSupply() | |
external | |
view | |
returns ( | |
uint256 totalTokensIssued | |
); | |
function transfer( | |
address to, | |
uint256 value | |
) | |
external | |
returns ( | |
bool success | |
); | |
function transferAndCall( | |
address to, | |
uint256 value, | |
bytes calldata data | |
) | |
external | |
returns ( | |
bool success | |
); | |
function transferFrom( | |
address from, | |
address to, | |
uint256 value | |
) | |
external | |
returns ( | |
bool success | |
); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.7.0; | |
interface PointerInterface { | |
function getAddress() | |
external | |
view | |
returns ( | |
address | |
); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.7.0; | |
/** | |
* @dev A library for working with mutable byte buffers in Solidity. | |
* | |
* Byte buffers are mutable and expandable, and provide a variety of primitives | |
* for writing to them. At any time you can fetch a bytes object containing the | |
* current contents of the buffer. The bytes object should not be stored between | |
* operations, as it may change due to resizing of the buffer. | |
*/ | |
library BufferChainlink { | |
/** | |
* @dev Represents a mutable buffer. Buffers have a current value (buf) and | |
* a capacity. The capacity may be longer than the current value, in | |
* which case it can be extended without the need to allocate more memory. | |
*/ | |
struct buffer { | |
bytes buf; | |
uint capacity; | |
} | |
/** | |
* @dev Initializes a buffer with an initial capacity. | |
* @param buf The buffer to initialize. | |
* @param capacity The number of bytes of space to allocate the buffer. | |
* @return The buffer, for chaining. | |
*/ | |
function init( | |
buffer memory buf, | |
uint capacity | |
) | |
internal | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
if (capacity % 32 != 0) { | |
capacity += 32 - (capacity % 32); | |
} | |
// Allocate space for the buffer data | |
buf.capacity = capacity; | |
assembly { | |
let ptr := mload(0x40) | |
mstore(buf, ptr) | |
mstore(ptr, 0) | |
mstore(0x40, add(32, add(ptr, capacity))) | |
} | |
return buf; | |
} | |
/** | |
* @dev Initializes a new buffer from an existing bytes object. | |
* Changes to the buffer may mutate the original value. | |
* @param b The bytes object to initialize the buffer with. | |
* @return A new buffer. | |
*/ | |
function fromBytes( | |
bytes memory b | |
) | |
internal | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
buffer memory buf; | |
buf.buf = b; | |
buf.capacity = b.length; | |
return buf; | |
} | |
function resize( | |
buffer memory buf, | |
uint capacity | |
) | |
private | |
pure | |
{ | |
bytes memory oldbuf = buf.buf; | |
init(buf, capacity); | |
append(buf, oldbuf); | |
} | |
function max( | |
uint a, | |
uint b | |
) | |
private | |
pure | |
returns( | |
uint | |
) | |
{ | |
if (a > b) { | |
return a; | |
} | |
return b; | |
} | |
/** | |
* @dev Sets buffer length to 0. | |
* @param buf The buffer to truncate. | |
* @return The original buffer, for chaining.. | |
*/ | |
function truncate( | |
buffer memory buf | |
) | |
internal | |
pure | |
returns ( | |
buffer memory | |
) | |
{ | |
assembly { | |
let bufptr := mload(buf) | |
mstore(bufptr, 0) | |
} | |
return buf; | |
} | |
/** | |
* @dev Writes a byte string to a buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The start offset to write to. | |
* @param data The data to append. | |
* @param len The number of bytes to copy. | |
* @return The original buffer, for chaining. | |
*/ | |
function write( | |
buffer memory buf, | |
uint off, | |
bytes memory data, | |
uint len | |
) | |
internal | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
require(len <= data.length); | |
if (off + len > buf.capacity) { | |
resize(buf, max(buf.capacity, len + off) * 2); | |
} | |
uint dest; | |
uint src; | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Length of existing buffer data | |
let buflen := mload(bufptr) | |
// Start address = buffer address + offset + sizeof(buffer length) | |
dest := add(add(bufptr, 32), off) | |
// Update buffer length if we're extending it | |
if gt(add(len, off), buflen) { | |
mstore(bufptr, add(len, off)) | |
} | |
src := add(data, 32) | |
} | |
// Copy word-length chunks while possible | |
for (; len >= 32; len -= 32) { | |
assembly { | |
mstore(dest, mload(src)) | |
} | |
dest += 32; | |
src += 32; | |
} | |
// Copy remaining bytes | |
uint mask = 256 ** (32 - len) - 1; | |
assembly { | |
let srcpart := and(mload(src), not(mask)) | |
let destpart := and(mload(dest), mask) | |
mstore(dest, or(destpart, srcpart)) | |
} | |
return buf; | |
} | |
/** | |
* @dev Appends a byte string to a buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @param len The number of bytes to copy. | |
* @return The original buffer, for chaining. | |
*/ | |
function append( | |
buffer memory buf, | |
bytes memory data, | |
uint len | |
) | |
internal | |
pure | |
returns ( | |
buffer memory | |
) | |
{ | |
return write(buf, buf.buf.length, data, len); | |
} | |
/** | |
* @dev Appends a byte string to a buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function append( | |
buffer memory buf, | |
bytes memory data | |
) | |
internal | |
pure | |
returns ( | |
buffer memory | |
) | |
{ | |
return write(buf, buf.buf.length, data, data.length); | |
} | |
/** | |
* @dev Writes a byte to the buffer. Resizes if doing so would exceed the | |
* capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write the byte at. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function writeUint8( | |
buffer memory buf, | |
uint off, | |
uint8 data | |
) | |
internal | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
if (off >= buf.capacity) { | |
resize(buf, buf.capacity * 2); | |
} | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Length of existing buffer data | |
let buflen := mload(bufptr) | |
// Address = buffer address + sizeof(buffer length) + off | |
let dest := add(add(bufptr, off), 32) | |
mstore8(dest, data) | |
// Update buffer length if we extended it | |
if eq(off, buflen) { | |
mstore(bufptr, add(buflen, 1)) | |
} | |
} | |
return buf; | |
} | |
/** | |
* @dev Appends a byte to the buffer. Resizes if doing so would exceed the | |
* capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function appendUint8( | |
buffer memory buf, | |
uint8 data | |
) | |
internal | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
return writeUint8(buf, buf.buf.length, data); | |
} | |
/** | |
* @dev Writes up to 32 bytes to the buffer. Resizes if doing so would | |
* exceed the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write at. | |
* @param data The data to append. | |
* @param len The number of bytes to write (left-aligned). | |
* @return The original buffer, for chaining. | |
*/ | |
function write( | |
buffer memory buf, | |
uint off, | |
bytes32 data, | |
uint len | |
) | |
private | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
if (len + off > buf.capacity) { | |
resize(buf, (len + off) * 2); | |
} | |
uint mask = 256 ** len - 1; | |
// Right-align data | |
data = data >> (8 * (32 - len)); | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Address = buffer address + sizeof(buffer length) + off + len | |
let dest := add(add(bufptr, off), len) | |
mstore(dest, or(and(mload(dest), not(mask)), data)) | |
// Update buffer length if we extended it | |
if gt(add(off, len), mload(bufptr)) { | |
mstore(bufptr, add(off, len)) | |
} | |
} | |
return buf; | |
} | |
/** | |
* @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the | |
* capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write at. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function writeBytes20( | |
buffer memory buf, | |
uint off, | |
bytes20 data | |
) | |
internal | |
pure | |
returns ( | |
buffer memory | |
) | |
{ | |
return write(buf, off, bytes32(data), 20); | |
} | |
/** | |
* @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chhaining. | |
*/ | |
function appendBytes20( | |
buffer memory buf, | |
bytes20 data | |
) | |
internal | |
pure | |
returns ( | |
buffer memory | |
) | |
{ | |
return write(buf, buf.buf.length, bytes32(data), 20); | |
} | |
/** | |
* @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function appendBytes32( | |
buffer memory buf, | |
bytes32 data | |
) | |
internal | |
pure | |
returns ( | |
buffer memory | |
) | |
{ | |
return write(buf, buf.buf.length, data, 32); | |
} | |
/** | |
* @dev Writes an integer to the buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write at. | |
* @param data The data to append. | |
* @param len The number of bytes to write (right-aligned). | |
* @return The original buffer, for chaining. | |
*/ | |
function writeInt( | |
buffer memory buf, | |
uint off, | |
uint data, | |
uint len | |
) | |
private | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
if (len + off > buf.capacity) { | |
resize(buf, (len + off) * 2); | |
} | |
uint mask = 256 ** len - 1; | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Address = buffer address + off + sizeof(buffer length) + len | |
let dest := add(add(bufptr, off), len) | |
mstore(dest, or(and(mload(dest), not(mask)), data)) | |
// Update buffer length if we extended it | |
if gt(add(off, len), mload(bufptr)) { | |
mstore(bufptr, add(off, len)) | |
} | |
} | |
return buf; | |
} | |
/** | |
* @dev Appends a byte to the end of the buffer. Resizes if doing so would | |
* exceed the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer. | |
*/ | |
function appendInt( | |
buffer memory buf, | |
uint data, | |
uint len | |
) | |
internal | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
return writeInt(buf, buf.buf.length, data, len); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity >= 0.4.19; | |
import { BufferChainlink } from "./BufferChainlink.sol"; | |
library CBORChainlink { | |
using BufferChainlink for BufferChainlink.buffer; | |
uint8 private constant MAJOR_TYPE_INT = 0; | |
uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1; | |
uint8 private constant MAJOR_TYPE_BYTES = 2; | |
uint8 private constant MAJOR_TYPE_STRING = 3; | |
uint8 private constant MAJOR_TYPE_ARRAY = 4; | |
uint8 private constant MAJOR_TYPE_MAP = 5; | |
uint8 private constant MAJOR_TYPE_TAG = 6; | |
uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7; | |
uint8 private constant TAG_TYPE_BIGNUM = 2; | |
uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3; | |
function encodeType( | |
BufferChainlink.buffer memory buf, | |
uint8 major, | |
uint value | |
) | |
private | |
pure | |
{ | |
if(value <= 23) { | |
buf.appendUint8(uint8((major << 5) | value)); | |
} else if(value <= 0xFF) { | |
buf.appendUint8(uint8((major << 5) | 24)); | |
buf.appendInt(value, 1); | |
} else if(value <= 0xFFFF) { | |
buf.appendUint8(uint8((major << 5) | 25)); | |
buf.appendInt(value, 2); | |
} else if(value <= 0xFFFFFFFF) { | |
buf.appendUint8(uint8((major << 5) | 26)); | |
buf.appendInt(value, 4); | |
} else if(value <= 0xFFFFFFFFFFFFFFFF) { | |
buf.appendUint8(uint8((major << 5) | 27)); | |
buf.appendInt(value, 8); | |
} | |
} | |
function encodeIndefiniteLengthType( | |
BufferChainlink.buffer memory buf, | |
uint8 major | |
) | |
private | |
pure | |
{ | |
buf.appendUint8(uint8((major << 5) | 31)); | |
} | |
function encodeUInt( | |
BufferChainlink.buffer memory buf, | |
uint value | |
) | |
internal | |
pure | |
{ | |
encodeType(buf, MAJOR_TYPE_INT, value); | |
} | |
function encodeInt( | |
BufferChainlink.buffer memory buf, | |
int value | |
) | |
internal | |
pure | |
{ | |
if(value < -0x10000000000000000) { | |
encodeSignedBigNum(buf, value); | |
} else if(value > 0xFFFFFFFFFFFFFFFF) { | |
encodeBigNum(buf, value); | |
} else if(value >= 0) { | |
encodeType(buf, MAJOR_TYPE_INT, uint(value)); | |
} else { | |
encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value)); | |
} | |
} | |
function encodeBytes( | |
BufferChainlink.buffer memory buf, | |
bytes memory value | |
) | |
internal | |
pure | |
{ | |
encodeType(buf, MAJOR_TYPE_BYTES, value.length); | |
buf.append(value); | |
} | |
function encodeBigNum( | |
BufferChainlink.buffer memory buf, | |
int value | |
) | |
internal | |
pure | |
{ | |
buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM)); | |
encodeBytes(buf, abi.encode(uint(value))); | |
} | |
function encodeSignedBigNum( | |
BufferChainlink.buffer memory buf, | |
int input | |
) | |
internal | |
pure | |
{ | |
buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM)); | |
encodeBytes(buf, abi.encode(uint(-1 - input))); | |
} | |
function encodeString( | |
BufferChainlink.buffer memory buf, | |
string memory value | |
) | |
internal | |
pure | |
{ | |
encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length); | |
buf.append(bytes(value)); | |
} | |
function startArray( | |
BufferChainlink.buffer memory buf | |
) | |
internal | |
pure | |
{ | |
encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY); | |
} | |
function startMap( | |
BufferChainlink.buffer memory buf | |
) | |
internal | |
pure | |
{ | |
encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP); | |
} | |
function endSequence( | |
BufferChainlink.buffer memory buf | |
) | |
internal | |
pure | |
{ | |
encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.7.0; | |
abstract contract ENSResolver { | |
function addr( | |
bytes32 node | |
) | |
public | |
view | |
virtual | |
returns ( | |
address | |
); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.8.0; | |
import { CBORChainlink } from "../vendor/CBORChainlink.sol"; | |
import { BufferChainlink } from "../vendor/BufferChainlink.sol"; | |
/** | |
* @title Library for common Chainlink functions | |
* @dev Uses imported CBOR library for encoding to buffer | |
*/ | |
library Chainlink { | |
uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase | |
using CBORChainlink for BufferChainlink.buffer; | |
struct Request { | |
bytes32 id; | |
address callbackAddress; | |
bytes4 callbackFunctionId; | |
uint256 nonce; | |
BufferChainlink.buffer buf; | |
} | |
/** | |
* @notice Initializes a Chainlink request | |
* @dev Sets the ID, callback address, and callback function signature on the request | |
* @param self The uninitialized request | |
* @param jobId The Job Specification ID | |
* @param callbackAddr The callback address | |
* @param callbackFunc The callback function signature | |
* @return The initialized request | |
*/ | |
function initialize( | |
Request memory self, | |
bytes32 jobId, | |
address callbackAddr, | |
bytes4 callbackFunc | |
) | |
internal | |
pure | |
returns ( | |
Chainlink.Request memory | |
) | |
{ | |
BufferChainlink.init(self.buf, defaultBufferSize); | |
self.id = jobId; | |
self.callbackAddress = callbackAddr; | |
self.callbackFunctionId = callbackFunc; | |
return self; | |
} | |
/** | |
* @notice Sets the data for the buffer without encoding CBOR on-chain | |
* @dev CBOR can be closed with curly-brackets {} or they can be left off | |
* @param self The initialized request | |
* @param data The CBOR data | |
*/ | |
function setBuffer( | |
Request memory self, | |
bytes memory data | |
) | |
internal | |
pure | |
{ | |
BufferChainlink.init(self.buf, data.length); | |
BufferChainlink.append(self.buf, data); | |
} | |
/** | |
* @notice Adds a string value to the request with a given key name | |
* @param self The initialized request | |
* @param key The name of the key | |
* @param value The string value to add | |
*/ | |
function add( | |
Request memory self, | |
string memory key, | |
string memory value | |
) | |
internal | |
pure | |
{ | |
self.buf.encodeString(key); | |
self.buf.encodeString(value); | |
} | |
/** | |
* @notice Adds a bytes value to the request with a given key name | |
* @param self The initialized request | |
* @param key The name of the key | |
* @param value The bytes value to add | |
*/ | |
function addBytes( | |
Request memory self, | |
string memory key, | |
bytes memory value | |
) | |
internal | |
pure | |
{ | |
self.buf.encodeString(key); | |
self.buf.encodeBytes(value); | |
} | |
/** | |
* @notice Adds a int256 value to the request with a given key name | |
* @param self The initialized request | |
* @param key The name of the key | |
* @param value The int256 value to add | |
*/ | |
function addInt( | |
Request memory self, | |
string memory key, | |
int256 value | |
) | |
internal | |
pure | |
{ | |
self.buf.encodeString(key); | |
self.buf.encodeInt(value); | |
} | |
/** | |
* @notice Adds a uint256 value to the request with a given key name | |
* @param self The initialized request | |
* @param key The name of the key | |
* @param value The uint256 value to add | |
*/ | |
function addUint( | |
Request memory self, | |
string memory key, | |
uint256 value | |
) | |
internal | |
pure | |
{ | |
self.buf.encodeString(key); | |
self.buf.encodeUInt(value); | |
} | |
/** | |
* @notice Adds an array of strings to the request with a given key name | |
* @param self The initialized request | |
* @param key The name of the key | |
* @param values The array of string values to add | |
*/ | |
function addStringArray( | |
Request memory self, | |
string memory key, | |
string[] memory values | |
) | |
internal | |
pure | |
{ | |
self.buf.encodeString(key); | |
self.buf.startArray(); | |
for (uint256 i = 0; i < values.length; i++) { | |
self.buf.encodeString(values[i]); | |
} | |
self.buf.endSequence(); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.8.0; | |
import "./Chainlink.sol"; | |
import "../interfaces/ENSInterface.sol"; | |
import "../interfaces/LinkTokenInterface.sol"; | |
import "../interfaces/ChainlinkRequestInterface.sol"; | |
import "../interfaces/PointerInterface.sol"; | |
import { ENSResolver as ENSResolver_Chainlink } from "../vendor/ENSResolver.sol"; | |
/** | |
* @title The ChainlinkClient contract | |
* @notice Contract writers can inherit this contract in order to create requests for the | |
* Chainlink network | |
*/ | |
contract ChainlinkClient { | |
using Chainlink for Chainlink.Request; | |
uint256 constant internal LINK_DIVISIBILITY = 10**18; | |
uint256 constant private AMOUNT_OVERRIDE = 0; | |
address constant private SENDER_OVERRIDE = address(0); | |
uint256 constant private ARGS_VERSION = 2; | |
bytes32 constant private ENS_TOKEN_SUBNAME = keccak256("link"); | |
bytes32 constant private ENS_ORACLE_SUBNAME = keccak256("oracle"); | |
address constant private LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571; | |
ENSInterface private ens; | |
bytes32 private ensNode; | |
LinkTokenInterface private link; | |
ChainlinkRequestInterface private oracle; | |
uint256 private requestCount = 1; | |
mapping(bytes32 => address) private pendingRequests; | |
event ChainlinkRequested( | |
bytes32 indexed id | |
); | |
event ChainlinkFulfilled( | |
bytes32 indexed id | |
); | |
event ChainlinkCancelled( | |
bytes32 indexed id | |
); | |
/** | |
* @notice Creates a request that can hold additional parameters | |
* @param specId The Job Specification ID that the request will be created for | |
* @param callbackAddress The callback address that the response will be sent to | |
* @param callbackFunctionSignature The callback function signature to use for the callback address | |
* @return A Chainlink Request struct in memory | |
*/ | |
function buildChainlinkRequest( | |
bytes32 specId, | |
address callbackAddress, | |
bytes4 callbackFunctionSignature | |
) | |
internal | |
pure | |
returns ( | |
Chainlink.Request memory | |
) | |
{ | |
Chainlink.Request memory req; | |
return req.initialize(specId, callbackAddress, callbackFunctionSignature); | |
} | |
/** | |
* @notice Creates a Chainlink request to the stored oracle address | |
* @dev Calls `chainlinkRequestTo` with the stored oracle address | |
* @param req The initialized Chainlink Request | |
* @param payment The amount of LINK to send for the request | |
* @return requestId The request ID | |
*/ | |
function sendChainlinkRequest( | |
Chainlink.Request memory req, | |
uint256 payment | |
) | |
internal | |
returns ( | |
bytes32 | |
) | |
{ | |
return sendChainlinkRequestTo(address(oracle), req, payment); | |
} | |
/** | |
* @notice Creates a Chainlink request to the specified oracle address | |
* @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to | |
* send LINK which creates a request on the target oracle contract. | |
* Emits ChainlinkRequested event. | |
* @param oracleAddress The address of the oracle for the request | |
* @param req The initialized Chainlink Request | |
* @param payment The amount of LINK to send for the request | |
* @return requestId The request ID | |
*/ | |
function sendChainlinkRequestTo( | |
address oracleAddress, | |
Chainlink.Request memory req, | |
uint256 payment | |
) | |
internal | |
returns ( | |
bytes32 requestId | |
) | |
{ | |
requestId = keccak256(abi.encodePacked(this, requestCount)); | |
req.nonce = requestCount; | |
pendingRequests[requestId] = oracleAddress; | |
emit ChainlinkRequested(requestId); | |
require(link.transferAndCall(oracleAddress, payment, encodeRequest(req, ARGS_VERSION)), "unable to transferAndCall to oracle"); | |
requestCount += 1; | |
return requestId; | |
} | |
/** | |
* @notice Allows a request to be cancelled if it has not been fulfilled | |
* @dev Requires keeping track of the expiration value emitted from the oracle contract. | |
* Deletes the request from the `pendingRequests` mapping. | |
* Emits ChainlinkCancelled event. | |
* @param requestId The request ID | |
* @param payment The amount of LINK sent for the request | |
* @param callbackFunc The callback function specified for the request | |
* @param expiration The time of the expiration for the request | |
*/ | |
function cancelChainlinkRequest( | |
bytes32 requestId, | |
uint256 payment, | |
bytes4 callbackFunc, | |
uint256 expiration | |
) | |
internal | |
{ | |
ChainlinkRequestInterface requested = ChainlinkRequestInterface(pendingRequests[requestId]); | |
delete pendingRequests[requestId]; | |
emit ChainlinkCancelled(requestId); | |
requested.cancelOracleRequest(requestId, payment, callbackFunc, expiration); | |
} | |
/** | |
* @notice Sets the stored oracle address | |
* @param oracleAddress The address of the oracle contract | |
*/ | |
function setChainlinkOracle( | |
address oracleAddress | |
) | |
internal | |
{ | |
oracle = ChainlinkRequestInterface(oracleAddress); | |
} | |
/** | |
* @notice Sets the LINK token address | |
* @param linkAddress The address of the LINK token contract | |
*/ | |
function setChainlinkToken( | |
address linkAddress | |
) | |
internal | |
{ | |
link = LinkTokenInterface(linkAddress); | |
} | |
/** | |
* @notice Sets the Chainlink token address for the public | |
* network as given by the Pointer contract | |
*/ | |
function setPublicChainlinkToken() | |
internal | |
{ | |
setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress()); | |
} | |
/** | |
* @notice Retrieves the stored address of the LINK token | |
* @return The address of the LINK token | |
*/ | |
function chainlinkTokenAddress() | |
internal | |
view | |
returns ( | |
address | |
) | |
{ | |
return address(link); | |
} | |
/** | |
* @notice Retrieves the stored address of the oracle contract | |
* @return The address of the oracle contract | |
*/ | |
function chainlinkOracleAddress() | |
internal | |
view | |
returns ( | |
address | |
) | |
{ | |
return address(oracle); | |
} | |
/** | |
* @notice Allows for a request which was created on another contract to be fulfilled | |
* on this contract | |
* @param oracleAddress The address of the oracle contract that will fulfill the request | |
* @param requestId The request ID used for the response | |
*/ | |
function addChainlinkExternalRequest( | |
address oracleAddress, | |
bytes32 requestId | |
) | |
internal | |
notPendingRequest(requestId) | |
{ | |
pendingRequests[requestId] = oracleAddress; | |
} | |
/** | |
* @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS | |
* @dev Accounts for subnodes having different resolvers | |
* @param ensAddress The address of the ENS contract | |
* @param node The ENS node hash | |
*/ | |
function useChainlinkWithENS( | |
address ensAddress, | |
bytes32 node | |
) | |
internal | |
{ | |
ens = ENSInterface(ensAddress); | |
ensNode = node; | |
bytes32 linkSubnode = keccak256(abi.encodePacked(ensNode, ENS_TOKEN_SUBNAME)); | |
ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(linkSubnode)); | |
setChainlinkToken(resolver.addr(linkSubnode)); | |
updateChainlinkOracleWithENS(); | |
} | |
/** | |
* @notice Sets the stored oracle contract with the address resolved by ENS | |
* @dev This may be called on its own as long as `useChainlinkWithENS` has been called previously | |
*/ | |
function updateChainlinkOracleWithENS() | |
internal | |
{ | |
bytes32 oracleSubnode = keccak256(abi.encodePacked(ensNode, ENS_ORACLE_SUBNAME)); | |
ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(oracleSubnode)); | |
setChainlinkOracle(resolver.addr(oracleSubnode)); | |
} | |
/** | |
* @notice Encodes the request to be sent to the oracle contract | |
* @dev The Chainlink node expects values to be in order for the request to be picked up. Order of types | |
* will be validated in the oracle contract. | |
* @param req The initialized Chainlink Request | |
* @param dataVersion The request data version | |
* @return The bytes payload for the `transferAndCall` method | |
*/ | |
function encodeRequest( | |
Chainlink.Request memory req, | |
uint256 dataVersion | |
) | |
private | |
view | |
returns ( | |
bytes memory | |
) | |
{ | |
return abi.encodeWithSelector( | |
oracle.oracleRequest.selector, | |
SENDER_OVERRIDE, // Sender value - overridden by onTokenTransfer by the requesting contract's address | |
AMOUNT_OVERRIDE, // Amount value - overridden by onTokenTransfer by the actual amount of LINK sent | |
req.id, | |
req.callbackAddress, | |
req.callbackFunctionId, | |
req.nonce, | |
dataVersion, | |
req.buf.buf); | |
} | |
/** | |
* @notice Ensures that the fulfillment is valid for this contract | |
* @dev Use if the contract developer prefers methods instead of modifiers for validation | |
* @param requestId The request ID for fulfillment | |
*/ | |
function validateChainlinkCallback( | |
bytes32 requestId | |
) | |
internal | |
recordChainlinkFulfillment(requestId) | |
// solhint-disable-next-line no-empty-blocks | |
{} | |
/** | |
* @dev Reverts if the sender is not the oracle of the request. | |
* Emits ChainlinkFulfilled event. | |
* @param requestId The request ID for fulfillment | |
*/ | |
modifier recordChainlinkFulfillment( | |
bytes32 requestId | |
) | |
{ | |
require(msg.sender == pendingRequests[requestId], | |
"Source must be the oracle of the request"); | |
delete pendingRequests[requestId]; | |
emit ChainlinkFulfilled(requestId); | |
_; | |
} | |
/** | |
* @dev Reverts if the request is already pending | |
* @param requestId The request ID for fulfillment | |
*/ | |
modifier notPendingRequest( | |
bytes32 requestId | |
) | |
{ | |
require(pendingRequests[requestId] == address(0), "Request is already pending"); | |
_; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.8.0; | |
interface ChainlinkRequestInterface { | |
function oracleRequest( | |
address sender, | |
uint256 requestPrice, | |
bytes32 serviceAgreementID, | |
address callbackAddress, | |
bytes4 callbackFunctionId, | |
uint256 nonce, | |
uint256 dataVersion, | |
bytes calldata data | |
) external; | |
function cancelOracleRequest( | |
bytes32 requestId, | |
uint256 payment, | |
bytes4 callbackFunctionId, | |
uint256 expiration | |
) external; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.8.0; | |
interface ENSInterface { | |
// Logged when the owner of a node assigns a new owner to a subnode. | |
event NewOwner( | |
bytes32 indexed node, | |
bytes32 indexed label, | |
address owner | |
); | |
// Logged when the owner of a node transfers ownership to a new account. | |
event Transfer( | |
bytes32 indexed node, | |
address owner | |
); | |
// Logged when the resolver for a node changes. | |
event NewResolver( | |
bytes32 indexed node, | |
address resolver | |
); | |
// Logged when the TTL of a node changes | |
event NewTTL( | |
bytes32 indexed node, | |
uint64 ttl | |
); | |
function setSubnodeOwner( | |
bytes32 node, | |
bytes32 label, | |
address owner | |
) external; | |
function setResolver( | |
bytes32 node, | |
address resolver | |
) external; | |
function setOwner( | |
bytes32 node, | |
address owner | |
) external; | |
function setTTL( | |
bytes32 node, | |
uint64 ttl | |
) external; | |
function owner( | |
bytes32 node | |
) | |
external | |
view | |
returns ( | |
address | |
); | |
function resolver( | |
bytes32 node | |
) | |
external | |
view | |
returns ( | |
address | |
); | |
function ttl( | |
bytes32 node | |
) | |
external | |
view | |
returns ( | |
uint64 | |
); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.8.0; | |
interface LinkTokenInterface { | |
function allowance( | |
address owner, | |
address spender | |
) | |
external | |
view | |
returns ( | |
uint256 remaining | |
); | |
function approve( | |
address spender, | |
uint256 value | |
) | |
external | |
returns ( | |
bool success | |
); | |
function balanceOf( | |
address owner | |
) | |
external | |
view | |
returns ( | |
uint256 balance | |
); | |
function decimals() | |
external | |
view | |
returns ( | |
uint8 decimalPlaces | |
); | |
function decreaseApproval( | |
address spender, | |
uint256 addedValue | |
) | |
external | |
returns ( | |
bool success | |
); | |
function increaseApproval( | |
address spender, | |
uint256 subtractedValue | |
) external; | |
function name() | |
external | |
view | |
returns ( | |
string memory tokenName | |
); | |
function symbol() | |
external | |
view | |
returns ( | |
string memory tokenSymbol | |
); | |
function totalSupply() | |
external | |
view | |
returns ( | |
uint256 totalTokensIssued | |
); | |
function transfer( | |
address to, | |
uint256 value | |
) | |
external | |
returns ( | |
bool success | |
); | |
function transferAndCall( | |
address to, | |
uint256 value, | |
bytes calldata data | |
) | |
external | |
returns ( | |
bool success | |
); | |
function transferFrom( | |
address from, | |
address to, | |
uint256 value | |
) | |
external | |
returns ( | |
bool success | |
); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.8.0; | |
interface PointerInterface { | |
function getAddress() | |
external | |
view | |
returns ( | |
address | |
); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.8.0; | |
/** | |
* @dev A library for working with mutable byte buffers in Solidity. | |
* | |
* Byte buffers are mutable and expandable, and provide a variety of primitives | |
* for writing to them. At any time you can fetch a bytes object containing the | |
* current contents of the buffer. The bytes object should not be stored between | |
* operations, as it may change due to resizing of the buffer. | |
*/ | |
library BufferChainlink { | |
/** | |
* @dev Represents a mutable buffer. Buffers have a current value (buf) and | |
* a capacity. The capacity may be longer than the current value, in | |
* which case it can be extended without the need to allocate more memory. | |
*/ | |
struct buffer { | |
bytes buf; | |
uint capacity; | |
} | |
/** | |
* @dev Initializes a buffer with an initial capacity. | |
* @param buf The buffer to initialize. | |
* @param capacity The number of bytes of space to allocate the buffer. | |
* @return The buffer, for chaining. | |
*/ | |
function init( | |
buffer memory buf, | |
uint capacity | |
) | |
internal | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
if (capacity % 32 != 0) { | |
capacity += 32 - (capacity % 32); | |
} | |
// Allocate space for the buffer data | |
buf.capacity = capacity; | |
assembly { | |
let ptr := mload(0x40) | |
mstore(buf, ptr) | |
mstore(ptr, 0) | |
mstore(0x40, add(32, add(ptr, capacity))) | |
} | |
return buf; | |
} | |
/** | |
* @dev Initializes a new buffer from an existing bytes object. | |
* Changes to the buffer may mutate the original value. | |
* @param b The bytes object to initialize the buffer with. | |
* @return A new buffer. | |
*/ | |
function fromBytes( | |
bytes memory b | |
) | |
internal | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
buffer memory buf; | |
buf.buf = b; | |
buf.capacity = b.length; | |
return buf; | |
} | |
function resize( | |
buffer memory buf, | |
uint capacity | |
) | |
private | |
pure | |
{ | |
bytes memory oldbuf = buf.buf; | |
init(buf, capacity); | |
append(buf, oldbuf); | |
} | |
function max( | |
uint a, | |
uint b | |
) | |
private | |
pure | |
returns( | |
uint | |
) | |
{ | |
if (a > b) { | |
return a; | |
} | |
return b; | |
} | |
/** | |
* @dev Sets buffer length to 0. | |
* @param buf The buffer to truncate. | |
* @return The original buffer, for chaining.. | |
*/ | |
function truncate( | |
buffer memory buf | |
) | |
internal | |
pure | |
returns ( | |
buffer memory | |
) | |
{ | |
assembly { | |
let bufptr := mload(buf) | |
mstore(bufptr, 0) | |
} | |
return buf; | |
} | |
/** | |
* @dev Writes a byte string to a buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The start offset to write to. | |
* @param data The data to append. | |
* @param len The number of bytes to copy. | |
* @return The original buffer, for chaining. | |
*/ | |
function write( | |
buffer memory buf, | |
uint off, | |
bytes memory data, | |
uint len | |
) | |
internal | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
require(len <= data.length); | |
if (off + len > buf.capacity) { | |
resize(buf, max(buf.capacity, len + off) * 2); | |
} | |
uint dest; | |
uint src; | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Length of existing buffer data | |
let buflen := mload(bufptr) | |
// Start address = buffer address + offset + sizeof(buffer length) | |
dest := add(add(bufptr, 32), off) | |
// Update buffer length if we're extending it | |
if gt(add(len, off), buflen) { | |
mstore(bufptr, add(len, off)) | |
} | |
src := add(data, 32) | |
} | |
// Copy word-length chunks while possible | |
for (; len >= 32; len -= 32) { | |
assembly { | |
mstore(dest, mload(src)) | |
} | |
dest += 32; | |
src += 32; | |
} | |
// Copy remaining bytes | |
uint mask = 256 ** (32 - len) - 1; | |
assembly { | |
let srcpart := and(mload(src), not(mask)) | |
let destpart := and(mload(dest), mask) | |
mstore(dest, or(destpart, srcpart)) | |
} | |
return buf; | |
} | |
/** | |
* @dev Appends a byte string to a buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @param len The number of bytes to copy. | |
* @return The original buffer, for chaining. | |
*/ | |
function append( | |
buffer memory buf, | |
bytes memory data, | |
uint len | |
) | |
internal | |
pure | |
returns ( | |
buffer memory | |
) | |
{ | |
return write(buf, buf.buf.length, data, len); | |
} | |
/** | |
* @dev Appends a byte string to a buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function append( | |
buffer memory buf, | |
bytes memory data | |
) | |
internal | |
pure | |
returns ( | |
buffer memory | |
) | |
{ | |
return write(buf, buf.buf.length, data, data.length); | |
} | |
/** | |
* @dev Writes a byte to the buffer. Resizes if doing so would exceed the | |
* capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write the byte at. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function writeUint8( | |
buffer memory buf, | |
uint off, | |
uint8 data | |
) | |
internal | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
if (off >= buf.capacity) { | |
resize(buf, buf.capacity * 2); | |
} | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Length of existing buffer data | |
let buflen := mload(bufptr) | |
// Address = buffer address + sizeof(buffer length) + off | |
let dest := add(add(bufptr, off), 32) | |
mstore8(dest, data) | |
// Update buffer length if we extended it | |
if eq(off, buflen) { | |
mstore(bufptr, add(buflen, 1)) | |
} | |
} | |
return buf; | |
} | |
/** | |
* @dev Appends a byte to the buffer. Resizes if doing so would exceed the | |
* capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function appendUint8( | |
buffer memory buf, | |
uint8 data | |
) | |
internal | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
return writeUint8(buf, buf.buf.length, data); | |
} | |
/** | |
* @dev Writes up to 32 bytes to the buffer. Resizes if doing so would | |
* exceed the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write at. | |
* @param data The data to append. | |
* @param len The number of bytes to write (left-aligned). | |
* @return The original buffer, for chaining. | |
*/ | |
function write( | |
buffer memory buf, | |
uint off, | |
bytes32 data, | |
uint len | |
) | |
private | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
if (len + off > buf.capacity) { | |
resize(buf, (len + off) * 2); | |
} | |
uint mask = 256 ** len - 1; | |
// Right-align data | |
data = data >> (8 * (32 - len)); | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Address = buffer address + sizeof(buffer length) + off + len | |
let dest := add(add(bufptr, off), len) | |
mstore(dest, or(and(mload(dest), not(mask)), data)) | |
// Update buffer length if we extended it | |
if gt(add(off, len), mload(bufptr)) { | |
mstore(bufptr, add(off, len)) | |
} | |
} | |
return buf; | |
} | |
/** | |
* @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the | |
* capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write at. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function writeBytes20( | |
buffer memory buf, | |
uint off, | |
bytes20 data | |
) | |
internal | |
pure | |
returns ( | |
buffer memory | |
) | |
{ | |
return write(buf, off, bytes32(data), 20); | |
} | |
/** | |
* @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chhaining. | |
*/ | |
function appendBytes20( | |
buffer memory buf, | |
bytes20 data | |
) | |
internal | |
pure | |
returns ( | |
buffer memory | |
) | |
{ | |
return write(buf, buf.buf.length, bytes32(data), 20); | |
} | |
/** | |
* @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function appendBytes32( | |
buffer memory buf, | |
bytes32 data | |
) | |
internal | |
pure | |
returns ( | |
buffer memory | |
) | |
{ | |
return write(buf, buf.buf.length, data, 32); | |
} | |
/** | |
* @dev Writes an integer to the buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write at. | |
* @param data The data to append. | |
* @param len The number of bytes to write (right-aligned). | |
* @return The original buffer, for chaining. | |
*/ | |
function writeInt( | |
buffer memory buf, | |
uint off, | |
uint data, | |
uint len | |
) | |
private | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
if (len + off > buf.capacity) { | |
resize(buf, (len + off) * 2); | |
} | |
uint mask = 256 ** len - 1; | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Address = buffer address + off + sizeof(buffer length) + len | |
let dest := add(add(bufptr, off), len) | |
mstore(dest, or(and(mload(dest), not(mask)), data)) | |
// Update buffer length if we extended it | |
if gt(add(off, len), mload(bufptr)) { | |
mstore(bufptr, add(off, len)) | |
} | |
} | |
return buf; | |
} | |
/** | |
* @dev Appends a byte to the end of the buffer. Resizes if doing so would | |
* exceed the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer. | |
*/ | |
function appendInt( | |
buffer memory buf, | |
uint data, | |
uint len | |
) | |
internal | |
pure | |
returns( | |
buffer memory | |
) | |
{ | |
return writeInt(buf, buf.buf.length, data, len); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity >= 0.4.19; | |
import { BufferChainlink } from "./BufferChainlink.sol"; | |
library CBORChainlink { | |
using BufferChainlink for BufferChainlink.buffer; | |
uint8 private constant MAJOR_TYPE_INT = 0; | |
uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1; | |
uint8 private constant MAJOR_TYPE_BYTES = 2; | |
uint8 private constant MAJOR_TYPE_STRING = 3; | |
uint8 private constant MAJOR_TYPE_ARRAY = 4; | |
uint8 private constant MAJOR_TYPE_MAP = 5; | |
uint8 private constant MAJOR_TYPE_TAG = 6; | |
uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7; | |
uint8 private constant TAG_TYPE_BIGNUM = 2; | |
uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3; | |
function encodeType( | |
BufferChainlink.buffer memory buf, | |
uint8 major, | |
uint value | |
) | |
private | |
pure | |
{ | |
if(value <= 23) { | |
buf.appendUint8(uint8((major << 5) | value)); | |
} else if(value <= 0xFF) { | |
buf.appendUint8(uint8((major << 5) | 24)); | |
buf.appendInt(value, 1); | |
} else if(value <= 0xFFFF) { | |
buf.appendUint8(uint8((major << 5) | 25)); | |
buf.appendInt(value, 2); | |
} else if(value <= 0xFFFFFFFF) { | |
buf.appendUint8(uint8((major << 5) | 26)); | |
buf.appendInt(value, 4); | |
} else if(value <= 0xFFFFFFFFFFFFFFFF) { | |
buf.appendUint8(uint8((major << 5) | 27)); | |
buf.appendInt(value, 8); | |
} | |
} | |
function encodeIndefiniteLengthType( | |
BufferChainlink.buffer memory buf, | |
uint8 major | |
) | |
private | |
pure | |
{ | |
buf.appendUint8(uint8((major << 5) | 31)); | |
} | |
function encodeUInt( | |
BufferChainlink.buffer memory buf, | |
uint value | |
) | |
internal | |
pure | |
{ | |
encodeType(buf, MAJOR_TYPE_INT, value); | |
} | |
function encodeInt( | |
BufferChainlink.buffer memory buf, | |
int value | |
) | |
internal | |
pure | |
{ | |
if(value < -0x10000000000000000) { | |
encodeSignedBigNum(buf, value); | |
} else if(value > 0xFFFFFFFFFFFFFFFF) { | |
encodeBigNum(buf, value); | |
} else if(value >= 0) { | |
encodeType(buf, MAJOR_TYPE_INT, uint(value)); | |
} else { | |
encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value)); | |
} | |
} | |
function encodeBytes( | |
BufferChainlink.buffer memory buf, | |
bytes memory value | |
) | |
internal | |
pure | |
{ | |
encodeType(buf, MAJOR_TYPE_BYTES, value.length); | |
buf.append(value); | |
} | |
function encodeBigNum( | |
BufferChainlink.buffer memory buf, | |
int value | |
) | |
internal | |
pure | |
{ | |
buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM)); | |
encodeBytes(buf, abi.encode(uint(value))); | |
} | |
function encodeSignedBigNum( | |
BufferChainlink.buffer memory buf, | |
int input | |
) | |
internal | |
pure | |
{ | |
buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM)); | |
encodeBytes(buf, abi.encode(uint(-1 - input))); | |
} | |
function encodeString( | |
BufferChainlink.buffer memory buf, | |
string memory value | |
) | |
internal | |
pure | |
{ | |
encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length); | |
buf.append(bytes(value)); | |
} | |
function startArray( | |
BufferChainlink.buffer memory buf | |
) | |
internal | |
pure | |
{ | |
encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY); | |
} | |
function startMap( | |
BufferChainlink.buffer memory buf | |
) | |
internal | |
pure | |
{ | |
encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP); | |
} | |
function endSequence( | |
BufferChainlink.buffer memory buf | |
) | |
internal | |
pure | |
{ | |
encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.8.0; | |
abstract contract ENSResolver { | |
function addr( | |
bytes32 node | |
) | |
public | |
view | |
virtual | |
returns ( | |
address | |
); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.6.0; | |
import { CBORChainlink } from "./vendor/CBORChainlink.sol"; | |
import { BufferChainlink } from "./vendor/BufferChainlink.sol"; | |
/** | |
* @title Library for common Chainlink functions | |
* @dev Uses imported CBOR library for encoding to buffer | |
*/ | |
library Chainlink { | |
uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase | |
using CBORChainlink for BufferChainlink.buffer; | |
struct Request { | |
bytes32 id; | |
address callbackAddress; | |
bytes4 callbackFunctionId; | |
uint256 nonce; | |
BufferChainlink.buffer buf; | |
} | |
/** | |
* @notice Initializes a Chainlink request | |
* @dev Sets the ID, callback address, and callback function signature on the request | |
* @param self The uninitialized request | |
* @param _id The Job Specification ID | |
* @param _callbackAddress The callback address | |
* @param _callbackFunction The callback function signature | |
* @return The initialized request | |
*/ | |
function initialize( | |
Request memory self, | |
bytes32 _id, | |
address _callbackAddress, | |
bytes4 _callbackFunction | |
) internal pure returns (Chainlink.Request memory) { | |
BufferChainlink.init(self.buf, defaultBufferSize); | |
self.id = _id; | |
self.callbackAddress = _callbackAddress; | |
self.callbackFunctionId = _callbackFunction; | |
return self; | |
} | |
/** | |
* @notice Sets the data for the buffer without encoding CBOR on-chain | |
* @dev CBOR can be closed with curly-brackets {} or they can be left off | |
* @param self The initialized request | |
* @param _data The CBOR data | |
*/ | |
function setBuffer(Request memory self, bytes memory _data) | |
internal pure | |
{ | |
BufferChainlink.init(self.buf, _data.length); | |
BufferChainlink.append(self.buf, _data); | |
} | |
/** | |
* @notice Adds a string value to the request with a given key name | |
* @param self The initialized request | |
* @param _key The name of the key | |
* @param _value The string value to add | |
*/ | |
function add(Request memory self, string memory _key, string memory _value) | |
internal pure | |
{ | |
self.buf.encodeString(_key); | |
self.buf.encodeString(_value); | |
} | |
/** | |
* @notice Adds a bytes value to the request with a given key name | |
* @param self The initialized request | |
* @param _key The name of the key | |
* @param _value The bytes value to add | |
*/ | |
function addBytes(Request memory self, string memory _key, bytes memory _value) | |
internal pure | |
{ | |
self.buf.encodeString(_key); | |
self.buf.encodeBytes(_value); | |
} | |
/** | |
* @notice Adds a int256 value to the request with a given key name | |
* @param self The initialized request | |
* @param _key The name of the key | |
* @param _value The int256 value to add | |
*/ | |
function addInt(Request memory self, string memory _key, int256 _value) | |
internal pure | |
{ | |
self.buf.encodeString(_key); | |
self.buf.encodeInt(_value); | |
} | |
/** | |
* @notice Adds a uint256 value to the request with a given key name | |
* @param self The initialized request | |
* @param _key The name of the key | |
* @param _value The uint256 value to add | |
*/ | |
function addUint(Request memory self, string memory _key, uint256 _value) | |
internal pure | |
{ | |
self.buf.encodeString(_key); | |
self.buf.encodeUInt(_value); | |
} | |
/** | |
* @notice Adds an array of strings to the request with a given key name | |
* @param self The initialized request | |
* @param _key The name of the key | |
* @param _values The array of string values to add | |
*/ | |
function addStringArray(Request memory self, string memory _key, string[] memory _values) | |
internal pure | |
{ | |
self.buf.encodeString(_key); | |
self.buf.startArray(); | |
for (uint256 i = 0; i < _values.length; i++) { | |
self.buf.encodeString(_values[i]); | |
} | |
self.buf.endSequence(); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.6.0; | |
import "./Chainlink.sol"; | |
import "./interfaces/ENSInterface.sol"; | |
import "./interfaces/LinkTokenInterface.sol"; | |
import "./interfaces/ChainlinkRequestInterface.sol"; | |
import "./interfaces/PointerInterface.sol"; | |
import { ENSResolver as ENSResolver_Chainlink } from "./vendor/ENSResolver.sol"; | |
/** | |
* @title The ChainlinkClient contract | |
* @notice Contract writers can inherit this contract in order to create requests for the | |
* Chainlink network | |
*/ | |
contract ChainlinkClient { | |
using Chainlink for Chainlink.Request; | |
uint256 constant internal LINK = 10**18; | |
uint256 constant private AMOUNT_OVERRIDE = 0; | |
address constant private SENDER_OVERRIDE = address(0); | |
uint256 constant private ARGS_VERSION = 1; | |
bytes32 constant private ENS_TOKEN_SUBNAME = keccak256("link"); | |
bytes32 constant private ENS_ORACLE_SUBNAME = keccak256("oracle"); | |
address constant private LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571; | |
ENSInterface private ens; | |
bytes32 private ensNode; | |
LinkTokenInterface private link; | |
ChainlinkRequestInterface private oracle; | |
uint256 private requestCount = 1; | |
mapping(bytes32 => address) private pendingRequests; | |
event ChainlinkRequested(bytes32 indexed id); | |
event ChainlinkFulfilled(bytes32 indexed id); | |
event ChainlinkCancelled(bytes32 indexed id); | |
/** | |
* @notice Creates a request that can hold additional parameters | |
* @param _specId The Job Specification ID that the request will be created for | |
* @param _callbackAddress The callback address that the response will be sent to | |
* @param _callbackFunctionSignature The callback function signature to use for the callback address | |
* @return A Chainlink Request struct in memory | |
*/ | |
function buildChainlinkRequest( | |
bytes32 _specId, | |
address _callbackAddress, | |
bytes4 _callbackFunctionSignature | |
) internal pure returns (Chainlink.Request memory) { | |
Chainlink.Request memory req; | |
return req.initialize(_specId, _callbackAddress, _callbackFunctionSignature); | |
} | |
/** | |
* @notice Creates a Chainlink request to the stored oracle address | |
* @dev Calls `chainlinkRequestTo` with the stored oracle address | |
* @param _req The initialized Chainlink Request | |
* @param _payment The amount of LINK to send for the request | |
* @return requestId The request ID | |
*/ | |
function sendChainlinkRequest(Chainlink.Request memory _req, uint256 _payment) | |
internal | |
returns (bytes32) | |
{ | |
return sendChainlinkRequestTo(address(oracle), _req, _payment); | |
} | |
/** | |
* @notice Creates a Chainlink request to the specified oracle address | |
* @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to | |
* send LINK which creates a request on the target oracle contract. | |
* Emits ChainlinkRequested event. | |
* @param _oracle The address of the oracle for the request | |
* @param _req The initialized Chainlink Request | |
* @param _payment The amount of LINK to send for the request | |
* @return requestId The request ID | |
*/ | |
function sendChainlinkRequestTo(address _oracle, Chainlink.Request memory _req, uint256 _payment) | |
internal | |
returns (bytes32 requestId) | |
{ | |
requestId = keccak256(abi.encodePacked(this, requestCount)); | |
_req.nonce = requestCount; | |
pendingRequests[requestId] = _oracle; | |
emit ChainlinkRequested(requestId); | |
require(link.transferAndCall(_oracle, _payment, encodeRequest(_req)), "unable to transferAndCall to oracle"); | |
requestCount += 1; | |
return requestId; | |
} | |
/** | |
* @notice Allows a request to be cancelled if it has not been fulfilled | |
* @dev Requires keeping track of the expiration value emitted from the oracle contract. | |
* Deletes the request from the `pendingRequests` mapping. | |
* Emits ChainlinkCancelled event. | |
* @param _requestId The request ID | |
* @param _payment The amount of LINK sent for the request | |
* @param _callbackFunc The callback function specified for the request | |
* @param _expiration The time of the expiration for the request | |
*/ | |
function cancelChainlinkRequest( | |
bytes32 _requestId, | |
uint256 _payment, | |
bytes4 _callbackFunc, | |
uint256 _expiration | |
) | |
internal | |
{ | |
ChainlinkRequestInterface requested = ChainlinkRequestInterface(pendingRequests[_requestId]); | |
delete pendingRequests[_requestId]; | |
emit ChainlinkCancelled(_requestId); | |
requested.cancelOracleRequest(_requestId, _payment, _callbackFunc, _expiration); | |
} | |
/** | |
* @notice Sets the stored oracle address | |
* @param _oracle The address of the oracle contract | |
*/ | |
function setChainlinkOracle(address _oracle) internal { | |
oracle = ChainlinkRequestInterface(_oracle); | |
} | |
/** | |
* @notice Sets the LINK token address | |
* @param _link The address of the LINK token contract | |
*/ | |
function setChainlinkToken(address _link) internal { | |
link = LinkTokenInterface(_link); | |
} | |
/** | |
* @notice Sets the Chainlink token address for the public | |
* network as given by the Pointer contract | |
*/ | |
function setPublicChainlinkToken() internal { | |
setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress()); | |
} | |
/** | |
* @notice Retrieves the stored address of the LINK token | |
* @return The address of the LINK token | |
*/ | |
function chainlinkTokenAddress() | |
internal | |
view | |
returns (address) | |
{ | |
return address(link); | |
} | |
/** | |
* @notice Retrieves the stored address of the oracle contract | |
* @return The address of the oracle contract | |
*/ | |
function chainlinkOracleAddress() | |
internal | |
view | |
returns (address) | |
{ | |
return address(oracle); | |
} | |
/** | |
* @notice Allows for a request which was created on another contract to be fulfilled | |
* on this contract | |
* @param _oracle The address of the oracle contract that will fulfill the request | |
* @param _requestId The request ID used for the response | |
*/ | |
function addChainlinkExternalRequest(address _oracle, bytes32 _requestId) | |
internal | |
notPendingRequest(_requestId) | |
{ | |
pendingRequests[_requestId] = _oracle; | |
} | |
/** | |
* @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS | |
* @dev Accounts for subnodes having different resolvers | |
* @param _ens The address of the ENS contract | |
* @param _node The ENS node hash | |
*/ | |
function useChainlinkWithENS(address _ens, bytes32 _node) | |
internal | |
{ | |
ens = ENSInterface(_ens); | |
ensNode = _node; | |
bytes32 linkSubnode = keccak256(abi.encodePacked(ensNode, ENS_TOKEN_SUBNAME)); | |
ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(linkSubnode)); | |
setChainlinkToken(resolver.addr(linkSubnode)); | |
updateChainlinkOracleWithENS(); | |
} | |
/** | |
* @notice Sets the stored oracle contract with the address resolved by ENS | |
* @dev This may be called on its own as long as `useChainlinkWithENS` has been called previously | |
*/ | |
function updateChainlinkOracleWithENS() | |
internal | |
{ | |
bytes32 oracleSubnode = keccak256(abi.encodePacked(ensNode, ENS_ORACLE_SUBNAME)); | |
ENSResolver_Chainlink resolver = ENSResolver_Chainlink(ens.resolver(oracleSubnode)); | |
setChainlinkOracle(resolver.addr(oracleSubnode)); | |
} | |
/** | |
* @notice Encodes the request to be sent to the oracle contract | |
* @dev The Chainlink node expects values to be in order for the request to be picked up. Order of types | |
* will be validated in the oracle contract. | |
* @param _req The initialized Chainlink Request | |
* @return The bytes payload for the `transferAndCall` method | |
*/ | |
function encodeRequest(Chainlink.Request memory _req) | |
private | |
view | |
returns (bytes memory) | |
{ | |
return abi.encodeWithSelector( | |
oracle.oracleRequest.selector, | |
SENDER_OVERRIDE, // Sender value - overridden by onTokenTransfer by the requesting contract's address | |
AMOUNT_OVERRIDE, // Amount value - overridden by onTokenTransfer by the actual amount of LINK sent | |
_req.id, | |
_req.callbackAddress, | |
_req.callbackFunctionId, | |
_req.nonce, | |
ARGS_VERSION, | |
_req.buf.buf); | |
} | |
/** | |
* @notice Ensures that the fulfillment is valid for this contract | |
* @dev Use if the contract developer prefers methods instead of modifiers for validation | |
* @param _requestId The request ID for fulfillment | |
*/ | |
function validateChainlinkCallback(bytes32 _requestId) | |
internal | |
recordChainlinkFulfillment(_requestId) | |
// solhint-disable-next-line no-empty-blocks | |
{} | |
/** | |
* @dev Reverts if the sender is not the oracle of the request. | |
* Emits ChainlinkFulfilled event. | |
* @param _requestId The request ID for fulfillment | |
*/ | |
modifier recordChainlinkFulfillment(bytes32 _requestId) { | |
require(msg.sender == pendingRequests[_requestId], | |
"Source must be the oracle of the request"); | |
delete pendingRequests[_requestId]; | |
emit ChainlinkFulfilled(_requestId); | |
_; | |
} | |
/** | |
* @dev Reverts if the request is already pending | |
* @param _requestId The request ID for fulfillment | |
*/ | |
modifier notPendingRequest(bytes32 _requestId) { | |
require(pendingRequests[_requestId] == address(0), "Request is already pending"); | |
_; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.6.0; | |
interface ChainlinkRequestInterface { | |
function oracleRequest( | |
address sender, | |
uint256 requestPrice, | |
bytes32 serviceAgreementID, | |
address callbackAddress, | |
bytes4 callbackFunctionId, | |
uint256 nonce, | |
uint256 dataVersion, | |
bytes calldata data | |
) external; | |
function cancelOracleRequest( | |
bytes32 requestId, | |
uint256 payment, | |
bytes4 callbackFunctionId, | |
uint256 expiration | |
) external; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.6.0; | |
interface ENSInterface { | |
// Logged when the owner of a node assigns a new owner to a subnode. | |
event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner); | |
// Logged when the owner of a node transfers ownership to a new account. | |
event Transfer(bytes32 indexed node, address owner); | |
// Logged when the resolver for a node changes. | |
event NewResolver(bytes32 indexed node, address resolver); | |
// Logged when the TTL of a node changes | |
event NewTTL(bytes32 indexed node, uint64 ttl); | |
function setSubnodeOwner(bytes32 node, bytes32 label, address _owner) external; | |
function setResolver(bytes32 node, address _resolver) external; | |
function setOwner(bytes32 node, address _owner) external; | |
function setTTL(bytes32 node, uint64 _ttl) external; | |
function owner(bytes32 node) external view returns (address); | |
function resolver(bytes32 node) external view returns (address); | |
function ttl(bytes32 node) external view returns (uint64); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.6.0; | |
interface LinkTokenInterface { | |
function allowance(address owner, address spender) external view returns (uint256 remaining); | |
function approve(address spender, uint256 value) external returns (bool success); | |
function balanceOf(address owner) external view returns (uint256 balance); | |
function decimals() external view returns (uint8 decimalPlaces); | |
function decreaseApproval(address spender, uint256 addedValue) external returns (bool success); | |
function increaseApproval(address spender, uint256 subtractedValue) external; | |
function name() external view returns (string memory tokenName); | |
function symbol() external view returns (string memory tokenSymbol); | |
function totalSupply() external view returns (uint256 totalTokensIssued); | |
function transfer(address to, uint256 value) external returns (bool success); | |
function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool success); | |
function transferFrom(address from, address to, uint256 value) external returns (bool success); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.6.0; | |
interface PointerInterface { | |
function getAddress() external view returns (address); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.6.0; | |
/** | |
* @dev A library for working with mutable byte buffers in Solidity. | |
* | |
* Byte buffers are mutable and expandable, and provide a variety of primitives | |
* for writing to them. At any time you can fetch a bytes object containing the | |
* current contents of the buffer. The bytes object should not be stored between | |
* operations, as it may change due to resizing of the buffer. | |
*/ | |
library BufferChainlink { | |
/** | |
* @dev Represents a mutable buffer. Buffers have a current value (buf) and | |
* a capacity. The capacity may be longer than the current value, in | |
* which case it can be extended without the need to allocate more memory. | |
*/ | |
struct buffer { | |
bytes buf; | |
uint capacity; | |
} | |
/** | |
* @dev Initializes a buffer with an initial capacity. | |
* @param buf The buffer to initialize. | |
* @param capacity The number of bytes of space to allocate the buffer. | |
* @return The buffer, for chaining. | |
*/ | |
function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) { | |
if (capacity % 32 != 0) { | |
capacity += 32 - (capacity % 32); | |
} | |
// Allocate space for the buffer data | |
buf.capacity = capacity; | |
assembly { | |
let ptr := mload(0x40) | |
mstore(buf, ptr) | |
mstore(ptr, 0) | |
mstore(0x40, add(32, add(ptr, capacity))) | |
} | |
return buf; | |
} | |
/** | |
* @dev Initializes a new buffer from an existing bytes object. | |
* Changes to the buffer may mutate the original value. | |
* @param b The bytes object to initialize the buffer with. | |
* @return A new buffer. | |
*/ | |
function fromBytes(bytes memory b) internal pure returns(buffer memory) { | |
buffer memory buf; | |
buf.buf = b; | |
buf.capacity = b.length; | |
return buf; | |
} | |
function resize(buffer memory buf, uint capacity) private pure { | |
bytes memory oldbuf = buf.buf; | |
init(buf, capacity); | |
append(buf, oldbuf); | |
} | |
function max(uint a, uint b) private pure returns(uint) { | |
if (a > b) { | |
return a; | |
} | |
return b; | |
} | |
/** | |
* @dev Sets buffer length to 0. | |
* @param buf The buffer to truncate. | |
* @return The original buffer, for chaining.. | |
*/ | |
function truncate(buffer memory buf) internal pure returns (buffer memory) { | |
assembly { | |
let bufptr := mload(buf) | |
mstore(bufptr, 0) | |
} | |
return buf; | |
} | |
/** | |
* @dev Writes a byte string to a buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The start offset to write to. | |
* @param data The data to append. | |
* @param len The number of bytes to copy. | |
* @return The original buffer, for chaining. | |
*/ | |
function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) { | |
require(len <= data.length); | |
if (off + len > buf.capacity) { | |
resize(buf, max(buf.capacity, len + off) * 2); | |
} | |
uint dest; | |
uint src; | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Length of existing buffer data | |
let buflen := mload(bufptr) | |
// Start address = buffer address + offset + sizeof(buffer length) | |
dest := add(add(bufptr, 32), off) | |
// Update buffer length if we're extending it | |
if gt(add(len, off), buflen) { | |
mstore(bufptr, add(len, off)) | |
} | |
src := add(data, 32) | |
} | |
// Copy word-length chunks while possible | |
for (; len >= 32; len -= 32) { | |
assembly { | |
mstore(dest, mload(src)) | |
} | |
dest += 32; | |
src += 32; | |
} | |
// Copy remaining bytes | |
uint mask = 256 ** (32 - len) - 1; | |
assembly { | |
let srcpart := and(mload(src), not(mask)) | |
let destpart := and(mload(dest), mask) | |
mstore(dest, or(destpart, srcpart)) | |
} | |
return buf; | |
} | |
/** | |
* @dev Appends a byte string to a buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @param len The number of bytes to copy. | |
* @return The original buffer, for chaining. | |
*/ | |
function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) { | |
return write(buf, buf.buf.length, data, len); | |
} | |
/** | |
* @dev Appends a byte string to a buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) { | |
return write(buf, buf.buf.length, data, data.length); | |
} | |
/** | |
* @dev Writes a byte to the buffer. Resizes if doing so would exceed the | |
* capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write the byte at. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) { | |
if (off >= buf.capacity) { | |
resize(buf, buf.capacity * 2); | |
} | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Length of existing buffer data | |
let buflen := mload(bufptr) | |
// Address = buffer address + sizeof(buffer length) + off | |
let dest := add(add(bufptr, off), 32) | |
mstore8(dest, data) | |
// Update buffer length if we extended it | |
if eq(off, buflen) { | |
mstore(bufptr, add(buflen, 1)) | |
} | |
} | |
return buf; | |
} | |
/** | |
* @dev Appends a byte to the buffer. Resizes if doing so would exceed the | |
* capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) { | |
return writeUint8(buf, buf.buf.length, data); | |
} | |
/** | |
* @dev Writes up to 32 bytes to the buffer. Resizes if doing so would | |
* exceed the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write at. | |
* @param data The data to append. | |
* @param len The number of bytes to write (left-aligned). | |
* @return The original buffer, for chaining. | |
*/ | |
function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) { | |
if (len + off > buf.capacity) { | |
resize(buf, (len + off) * 2); | |
} | |
uint mask = 256 ** len - 1; | |
// Right-align data | |
data = data >> (8 * (32 - len)); | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Address = buffer address + sizeof(buffer length) + off + len | |
let dest := add(add(bufptr, off), len) | |
mstore(dest, or(and(mload(dest), not(mask)), data)) | |
// Update buffer length if we extended it | |
if gt(add(off, len), mload(bufptr)) { | |
mstore(bufptr, add(off, len)) | |
} | |
} | |
return buf; | |
} | |
/** | |
* @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the | |
* capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write at. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) { | |
return write(buf, off, bytes32(data), 20); | |
} | |
/** | |
* @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chhaining. | |
*/ | |
function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) { | |
return write(buf, buf.buf.length, bytes32(data), 20); | |
} | |
/** | |
* @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer, for chaining. | |
*/ | |
function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) { | |
return write(buf, buf.buf.length, data, 32); | |
} | |
/** | |
* @dev Writes an integer to the buffer. Resizes if doing so would exceed | |
* the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param off The offset to write at. | |
* @param data The data to append. | |
* @param len The number of bytes to write (right-aligned). | |
* @return The original buffer, for chaining. | |
*/ | |
function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) { | |
if (len + off > buf.capacity) { | |
resize(buf, (len + off) * 2); | |
} | |
uint mask = 256 ** len - 1; | |
assembly { | |
// Memory address of the buffer data | |
let bufptr := mload(buf) | |
// Address = buffer address + off + sizeof(buffer length) + len | |
let dest := add(add(bufptr, off), len) | |
mstore(dest, or(and(mload(dest), not(mask)), data)) | |
// Update buffer length if we extended it | |
if gt(add(off, len), mload(bufptr)) { | |
mstore(bufptr, add(off, len)) | |
} | |
} | |
return buf; | |
} | |
/** | |
* @dev Appends a byte to the end of the buffer. Resizes if doing so would | |
* exceed the capacity of the buffer. | |
* @param buf The buffer to append to. | |
* @param data The data to append. | |
* @return The original buffer. | |
*/ | |
function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) { | |
return writeInt(buf, buf.buf.length, data, len); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity >= 0.4.19 < 0.7.0; | |
import { BufferChainlink } from "./BufferChainlink.sol"; | |
library CBORChainlink { | |
using BufferChainlink for BufferChainlink.buffer; | |
uint8 private constant MAJOR_TYPE_INT = 0; | |
uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1; | |
uint8 private constant MAJOR_TYPE_BYTES = 2; | |
uint8 private constant MAJOR_TYPE_STRING = 3; | |
uint8 private constant MAJOR_TYPE_ARRAY = 4; | |
uint8 private constant MAJOR_TYPE_MAP = 5; | |
uint8 private constant MAJOR_TYPE_TAG = 6; | |
uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7; | |
uint8 private constant TAG_TYPE_BIGNUM = 2; | |
uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3; | |
function encodeType(BufferChainlink.buffer memory buf, uint8 major, uint value) private pure { | |
if(value <= 23) { | |
buf.appendUint8(uint8((major << 5) | value)); | |
} else if(value <= 0xFF) { | |
buf.appendUint8(uint8((major << 5) | 24)); | |
buf.appendInt(value, 1); | |
} else if(value <= 0xFFFF) { | |
buf.appendUint8(uint8((major << 5) | 25)); | |
buf.appendInt(value, 2); | |
} else if(value <= 0xFFFFFFFF) { | |
buf.appendUint8(uint8((major << 5) | 26)); | |
buf.appendInt(value, 4); | |
} else if(value <= 0xFFFFFFFFFFFFFFFF) { | |
buf.appendUint8(uint8((major << 5) | 27)); | |
buf.appendInt(value, 8); | |
} | |
} | |
function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure { | |
buf.appendUint8(uint8((major << 5) | 31)); | |
} | |
function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure { | |
encodeType(buf, MAJOR_TYPE_INT, value); | |
} | |
function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure { | |
if(value < -0x10000000000000000) { | |
encodeSignedBigNum(buf, value); | |
} else if(value > 0xFFFFFFFFFFFFFFFF) { | |
encodeBigNum(buf, value); | |
} else if(value >= 0) { | |
encodeType(buf, MAJOR_TYPE_INT, uint(value)); | |
} else { | |
encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value)); | |
} | |
} | |
function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure { | |
encodeType(buf, MAJOR_TYPE_BYTES, value.length); | |
buf.append(value); | |
} | |
function encodeBigNum(BufferChainlink.buffer memory buf, int value) internal pure { | |
buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM)); | |
encodeBytes(buf, abi.encode(uint(value))); | |
} | |
function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure { | |
buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM)); | |
encodeBytes(buf, abi.encode(uint(-1 - input))); | |
} | |
function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure { | |
encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length); | |
buf.append(bytes(value)); | |
} | |
function startArray(BufferChainlink.buffer memory buf) internal pure { | |
encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY); | |
} | |
function startMap(BufferChainlink.buffer memory buf) internal pure { | |
encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP); | |
} | |
function endSequence(BufferChainlink.buffer memory buf) internal pure { | |
encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.6.0; | |
abstract contract ENSResolver { | |
function addr(bytes32 node) public view virtual returns (address); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.6.0; | |
/** | |
* @dev Wrappers over Solidity's arithmetic operations with added overflow | |
* checks. | |
* | |
* Arithmetic operations in Solidity wrap on overflow. This can easily result | |
* in bugs, because programmers usually assume that an overflow raises an | |
* error, which is the standard behavior in high level programming languages. | |
* `SafeMath` restores this intuition by reverting the transaction when an | |
* operation overflows. | |
* | |
* Using this library instead of the unchecked operations eliminates an entire | |
* class of bugs, so it's recommended to use it always. | |
*/ | |
library SafeMathChainlink { | |
/** | |
* @dev Returns the addition of two unsigned integers, reverting on | |
* overflow. | |
* | |
* Counterpart to Solidity's `+` operator. | |
* | |
* Requirements: | |
* - Addition cannot overflow. | |
*/ | |
function add(uint256 a, uint256 b) internal pure returns (uint256) { | |
uint256 c = a + b; | |
require(c >= a, "SafeMath: addition overflow"); | |
return c; | |
} | |
/** | |
* @dev Returns the subtraction of two unsigned integers, reverting on | |
* overflow (when the result is negative). | |
* | |
* Counterpart to Solidity's `-` operator. | |
* | |
* Requirements: | |
* - Subtraction cannot overflow. | |
*/ | |
function sub(uint256 a, uint256 b) internal pure returns (uint256) { | |
require(b <= a, "SafeMath: subtraction overflow"); | |
uint256 c = a - b; | |
return c; | |
} | |
/** | |
* @dev Returns the multiplication of two unsigned integers, reverting on | |
* overflow. | |
* | |
* Counterpart to Solidity's `*` operator. | |
* | |
* Requirements: | |
* - Multiplication cannot overflow. | |
*/ | |
function mul(uint256 a, uint256 b) internal pure returns (uint256) { | |
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the | |
// benefit is lost if 'b' is also tested. | |
// See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 | |
if (a == 0) { | |
return 0; | |
} | |
uint256 c = a * b; | |
require(c / a == b, "SafeMath: multiplication overflow"); | |
return c; | |
} | |
/** | |
* @dev Returns the integer division of two unsigned integers. Reverts on | |
* division by zero. The result is rounded towards zero. | |
* | |
* Counterpart to Solidity's `/` operator. Note: this function uses a | |
* `revert` opcode (which leaves remaining gas untouched) while Solidity | |
* uses an invalid opcode to revert (consuming all remaining gas). | |
* | |
* Requirements: | |
* - The divisor cannot be zero. | |
*/ | |
function div(uint256 a, uint256 b) internal pure returns (uint256) { | |
// Solidity only automatically asserts when dividing by 0 | |
require(b > 0, "SafeMath: division by zero"); | |
uint256 c = a / b; | |
// assert(a == b * c + a % b); // There is no case in which this doesn't hold | |
return c; | |
} | |
/** | |
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), | |
* Reverts when dividing by zero. | |
* | |
* Counterpart to Solidity's `%` operator. This function uses a `revert` | |
* opcode (which leaves remaining gas untouched) while Solidity uses an | |
* invalid opcode to revert (consuming all remaining gas). | |
* | |
* Requirements: | |
* - The divisor cannot be zero. | |
*/ | |
function mod(uint256 a, uint256 b) internal pure returns (uint256) { | |
require(b != 0, "SafeMath: modulo by zero"); | |
return a % b; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.6.0; | |
import "./vendor/SafeMathChainlink.sol"; | |
import "./interfaces/LinkTokenInterface.sol"; | |
import "./VRFRequestIDBase.sol"; | |
/** **************************************************************************** | |
* @notice Interface for contracts using VRF randomness | |
* ***************************************************************************** | |
* @dev PURPOSE | |
* | |
* @dev Reggie the Random Oracle (not his real job) wants to provide randomness | |
* @dev to Vera the verifier in such a way that Vera can be sure he's not | |
* @dev making his output up to suit himself. Reggie provides Vera a public key | |
* @dev to which he knows the secret key. Each time Vera provides a seed to | |
* @dev Reggie, he gives back a value which is computed completely | |
* @dev deterministically from the seed and the secret key. | |
* | |
* @dev Reggie provides a proof by which Vera can verify that the output was | |
* @dev correctly computed once Reggie tells it to her, but without that proof, | |
* @dev the output is indistinguishable to her from a uniform random sample | |
* @dev from the output space. | |
* | |
* @dev The purpose of this contract is to make it easy for unrelated contracts | |
* @dev to talk to Vera the verifier about the work Reggie is doing, to provide | |
* @dev simple access to a verifiable source of randomness. | |
* ***************************************************************************** | |
* @dev USAGE | |
* | |
* @dev Calling contracts must inherit from VRFConsumerBase, and can | |
* @dev initialize VRFConsumerBase's attributes in their constructor as | |
* @dev shown: | |
* | |
* @dev contract VRFConsumer { | |
* @dev constuctor(<other arguments>, address _vrfCoordinator, address _link) | |
* @dev VRFConsumerBase(_vrfCoordinator, _link) public { | |
* @dev <initialization with other arguments goes here> | |
* @dev } | |
* @dev } | |
* | |
* @dev The oracle will have given you an ID for the VRF keypair they have | |
* @dev committed to (let's call it keyHash), and have told you the minimum LINK | |
* @dev price for VRF service. Make sure your contract has sufficient LINK, and | |
* @dev call requestRandomness(keyHash, fee, seed), where seed is the input you | |
* @dev want to generate randomness from. | |
* | |
* @dev Once the VRFCoordinator has received and validated the oracle's response | |
* @dev to your request, it will call your contract's fulfillRandomness method. | |
* | |
* @dev The randomness argument to fulfillRandomness is the actual random value | |
* @dev generated from your seed. | |
* | |
* @dev The requestId argument is generated from the keyHash and the seed by | |
* @dev makeRequestId(keyHash, seed). If your contract could have concurrent | |
* @dev requests open, you can use the requestId to track which seed is | |
* @dev associated with which randomness. See VRFRequestIDBase.sol for more | |
* @dev details. (See "SECURITY CONSIDERATIONS" for principles to keep in mind, | |
* @dev if your contract could have multiple requests in flight simultaneously.) | |
* | |
* @dev Colliding `requestId`s are cryptographically impossible as long as seeds | |
* @dev differ. (Which is critical to making unpredictable randomness! See the | |
* @dev next section.) | |
* | |
* ***************************************************************************** | |
* @dev SECURITY CONSIDERATIONS | |
* | |
* @dev A method with the ability to call your fulfillRandomness method directly | |
* @dev could spoof a VRF response with any random value, so it's critical that | |
* @dev it cannot be directly called by anything other than this base contract | |
* @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method). | |
* | |
* @dev For your users to trust that your contract's random behavior is free | |
* @dev from malicious interference, it's best if you can write it so that all | |
* @dev behaviors implied by a VRF response are executed *during* your | |
* @dev fulfillRandomness method. If your contract must store the response (or | |
* @dev anything derived from it) and use it later, you must ensure that any | |
* @dev user-significant behavior which depends on that stored value cannot be | |
* @dev manipulated by a subsequent VRF request. | |
* | |
* @dev Similarly, both miners and the VRF oracle itself have some influence | |
* @dev over the order in which VRF responses appear on the blockchain, so if | |
* @dev your contract could have multiple VRF requests in flight simultaneously, | |
* @dev you must ensure that the order in which the VRF responses arrive cannot | |
* @dev be used to manipulate your contract's user-significant behavior. | |
* | |
* @dev Since the ultimate input to the VRF is mixed with the block hash of the | |
* @dev block in which the request is made, user-provided seeds have no impact | |
* @dev on its economic security properties. They are only included for API | |
* @dev compatability with previous versions of this contract. | |
* | |
* @dev Since the block hash of the block which contains the requestRandomness | |
* @dev call is mixed into the input to the VRF *last*, a sufficiently powerful | |
* @dev miner could, in principle, fork the blockchain to evict the block | |
* @dev containing the request, forcing the request to be included in a | |
* @dev different block with a different hash, and therefore a different input | |
* @dev to the VRF. However, such an attack would incur a substantial economic | |
* @dev cost. This cost scales with the number of blocks the VRF oracle waits | |
* @dev until it calls responds to a request. | |
*/ | |
abstract contract VRFConsumerBase is VRFRequestIDBase { | |
using SafeMathChainlink for uint256; | |
/** | |
* @notice fulfillRandomness handles the VRF response. Your contract must | |
* @notice implement it. See "SECURITY CONSIDERATIONS" above for important | |
* @notice principles to keep in mind when implementing your fulfillRandomness | |
* @notice method. | |
* | |
* @dev VRFConsumerBase expects its subcontracts to have a method with this | |
* @dev signature, and will call it once it has verified the proof | |
* @dev associated with the randomness. (It is triggered via a call to | |
* @dev rawFulfillRandomness, below.) | |
* | |
* @param requestId The Id initially returned by requestRandomness | |
* @param randomness the VRF output | |
*/ | |
function fulfillRandomness(bytes32 requestId, uint256 randomness) | |
internal virtual; | |
/** | |
* @notice requestRandomness initiates a request for VRF output given _seed | |
* | |
* @dev The fulfillRandomness method receives the output, once it's provided | |
* @dev by the Oracle, and verified by the vrfCoordinator. | |
* | |
* @dev The _keyHash must already be registered with the VRFCoordinator, and | |
* @dev the _fee must exceed the fee specified during registration of the | |
* @dev _keyHash. | |
* | |
* @dev The _seed parameter is vestigial, and is kept only for API | |
* @dev compatibility with older versions. It can't *hurt* to mix in some of | |
* @dev your own randomness, here, but it's not necessary because the VRF | |
* @dev oracle will mix the hash of the block containing your request into the | |
* @dev VRF seed it ultimately uses. | |
* | |
* @param _keyHash ID of public key against which randomness is generated | |
* @param _fee The amount of LINK to send with the request | |
* @param _seed seed mixed into the input of the VRF. | |
* | |
* @return requestId unique ID for this request | |
* | |
* @dev The returned requestId can be used to distinguish responses to | |
* @dev concurrent requests. It is passed as the first argument to | |
* @dev fulfillRandomness. | |
*/ | |
function requestRandomness(bytes32 _keyHash, uint256 _fee, uint256 _seed) | |
internal returns (bytes32 requestId) | |
{ | |
LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, _seed)); | |
// This is the seed passed to VRFCoordinator. The oracle will mix this with | |
// the hash of the block containing this request to obtain the seed/input | |
// which is finally passed to the VRF cryptographic machinery. | |
uint256 vRFSeed = makeVRFInputSeed(_keyHash, _seed, address(this), nonces[_keyHash]); | |
// nonces[_keyHash] must stay in sync with | |
// VRFCoordinator.nonces[_keyHash][this], which was incremented by the above | |
// successful LINK.transferAndCall (in VRFCoordinator.randomnessRequest). | |
// This provides protection against the user repeating their input seed, | |
// which would result in a predictable/duplicate output, if multiple such | |
// requests appeared in the same block. | |
nonces[_keyHash] = nonces[_keyHash].add(1); | |
return makeRequestId(_keyHash, vRFSeed); | |
} | |
LinkTokenInterface immutable internal LINK; | |
address immutable private vrfCoordinator; | |
// Nonces for each VRF key from which randomness has been requested. | |
// | |
// Must stay in sync with VRFCoordinator[_keyHash][this] | |
mapping(bytes32 /* keyHash */ => uint256 /* nonce */) private nonces; | |
/** | |
* @param _vrfCoordinator address of VRFCoordinator contract | |
* @param _link address of LINK token contract | |
* | |
* @dev https://docs.chain.link/docs/link-token-contracts | |
*/ | |
constructor(address _vrfCoordinator, address _link) public { | |
vrfCoordinator = _vrfCoordinator; | |
LINK = LinkTokenInterface(_link); | |
} | |
// rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF | |
// proof. rawFulfillRandomness then calls fulfillRandomness, after validating | |
// the origin of the call | |
function rawFulfillRandomness(bytes32 requestId, uint256 randomness) external { | |
require(msg.sender == vrfCoordinator, "Only VRFCoordinator can fulfill"); | |
fulfillRandomness(requestId, randomness); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.6.0; | |
contract VRFRequestIDBase { | |
/** | |
* @notice returns the seed which is actually input to the VRF coordinator | |
* | |
* @dev To prevent repetition of VRF output due to repetition of the | |
* @dev user-supplied seed, that seed is combined in a hash with the | |
* @dev user-specific nonce, and the address of the consuming contract. The | |
* @dev risk of repetition is mostly mitigated by inclusion of a blockhash in | |
* @dev the final seed, but the nonce does protect against repetition in | |
* @dev requests which are included in a single block. | |
* | |
* @param _userSeed VRF seed input provided by user | |
* @param _requester Address of the requesting contract | |
* @param _nonce User-specific nonce at the time of the request | |
*/ | |
function makeVRFInputSeed(bytes32 _keyHash, uint256 _userSeed, | |
address _requester, uint256 _nonce) | |
internal pure returns (uint256) | |
{ | |
return uint256(keccak256(abi.encode(_keyHash, _userSeed, _requester, _nonce))); | |
} | |
/** | |
* @notice Returns the id for this request | |
* @param _keyHash The serviceAgreement ID to be used for this request | |
* @param _vRFInputSeed The seed to be passed directly to the VRF | |
* @return The id for this request | |
* | |
* @dev Note that _vRFInputSeed is not the seed passed by the consuming | |
* @dev contract, but the one generated by makeVRFInputSeed | |
*/ | |
function makeRequestId( | |
bytes32 _keyHash, uint256 _vRFInputSeed) internal pure returns (bytes32) { | |
return keccak256(abi.encodePacked(_keyHash, _vRFInputSeed)); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"deploy": { | |
"VM:-": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"main:1": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"ropsten:3": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"rinkeby:4": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"kovan:42": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"görli:5": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"Custom": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
} | |
}, | |
"data": { | |
"bytecode": { | |
"linkReferences": {}, | |
"object": "608060405234801561001057600080fd5b50739326bfa02add2366b30bacb125260af6410313316000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061016c806100746000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80638e15f47314610030575b600080fd5b61003861004e565b6040518082815260200191505060405180910390f35b6000806000806000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156100be57600080fd5b505afa1580156100d2573d6000803e3d6000fd5b505050506040513d60a08110156100e857600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050509450945094509450945083955050505050509056fea2646970667358221220c4812f8bceeb89a8994e72960fe081889552dc295a07e8c03662b09e235c5a4f64736f6c63430006070033", | |
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0x9326BFA02ADD2366B30BACB125260AF641031331 PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x16C DUP1 PUSH2 0x74 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8E15F473 EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x38 PUSH2 0x4E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xFEAF968C PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0xA0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xBE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xD2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0xA0 DUP2 LT ISZERO PUSH2 0xE8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP DUP4 SWAP6 POP POP POP POP POP POP SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC4 DUP2 0x2F DUP12 0xCE 0xEB DUP10 0xA8 SWAP10 0x4E PUSH19 0x960FE081889552DC295A07E8C03662B09E235C GAS 0x4F PUSH5 0x736F6C6343 STOP MOD SMOD STOP CALLER ", | |
"sourceMap": "239:649:0:-:0;;;442:115;5:9:-1;2:2;;;27:1;24;17:12;2:2;442:115:0;507:42;473:9;;:77;;;;;;;;;;;;;;;;;;239:649;;;;;;" | |
}, | |
"deployedBytecode": { | |
"immutableReferences": {}, | |
"linkReferences": {}, | |
"object": "608060405234801561001057600080fd5b506004361061002b5760003560e01c80638e15f47314610030575b600080fd5b61003861004e565b6040518082815260200191505060405180910390f35b6000806000806000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156100be57600080fd5b505afa1580156100d2573d6000803e3d6000fd5b505050506040513d60a08110156100e857600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050509450945094509450945083955050505050509056fea2646970667358221220c4812f8bceeb89a8994e72960fe081889552dc295a07e8c03662b09e235c5a4f64736f6c63430006070033", | |
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8E15F473 EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x38 PUSH2 0x4E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xFEAF968C PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0xA0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xBE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xD2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0xA0 DUP2 LT ISZERO PUSH2 0xE8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP DUP4 SWAP6 POP POP POP POP POP POP SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC4 DUP2 0x2F DUP12 0xCE 0xEB DUP10 0xA8 SWAP10 0x4E PUSH19 0x960FE081889552DC295A07E8C03662B09E235C GAS 0x4F PUSH5 0x736F6C6343 STOP MOD SMOD STOP CALLER ", | |
"sourceMap": "239:649:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;239:649:0;;;;;;;;;;;;;;;;12:1:-1;9;2:12;611:275:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;658:3;687:14;716:9;739:14;767;795:22;830:9;;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;830:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;830:27:0;;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;830:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;673:184;;;;;;;;;;874:5;867:12;;;;;;;611:275;:::o" | |
}, | |
"gasEstimates": { | |
"creation": { | |
"codeDepositCost": "72800", | |
"executionCost": "20990", | |
"totalCost": "93790" | |
}, | |
"external": { | |
"getLatestPrice()": "infinite" | |
} | |
}, | |
"methodIdentifiers": { | |
"getLatestPrice()": "8e15f473" | |
} | |
}, | |
"abi": [ | |
{ | |
"inputs": [], | |
"stateMutability": "nonpayable", | |
"type": "constructor" | |
}, | |
{ | |
"inputs": [], | |
"name": "getLatestPrice", | |
"outputs": [ | |
{ | |
"internalType": "int256", | |
"name": "", | |
"type": "int256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
} | |
] | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"compiler": { | |
"version": "0.6.7+commit.b8d736ae" | |
}, | |
"language": "Solidity", | |
"output": { | |
"abi": [ | |
{ | |
"inputs": [], | |
"stateMutability": "nonpayable", | |
"type": "constructor" | |
}, | |
{ | |
"inputs": [], | |
"name": "getLatestPrice", | |
"outputs": [ | |
{ | |
"internalType": "int256", | |
"name": "", | |
"type": "int256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
} | |
], | |
"devdoc": { | |
"methods": {} | |
}, | |
"userdoc": { | |
"methods": { | |
"constructor": "Network: Kovan Aggregator: ETH/USD Address: 0x9326BFA02ADD2366b30bacB125260Af641031331", | |
"getLatestPrice()": { | |
"notice": "Returns the latest price" | |
} | |
} | |
} | |
}, | |
"settings": { | |
"compilationTarget": { | |
"0c5928a00094810d2ba01fd8d1083581/PriceConsumerV3.sol": "PriceConsumerV3" | |
}, | |
"evmVersion": "istanbul", | |
"libraries": {}, | |
"metadata": { | |
"bytecodeHash": "ipfs" | |
}, | |
"optimizer": { | |
"enabled": false, | |
"runs": 200 | |
}, | |
"remappings": [] | |
}, | |
"sources": { | |
"0c5928a00094810d2ba01fd8d1083581/PriceConsumerV3.sol": { | |
"keccak256": "0xb93dd6e168e9760b5ac15ecf42310e571902a5a49bb86efb6a991a073bd4c0ec", | |
"urls": [ | |
"bzz-raw://31effca99806bce5d4932452e3943dc1d2866f83b1b426dbce86e3d82c7716ea", | |
"dweb:/ipfs/QmQKLjPaS1Xmgqgz9mUr8KPe7UmUH8rnYRJjTTnA8Qispy" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/master/evm-contracts/src/v0.6/interfaces/AggregatorV3Interface.sol": { | |
"keccak256": "0x1862840d741dedb36e774534b877a13b5187555e3b78b8d2815f898b0dc02268", | |
"urls": [ | |
"bzz-raw://64a15f4349aea6e60703f581a6280b71d6adb35ee74d2f3c4f130a2adc3efee3", | |
"dweb:/ipfs/QmdVoSQvGfJNPnjQsAs7ZN3ueWghzTa72jSqzhGiQNDpkL" | |
] | |
} | |
}, | |
"version": 1 | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This example code is designed to quickly deploy an example contract using Remix. | |
pragma solidity ^0.6.7; | |
import "https://github.com/smartcontractkit/chainlink/blob/master/evm-contracts/src/v0.6/interfaces/AggregatorV3Interface.sol"; | |
contract PriceConsumerV3 { | |
AggregatorV3Interface internal priceFeed; | |
/** | |
* Network: Kovan | |
* Aggregator: ETH/USD | |
* Address: 0x9326BFA02ADD2366b30bacB125260Af641031331 | |
*/ | |
constructor() public { | |
priceFeed = AggregatorV3Interface(0x9326BFA02ADD2366b30bacB125260Af641031331); | |
} | |
/** | |
* Returns the latest price | |
*/ | |
function getLatestPrice() public view returns (int) { | |
( | |
uint80 roundID, | |
int price, | |
uint startedAt, | |
uint timeStamp, | |
uint80 answeredInRound | |
) = priceFeed.latestRoundData(); | |
return price; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"deploy": { | |
"VM:-": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"main:1": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"ropsten:3": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"rinkeby:4": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"kovan:42": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"görli:5": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"Custom": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
} | |
}, | |
"data": { | |
"bytecode": { | |
"linkReferences": {}, | |
"object": "60806040527f3100000000000000000000000000000000000000000000000000000000000000600460006101000a81548160ff021916908360f81c02179055506000600460016101000a81548160ff0219169083600281111561005e57fe5b021790555034801561006f57600080fd5b50610b5c8061007f6000396000f3fe6080604052600436106100c25760003560e01c8063c19d93fb1161007f578063d2f0be9911610059578063d2f0be991461032d578063d7bb99ba14610380578063d939c9601461039e578063fe389e09146103f5576100c2565b8063c19d93fb146102b2578063c2052403146102eb578063c5c4744c14610302576100c2565b806302d05d3f146100c7578063105ea5401461011e57806328b3aa4c1461014957806337f944cc146102455780634c4cea5a1461027057806386f325861461029b575b600080fd5b3480156100d357600080fd5b506100dc61040c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561012a57600080fd5b50610133610431565b6040518082815260200191505060405180910390f35b34801561015557600080fd5b506102436004803603608081101561016c57600080fd5b81019080803590602001909291908035906020019064010000000081111561019357600080fd5b8201836020820111156101a557600080fd5b803590602001918460018302840111640100000000831117156101c757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610437565b005b34801561025157600080fd5b5061025a6104e9565b6040518082815260200191505060405180910390f35b34801561027c57600080fd5b506102856104ef565b6040518082815260200191505060405180910390f35b3480156102a757600080fd5b506102b06104f5565b005b3480156102be57600080fd5b506102c761056b565b604051808260028111156102d757fe5b60ff16815260200191505060405180910390f35b3480156102f757600080fd5b5061030061057e565b005b34801561030e57600080fd5b506103176106a2565b6040518082815260200191505060405180910390f35b34801561033957600080fd5b506103666004803603602081101561035057600080fd5b81019080803590602001909291905050506106a8565b604051808215151515815260200191505060405180910390f35b6103886107fd565b6040518082815260200191505060405180910390f35b3480156103aa57600080fd5b506103b3610976565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561040157600080fd5b5061040a61099c565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025481565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600390805190602001906104ce929190610a81565b5080600281905550610e108402420160068190555050505050565b60065481565b60075481565b6002546005541115610532576002600460016101000a81548160ff0219169083600281111561052057fe5b021790555061052d61057e565b610562565b600654421115610561576001600460016101000a81548160ff0219169083600281111561055b57fe5b02179055505b5b42600781905550565b600460019054906101000a900460ff1681565b600280600281111561058c57fe5b600460019054906101000a900460ff1660028111156105a757fe5b146105b157600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610619573d6000803e3d6000fd5b507fcc2a9192e91e4dd58845fd890b297de7bfda33e9f07f14bb2e4fe2237c86723d600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60055481565b600060018060028111156106b857fe5b600460019054906101000a900460ff1660028111156106d357fe5b146106dd57600080fd5b826008805490501180156106f2575060008310155b801561071d575060006008848154811061070857fe5b90600052602060002090600202016000015414155b61072657600080fd5b60006008848154811061073557fe5b906000526020600020906002020160000154905060006008858154811061075857fe5b9060005260206000209060020201600001819055506008848154811061077a57fe5b906000526020600020906002020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156107f1573d6000803e3d6000fd5b50600192505050919050565b60008080600281111561080c57fe5b600460019054906101000a900460ff16600281111561082757fe5b1461083157600080fd5b600860405180604001604052803481526020013373ffffffffffffffffffffffffffffffffffffffff1681525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050346005600082825401925050819055507f304e48bb03eae5e9bf3575d270648664895983e116a51773a65e9f3341b3b40e3334600554604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a16109676104f5565b60016008805490500391505090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109f557600080fd5b60016002811115610a0257fe5b600460019054906101000a900460ff166002811115610a1d57fe5b1480610a4d5750600280811115610a3057fe5b600460019054906101000a900460ff166002811115610a4b57fe5b145b8015610a5f57504262dd7c0060075401105b610a6857600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16ff5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610ac257805160ff1916838001178555610af0565b82800160010185558215610af0579182015b82811115610aef578251825591602001919060010190610ad4565b5b509050610afd9190610b01565b5090565b610b2391905b80821115610b1f576000816000905550600101610b07565b5090565b9056fea2646970667358221220250791b228614b334f8cd73654963fe49b4d6f40b21e2291c8207fc5d5bcee8a64736f6c63430006060033", | |
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH32 0x3100000000000000000000000000000000000000000000000000000000000000 PUSH1 0x4 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0xF8 SHR MUL OR SWAP1 SSTORE POP PUSH1 0x0 PUSH1 0x4 PUSH1 0x1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x5E JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP CALLVALUE DUP1 ISZERO PUSH2 0x6F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB5C DUP1 PUSH2 0x7F PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xC2 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xC19D93FB GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xD2F0BE99 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xD2F0BE99 EQ PUSH2 0x32D JUMPI DUP1 PUSH4 0xD7BB99BA EQ PUSH2 0x380 JUMPI DUP1 PUSH4 0xD939C960 EQ PUSH2 0x39E JUMPI DUP1 PUSH4 0xFE389E09 EQ PUSH2 0x3F5 JUMPI PUSH2 0xC2 JUMP JUMPDEST DUP1 PUSH4 0xC19D93FB EQ PUSH2 0x2B2 JUMPI DUP1 PUSH4 0xC2052403 EQ PUSH2 0x2EB JUMPI DUP1 PUSH4 0xC5C4744C EQ PUSH2 0x302 JUMPI PUSH2 0xC2 JUMP JUMPDEST DUP1 PUSH4 0x2D05D3F EQ PUSH2 0xC7 JUMPI DUP1 PUSH4 0x105EA540 EQ PUSH2 0x11E JUMPI DUP1 PUSH4 0x28B3AA4C EQ PUSH2 0x149 JUMPI DUP1 PUSH4 0x37F944CC EQ PUSH2 0x245 JUMPI DUP1 PUSH4 0x4C4CEA5A EQ PUSH2 0x270 JUMPI DUP1 PUSH4 0x86F32586 EQ PUSH2 0x29B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDC PUSH2 0x40C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x133 PUSH2 0x431 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x155 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x16C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x193 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x1A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x1C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x437 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x251 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x25A PUSH2 0x4E9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x27C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x285 PUSH2 0x4EF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B0 PUSH2 0x4F5 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2C7 PUSH2 0x56B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x2D7 JUMPI INVALID JUMPDEST PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x300 PUSH2 0x57E JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x30E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x317 PUSH2 0x6A2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x339 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x366 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x350 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x6A8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x388 PUSH2 0x7FD JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3B3 PUSH2 0x976 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x401 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x40A PUSH2 0x99C JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP2 PUSH1 0x1 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP3 PUSH1 0x3 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x4CE SWAP3 SWAP2 SWAP1 PUSH2 0xA81 JUMP JUMPDEST POP DUP1 PUSH1 0x2 DUP2 SWAP1 SSTORE POP PUSH2 0xE10 DUP5 MUL TIMESTAMP ADD PUSH1 0x6 DUP2 SWAP1 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x5 SLOAD GT ISZERO PUSH2 0x532 JUMPI PUSH1 0x2 PUSH1 0x4 PUSH1 0x1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x520 JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP PUSH2 0x52D PUSH2 0x57E JUMP JUMPDEST PUSH2 0x562 JUMP JUMPDEST PUSH1 0x6 SLOAD TIMESTAMP GT ISZERO PUSH2 0x561 JUMPI PUSH1 0x1 PUSH1 0x4 PUSH1 0x1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x55B JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP JUMPDEST JUMPDEST TIMESTAMP PUSH1 0x7 DUP2 SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 DUP1 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x58C JUMPI INVALID JUMPDEST PUSH1 0x4 PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x5A7 JUMPI INVALID JUMPDEST EQ PUSH2 0x5B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC SELFBALANCE SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x619 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH32 0xCC2A9192E91E4DD58845FD890B297DE7BFDA33E9F07F14BB2E4FE2237C86723D PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x5 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP1 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x6B8 JUMPI INVALID JUMPDEST PUSH1 0x4 PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x6D3 JUMPI INVALID JUMPDEST EQ PUSH2 0x6DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x8 DUP1 SLOAD SWAP1 POP GT DUP1 ISZERO PUSH2 0x6F2 JUMPI POP PUSH1 0x0 DUP4 LT ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x71D JUMPI POP PUSH1 0x0 PUSH1 0x8 DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x708 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x0 ADD SLOAD EQ ISZERO JUMPDEST PUSH2 0x726 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x8 DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x735 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x0 ADD SLOAD SWAP1 POP PUSH1 0x0 PUSH1 0x8 DUP6 DUP2 SLOAD DUP2 LT PUSH2 0x758 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x0 ADD DUP2 SWAP1 SSTORE POP PUSH1 0x8 DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x77A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x1 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC DUP3 SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x7F1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 SWAP3 POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x80C JUMPI INVALID JUMPDEST PUSH1 0x4 PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x827 JUMPI INVALID JUMPDEST EQ PUSH2 0x831 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x8 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 CALLVALUE DUP2 MSTORE PUSH1 0x20 ADD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP PUSH1 0x1 SWAP1 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x0 SWAP1 SWAP2 SWAP1 SWAP2 SWAP1 SWAP2 POP PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD SSTORE PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP POP CALLVALUE PUSH1 0x5 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP PUSH32 0x304E48BB03EAE5E9BF3575D270648664895983E116A51773A65E9F3341B3B40E CALLER CALLVALUE PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH2 0x967 PUSH2 0x4F5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x8 DUP1 SLOAD SWAP1 POP SUB SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x9F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0xA02 JUMPI INVALID JUMPDEST PUSH1 0x4 PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0xA1D JUMPI INVALID JUMPDEST EQ DUP1 PUSH2 0xA4D JUMPI POP PUSH1 0x2 DUP1 DUP2 GT ISZERO PUSH2 0xA30 JUMPI INVALID JUMPDEST PUSH1 0x4 PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0xA4B JUMPI INVALID JUMPDEST EQ JUMPDEST DUP1 ISZERO PUSH2 0xA5F JUMPI POP TIMESTAMP PUSH3 0xDD7C00 PUSH1 0x7 SLOAD ADD LT JUMPDEST PUSH2 0xA68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SELFDESTRUCT JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0xAC2 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0xAF0 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0xAF0 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0xAEF JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0xAD4 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0xAFD SWAP2 SWAP1 PUSH2 0xB01 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0xB23 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xB1F JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0xB07 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x25 SMOD SWAP2 0xB2 0x28 PUSH2 0x4B33 0x4F DUP13 0xD7 CALLDATASIZE SLOAD SWAP7 EXTCODEHASH 0xE4 SWAP12 0x4D PUSH16 0x40B21E2291C8207FC5D5BCEE8A64736F PUSH13 0x63430006060033000000000000 ", | |
"sourceMap": "186:3359:0:-:0;;;491:18;;;;;;;;;;;;;;;;;;;;;760:17;739:38;;;;;;;;;;;;;;;;;;;;;;;;;;186:3359;5:9:-1;2:2;;;27:1;24;17:12;2:2;186:3359:0;;;;;;;" | |
}, | |
"deployedBytecode": { | |
"immutableReferences": {}, | |
"linkReferences": {}, | |
"object": "6080604052600436106100c25760003560e01c8063c19d93fb1161007f578063d2f0be9911610059578063d2f0be991461032d578063d7bb99ba14610380578063d939c9601461039e578063fe389e09146103f5576100c2565b8063c19d93fb146102b2578063c2052403146102eb578063c5c4744c14610302576100c2565b806302d05d3f146100c7578063105ea5401461011e57806328b3aa4c1461014957806337f944cc146102455780634c4cea5a1461027057806386f325861461029b575b600080fd5b3480156100d357600080fd5b506100dc61040c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561012a57600080fd5b50610133610431565b6040518082815260200191505060405180910390f35b34801561015557600080fd5b506102436004803603608081101561016c57600080fd5b81019080803590602001909291908035906020019064010000000081111561019357600080fd5b8201836020820111156101a557600080fd5b803590602001918460018302840111640100000000831117156101c757600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610437565b005b34801561025157600080fd5b5061025a6104e9565b6040518082815260200191505060405180910390f35b34801561027c57600080fd5b506102856104ef565b6040518082815260200191505060405180910390f35b3480156102a757600080fd5b506102b06104f5565b005b3480156102be57600080fd5b506102c761056b565b604051808260028111156102d757fe5b60ff16815260200191505060405180910390f35b3480156102f757600080fd5b5061030061057e565b005b34801561030e57600080fd5b506103176106a2565b6040518082815260200191505060405180910390f35b34801561033957600080fd5b506103666004803603602081101561035057600080fd5b81019080803590602001909291905050506106a8565b604051808215151515815260200191505060405180910390f35b6103886107fd565b6040518082815260200191505060405180910390f35b3480156103aa57600080fd5b506103b3610976565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561040157600080fd5b5061040a61099c565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025481565b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600390805190602001906104ce929190610a81565b5080600281905550610e108402420160068190555050505050565b60065481565b60075481565b6002546005541115610532576002600460016101000a81548160ff0219169083600281111561052057fe5b021790555061052d61057e565b610562565b600654421115610561576001600460016101000a81548160ff0219169083600281111561055b57fe5b02179055505b5b42600781905550565b600460019054906101000a900460ff1681565b600280600281111561058c57fe5b600460019054906101000a900460ff1660028111156105a757fe5b146105b157600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610619573d6000803e3d6000fd5b507fcc2a9192e91e4dd58845fd890b297de7bfda33e9f07f14bb2e4fe2237c86723d600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60055481565b600060018060028111156106b857fe5b600460019054906101000a900460ff1660028111156106d357fe5b146106dd57600080fd5b826008805490501180156106f2575060008310155b801561071d575060006008848154811061070857fe5b90600052602060002090600202016000015414155b61072657600080fd5b60006008848154811061073557fe5b906000526020600020906002020160000154905060006008858154811061075857fe5b9060005260206000209060020201600001819055506008848154811061077a57fe5b906000526020600020906002020160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156107f1573d6000803e3d6000fd5b50600192505050919050565b60008080600281111561080c57fe5b600460019054906101000a900460ff16600281111561082757fe5b1461083157600080fd5b600860405180604001604052803481526020013373ffffffffffffffffffffffffffffffffffffffff1681525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050346005600082825401925050819055507f304e48bb03eae5e9bf3575d270648664895983e116a51773a65e9f3341b3b40e3334600554604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a16109676104f5565b60016008805490500391505090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109f557600080fd5b60016002811115610a0257fe5b600460019054906101000a900460ff166002811115610a1d57fe5b1480610a4d5750600280811115610a3057fe5b600460019054906101000a900460ff166002811115610a4b57fe5b145b8015610a5f57504262dd7c0060075401105b610a6857600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16ff5b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610ac257805160ff1916838001178555610af0565b82800160010185558215610af0579182015b82811115610aef578251825591602001919060010190610ad4565b5b509050610afd9190610b01565b5090565b610b2391905b80821115610b1f576000816000905550600101610b07565b5090565b9056fea2646970667358221220250791b228614b334f8cd73654963fe49b4d6f40b21e2291c8207fc5d5bcee8a64736f6c63430006060033", | |
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0xC2 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xC19D93FB GT PUSH2 0x7F JUMPI DUP1 PUSH4 0xD2F0BE99 GT PUSH2 0x59 JUMPI DUP1 PUSH4 0xD2F0BE99 EQ PUSH2 0x32D JUMPI DUP1 PUSH4 0xD7BB99BA EQ PUSH2 0x380 JUMPI DUP1 PUSH4 0xD939C960 EQ PUSH2 0x39E JUMPI DUP1 PUSH4 0xFE389E09 EQ PUSH2 0x3F5 JUMPI PUSH2 0xC2 JUMP JUMPDEST DUP1 PUSH4 0xC19D93FB EQ PUSH2 0x2B2 JUMPI DUP1 PUSH4 0xC2052403 EQ PUSH2 0x2EB JUMPI DUP1 PUSH4 0xC5C4744C EQ PUSH2 0x302 JUMPI PUSH2 0xC2 JUMP JUMPDEST DUP1 PUSH4 0x2D05D3F EQ PUSH2 0xC7 JUMPI DUP1 PUSH4 0x105EA540 EQ PUSH2 0x11E JUMPI DUP1 PUSH4 0x28B3AA4C EQ PUSH2 0x149 JUMPI DUP1 PUSH4 0x37F944CC EQ PUSH2 0x245 JUMPI DUP1 PUSH4 0x4C4CEA5A EQ PUSH2 0x270 JUMPI DUP1 PUSH4 0x86F32586 EQ PUSH2 0x29B JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xD3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xDC PUSH2 0x40C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x12A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x133 PUSH2 0x431 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x155 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x243 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x80 DUP2 LT ISZERO PUSH2 0x16C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x193 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x1A5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x1C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x437 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x251 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x25A PUSH2 0x4E9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x27C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x285 PUSH2 0x4EF JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2B0 PUSH2 0x4F5 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2C7 PUSH2 0x56B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x2D7 JUMPI INVALID JUMPDEST PUSH1 0xFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2F7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x300 PUSH2 0x57E JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x30E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x317 PUSH2 0x6A2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x339 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x366 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x350 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x6A8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x388 PUSH2 0x7FD JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3AA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x3B3 PUSH2 0x976 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x401 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x40A PUSH2 0x99C JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD DUP2 JUMP JUMPDEST CALLER PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP2 PUSH1 0x1 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP3 PUSH1 0x3 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH2 0x4CE SWAP3 SWAP2 SWAP1 PUSH2 0xA81 JUMP JUMPDEST POP DUP1 PUSH1 0x2 DUP2 SWAP1 SSTORE POP PUSH2 0xE10 DUP5 MUL TIMESTAMP ADD PUSH1 0x6 DUP2 SWAP1 SSTORE POP POP POP POP POP JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x7 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x5 SLOAD GT ISZERO PUSH2 0x532 JUMPI PUSH1 0x2 PUSH1 0x4 PUSH1 0x1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x520 JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP PUSH2 0x52D PUSH2 0x57E JUMP JUMPDEST PUSH2 0x562 JUMP JUMPDEST PUSH1 0x6 SLOAD TIMESTAMP GT ISZERO PUSH2 0x561 JUMPI PUSH1 0x1 PUSH1 0x4 PUSH1 0x1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x55B JUMPI INVALID JUMPDEST MUL OR SWAP1 SSTORE POP JUMPDEST JUMPDEST TIMESTAMP PUSH1 0x7 DUP2 SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x4 PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x2 DUP1 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x58C JUMPI INVALID JUMPDEST PUSH1 0x4 PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x5A7 JUMPI INVALID JUMPDEST EQ PUSH2 0x5B1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC SELFBALANCE SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x619 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH32 0xCC2A9192E91E4DD58845FD890B297DE7BFDA33E9F07F14BB2E4FE2237C86723D PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x5 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP1 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x6B8 JUMPI INVALID JUMPDEST PUSH1 0x4 PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x6D3 JUMPI INVALID JUMPDEST EQ PUSH2 0x6DD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 PUSH1 0x8 DUP1 SLOAD SWAP1 POP GT DUP1 ISZERO PUSH2 0x6F2 JUMPI POP PUSH1 0x0 DUP4 LT ISZERO JUMPDEST DUP1 ISZERO PUSH2 0x71D JUMPI POP PUSH1 0x0 PUSH1 0x8 DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x708 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x0 ADD SLOAD EQ ISZERO JUMPDEST PUSH2 0x726 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x8 DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x735 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x0 ADD SLOAD SWAP1 POP PUSH1 0x0 PUSH1 0x8 DUP6 DUP2 SLOAD DUP2 LT PUSH2 0x758 JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x0 ADD DUP2 SWAP1 SSTORE POP PUSH1 0x8 DUP5 DUP2 SLOAD DUP2 LT PUSH2 0x77A JUMPI INVALID JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x1 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC DUP3 SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x7F1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 SWAP3 POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP1 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x80C JUMPI INVALID JUMPDEST PUSH1 0x4 PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0x827 JUMPI INVALID JUMPDEST EQ PUSH2 0x831 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x8 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 CALLVALUE DUP2 MSTORE PUSH1 0x20 ADD CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP SWAP1 DUP1 PUSH1 0x1 DUP2 SLOAD ADD DUP1 DUP3 SSTORE DUP1 SWAP2 POP POP PUSH1 0x1 SWAP1 SUB SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x2 MUL ADD PUSH1 0x0 SWAP1 SWAP2 SWAP1 SWAP2 SWAP1 SWAP2 POP PUSH1 0x0 DUP3 ADD MLOAD DUP2 PUSH1 0x0 ADD SSTORE PUSH1 0x20 DUP3 ADD MLOAD DUP2 PUSH1 0x1 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP POP CALLVALUE PUSH1 0x5 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP PUSH32 0x304E48BB03EAE5E9BF3575D270648664895983E116A51773A65E9F3341B3B40E CALLER CALLVALUE PUSH1 0x5 SLOAD PUSH1 0x40 MLOAD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP4 POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH2 0x967 PUSH2 0x4F5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x8 DUP1 SLOAD SWAP1 POP SUB SWAP2 POP POP SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x9F5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x2 DUP2 GT ISZERO PUSH2 0xA02 JUMPI INVALID JUMPDEST PUSH1 0x4 PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0xA1D JUMPI INVALID JUMPDEST EQ DUP1 PUSH2 0xA4D JUMPI POP PUSH1 0x2 DUP1 DUP2 GT ISZERO PUSH2 0xA30 JUMPI INVALID JUMPDEST PUSH1 0x4 PUSH1 0x1 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND PUSH1 0x2 DUP2 GT ISZERO PUSH2 0xA4B JUMPI INVALID JUMPDEST EQ JUMPDEST DUP1 ISZERO PUSH2 0xA5F JUMPI POP TIMESTAMP PUSH3 0xDD7C00 PUSH1 0x7 SLOAD ADD LT JUMPDEST PUSH2 0xA68 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SELFDESTRUCT JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0xAC2 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0xAF0 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0xAF0 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0xAEF JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0xAD4 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0xAFD SWAP2 SWAP1 PUSH2 0xB01 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0xB23 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0xB1F JUMPI PUSH1 0x0 DUP2 PUSH1 0x0 SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0xB07 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST SWAP1 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x25 SMOD SWAP2 0xB2 0x28 PUSH2 0x4B33 0x4F DUP13 0xD7 CALLDATASIZE SLOAD SWAP7 EXTCODEHASH 0xE4 SWAP12 0x4D PUSH16 0x40B21E2291C8207FC5D5BCEE8A64736F PUSH13 0x63430006060033000000000000 ", | |
"sourceMap": "186:3359:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;255:22:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;255:22:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;389:26;;5:9:-1;2:2;;;27:1;24;17:12;2:2;389:26:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1475:403;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1475:403:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;1475:403:0;;;;;;;;;;;;;;;;;;;27:11:-1;14;11:28;8:2;;;52:1;49;42:12;8:2;1475:403:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;1475:403:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;1475:403:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;1475:403:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;836:19;;5:9:-1;2:2;;;27:1;24;17:12;2:2;836:19:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;861:22;;5:9:-1;2:2;;;27:1;24;17:12;2:2;861:22:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2388:418;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2388:418:0;;;:::i;:::-;;739:38;;5:9:-1;2:2;;;27:1;24;17:12;2:2;739:38:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2812:163;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2812:163:0;;;:::i;:::-;;807:23;;5:9:-1;2:2;;;27:1;24;17:12;2:2;807:23:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2981:378;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2981:378:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;2981:378:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1884:498;;;:::i;:::-;;;;;;;;;;;;;;;;;;;283:36;;5:9:-1;2:2;;;27:1;24;17:12;2:2;283:36:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;3365:178;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3365:178:0;;;:::i;:::-;;255:22;;;;;;;;;;;;;:::o;389:26::-;;;;:::o;1475:403::-;1680:10;1670:7;;:20;;;;;;;;;;;;;;;;;;1716:14;1700:13;;:30;;;;;;;;;;;;;;;;;;1754:12;1740:11;:26;;;;;;;;;;;;:::i;:::-;;1793:15;1776:14;:32;;;;1863:7;1835:25;:35;1828:3;:43;1818:7;:53;;;;1475:403;;;;:::o;836:19::-;;;;:::o;861:22::-;;;;:::o;2388:418::-;2474:14;;2460:11;;:28;2456:318;;;2512:16;2504:5;;:24;;;;;;;;;;;;;;;;;;;;;;;;2542:8;:6;:8::i;:::-;2456:318;;;2651:7;;2645:3;:13;2640:134;;;2684:19;2676:5;;:27;;;;;;;;;;;;;;;;;;;;;;;;2640:134;2456:318;2796:3;2783:10;:16;;;;2388:418::o;739:38::-;;;;;;;;;;;;;:::o;2812:163::-;2853:16;1107:6;1098:15;;;;;;;;:5;;;;;;;;;;;:15;;;;;;;;;1090:24;;12:1:-1;9;2:12;1090:24:0;2885:13:::1;;;;;;;;;;;:22;;:45;2908:21;2885:45;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;2885:45:0;2940:28;2954:13;;;;;;;;;;;2940:28;;;;;;;;;;;;;;;;;;;;;;2812:163:::0;:::o;807:23::-;;;;:::o;2981:378::-;3068:4;3024:19;1107:6;1098:15;;;;;;;;:5;;;;;;;;;;;:15;;;;;;;;;1090:24;;12:1:-1;9;2:12;1090:24:0;3119:2:::1;3096:13;:20;;;;:25;:36;;;;;3131:1;3125:2;:7;;3096:36;:69;;;;;3164:1;3136:13;3150:2;3136:17;;;;;;;;;;;;;;;;;;:24;;;:29;;3096:69;3088:79;;12:1:-1;9::::0;2:12:::1;3088:79:0;3178:22;3203:13;3217:2;3203:17;;;;;;;;;;;;;;;;;;:24;;;3178:49;;3264:1;3237:13;3251:2;3237:17;;;;;;;;;;;;;;;;;;:24;;:28;;;;3276:13;3290:2;3276:17;;;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;:38;;:54;3315:14;3276:54;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;3276:54:0;3348:4;3341:11;;;2981:378:::0;;;;:::o;1884:498::-;1972:10;1941:17;1107:6;1098:15;;;;;;;;:5;;;;;;;;;;;:15;;;;;;;;;1090:24;;12:1:-1;9;2:12;1090:24:0;1998:13:::1;2030:104;;;;;;;;2069:9;2030:104;;;;2109:10;2030:104;;;;::::0;1998:175:::1;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;1998:175:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2198:9;2183:11;;:24;;;;;;;;;;;2223:54;2242:10;2254:9;2265:11;;2223:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2288:33;:31;:33::i;:::-;2361:1;2338:13;:20;;;;:24;2331:31;;1884:498:::0;;:::o;283:36::-;;;;;;;;;;;;;:::o;3365:178::-;1191:7;;;;;;;;;;;1177:21;;:10;:21;;;1169:30;;12:1:-1;9;2:12;1169:30:0;1361:19:::1;1352:28;;;;;;;;:5;;;;;;;;;;;:28;;;;;;;;;:57;;;;1393:16;1384:25:::0;::::1;;;;;;;:5;;;;;;;;;;;:25;;;;;;;;;1352:57;1351:98;;;;;1446:3;1435:8;1422:10;;:21;:27;1351:98;1342:109;;12:1:-1;9::::0;2:12:::1;1342:109:0;3468:10:::2;3455:24;;;186:3359:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o" | |
}, | |
"gasEstimates": { | |
"creation": { | |
"codeDepositCost": "581600", | |
"executionCost": "42417", | |
"totalCost": "624017" | |
}, | |
"external": { | |
"checkIfFundingCompleteOrExpired()": "infinite", | |
"completeAt()": "1094", | |
"contribute()": "infinite", | |
"creator()": "1054", | |
"crowdFund(uint256,string,address,uint256)": "infinite", | |
"fundRecipient()": "1119", | |
"getRefund(uint256)": "infinite", | |
"minimumToRaise()": "1028", | |
"payOut()": "infinite", | |
"raiseBy()": "1072", | |
"removeContract()": "33864", | |
"state()": "1146", | |
"totalRaised()": "1072" | |
} | |
}, | |
"methodIdentifiers": { | |
"checkIfFundingCompleteOrExpired()": "86f32586", | |
"completeAt()": "4c4cea5a", | |
"contribute()": "d7bb99ba", | |
"creator()": "02d05d3f", | |
"crowdFund(uint256,string,address,uint256)": "28b3aa4c", | |
"fundRecipient()": "d939c960", | |
"getRefund(uint256)": "d2f0be99", | |
"minimumToRaise()": "105ea540", | |
"payOut()": "c2052403", | |
"raiseBy()": "37f944cc", | |
"removeContract()": "fe389e09", | |
"state()": "c19d93fb", | |
"totalRaised()": "c5c4744c" | |
} | |
}, | |
"abi": [ | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": false, | |
"internalType": "address", | |
"name": "addr", | |
"type": "address" | |
}, | |
{ | |
"indexed": false, | |
"internalType": "uint256", | |
"name": "amount", | |
"type": "uint256" | |
}, | |
{ | |
"indexed": false, | |
"internalType": "uint256", | |
"name": "currentTotal", | |
"type": "uint256" | |
} | |
], | |
"name": "LogFundingReceived", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": false, | |
"internalType": "address", | |
"name": "winnerAddress", | |
"type": "address" | |
} | |
], | |
"name": "LogWinnerPaid", | |
"type": "event" | |
}, | |
{ | |
"inputs": [], | |
"name": "checkIfFundingCompleteOrExpired", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "completeAt", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "contribute", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "id", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "payable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "creator", | |
"outputs": [ | |
{ | |
"internalType": "address", | |
"name": "", | |
"type": "address" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "timeInHoursForFundraising", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "string", | |
"name": "_campaignUrl", | |
"type": "string" | |
}, | |
{ | |
"internalType": "address payable", | |
"name": "_fundRecipient", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "_minimumToRaise", | |
"type": "uint256" | |
} | |
], | |
"name": "crowdFund", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "fundRecipient", | |
"outputs": [ | |
{ | |
"internalType": "address payable", | |
"name": "", | |
"type": "address" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "id", | |
"type": "uint256" | |
} | |
], | |
"name": "getRefund", | |
"outputs": [ | |
{ | |
"internalType": "bool", | |
"name": "", | |
"type": "bool" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "minimumToRaise", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "payOut", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "raiseBy", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "removeContract", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "state", | |
"outputs": [ | |
{ | |
"internalType": "enum CrowdFunder.State", | |
"name": "", | |
"type": "uint8" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "totalRaised", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
} | |
] | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"compiler": { | |
"version": "0.6.6+commit.6c089d02" | |
}, | |
"language": "Solidity", | |
"output": { | |
"abi": [ | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": false, | |
"internalType": "address", | |
"name": "addr", | |
"type": "address" | |
}, | |
{ | |
"indexed": false, | |
"internalType": "uint256", | |
"name": "amount", | |
"type": "uint256" | |
}, | |
{ | |
"indexed": false, | |
"internalType": "uint256", | |
"name": "currentTotal", | |
"type": "uint256" | |
} | |
], | |
"name": "LogFundingReceived", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": false, | |
"internalType": "address", | |
"name": "winnerAddress", | |
"type": "address" | |
} | |
], | |
"name": "LogWinnerPaid", | |
"type": "event" | |
}, | |
{ | |
"inputs": [], | |
"name": "checkIfFundingCompleteOrExpired", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "completeAt", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "contribute", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "id", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "payable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "creator", | |
"outputs": [ | |
{ | |
"internalType": "address", | |
"name": "", | |
"type": "address" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "timeInHoursForFundraising", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "string", | |
"name": "_campaignUrl", | |
"type": "string" | |
}, | |
{ | |
"internalType": "address payable", | |
"name": "_fundRecipient", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "_minimumToRaise", | |
"type": "uint256" | |
} | |
], | |
"name": "crowdFund", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "fundRecipient", | |
"outputs": [ | |
{ | |
"internalType": "address payable", | |
"name": "", | |
"type": "address" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "id", | |
"type": "uint256" | |
} | |
], | |
"name": "getRefund", | |
"outputs": [ | |
{ | |
"internalType": "bool", | |
"name": "", | |
"type": "bool" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "minimumToRaise", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "payOut", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "raiseBy", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "removeContract", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "state", | |
"outputs": [ | |
{ | |
"internalType": "enum CrowdFunder.State", | |
"name": "", | |
"type": "uint8" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "totalRaised", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
} | |
], | |
"devdoc": { | |
"author": "nemild", | |
"methods": {}, | |
"title": "CrowdFunder" | |
}, | |
"userdoc": { | |
"methods": {} | |
} | |
}, | |
"settings": { | |
"compilationTarget": { | |
"3d12cd503dcedfcdd715ef61f786be0b/CrowdFunder.sol": "CrowdFunder" | |
}, | |
"evmVersion": "istanbul", | |
"libraries": {}, | |
"metadata": { | |
"bytecodeHash": "ipfs" | |
}, | |
"optimizer": { | |
"enabled": false, | |
"runs": 200 | |
}, | |
"remappings": [] | |
}, | |
"sources": { | |
"3d12cd503dcedfcdd715ef61f786be0b/CrowdFunder.sol": { | |
"keccak256": "0x216993a8afbeceac77ed7ad466976d4ef8a4cf8a60561624f271c52bfa64b884", | |
"urls": [ | |
"bzz-raw://1d6c64ed4b42df13127990755f7f7f2fa5ee491e2a6eb759eeddb5d33da8e794", | |
"dweb:/ipfs/QmXhVQvmTxPx3pFm3pfD2XJg5CiCeVy3JdEBDz3bXsZuL8" | |
] | |
} | |
}, | |
"version": 1 | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// *** EXAMPLE: A crowdfunding example (broadly similar to Kickstarter) *** | |
// ** START EXAMPLE ** | |
// CrowdFunder.sol | |
pragma solidity ^0.6.6; | |
/// @title CrowdFunder | |
/// @author nemild | |
contract CrowdFunder { | |
// Variables set on create by creator | |
address public creator; | |
address payable public fundRecipient; // creator may be different than recipient, and must be payable | |
uint public minimumToRaise; // required to tip, else everyone gets refund | |
string campaignUrl; | |
byte version = "1"; | |
// Data structures | |
enum State { | |
Fundraising, | |
ExpiredRefund, | |
Successful | |
} | |
struct Contribution { | |
uint amount; | |
address payable contributor; | |
} | |
// State variables | |
State public state = State.Fundraising; // initialize on create | |
uint public totalRaised; | |
uint public raiseBy; | |
uint public completeAt; | |
Contribution[] contributions; | |
event LogFundingReceived(address addr, uint amount, uint currentTotal); | |
event LogWinnerPaid(address winnerAddress); | |
modifier inState(State _state) { | |
require(state == _state); | |
_; | |
} | |
modifier isCreator() { | |
require(msg.sender == creator); | |
_; | |
} | |
// Wait 24 weeks after final contract state before allowing contract destruction | |
modifier atEndOfLifecycle() { | |
require(((state == State.ExpiredRefund || state == State.Successful) && | |
completeAt + 24 weeks < now)); | |
_; | |
} | |
function crowdFund( | |
uint timeInHoursForFundraising, | |
string memory _campaignUrl, | |
address payable _fundRecipient, | |
uint _minimumToRaise) | |
public | |
{ | |
creator = msg.sender; | |
fundRecipient = _fundRecipient; | |
campaignUrl = _campaignUrl; | |
minimumToRaise = _minimumToRaise; | |
raiseBy = now + (timeInHoursForFundraising * 1 hours); | |
} | |
function contribute() | |
public | |
payable | |
inState(State.Fundraising) | |
returns(uint256 id) | |
{ | |
contributions.push( | |
Contribution({ | |
amount: msg.value, | |
contributor: msg.sender | |
}) // use array, so can iterate | |
); | |
totalRaised += msg.value; | |
emit LogFundingReceived(msg.sender, msg.value, totalRaised); | |
checkIfFundingCompleteOrExpired(); | |
return contributions.length - 1; // return id | |
} | |
function checkIfFundingCompleteOrExpired() | |
public | |
{ | |
if (totalRaised > minimumToRaise) { | |
state = State.Successful; | |
payOut(); | |
// could incentivize sender who initiated state change here | |
} else if ( now > raiseBy ) { | |
state = State.ExpiredRefund; // backers can now collect refunds by calling getRefund(id) | |
} | |
completeAt = now; | |
} | |
function payOut() | |
public | |
inState(State.Successful) | |
{ | |
fundRecipient.transfer(address(this).balance); | |
LogWinnerPaid(fundRecipient); | |
} | |
function getRefund(uint256 id) | |
inState(State.ExpiredRefund) | |
public | |
returns(bool) | |
{ | |
require(contributions.length > id && id >= 0 && contributions[id].amount != 0 ); | |
uint256 amountToRefund = contributions[id].amount; | |
contributions[id].amount = 0; | |
contributions[id].contributor.transfer(amountToRefund); | |
return true; | |
} | |
function removeContract() | |
public | |
isCreator() | |
atEndOfLifecycle() | |
{ | |
selfdestruct(msg.sender); | |
// creator gets all money that hasn't be claimed | |
} | |
} | |
// ** END EXAMPLE ** |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"deploy": { | |
"VM:-": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"main:1": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"ropsten:3": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"rinkeby:4": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"kovan:42": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"görli:5": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"Custom": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
} | |
}, | |
"data": { | |
"bytecode": { | |
"linkReferences": {}, | |
"object": "60c060405234801561001057600080fd5b5073dd3782915140c8f3b190b5d67eac6dc5760c46e973a36085f69e2889c224210f603d836748e7dc00888173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505050507f6c3699283bda56ad74f6b855546325b68d482e983852a7a82979cc4807b641f460001b60018190555067016345785d8a000060028190555060805160601c60a05160601c6108f161012060003980610328528061058a52508060fb528061013852806103fc528061054e52506108f16000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806342619f66146100515780638dc654a21461006f57806394985ddd14610079578063b37217a4146100b1575b600080fd5b6100596100f3565b6040518082815260200191505060405180910390f35b6100776100f9565b005b6100af6004803603604081101561008f57600080fd5b810190808035906020019092919080359060200190929190505050610326565b005b6100dd600480360360208110156100c757600080fd5b81019080803590602001909291905050506103f5565b6040518082815260200191505060405180910390f35b60035481565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156101d357600080fd5b505afa1580156101e7573d6000803e3d6000fd5b505050506040513d60208110156101fd57600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561027757600080fd5b505af115801561028b573d6000803e3d6000fd5b505050506040513d60208110156102a157600080fd5b8101908080519060200190929190505050610324576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f556e61626c6520746f207472616e73666572000000000000000000000000000081525060200191505060405180910390fd5b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c0081525060200191505060405180910390fd5b6103f1828261053f565b5050565b60006002547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561049757600080fd5b505afa1580156104ab573d6000803e3d6000fd5b505050506040513d60208110156104c157600080fd5b81019080805190602001909291905050501015610529576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180610891602b913960400191505060405180910390fd5b6105386001546002548461054a565b9050919050565b806003819055505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634000aea07f000000000000000000000000000000000000000000000000000000000000000085878660405160200180838152602001828152602001925050506040516020818303038152906040526040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561065957808201518184015260208101905061063e565b50505050905090810190601f1680156106865780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b1580156106a757600080fd5b505af11580156106bb573d6000803e3d6000fd5b505050506040513d60208110156106d157600080fd5b81019080805190602001909291905050505060006107038584306000808a815260200190815260200160002054610755565b905061072b6001600080888152602001908152602001600020546107cf90919063ffffffff16565b6000808781526020019081526020016000208190555061074b8582610857565b9150509392505050565b600084848484604051602001808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019450505050506040516020818303038152906040528051906020012060001c9050949350505050565b60008082840190508381101561084d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000828260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012090509291505056fe4e6f7420656e6f756768204c494e4b202d2066696c6c20636f6e7472616374207769746820666175636574a2646970667358221220f4691515d0ef70ee0058a1cdd593f6b8113651db56b795961e47a22b727a698b64736f6c63430006060033", | |
"opcodes": "PUSH1 0xC0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0xDD3782915140C8F3B190B5D67EAC6DC5760C46E9 PUSH20 0xA36085F69E2889C224210F603D836748E7DC0088 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 SHL DUP2 MSTORE POP POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x80 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 SHL DUP2 MSTORE POP POP POP POP PUSH32 0x6C3699283BDA56AD74F6B855546325B68D482E983852A7A82979CC4807B641F4 PUSH1 0x0 SHL PUSH1 0x1 DUP2 SWAP1 SSTORE POP PUSH8 0x16345785D8A0000 PUSH1 0x2 DUP2 SWAP1 SSTORE POP PUSH1 0x80 MLOAD PUSH1 0x60 SHR PUSH1 0xA0 MLOAD PUSH1 0x60 SHR PUSH2 0x8F1 PUSH2 0x120 PUSH1 0x0 CODECOPY DUP1 PUSH2 0x328 MSTORE DUP1 PUSH2 0x58A MSTORE POP DUP1 PUSH1 0xFB MSTORE DUP1 PUSH2 0x138 MSTORE DUP1 PUSH2 0x3FC MSTORE DUP1 PUSH2 0x54E MSTORE POP PUSH2 0x8F1 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x42619F66 EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0x8DC654A2 EQ PUSH2 0x6F JUMPI DUP1 PUSH4 0x94985DDD EQ PUSH2 0x79 JUMPI DUP1 PUSH4 0xB37217A4 EQ PUSH2 0xB1 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x59 PUSH2 0xF3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x77 PUSH2 0xF9 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xAF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x8F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x326 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xDD PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x3F5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x3 SLOAD DUP2 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xA9059CBB CALLER PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1E7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x277 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x28B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x324 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x556E61626C6520746F207472616E736665720000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x3E7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1F DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F6E6C7920565246436F6F7264696E61746F722063616E2066756C66696C6C00 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3F1 DUP3 DUP3 PUSH2 0x53F JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 SLOAD PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x497 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x4AB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP LT ISZERO PUSH2 0x529 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x891 PUSH1 0x2B SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x538 PUSH1 0x1 SLOAD PUSH1 0x2 SLOAD DUP5 PUSH2 0x54A JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 PUSH1 0x3 DUP2 SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 PUSH32 0x0 DUP6 DUP8 DUP7 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x659 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x63E JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x686 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x6BB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP POP PUSH1 0x0 PUSH2 0x703 DUP6 DUP5 ADDRESS PUSH1 0x0 DUP1 DUP11 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x755 JUMP JUMPDEST SWAP1 POP PUSH2 0x72B PUSH1 0x1 PUSH1 0x0 DUP1 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x7CF SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x0 DUP1 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0x74B DUP6 DUP3 PUSH2 0x857 JUMP JUMPDEST SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH1 0x0 SHR SWAP1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 ADD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x84D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP3 SWAP2 POP POP JUMP INVALID 0x4E PUSH16 0x7420656E6F756768204C494E4B202D20 PUSH7 0x696C6C20636F6E PUSH21 0x72616374207769746820666175636574A264697066 PUSH20 0x58221220F4691515D0EF70EE0058A1CDD593F6B8 GT CALLDATASIZE MLOAD 0xDB JUMP 0xB7 SWAP6 SWAP7 0x1E SELFBALANCE LOG2 0x2B PUSH19 0x7A698B64736F6C634300060600330000000000 ", | |
"sourceMap": "231:2516:0:-:0;;;734:341;5:9:-1;2:2;;;27:1;24;17:12;2:2;734:341:0;786:42;861;9015:15:1;8998:32;;;;;;;;;;;;9062:5;9036:32;;;;;;;;;;;;8933:140;;960:66:0::1;950:76;;:7;:76;;;;1042:14;1036:3;:20;;;;231:2516:::0;;;;;;;;;;;;;;;;" | |
}, | |
"deployedBytecode": { | |
"immutableReferences": { | |
"171": [ | |
{ | |
"length": 32, | |
"start": 251 | |
}, | |
{ | |
"length": 32, | |
"start": 312 | |
}, | |
{ | |
"length": 32, | |
"start": 1020 | |
}, | |
{ | |
"length": 32, | |
"start": 1358 | |
} | |
], | |
"173": [ | |
{ | |
"length": 32, | |
"start": 808 | |
}, | |
{ | |
"length": 32, | |
"start": 1418 | |
} | |
] | |
}, | |
"linkReferences": {}, | |
"object": "608060405234801561001057600080fd5b506004361061004c5760003560e01c806342619f66146100515780638dc654a21461006f57806394985ddd14610079578063b37217a4146100b1575b600080fd5b6100596100f3565b6040518082815260200191505060405180910390f35b6100776100f9565b005b6100af6004803603604081101561008f57600080fd5b810190808035906020019092919080359060200190929190505050610326565b005b6100dd600480360360208110156100c757600080fd5b81019080803590602001909291905050506103f5565b6040518082815260200191505060405180910390f35b60035481565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156101d357600080fd5b505afa1580156101e7573d6000803e3d6000fd5b505050506040513d60208110156101fd57600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561027757600080fd5b505af115801561028b573d6000803e3d6000fd5b505050506040513d60208110156102a157600080fd5b8101908080519060200190929190505050610324576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f556e61626c6520746f207472616e73666572000000000000000000000000000081525060200191505060405180910390fd5b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c0081525060200191505060405180910390fd5b6103f1828261053f565b5050565b60006002547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561049757600080fd5b505afa1580156104ab573d6000803e3d6000fd5b505050506040513d60208110156104c157600080fd5b81019080805190602001909291905050501015610529576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180610891602b913960400191505060405180910390fd5b6105386001546002548461054a565b9050919050565b806003819055505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634000aea07f000000000000000000000000000000000000000000000000000000000000000085878660405160200180838152602001828152602001925050506040516020818303038152906040526040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561065957808201518184015260208101905061063e565b50505050905090810190601f1680156106865780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b1580156106a757600080fd5b505af11580156106bb573d6000803e3d6000fd5b505050506040513d60208110156106d157600080fd5b81019080805190602001909291905050505060006107038584306000808a815260200190815260200160002054610755565b905061072b6001600080888152602001908152602001600020546107cf90919063ffffffff16565b6000808781526020019081526020016000208190555061074b8582610857565b9150509392505050565b600084848484604051602001808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019450505050506040516020818303038152906040528051906020012060001c9050949350505050565b60008082840190508381101561084d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000828260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012090509291505056fe4e6f7420656e6f756768204c494e4b202d2066696c6c20636f6e7472616374207769746820666175636574a2646970667358221220f4691515d0ef70ee0058a1cdd593f6b8113651db56b795961e47a22b727a698b64736f6c63430006060033", | |
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x42619F66 EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0x8DC654A2 EQ PUSH2 0x6F JUMPI DUP1 PUSH4 0x94985DDD EQ PUSH2 0x79 JUMPI DUP1 PUSH4 0xB37217A4 EQ PUSH2 0xB1 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x59 PUSH2 0xF3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x77 PUSH2 0xF9 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xAF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x8F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x326 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xDD PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0xC7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x3F5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x3 SLOAD DUP2 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xA9059CBB CALLER PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x1D3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1E7 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1FD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x277 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x28B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x2A1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x324 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x556E61626C6520746F207472616E736665720000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x3E7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1F DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F6E6C7920565246436F6F7264696E61746F722063616E2066756C66696C6C00 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3F1 DUP3 DUP3 PUSH2 0x53F JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 SLOAD PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x497 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x4AB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP LT ISZERO PUSH2 0x529 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x2B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x891 PUSH1 0x2B SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x538 PUSH1 0x1 SLOAD PUSH1 0x2 SLOAD DUP5 PUSH2 0x54A JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP1 PUSH1 0x3 DUP2 SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 PUSH32 0x0 DUP6 DUP8 DUP7 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x659 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x63E JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x686 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x6A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x6BB JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x6D1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP POP PUSH1 0x0 PUSH2 0x703 DUP6 DUP5 ADDRESS PUSH1 0x0 DUP1 DUP11 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x755 JUMP JUMPDEST SWAP1 POP PUSH2 0x72B PUSH1 0x1 PUSH1 0x0 DUP1 DUP9 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x7CF SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x0 DUP1 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0x74B DUP6 DUP3 PUSH2 0x857 JUMP JUMPDEST SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP5 DUP5 DUP5 DUP5 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 PUSH1 0x0 SHR SWAP1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 DUP5 ADD SWAP1 POP DUP4 DUP2 LT ISZERO PUSH2 0x84D JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1B DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x536166654D6174683A206164646974696F6E206F766572666C6F770000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP SWAP3 SWAP2 POP POP JUMP INVALID 0x4E PUSH16 0x7420656E6F756768204C494E4B202D20 PUSH7 0x696C6C20636F6E PUSH21 0x72616374207769746820666175636574A264697066 PUSH20 0x58221220F4691515D0EF70EE0058A1CDD593F6B8 GT CALLDATASIZE MLOAD 0xDB JUMP 0xB7 SWAP6 SWAP7 0x1E SELFBALANCE LOG2 0x2B PUSH19 0x7A698B64736F6C634300060600330000000000 ", | |
"sourceMap": "231:2516:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;231:2516:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;352:27:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2608:137;;;:::i;:::-;;9268:207:1;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;9268:207:1;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1959:261:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;1959:261:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;352:27;;;;:::o;2608:137::-;2659:4;:13;;;2673:10;2685:4;:14;;;2708:4;2685:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2685:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2685:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;2685:29:0;;;;;;;;;;;;;;;;2659:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2659:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2659:56:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;2659:56:0;;;;;;;;;;;;;;;;2651:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2608:137::o;9268:207:1:-;9374:14;9360:28;;:10;:28;;;9352:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9430:40;9448:9;9459:10;9430:17;:40::i;:::-;9268:207;;:::o;1959:261:0:-;2026:17;2096:3;;2063:4;:14;;;2086:4;2063:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2063:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2063:29:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;2063:29:0;;;;;;;;;;;;;;;;:36;;2055:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2164:49;2182:7;;2191:3;;2196:16;2164:17;:49::i;:::-;2157:56;;1959:261;;;:::o;2291:126::-;2400:10;2385:12;:25;;;;2291:126;;:::o;7428:1013:1:-;7524:17;7551:4;:20;;;7572:14;7588:4;7605:8;7615:5;7594:27;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;7594:27:1;;;7551:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;7551:71:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7551:71:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7551:71:1;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;7551:71:1;;;;;;;;;;;;;;;;;7853:15;7872:66;7889:8;7899:5;7914:4;7921:6;:16;7928:8;7921:16;;;;;;;;;;;;7872;:66::i;:::-;7853:85;;8368:23;8389:1;8368:6;:16;8375:8;8368:16;;;;;;;;;;;;:20;;:23;;;;:::i;:::-;8349:6;:16;8356:8;8349:16;;;;;;;;;;;:42;;;;8404:32;8418:8;8428:7;8404:13;:32::i;:::-;8397:39;;;7428:1013;;;;;:::o;797:231:2:-;927:7;981:8;991:9;1002:10;1014:6;970:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;970:51:2;;;960:62;;;;;;952:71;;944:79;;797:231;;;;;;:::o;863:162:4:-;921:7;936:9;952:1;948;:5;936:17;;972:1;967;:6;;959:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1019:1;1012:8;;;863:162;;;;:::o;1408:171:2:-;1500:7;1549:8;1559:13;1532:41;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1532:41:2;;;1522:52;;;;;;1515:59;;1408:171;;;;:::o" | |
}, | |
"gasEstimates": { | |
"creation": { | |
"codeDepositCost": "457800", | |
"executionCost": "infinite", | |
"totalCost": "infinite" | |
}, | |
"external": { | |
"getRandomNumber(uint256)": "infinite", | |
"randomResult()": "983", | |
"rawFulfillRandomness(bytes32,uint256)": "infinite", | |
"withdrawLink()": "infinite" | |
}, | |
"internal": { | |
"fulfillRandomness(bytes32,uint256)": "20027" | |
} | |
}, | |
"methodIdentifiers": { | |
"getRandomNumber(uint256)": "b37217a4", | |
"randomResult()": "42619f66", | |
"rawFulfillRandomness(bytes32,uint256)": "94985ddd", | |
"withdrawLink()": "8dc654a2" | |
} | |
}, | |
"abi": [ | |
{ | |
"inputs": [], | |
"stateMutability": "nonpayable", | |
"type": "constructor" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "userProvidedSeed", | |
"type": "uint256" | |
} | |
], | |
"name": "getRandomNumber", | |
"outputs": [ | |
{ | |
"internalType": "bytes32", | |
"name": "requestId", | |
"type": "bytes32" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "randomResult", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "bytes32", | |
"name": "requestId", | |
"type": "bytes32" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "randomness", | |
"type": "uint256" | |
} | |
], | |
"name": "rawFulfillRandomness", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "withdrawLink", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
} | |
] | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"compiler": { | |
"version": "0.6.6+commit.6c089d02" | |
}, | |
"language": "Solidity", | |
"output": { | |
"abi": [ | |
{ | |
"inputs": [], | |
"stateMutability": "nonpayable", | |
"type": "constructor" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "userProvidedSeed", | |
"type": "uint256" | |
} | |
], | |
"name": "getRandomNumber", | |
"outputs": [ | |
{ | |
"internalType": "bytes32", | |
"name": "requestId", | |
"type": "bytes32" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "randomResult", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "bytes32", | |
"name": "requestId", | |
"type": "bytes32" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "randomness", | |
"type": "uint256" | |
} | |
], | |
"name": "rawFulfillRandomness", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "withdrawLink", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
} | |
], | |
"devdoc": { | |
"methods": {} | |
}, | |
"userdoc": { | |
"methods": { | |
"constructor": "Constructor inherits VRFConsumerBase * Network: Kovan Chainlink VRF Coordinator address: 0xdD3782915140c8f3b190B5D67eAc6dc5760C46E9 LINK token address: 0xa36085F69e2889c224210F603D836748e7dC0088 Key Hash: 0x6c3699283bda56ad74f6b855546325b68d482e983852a7a82979cc4807b641f4", | |
"getRandomNumber(uint256)": { | |
"notice": "Requests randomness from a user-provided seed************************************************************************************ STOP! * THIS FUNCTION WILL FAIL IF THIS CONTRACT DOES NOT OWN LINK * ---------------------------------------------------------- * Learn how to obtain testnet LINK and fund this contract: * ------- https://docs.chain.link/docs/acquire-link -------- * ---- https://docs.chain.link/docs/fund-your-contract ----- * ************************************************************************************" | |
}, | |
"withdrawLink()": { | |
"notice": "Withdraw LINK from this contract * DO NOT USE THIS IN PRODUCTION AS IT CAN BE CALLED BY ANY ADDRESS. THIS IS PURELY FOR EXAMPLE PURPOSES." | |
} | |
} | |
} | |
}, | |
"settings": { | |
"compilationTarget": { | |
"536123b71478ad4442cfc4278e8de577/RandomNumberConsumer.sol": "RandomNumberConsumer" | |
}, | |
"evmVersion": "istanbul", | |
"libraries": {}, | |
"metadata": { | |
"bytecodeHash": "ipfs" | |
}, | |
"optimizer": { | |
"enabled": false, | |
"runs": 200 | |
}, | |
"remappings": [] | |
}, | |
"sources": { | |
"536123b71478ad4442cfc4278e8de577/RandomNumberConsumer.sol": { | |
"keccak256": "0x4a196a5f22c71159d70d66cecb58c8bbb4a3a44dc3f37bb97db4dd6047ea9893", | |
"urls": [ | |
"bzz-raw://4c30e623aa3d67001dd2f2263d97fc048cc23913705b4074aa38da79795b3125", | |
"dweb:/ipfs/QmYeWwJq7LvModUWrLhm4ES42P36yaYh18ctEPqBnGhV7h" | |
] | |
}, | |
"https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/VRFConsumerBase.sol": { | |
"keccak256": "0xbb84a6411e071d5b04b36d7dda59eaf1cb5a28b3b289757a5ac849ddf9befac3", | |
"urls": [ | |
"bzz-raw://6bc702d1ec269920a3f0cf371155b6c4800d36233949873144e95ce3c4427eb3", | |
"dweb:/ipfs/QmUrYPpfh7TAcUBx3B5ugW2jCAeWThMssY5oyRgQXQRkbE" | |
] | |
}, | |
"https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/VRFRequestIDBase.sol": { | |
"keccak256": "0x0c3bd40c63dac8398a979b1228c8ecb1c269c157dd16f2dce2086d2270b65b22", | |
"urls": [ | |
"bzz-raw://ed9db87be9dfb0f763a556d8d80356b08282b8ea48484838cdf470a5c3cd15d5", | |
"dweb:/ipfs/QmPLhwDAS3TPDiEQmTyqXnWBqwEMBSbXtjEiQDSGejoiPt" | |
] | |
}, | |
"https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/interfaces/LinkTokenInterface.sol": { | |
"keccak256": "0xe245a7be950c94d87bb775ae9ee9fbd693fbe2987778e6ce0b04605ea44b7b68", | |
"urls": [ | |
"bzz-raw://bd2c3165d949fc66fe407b96eb3dc2092c7e800f4c073b411bf7b96de3e156c9", | |
"dweb:/ipfs/QmcfJhR1Np4GsLWnww2Duqks2wEzYk8VDTvCAYy7MisG1r" | |
] | |
}, | |
"https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/vendor/SafeMathChainlink.sol": { | |
"keccak256": "0x105f5e9491f3d0bbdd4f1c7627eb839d69b944bfd803028a01cc083597692c1f", | |
"urls": [ | |
"bzz-raw://ec45a2748a024a947a921183d4102d5e206808588501d85ddc4f5668a009bc73", | |
"dweb:/ipfs/QmRNAMpq7LdWFnJ7wWKGbUuAcURaGSS42PMxtQ4vjrHmp9" | |
] | |
} | |
}, | |
"version": 1 | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This example code is designed to quickly deploy an example contract using Remix. | |
pragma solidity 0.6.6; | |
import "https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/VRFConsumerBase.sol"; | |
contract RandomNumberConsumer is VRFConsumerBase { | |
bytes32 internal keyHash; | |
uint256 internal fee; | |
uint256 public randomResult; | |
/** | |
* Constructor inherits VRFConsumerBase | |
* | |
* Network: Kovan | |
* Chainlink VRF Coordinator address: 0xdD3782915140c8f3b190B5D67eAc6dc5760C46E9 | |
* LINK token address: 0xa36085F69e2889c224210F603D836748e7dC0088 | |
* Key Hash: 0x6c3699283bda56ad74f6b855546325b68d482e983852a7a82979cc4807b641f4 | |
*/ | |
constructor() | |
VRFConsumerBase( | |
0xdD3782915140c8f3b190B5D67eAc6dc5760C46E9, // VRF Coordinator | |
0xa36085F69e2889c224210F603D836748e7dC0088 // LINK Token | |
) public | |
{ | |
keyHash = 0x6c3699283bda56ad74f6b855546325b68d482e983852a7a82979cc4807b641f4; | |
fee = 0.1 * 10 ** 18; // 0.1 LINK | |
} | |
/** | |
* Requests randomness from a user-provided seed | |
************************************************************************************ | |
* STOP! * | |
* THIS FUNCTION WILL FAIL IF THIS CONTRACT DOES NOT OWN LINK * | |
* ---------------------------------------------------------- * | |
* Learn how to obtain testnet LINK and fund this contract: * | |
* ------- https://docs.chain.link/docs/acquire-link -------- * | |
* ---- https://docs.chain.link/docs/fund-your-contract ----- * | |
* * | |
************************************************************************************/ | |
function getRandomNumber(uint256 userProvidedSeed) public returns (bytes32 requestId) { | |
require(LINK.balanceOf(address(this)) >= fee, "Not enough LINK - fill contract with faucet"); | |
return requestRandomness(keyHash, fee, userProvidedSeed); | |
} | |
/** | |
* Callback function used by VRF Coordinator | |
*/ | |
function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override { | |
randomResult = randomness; | |
} | |
/** | |
* Withdraw LINK from this contract | |
* | |
* DO NOT USE THIS IN PRODUCTION AS IT CAN BE CALLED BY ANY ADDRESS. | |
* THIS IS PURELY FOR EXAMPLE PURPOSES. | |
*/ | |
function withdrawLink() external { | |
require(LINK.transfer(msg.sender, LINK.balanceOf(address(this))), "Unable to transfer"); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"deploy": { | |
"VM:-": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"main:1": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"ropsten:3": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"rinkeby:4": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"kovan:42": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"görli:5": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"Custom": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
} | |
}, | |
"data": { | |
"bytecode": { | |
"linkReferences": {}, | |
"object": "6080604081905260016004556017805461ff00191690556000601881905542601955601a819055601b5562002ad83881900390819083398101806040526200004b9190810190620004a2565b60068054600160a060020a0319908116331790915560078054909116739326bfa02add2366b30bacb125260af641031331179055620000938264010000000062000234810204565b6008819055620000c5620000af64010000000062000256810204565b8590640100000000620012226200035a82021704565b3410156200010a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200010190620006dd565b60405180910390fd5b6009805433600160a060020a031991821617909155600a8054909116600160a060020a03891617905542600b55600c869055600d859055600e84905560006016556017805460ff1916600117905582516200016d90600f90602086019062000370565b50601480547305c8fadf1798437c143683e665800d58a42b6e19600160a060020a031991821681179092556015805490911690911790557f61313765386662663463626634366565623739653034623365623836346134656012819055601355600954600a54600c54600d54600e546040517f0203790cae2ea31823a6382172bd46011fcfbab29b22bb78b4b2f266febf6072956200021f95600160a060020a03918216959116939092909162000687565b60405180910390a150505050505050620007a1565b60028054600160a060020a031916600160a060020a0392909216919091179055565b600080600080600080600760009054906101000a9004600160a060020a0316600160a060020a031663feaf968c6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160a060405180830381600087803b158015620002cc57600080fd5b505af1158015620002e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000307919081019062000565565b9450945094509450945060008211151562000350576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200010190620006f5565b5091949350505050565b600081838115156200036857fe5b049392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003b357805160ff1916838001178555620003e3565b82800160010185558215620003e3579182015b82811115620003e3578251825591602001919060010190620003c6565b50620003f1929150620003f5565b5090565b6200041291905b80821115620003f15760008155600101620003fc565b90565b600062000423825162000756565b9392505050565b600062000423825162000412565b6000601f820183136200044a57600080fd5b8151620004616200045b826200072e565b62000707565b915080825260208301602083018583830111156200047e57600080fd5b6200048b8382846200076e565b50505092915050565b600062000423825162000762565b600080600080600080600060e0888a031215620004be57600080fd5b6000620004cc8a8a62000415565b9750506020620004df8a828b016200042a565b9650506040620004f28a828b016200042a565b9550506060620005058a828b016200042a565b94505060808801516001604060020a038111156200052257600080fd5b620005308a828b0162000438565b93505060a0620005438a828b0162000415565b92505060c0620005568a828b016200042a565b91505092959891949750929550565b600080600080600060a086880312156200057e57600080fd5b60006200058c888862000494565b95505060206200059f888289016200042a565b9450506040620005b2888289016200042a565b9350506060620005c5888289016200042a565b9250506080620005d88882890162000494565b9150509295509295909350565b620005f08162000756565b82525050565b602181527f4e6f7420656e6f7567682066756e64732073656e7420746f20636f6e7472616360208201527f7400000000000000000000000000000000000000000000000000000000000000604082015260600190565b601281527f526f756e64206e6f7420636f6d706c6574650000000000000000000000000000602082015260400190565b620005f08162000412565b60a08101620006978288620005e5565b620006a66020830187620005e5565b620006b560408301866200067c565b620006c460608301856200067c565b620006d360808301846200067c565b9695505050505050565b60208082528101620006ef81620005f6565b92915050565b60208082528101620006ef816200064c565b6040518181016001604060020a03811182821017156200072657600080fd5b604052919050565b60006001604060020a038211156200074557600080fd5b506020601f91909101601f19160190565b600160a060020a031690565b6001605060020a031690565b60005b838110156200078b57818101518382015260200162000771565b838111156200079b576000848401525b50505050565b61232780620007b16000396000f30060806040526004361061013a5763ffffffff60e060020a6000350416630c15c365811461013c578063165d35e114610167578063185e5b4014610189578063243d9a5d146101a95780633fad1834146101be5780634162cc88146101d357806356a6d508146101f35780635b69a7d8146102085780635fdc6281146102285780636f9fb98a1461023d578063715018a6146102525780637a50413d146102675780638da5cb5b1461027c5780638e15f47314610291578063a241c089146102a6578063ad2e8c9b146102bb578063b0b30fee146102d0578063b1b91f7a146102f2578063b807873214610312578063bbe4fd5014610327578063c032846b1461033c578063c974402914610351578063ce2ce3fc14610366578063dbc837c514610388578063dcbacd111461039d578063f2fde38b146103b2575b005b34801561014857600080fd5b506101516103d2565b60405161015e9190612199565b60405180910390f35b34801561017357600080fd5b5061017c6103d8565b60405161015e91906120b8565b34801561019557600080fd5b506101516101a4366004611d44565b6103e7565b3480156101b557600080fd5b506101516103fb565b3480156101ca57600080fd5b50610151610401565b3480156101df57600080fd5b506101516101ee366004611d44565b610407565b3480156101ff57600080fd5b50610151610414565b34801561021457600080fd5b5061017c610223366004611d44565b61041a565b34801561023457600080fd5b50610151610437565b34801561024957600080fd5b5061015161043c565b34801561025e57600080fd5b5061013a610441565b34801561027357600080fd5b506101516104ce565b34801561028857600080fd5b5061017c6104d4565b34801561029d57600080fd5b506101516104e3565b3480156102b257600080fd5b506101516105b0565b3480156102c757600080fd5b50610151610aea565b3480156102dc57600080fd5b506102e5610af0565b60405161015e919061218b565b3480156102fe57600080fd5b5061013a61030d366004611d0a565b610afe565b34801561031e57600080fd5b50610151610d06565b34801561033357600080fd5b50610151610d0b565b34801561034857600080fd5b506102e5610d0f565b34801561035d57600080fd5b50610151610d18565b34801561037257600080fd5b5061037b610d1e565b60405161015e91906121a7565b34801561039457600080fd5b5061017c610db4565b3480156103a957600080fd5b50610151610dc3565b3480156103be57600080fd5b5061013a6103cd366004611cce565b610dc9565b60185490565b60006103e2610e02565b905090565b601081600281106103f457fe5b0154905081565b600e5490565b601a5490565b601281600281106103f457fe5b60195490565b6014816002811061042757fe5b0154600160a060020a0316905081565b603c81565b303190565b600954600160a060020a031633146104775760405160e560020a62461bcd02815260040161046e90612208565b60405180910390fd5b600654604051600160a060020a03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a26006805473ffffffffffffffffffffffffffffffffffffffff19169055565b60165490565b600654600160a060020a031681565b600080600080600080600760009054906101000a9004600160a060020a0316600160a060020a031663feaf968c6040518163ffffffff1660e060020a02815260040160a060405180830381600087803b15801561053f57600080fd5b505af1158015610553573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105779190810190611d80565b945094509450945094506000821115156105a65760405160e560020a62461bcd02815260040161046e90612218565b5091949350505050565b60175460009060609060ff1615156001146105e05760405160e560020a62461bcd02815260040161046e906121e8565b6105e8610e11565b60175460ff1615610ae6576000601b5560408051606081018252603a81527f687474703a2f2f6170692e776f726c64776561746865726f6e6c696e652e636f60208083019182527f6d2f7072656d69756d2f76312f776561746865722e617368783f0000000000008385015283518085018552601e81527f36323963366464303962626334333634623761333338313032303039313100008183015293518351939493600f9391909201918291908083835b602083106106b95780518252601f19909201916020918201910161069a565b51815160209384036101000a60001901801990921691161790527f6b65793d00000000000000000000000000000000000000000000000000000000919093019081528551600490910192860191508083835b6020831061072a5780518252601f19909201916020918201910161070b565b6001836020036101000a038019825116818451168082178552505050505050905001807f26713d0000000000000000000000000000000000000000000000000000000000815250600301828054600181600116156101000203166002900480156107cb5780601f106107a95761010080835404028352918201916107cb565b820191906000526020600020905b8154815290600101906020018083116107b7575b50507f26666f726d61743d6a736f6e266e756d5f6f665f646179733d31000000000000815260408051600519818403018152601a9092019052945061088e9350601492506000915061081a9050565b0154600160a060020a031660126000015483606060405190810160405280602181526020017f646174612e63757272656e745f636f6e646974696f6e2e302e7072656369704d81526020017f4d0000000000000000000000000000000000000000000000000000000000000081525061109e565b50606060405190810160405280602781526020017f68747470733a2f2f6170692e776561746865726269742e696f2f76322e302f6381526020017f757272656e743f00000000000000000000000000000000000000000000000000815250600f6040805190810160405280602081526020017f35653035616566303734313034303166616334393162303665623965386663388152506040516020018084805190602001908083835b602083106109565780518252601f199092019160209182019101610937565b6001836020036101000a038019825116818451168082178552505050505050905001807f636974793d000000000000000000000000000000000000000000000000000000815250600501838054600181600116156101000203166002900480156109f75780601f106109d55761010080835404028352918201916109f7565b820191906000526020600020905b8154815290600101906020018083116109e3575b5050807f266b65793d00000000000000000000000000000000000000000000000000000081525060050182805190602001908083835b60208310610a4c5780518252601f199092019160209182019101610a2d565b6001836020036101000a03801982511681845116808217855250505050505090500193505050506040516020818303038152906040529050610ae460146001600281101515610a9757fe5b0154600160a060020a0316601260010154836040805190810160405280600d81526020017f646174612e302e7072656369700000000000000000000000000000000000000081525061109e565b505b5090565b600c5490565b601754610100900460ff1690565b6000828152600560205260409020548290600160a060020a03163314610b395760405160e560020a62461bcd02815260040161046e90612228565b600081815260056020526040808220805473ffffffffffffffffffffffffffffffffffffffff191690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a260175460ff161515600114610bb35760405160e560020a62461bcd02815260040161046e906121e8565b610bd6610bc8603c600c63ffffffff61122216565b603c9063ffffffff61123916565b601954610bea90429063ffffffff61123916565b11610c0a5760405160e560020a62461bcd02815260040161046e906121d8565b816010601b54600281101515610c1c57fe5b0155601b80546001908101918290551015610cca57601154601054610c5391600291610c479161124b565b9063ffffffff61122216565b601881905542601955601a805460010190551515610c7957601680546001019055610cb8565b60006016556018546040517f2e5a5a6cf30e14f6500f404203cc44691f83c62354f375539ea7d45bcc49230591610caf91612199565b60405180910390a15b601654600311610cca57610cca611258565b7f9acb88f10af47daa34522605143d1719bad9aa6562e4c443c8abb9d594ea73f482604051610cf99190612199565b60405180910390a1505050565b600381565b4290565b60175460ff1690565b600d5490565b600f8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610daa5780601f10610d7f57610100808354040283529160200191610daa565b820191906000526020600020905b815481529060010190602001808311610d8d57829003601f168201915b5050505050905090565b600954600160a060020a031681565b600b5490565b600954600160a060020a03163314610df65760405160e560020a62461bcd02815260040161046e90612208565b610dff81611455565b50565b600254600160a060020a031690565b600042600c54600b54011015610dff57600c54600290610e3890603c63ffffffff61122216565b03601a54101515610e8357600954604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015610e7d573d6000803e3d6000fd5b50610f11565b600a54600160a060020a03166108fc610eac610e9d6104e3565b600d549063ffffffff61122216565b6040518115909202916000818181858888f19350505050158015610ed4573d6000803e3d6000fd5b50600954604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015610f0f573d6000803e3d6000fd5b505b610f19610e02565b6009546040517f70a08231000000000000000000000000000000000000000000000000000000008152919250600160a060020a038084169263a9059cbb929091169083906370a0823190610f719030906004016120b8565b602060405180830381600087803b158015610f8b57600080fd5b505af1158015610f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610fc39190810190611d62565b6040518363ffffffff1660e060020a028152600401610fe39291906120c6565b602060405180830381600087803b158015610ffd57600080fd5b505af1158015611011573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110359190810190611cec565b15156110565760405160e560020a62461bcd02815260040161046e906121b8565b6017805460ff191690556040517f71d9f146944417dd66115a997376d9878c3618f396c331a6c3aa82ce653eae1490611093904290303190612238565b60405180910390a150565b60006110a8611c45565b60175460ff1615156001146110d25760405160e560020a62461bcd02815260040161046e906121e8565b6110fd85307fb1b91f7a000000000000000000000000000000000000000000000000000000006114d3565b60408051808201909152600381527f676574000000000000000000000000000000000000000000000000000000000060208201529091506111469082908663ffffffff6114fe16565b60408051808201909152600481527f7061746800000000000000000000000000000000000000000000000000000000602082015261118c9082908563ffffffff6114fe16565b60408051808201909152600581527f74696d657300000000000000000000000000000000000000000000000000000060208201526111d3908290606463ffffffff61152d16565b6111e08682600854611557565b91507f9b79db1508864f538c7703d2267a0c858007ee5877c83d83aec1b431e5add541826040516112119190612199565b60405180910390a150949350505050565b6000818381151561122f57fe5b0490505b92915050565b60008282111561124557fe5b50900390565b8181018281101561123357fe5b60175460009060ff1615156001146112855760405160e560020a62461bcd02815260040161046e906121e8565b600a54604051600160a060020a0390911690303180156108fc02916000818181858888f193505050501580156112bf573d6000803e3d6000fd5b506112c8610e02565b6009546040517f70a08231000000000000000000000000000000000000000000000000000000008152919250600160a060020a038084169263a9059cbb929091169083906370a08231906113209030906004016120b8565b602060405180830381600087803b15801561133a57600080fd5b505af115801561134e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113729190810190611d62565b6040518363ffffffff1660e060020a0281526004016113929291906120c6565b602060405180830381600087803b1580156113ac57600080fd5b505af11580156113c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113e49190810190611cec565b15156114055760405160e560020a62461bcd02815260040161046e906121f8565b600e546018546040517fd8874104029b491ba57b1b4875bd4ba8d4a98bf0261e1fdfac96db44022f95f89261143b924292612246565b60405180910390a1506017805461ffff1916610100179055565b600160a060020a038116151561146a57600080fd5b600654604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6114db611c45565b6114e3611c45565b6114f58186868663ffffffff61172616565b95945050505050565b6080830151611513908363ffffffff61178116565b6080830151611528908263ffffffff61178116565b505050565b6080830151611542908363ffffffff61178116565b6080830151611528908263ffffffff61179e16565b6000306004546040516020018083600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401828152602001925050506040516020818303038152906040526040518082805190602001908083835b602083106115d35780518252601f1990920191602091820191016115b4565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912060045460608a015260008181526005909252838220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038c1617905592519295508594507fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af99350919050a2600254600160a060020a0316634000aea0858461168187611800565b6040518463ffffffff1660e060020a0281526004016116a29392919061215e565b602060405180830381600087803b1580156116bc57600080fd5b505af11580156116d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116f49190810190611cec565b15156117155760405160e560020a62461bcd02815260040161046e906121c8565b6004805460010190555b9392505050565b61172e611c45565b61173e85608001516101006118bd565b5050828452600160a060020a03821660208501527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1981166040850152835b949350505050565b61178e82600383516118f7565b611528828263ffffffff6119fa16565b67ffffffffffffffff198112156117be576117b98282611a14565b6117fc565b67ffffffffffffffff8113156117d8576117b98282611a53565b600081126117ec576117b9826000836118f7565b6117fc82600183600019036118f7565b5050565b80516020820151604080840151606085810151608087015151935191957f40429946000000000000000000000000000000000000000000000000000000009561185a956000958695939492939092916001916024016120e1565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19909316929092179091529050919050565b6118c5611c7a565b60208206156118da5760208206602003820191505b506020828101829052604080518085526000815290920101905290565b60178111611919576119138360ff848116602002168317611a7a565b50611528565b60ff811161194d5761193a836018602060ff8616021763ffffffff611a7a16565b506119138382600163ffffffff611a9216565b61ffff81116119825761196f836019602060ff8616021763ffffffff611a7a16565b506119138382600263ffffffff611a9216565b63ffffffff81116119b9576119a683601a602060ff8616021763ffffffff611a7a16565b506119138382600463ffffffff611a9216565b67ffffffffffffffff8111611528576119e183601b602060ff8616021763ffffffff611a7a16565b506119f48382600863ffffffff611a9216565b50505050565b611a02611c7a565b61171f83846000015151848551611aab565b611a258260c363ffffffff611a7a16565b506117fc828260001903604051602001611a3f9190612199565b604051602081830303815290604052611b61565b611a648260c263ffffffff611a7a16565b506117fc8282604051602001611a3f9190612199565b611a82611c7a565b61171f8384600001515184611b6e565b611a9a611c7a565b611779848560000151518585611bb9565b611ab3611c7a565b600080600085518511151515611ac857600080fd5b87602001518588011115611af257611af288611aea8a602001518a8901611c17565b600202611c2e565b875180518860208301019450808988011115611b0e5788870182525b60208801935050505b60208510611b395781518352601f199094019360209283019290910190611b17565b505181516020949094036101000a600019018019909116931692909217909152509192915050565b61178e82600283516118f7565b611b76611c7a565b60208401518310611b9257611b92848560200151600202611c2e565b8351805160208583010184815381861415611bae576001820183525b509495945050505050565b611bc1611c7a565b600085602001518584011115611be057611be086868501600202611c2e565b6001836101000a0390508551838682010185831982511617815281518588011115611c0b5784870182525b50959695505050505050565b600081831115611c28575081611233565b50919050565b8151611c3a83836118bd565b506119f483826119fa565b6040805160c081018252600080825260208201819052918101829052606081019190915260808101611c75611c7a565b905290565b60408051808201909152606081526000602082015290565b600061171f8235612272565b600061171f825161227e565b600061171f8235612283565b600061171f8251612283565b600061171f82516122a8565b600060208284031215611ce057600080fd5b60006117798484611c92565b600060208284031215611cfe57600080fd5b60006117798484611c9e565b60008060408385031215611d1d57600080fd5b6000611d298585611caa565b9250506020611d3a85828601611caa565b9150509250929050565b600060208284031215611d5657600080fd5b60006117798484611caa565b600060208284031215611d7457600080fd5b60006117798484611cb6565b600080600080600060a08688031215611d9857600080fd5b6000611da48888611cc2565b9550506020611db588828901611cb6565b9450506040611dc688828901611cb6565b9350506060611dd788828901611cb6565b9250506080611de888828901611cc2565b9150509295509295909350565b611dfe81612272565b82525050565b611dfe8161227e565b611dfe81612283565b611dfe81612286565b6000611e2a8261226e565b808452611e3e8160208601602086016122b7565b611e47816122e3565b9093016020019392505050565b602881527f556e61626c6520746f207472616e736665722072656d61696e696e67204c494e60208201527f4b20746f6b656e73000000000000000000000000000000000000000000000000604082015260600190565b602381527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160208201527f636c650000000000000000000000000000000000000000000000000000000000604082015260600190565b602481527f43616e206f6e6c7920636865636b207261696e66616c6c206f6e63652070657260208201527f2064617900000000000000000000000000000000000000000000000000000000604082015260600190565b603181527f436f6e74726163742068617320656e6465642c2063616e7420696e746572616360208201527f74207769746820697420616e796d6f7265000000000000000000000000000000604082015260600190565b601281527f556e61626c6520746f207472616e736665720000000000000000000000000000602082015260400190565b602381527f4f6e6c7920496e737572616e63652070726f76696465722063616e20646f207460208201527f6869730000000000000000000000000000000000000000000000000000000000604082015260600190565b601281527f526f756e64206e6f7420636f6d706c6574650000000000000000000000000000602082015260400190565b602881527f536f75726365206d75737420626520746865206f7261636c65206f662074686560208201527f2072657175657374000000000000000000000000000000000000000000000000604082015260600190565b602081016112338284611df5565b604081016120d48285611df5565b61171f6020830184611e0d565b61010081016120f0828b611df5565b6120fd602083018a611e0d565b61210a6040830189611e0d565b6121176060830188611df5565b6121246080830187611e16565b61213160a0830186611e0d565b61213e60c0830185611e0d565b81810360e08301526121508184611e1f565b9a9950505050505050505050565b6060810161216c8286611df5565b6121796020830185611e0d565b81810360408301526114f58184611e1f565b602081016112338284611e04565b602081016112338284611e0d565b6020808252810161171f8184611e1f565b6020808252810161123381611e54565b6020808252810161123381611eaa565b6020808252810161123381611f00565b6020808252810161123381611f56565b6020808252810161123381611fac565b6020808252810161123381611fdc565b6020808252810161123381612032565b6020808252810161123381612062565b604081016120d48285611e0d565b606081016122548286611e0d565b6122616020830185611e0d565b6117796040830184611e0d565b5190565b600160a060020a031690565b151590565b90565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690565b69ffffffffffffffffffff1690565b60005b838110156122d25781810151838201526020016122ba565b838111156119f45750506000910152565b601f01601f1916905600a265627a7a72305820ae7c6b1bc3e9c37bd83ce7ef0d6ebc72ee71c196bd8a89b84fa508d5c11d3f406c6578706572696d656e74616cf50037", | |
"opcodes": "PUSH1 0x80 PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x4 SSTORE PUSH1 0x17 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE PUSH1 0x0 PUSH1 0x18 DUP2 SWAP1 SSTORE TIMESTAMP PUSH1 0x19 SSTORE PUSH1 0x1A DUP2 SWAP1 SSTORE PUSH1 0x1B SSTORE PUSH3 0x2AD8 CODESIZE DUP2 SWAP1 SUB SWAP1 DUP2 SWAP1 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x4B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x4A2 JUMP JUMPDEST PUSH1 0x6 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP1 DUP2 AND CALLER OR SWAP1 SWAP2 SSTORE PUSH1 0x7 DUP1 SLOAD SWAP1 SWAP2 AND PUSH20 0x9326BFA02ADD2366B30BACB125260AF641031331 OR SWAP1 SSTORE PUSH3 0x93 DUP3 PUSH5 0x100000000 PUSH3 0x234 DUP2 MUL DIV JUMP JUMPDEST PUSH1 0x8 DUP2 SWAP1 SSTORE PUSH3 0xC5 PUSH3 0xAF PUSH5 0x100000000 PUSH3 0x256 DUP2 MUL DIV JUMP JUMPDEST DUP6 SWAP1 PUSH5 0x100000000 PUSH3 0x1222 PUSH3 0x35A DUP3 MUL OR DIV JUMP JUMPDEST CALLVALUE LT ISZERO PUSH3 0x10A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x101 SWAP1 PUSH3 0x6DD JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x9 DUP1 SLOAD CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0xA DUP1 SLOAD SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP10 AND OR SWAP1 SSTORE TIMESTAMP PUSH1 0xB SSTORE PUSH1 0xC DUP7 SWAP1 SSTORE PUSH1 0xD DUP6 SWAP1 SSTORE PUSH1 0xE DUP5 SWAP1 SSTORE PUSH1 0x0 PUSH1 0x16 SSTORE PUSH1 0x17 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE DUP3 MLOAD PUSH3 0x16D SWAP1 PUSH1 0xF SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH3 0x370 JUMP JUMPDEST POP PUSH1 0x14 DUP1 SLOAD PUSH20 0x5C8FADF1798437C143683E665800D58A42B6E19 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH1 0x15 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE PUSH32 0x6131376538666266346362663436656562373965303462336562383634613465 PUSH1 0x12 DUP2 SWAP1 SSTORE PUSH1 0x13 SSTORE PUSH1 0x9 SLOAD PUSH1 0xA SLOAD PUSH1 0xC SLOAD PUSH1 0xD SLOAD PUSH1 0xE SLOAD PUSH1 0x40 MLOAD PUSH32 0x203790CAE2EA31823A6382172BD46011FCFBAB29B22BB78B4B2F266FEBF6072 SWAP6 PUSH3 0x21F SWAP6 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP2 DUP3 AND SWAP6 SWAP2 AND SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 PUSH3 0x687 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP POP PUSH3 0x7A1 JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x7 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0xFEAF968C PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0xA0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x2CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x2E1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x307 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x565 JUMP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP PUSH1 0x0 DUP3 GT ISZERO ISZERO PUSH3 0x350 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x101 SWAP1 PUSH3 0x6F5 JUMP JUMPDEST POP SWAP2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 DUP2 ISZERO ISZERO PUSH3 0x368 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x3B3 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x3E3 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x3E3 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x3E3 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x3C6 JUMP JUMPDEST POP PUSH3 0x3F1 SWAP3 SWAP2 POP PUSH3 0x3F5 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x412 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x3F1 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x3FC JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x423 DUP3 MLOAD PUSH3 0x756 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x423 DUP3 MLOAD PUSH3 0x412 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH3 0x44A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x461 PUSH3 0x45B DUP3 PUSH3 0x72E JUMP JUMPDEST PUSH3 0x707 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH3 0x47E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x48B DUP4 DUP3 DUP5 PUSH3 0x76E JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x423 DUP3 MLOAD PUSH3 0x762 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH3 0x4BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x4CC DUP11 DUP11 PUSH3 0x415 JUMP JUMPDEST SWAP8 POP POP PUSH1 0x20 PUSH3 0x4DF DUP11 DUP3 DUP12 ADD PUSH3 0x42A JUMP JUMPDEST SWAP7 POP POP PUSH1 0x40 PUSH3 0x4F2 DUP11 DUP3 DUP12 ADD PUSH3 0x42A JUMP JUMPDEST SWAP6 POP POP PUSH1 0x60 PUSH3 0x505 DUP11 DUP3 DUP12 ADD PUSH3 0x42A JUMP JUMPDEST SWAP5 POP POP PUSH1 0x80 DUP9 ADD MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x522 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x530 DUP11 DUP3 DUP12 ADD PUSH3 0x438 JUMP JUMPDEST SWAP4 POP POP PUSH1 0xA0 PUSH3 0x543 DUP11 DUP3 DUP12 ADD PUSH3 0x415 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xC0 PUSH3 0x556 DUP11 DUP3 DUP12 ADD PUSH3 0x42A JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH3 0x57E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x58C DUP9 DUP9 PUSH3 0x494 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH3 0x59F DUP9 DUP3 DUP10 ADD PUSH3 0x42A JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH3 0x5B2 DUP9 DUP3 DUP10 ADD PUSH3 0x42A JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 PUSH3 0x5C5 DUP9 DUP3 DUP10 ADD PUSH3 0x42A JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 PUSH3 0x5D8 DUP9 DUP3 DUP10 ADD PUSH3 0x494 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH3 0x5F0 DUP2 PUSH3 0x756 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x21 DUP2 MSTORE PUSH32 0x4E6F7420656E6F7567682066756E64732073656E7420746F20636F6E74726163 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x7400000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x526F756E64206E6F7420636F6D706C6574650000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH3 0x5F0 DUP2 PUSH3 0x412 JUMP JUMPDEST PUSH1 0xA0 DUP2 ADD PUSH3 0x697 DUP3 DUP9 PUSH3 0x5E5 JUMP JUMPDEST PUSH3 0x6A6 PUSH1 0x20 DUP4 ADD DUP8 PUSH3 0x5E5 JUMP JUMPDEST PUSH3 0x6B5 PUSH1 0x40 DUP4 ADD DUP7 PUSH3 0x67C JUMP JUMPDEST PUSH3 0x6C4 PUSH1 0x60 DUP4 ADD DUP6 PUSH3 0x67C JUMP JUMPDEST PUSH3 0x6D3 PUSH1 0x80 DUP4 ADD DUP5 PUSH3 0x67C JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH3 0x6EF DUP2 PUSH3 0x5F6 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH3 0x6EF DUP2 PUSH3 0x64C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH3 0x726 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP3 GT ISZERO PUSH3 0x745 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x50 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x78B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x771 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0x79B JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x2327 DUP1 PUSH3 0x7B1 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x13A JUMPI PUSH4 0xFFFFFFFF PUSH1 0xE0 PUSH1 0x2 EXP PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0xC15C365 DUP2 EQ PUSH2 0x13C JUMPI DUP1 PUSH4 0x165D35E1 EQ PUSH2 0x167 JUMPI DUP1 PUSH4 0x185E5B40 EQ PUSH2 0x189 JUMPI DUP1 PUSH4 0x243D9A5D EQ PUSH2 0x1A9 JUMPI DUP1 PUSH4 0x3FAD1834 EQ PUSH2 0x1BE JUMPI DUP1 PUSH4 0x4162CC88 EQ PUSH2 0x1D3 JUMPI DUP1 PUSH4 0x56A6D508 EQ PUSH2 0x1F3 JUMPI DUP1 PUSH4 0x5B69A7D8 EQ PUSH2 0x208 JUMPI DUP1 PUSH4 0x5FDC6281 EQ PUSH2 0x228 JUMPI DUP1 PUSH4 0x6F9FB98A EQ PUSH2 0x23D JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x252 JUMPI DUP1 PUSH4 0x7A50413D EQ PUSH2 0x267 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x27C JUMPI DUP1 PUSH4 0x8E15F473 EQ PUSH2 0x291 JUMPI DUP1 PUSH4 0xA241C089 EQ PUSH2 0x2A6 JUMPI DUP1 PUSH4 0xAD2E8C9B EQ PUSH2 0x2BB JUMPI DUP1 PUSH4 0xB0B30FEE EQ PUSH2 0x2D0 JUMPI DUP1 PUSH4 0xB1B91F7A EQ PUSH2 0x2F2 JUMPI DUP1 PUSH4 0xB8078732 EQ PUSH2 0x312 JUMPI DUP1 PUSH4 0xBBE4FD50 EQ PUSH2 0x327 JUMPI DUP1 PUSH4 0xC032846B EQ PUSH2 0x33C JUMPI DUP1 PUSH4 0xC9744029 EQ PUSH2 0x351 JUMPI DUP1 PUSH4 0xCE2CE3FC EQ PUSH2 0x366 JUMPI DUP1 PUSH4 0xDBC837C5 EQ PUSH2 0x388 JUMPI DUP1 PUSH4 0xDCBACD11 EQ PUSH2 0x39D JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x3B2 JUMPI JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x148 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x3D2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15E SWAP2 SWAP1 PUSH2 0x2199 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x173 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17C PUSH2 0x3D8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15E SWAP2 SWAP1 PUSH2 0x20B8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x195 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x1A4 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D44 JUMP JUMPDEST PUSH2 0x3E7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x3FB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x401 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x1EE CALLDATASIZE PUSH1 0x4 PUSH2 0x1D44 JUMP JUMPDEST PUSH2 0x407 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x414 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x214 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17C PUSH2 0x223 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D44 JUMP JUMPDEST PUSH2 0x41A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x234 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x437 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x249 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x43C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x25E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13A PUSH2 0x441 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x273 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x4CE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x288 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17C PUSH2 0x4D4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x29D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x4E3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x5B0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0xAEA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E5 PUSH2 0xAF0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15E SWAP2 SWAP1 PUSH2 0x218B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13A PUSH2 0x30D CALLDATASIZE PUSH1 0x4 PUSH2 0x1D0A JUMP JUMPDEST PUSH2 0xAFE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x31E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0xD06 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x333 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0xD0B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x348 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E5 PUSH2 0xD0F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0xD18 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x37B PUSH2 0xD1E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15E SWAP2 SWAP1 PUSH2 0x21A7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x394 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17C PUSH2 0xDB4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0xDC3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13A PUSH2 0x3CD CALLDATASIZE PUSH1 0x4 PUSH2 0x1CCE JUMP JUMPDEST PUSH2 0xDC9 JUMP JUMPDEST PUSH1 0x18 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3E2 PUSH2 0xE02 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 PUSH1 0x2 DUP2 LT PUSH2 0x3F4 JUMPI INVALID JUMPDEST ADD SLOAD SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0xE SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1A SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 PUSH1 0x2 DUP2 LT PUSH2 0x3F4 JUMPI INVALID JUMPDEST PUSH1 0x19 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 PUSH1 0x2 DUP2 LT PUSH2 0x427 JUMPI INVALID JUMPDEST ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x3C DUP2 JUMP JUMPDEST ADDRESS BALANCE SWAP1 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x477 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x2208 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 PUSH32 0xF8DF31144D9C2F0F6B59D69B8B98ABD5459D07F2742C4DF920B25AAE33C64820 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH1 0x6 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x16 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x7 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0xFEAF968C PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0xA0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x53F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x553 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x577 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1D80 JUMP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP PUSH1 0x0 DUP3 GT ISZERO ISZERO PUSH2 0x5A6 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x2218 JUMP JUMPDEST POP SWAP2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x17 SLOAD PUSH1 0x0 SWAP1 PUSH1 0x60 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH1 0x1 EQ PUSH2 0x5E0 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21E8 JUMP JUMPDEST PUSH2 0x5E8 PUSH2 0xE11 JUMP JUMPDEST PUSH1 0x17 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xAE6 JUMPI PUSH1 0x0 PUSH1 0x1B SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x3A DUP2 MSTORE PUSH32 0x687474703A2F2F6170692E776F726C64776561746865726F6E6C696E652E636F PUSH1 0x20 DUP1 DUP4 ADD SWAP2 DUP3 MSTORE PUSH32 0x6D2F7072656D69756D2F76312F776561746865722E617368783F000000000000 DUP4 DUP6 ADD MSTORE DUP4 MLOAD DUP1 DUP6 ADD DUP6 MSTORE PUSH1 0x1E DUP2 MSTORE PUSH32 0x3632396336646430396262633433363462376133333831303230303931310000 DUP2 DUP4 ADD MSTORE SWAP4 MLOAD DUP4 MLOAD SWAP4 SWAP5 SWAP4 PUSH1 0xF SWAP4 SWAP2 SWAP1 SWAP3 ADD SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x6B9 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x69A JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH32 0x6B65793D00000000000000000000000000000000000000000000000000000000 SWAP2 SWAP1 SWAP4 ADD SWAP1 DUP2 MSTORE DUP6 MLOAD PUSH1 0x4 SWAP1 SWAP2 ADD SWAP3 DUP7 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x72A JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x70B JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD DUP1 PUSH32 0x26713D0000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x3 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x7CB JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x7A9 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x7CB JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x7B7 JUMPI JUMPDEST POP POP PUSH32 0x26666F726D61743D6A736F6E266E756D5F6F665F646179733D31000000000000 DUP2 MSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x5 NOT DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH1 0x1A SWAP1 SWAP3 ADD SWAP1 MSTORE SWAP5 POP PUSH2 0x88E SWAP4 POP PUSH1 0x14 SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH2 0x81A SWAP1 POP JUMP JUMPDEST ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x12 PUSH1 0x0 ADD SLOAD DUP4 PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x646174612E63757272656E745F636F6E646974696F6E2E302E7072656369704D DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4D00000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH2 0x109E JUMP JUMPDEST POP PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x68747470733A2F2F6170692E776561746865726269742E696F2F76322E302F63 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x757272656E743F00000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0xF PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x3565303561656630373431303430316661633439316230366562396538666338 DUP2 MSTORE POP PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP5 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x956 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x937 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD DUP1 PUSH32 0x636974793D000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x5 ADD DUP4 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x9F7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x9D5 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x9F7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x9E3 JUMPI JUMPDEST POP POP DUP1 PUSH32 0x266B65793D000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x5 ADD DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xA4C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xA2D JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP4 POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 POP PUSH2 0xAE4 PUSH1 0x14 PUSH1 0x1 PUSH1 0x2 DUP2 LT ISZERO ISZERO PUSH2 0xA97 JUMPI INVALID JUMPDEST ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x12 PUSH1 0x1 ADD SLOAD DUP4 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xD DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x646174612E302E70726563697000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH2 0x109E JUMP JUMPDEST POP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xC SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x17 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0xB39 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x2228 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 PUSH1 0x17 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH1 0x1 EQ PUSH2 0xBB3 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21E8 JUMP JUMPDEST PUSH2 0xBD6 PUSH2 0xBC8 PUSH1 0x3C PUSH1 0xC PUSH4 0xFFFFFFFF PUSH2 0x1222 AND JUMP JUMPDEST PUSH1 0x3C SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1239 AND JUMP JUMPDEST PUSH1 0x19 SLOAD PUSH2 0xBEA SWAP1 TIMESTAMP SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1239 AND JUMP JUMPDEST GT PUSH2 0xC0A JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21D8 JUMP JUMPDEST DUP2 PUSH1 0x10 PUSH1 0x1B SLOAD PUSH1 0x2 DUP2 LT ISZERO ISZERO PUSH2 0xC1C JUMPI INVALID JUMPDEST ADD SSTORE PUSH1 0x1B DUP1 SLOAD PUSH1 0x1 SWAP1 DUP2 ADD SWAP2 DUP3 SWAP1 SSTORE LT ISZERO PUSH2 0xCCA JUMPI PUSH1 0x11 SLOAD PUSH1 0x10 SLOAD PUSH2 0xC53 SWAP2 PUSH1 0x2 SWAP2 PUSH2 0xC47 SWAP2 PUSH2 0x124B JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1222 AND JUMP JUMPDEST PUSH1 0x18 DUP2 SWAP1 SSTORE TIMESTAMP PUSH1 0x19 SSTORE PUSH1 0x1A DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE ISZERO ISZERO PUSH2 0xC79 JUMPI PUSH1 0x16 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE PUSH2 0xCB8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x16 SSTORE PUSH1 0x18 SLOAD PUSH1 0x40 MLOAD PUSH32 0x2E5A5A6CF30E14F6500F404203CC44691F83C62354F375539EA7D45BCC492305 SWAP2 PUSH2 0xCAF SWAP2 PUSH2 0x2199 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST PUSH1 0x16 SLOAD PUSH1 0x3 GT PUSH2 0xCCA JUMPI PUSH2 0xCCA PUSH2 0x1258 JUMP JUMPDEST PUSH32 0x9ACB88F10AF47DAA34522605143D1719BAD9AA6562E4C443C8ABB9D594EA73F4 DUP3 PUSH1 0x40 MLOAD PUSH2 0xCF9 SWAP2 SWAP1 PUSH2 0x2199 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP JUMP JUMPDEST PUSH1 0x3 DUP2 JUMP JUMPDEST TIMESTAMP SWAP1 JUMP JUMPDEST PUSH1 0x17 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0xD SLOAD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xDAA JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xD7F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xDAA JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xD8D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0xB SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0xDF6 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x2208 JUMP JUMPDEST PUSH2 0xDFF DUP2 PUSH2 0x1455 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 TIMESTAMP PUSH1 0xC SLOAD PUSH1 0xB SLOAD ADD LT ISZERO PUSH2 0xDFF JUMPI PUSH1 0xC SLOAD PUSH1 0x2 SWAP1 PUSH2 0xE38 SWAP1 PUSH1 0x3C PUSH4 0xFFFFFFFF PUSH2 0x1222 AND JUMP JUMPDEST SUB PUSH1 0x1A SLOAD LT ISZERO ISZERO PUSH2 0xE83 JUMPI PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 ADDRESS BALANCE DUP1 ISZERO PUSH2 0x8FC MUL SWAP2 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xE7D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH2 0xF11 JUMP JUMPDEST PUSH1 0xA SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH2 0x8FC PUSH2 0xEAC PUSH2 0xE9D PUSH2 0x4E3 JUMP JUMPDEST PUSH1 0xD SLOAD SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1222 AND JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 ISZERO SWAP1 SWAP3 MUL SWAP2 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xED4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 ADDRESS BALANCE DUP1 ISZERO PUSH2 0x8FC MUL SWAP2 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xF0F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST PUSH2 0xF19 PUSH2 0xE02 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP5 AND SWAP3 PUSH4 0xA9059CBB SWAP3 SWAP1 SWAP2 AND SWAP1 DUP4 SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0xF71 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x20B8 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF9F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xFC3 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1D62 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xFE3 SWAP3 SWAP2 SWAP1 PUSH2 0x20C6 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xFFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1011 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1035 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1CEC JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1056 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21B8 JUMP JUMPDEST PUSH1 0x17 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x71D9F146944417DD66115A997376D9878C3618F396C331A6C3AA82CE653EAE14 SWAP1 PUSH2 0x1093 SWAP1 TIMESTAMP SWAP1 ADDRESS BALANCE SWAP1 PUSH2 0x2238 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10A8 PUSH2 0x1C45 JUMP JUMPDEST PUSH1 0x17 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH1 0x1 EQ PUSH2 0x10D2 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21E8 JUMP JUMPDEST PUSH2 0x10FD DUP6 ADDRESS PUSH32 0xB1B91F7A00000000000000000000000000000000000000000000000000000000 PUSH2 0x14D3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP2 MSTORE PUSH32 0x6765740000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH2 0x1146 SWAP1 DUP3 SWAP1 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x14FE AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0x7061746800000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x118C SWAP1 DUP3 SWAP1 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x14FE AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x5 DUP2 MSTORE PUSH32 0x74696D6573000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x11D3 SWAP1 DUP3 SWAP1 PUSH1 0x64 PUSH4 0xFFFFFFFF PUSH2 0x152D AND JUMP JUMPDEST PUSH2 0x11E0 DUP7 DUP3 PUSH1 0x8 SLOAD PUSH2 0x1557 JUMP JUMPDEST SWAP2 POP PUSH32 0x9B79DB1508864F538C7703D2267A0C858007EE5877C83D83AEC1B431E5ADD541 DUP3 PUSH1 0x40 MLOAD PUSH2 0x1211 SWAP2 SWAP1 PUSH2 0x2199 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 DUP2 ISZERO ISZERO PUSH2 0x122F JUMPI INVALID JUMPDEST DIV SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1245 JUMPI INVALID JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST DUP2 DUP2 ADD DUP3 DUP2 LT ISZERO PUSH2 0x1233 JUMPI INVALID JUMPDEST PUSH1 0x17 SLOAD PUSH1 0x0 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH1 0x1 EQ PUSH2 0x1285 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21E8 JUMP JUMPDEST PUSH1 0xA SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 ADDRESS BALANCE DUP1 ISZERO PUSH2 0x8FC MUL SWAP2 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x12BF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH2 0x12C8 PUSH2 0xE02 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP5 AND SWAP3 PUSH4 0xA9059CBB SWAP3 SWAP1 SWAP2 AND SWAP1 DUP4 SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0x1320 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x20B8 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x133A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x134E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1372 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1D62 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1392 SWAP3 SWAP2 SWAP1 PUSH2 0x20C6 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x13AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x13C0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x13E4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1CEC JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1405 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21F8 JUMP JUMPDEST PUSH1 0xE SLOAD PUSH1 0x18 SLOAD PUSH1 0x40 MLOAD PUSH32 0xD8874104029B491BA57B1B4875BD4BA8D4A98BF0261E1FDFAC96DB44022F95F8 SWAP3 PUSH2 0x143B SWAP3 TIMESTAMP SWAP3 PUSH2 0x2246 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP PUSH1 0x17 DUP1 SLOAD PUSH2 0xFFFF NOT AND PUSH2 0x100 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO ISZERO PUSH2 0x146A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x6 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x14DB PUSH2 0x1C45 JUMP JUMPDEST PUSH2 0x14E3 PUSH2 0x1C45 JUMP JUMPDEST PUSH2 0x14F5 DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x1726 AND JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x1513 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x1781 AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x1528 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x1781 AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x1542 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x1781 AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x1528 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x179E AND JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x15D3 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x15B4 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH1 0x4 SLOAD PUSH1 0x60 DUP11 ADD MSTORE PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP3 MSTORE DUP4 DUP3 KECCAK256 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP13 AND OR SWAP1 SSTORE SWAP3 MLOAD SWAP3 SWAP6 POP DUP6 SWAP5 POP PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP4 POP SWAP2 SWAP1 POP LOG2 PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0x1681 DUP8 PUSH2 0x1800 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x16A2 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x215E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x16BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x16D0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x16F4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1CEC JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1715 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21C8 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x172E PUSH2 0x1C45 JUMP JUMPDEST PUSH2 0x173E DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0x18BD JUMP JUMPDEST POP POP DUP3 DUP5 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x20 DUP6 ADD MSTORE PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT DUP2 AND PUSH1 0x40 DUP6 ADD MSTORE DUP4 JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x178E DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0x18F7 JUMP JUMPDEST PUSH2 0x1528 DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x19FA AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF NOT DUP2 SLT ISZERO PUSH2 0x17BE JUMPI PUSH2 0x17B9 DUP3 DUP3 PUSH2 0x1A14 JUMP JUMPDEST PUSH2 0x17FC JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 SGT ISZERO PUSH2 0x17D8 JUMPI PUSH2 0x17B9 DUP3 DUP3 PUSH2 0x1A53 JUMP JUMPDEST PUSH1 0x0 DUP2 SLT PUSH2 0x17EC JUMPI PUSH2 0x17B9 DUP3 PUSH1 0x0 DUP4 PUSH2 0x18F7 JUMP JUMPDEST PUSH2 0x17FC DUP3 PUSH1 0x1 DUP4 PUSH1 0x0 NOT SUB PUSH2 0x18F7 JUMP JUMPDEST POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x40 DUP1 DUP5 ADD MLOAD PUSH1 0x60 DUP6 DUP2 ADD MLOAD PUSH1 0x80 DUP8 ADD MLOAD MLOAD SWAP4 MLOAD SWAP2 SWAP6 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP6 PUSH2 0x185A SWAP6 PUSH1 0x0 SWAP6 DUP7 SWAP6 SWAP4 SWAP5 SWAP3 SWAP4 SWAP1 SWAP3 SWAP2 PUSH1 0x1 SWAP2 PUSH1 0x24 ADD PUSH2 0x20E1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x18C5 PUSH2 0x1C7A JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0x18DA JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0x1919 JUMPI PUSH2 0x1913 DUP4 PUSH1 0xFF DUP5 DUP2 AND PUSH1 0x20 MUL AND DUP4 OR PUSH2 0x1A7A JUMP JUMPDEST POP PUSH2 0x1528 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0x194D JUMPI PUSH2 0x193A DUP4 PUSH1 0x18 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x1913 DUP4 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1A92 AND JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0x1982 JUMPI PUSH2 0x196F DUP4 PUSH1 0x19 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x1913 DUP4 DUP3 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0x1A92 AND JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0x19B9 JUMPI PUSH2 0x19A6 DUP4 PUSH1 0x1A PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x1913 DUP4 DUP3 PUSH1 0x4 PUSH4 0xFFFFFFFF PUSH2 0x1A92 AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1528 JUMPI PUSH2 0x19E1 DUP4 PUSH1 0x1B PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x19F4 DUP4 DUP3 PUSH1 0x8 PUSH4 0xFFFFFFFF PUSH2 0x1A92 AND JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x1A02 PUSH2 0x1C7A JUMP JUMPDEST PUSH2 0x171F DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0x1AAB JUMP JUMPDEST PUSH2 0x1A25 DUP3 PUSH1 0xC3 PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x17FC DUP3 DUP3 PUSH1 0x0 NOT SUB PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x1A3F SWAP2 SWAP1 PUSH2 0x2199 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0x1B61 JUMP JUMPDEST PUSH2 0x1A64 DUP3 PUSH1 0xC2 PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x17FC DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x1A3F SWAP2 SWAP1 PUSH2 0x2199 JUMP JUMPDEST PUSH2 0x1A82 PUSH2 0x1C7A JUMP JUMPDEST PUSH2 0x171F DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0x1B6E JUMP JUMPDEST PUSH2 0x1A9A PUSH2 0x1C7A JUMP JUMPDEST PUSH2 0x1779 DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0x1BB9 JUMP JUMPDEST PUSH2 0x1AB3 PUSH2 0x1C7A JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP6 MLOAD DUP6 GT ISZERO ISZERO ISZERO PUSH2 0x1AC8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 PUSH1 0x20 ADD MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x1AF2 JUMPI PUSH2 0x1AF2 DUP9 PUSH2 0x1AEA DUP11 PUSH1 0x20 ADD MLOAD DUP11 DUP10 ADD PUSH2 0x1C17 JUMP JUMPDEST PUSH1 0x2 MUL PUSH2 0x1C2E JUMP JUMPDEST DUP8 MLOAD DUP1 MLOAD DUP9 PUSH1 0x20 DUP4 ADD ADD SWAP5 POP DUP1 DUP10 DUP9 ADD GT ISZERO PUSH2 0x1B0E JUMPI DUP9 DUP8 ADD DUP3 MSTORE JUMPDEST PUSH1 0x20 DUP9 ADD SWAP4 POP POP POP JUMPDEST PUSH1 0x20 DUP6 LT PUSH2 0x1B39 JUMPI DUP2 MLOAD DUP4 MSTORE PUSH1 0x1F NOT SWAP1 SWAP5 ADD SWAP4 PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1B17 JUMP JUMPDEST POP MLOAD DUP2 MLOAD PUSH1 0x20 SWAP5 SWAP1 SWAP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP2 AND SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x178E DUP3 PUSH1 0x2 DUP4 MLOAD PUSH2 0x18F7 JUMP JUMPDEST PUSH2 0x1B76 PUSH2 0x1C7A JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP4 LT PUSH2 0x1B92 JUMPI PUSH2 0x1B92 DUP5 DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x2 MUL PUSH2 0x1C2E JUMP JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0x1BAE JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1BC1 PUSH2 0x1C7A JUMP JUMPDEST PUSH1 0x0 DUP6 PUSH1 0x20 ADD MLOAD DUP6 DUP5 ADD GT ISZERO PUSH2 0x1BE0 JUMPI PUSH2 0x1BE0 DUP7 DUP7 DUP6 ADD PUSH1 0x2 MUL PUSH2 0x1C2E JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x1C0B JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0x1C28 JUMPI POP DUP2 PUSH2 0x1233 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP2 MLOAD PUSH2 0x1C3A DUP4 DUP4 PUSH2 0x18BD JUMP JUMPDEST POP PUSH2 0x19F4 DUP4 DUP3 PUSH2 0x19FA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x1C75 PUSH2 0x1C7A JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x171F DUP3 CALLDATALOAD PUSH2 0x2272 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x171F DUP3 MLOAD PUSH2 0x227E JUMP JUMPDEST PUSH1 0x0 PUSH2 0x171F DUP3 CALLDATALOAD PUSH2 0x2283 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x171F DUP3 MLOAD PUSH2 0x2283 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x171F DUP3 MLOAD PUSH2 0x22A8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1CE0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1779 DUP5 DUP5 PUSH2 0x1C92 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1CFE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1779 DUP5 DUP5 PUSH2 0x1C9E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1D1D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1D29 DUP6 DUP6 PUSH2 0x1CAA JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x1D3A DUP6 DUP3 DUP7 ADD PUSH2 0x1CAA JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1779 DUP5 DUP5 PUSH2 0x1CAA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1779 DUP5 DUP5 PUSH2 0x1CB6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1D98 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1DA4 DUP9 DUP9 PUSH2 0x1CC2 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH2 0x1DB5 DUP9 DUP3 DUP10 ADD PUSH2 0x1CB6 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH2 0x1DC6 DUP9 DUP3 DUP10 ADD PUSH2 0x1CB6 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 PUSH2 0x1DD7 DUP9 DUP3 DUP10 ADD PUSH2 0x1CB6 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 PUSH2 0x1DE8 DUP9 DUP3 DUP10 ADD PUSH2 0x1CC2 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH2 0x1DFE DUP2 PUSH2 0x2272 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x1DFE DUP2 PUSH2 0x227E JUMP JUMPDEST PUSH2 0x1DFE DUP2 PUSH2 0x2283 JUMP JUMPDEST PUSH2 0x1DFE DUP2 PUSH2 0x2286 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1E2A DUP3 PUSH2 0x226E JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x1E3E DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x22B7 JUMP JUMPDEST PUSH2 0x1E47 DUP2 PUSH2 0x22E3 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x28 DUP2 MSTORE PUSH32 0x556E61626C6520746F207472616E736665722072656D61696E696E67204C494E PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4B20746F6B656E73000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x24 DUP2 MSTORE PUSH32 0x43616E206F6E6C7920636865636B207261696E66616C6C206F6E636520706572 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x2064617900000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x31 DUP2 MSTORE PUSH32 0x436F6E74726163742068617320656E6465642C2063616E7420696E7465726163 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x74207769746820697420616E796D6F7265000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x556E61626C6520746F207472616E736665720000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x4F6E6C7920496E737572616E63652070726F76696465722063616E20646F2074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6869730000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x526F756E64206E6F7420636F6D706C6574650000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x28 DUP2 MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x1233 DUP3 DUP5 PUSH2 0x1DF5 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x20D4 DUP3 DUP6 PUSH2 0x1DF5 JUMP JUMPDEST PUSH2 0x171F PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x100 DUP2 ADD PUSH2 0x20F0 DUP3 DUP12 PUSH2 0x1DF5 JUMP JUMPDEST PUSH2 0x20FD PUSH1 0x20 DUP4 ADD DUP11 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x210A PUSH1 0x40 DUP4 ADD DUP10 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x2117 PUSH1 0x60 DUP4 ADD DUP9 PUSH2 0x1DF5 JUMP JUMPDEST PUSH2 0x2124 PUSH1 0x80 DUP4 ADD DUP8 PUSH2 0x1E16 JUMP JUMPDEST PUSH2 0x2131 PUSH1 0xA0 DUP4 ADD DUP7 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x213E PUSH1 0xC0 DUP4 ADD DUP6 PUSH2 0x1E0D JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0xE0 DUP4 ADD MSTORE PUSH2 0x2150 DUP2 DUP5 PUSH2 0x1E1F JUMP JUMPDEST SWAP11 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x216C DUP3 DUP7 PUSH2 0x1DF5 JUMP JUMPDEST PUSH2 0x2179 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1E0D JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x14F5 DUP2 DUP5 PUSH2 0x1E1F JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x1233 DUP3 DUP5 PUSH2 0x1E04 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x1233 DUP3 DUP5 PUSH2 0x1E0D JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x171F DUP2 DUP5 PUSH2 0x1E1F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1E54 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1EAA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1F00 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1F56 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1FAC JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1FDC JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x2032 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x2062 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x20D4 DUP3 DUP6 PUSH2 0x1E0D JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x2254 DUP3 DUP7 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x2261 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x1779 PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x1E0D JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 JUMP JUMPDEST PUSH10 0xFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x22D2 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x22BA JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x19F4 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0xae PUSH29 0x6B1BC3E9C37BD83CE7EF0D6EBC72EE71C196BD8A89B84FA508D5C11D3F BLOCKHASH PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY ", | |
"sourceMap": "5997:15237:0:-;;;;;1121:1:2;1094:28;;7598:25:0;;;-1:-1:-1;;7598:25:0;;;7618:5;7629:24;;;;7755:3;7721:37;;7810:21;;;;7942:25;;9602:1930;;;;;;;;5997:15237;9602:1930;;;;;;;;;;;;;;;567:5:12;:18;;-1:-1:-1;;;;;;567:18:12;;;575:10;567:18;;;;9843:9:0;:77;;;;;9877:42;9843:77;;;10013:24;10031:5;10013:17;;;;:24;:::i;:::-;10047:19;:42;;;10190:40;10212:16;:14;;;;:16;:::i;:::-;10190:12;;:16;;;;;;:40;:::i;:::-;10177:9;:53;;10169:99;;;;;;;;;;;;;;;;;;;;;;10336:7;:19;;10345:10;-1:-1:-1;;;;;;10336:19:0;;;;;;;10365:6;:16;;;;;-1:-1:-1;;;;;10365:16:0;;;;;10403:3;10391:9;:15;10470:8;:20;;;10500:7;:18;;;10528:11;:26;;;-1:-1:-1;10564:15:0;:19;10593:14;:21;;-1:-1:-1;;10593:21:0;-1:-1:-1;10593:21:0;;;10624:28;;;;:12;;:28;;;;;:::i;:::-;-1:-1:-1;11089:7:0;:55;;11102:42;-1:-1:-1;;;;;;11089:55:0;;;;;;;;11154:10;:55;;;;;;;;;;11219:46;:6;:46;;;11275:9;:46;11361:7;;11399:6;;11436:8;;11475:7;;11513:11;;11345:180;;;;;;-1:-1:-1;;;;;11361:7:0;;;;11399:6;;;11436:8;;11475:7;;11345:180;;;;;;;;;;9602:1930;;;;;;;5997:15237;;4751:94:2;4808:4;:32;;-1:-1:-1;;;;;;4808:32:2;-1:-1:-1;;;;;4808:32:2;;;;;;;;;;4751:94::o;17267:389:0:-;17314:3;17343:14;17372:9;17395:14;17423;17451:22;17486:9;;;;;;;;;-1:-1:-1;;;;;17486:9:0;-1:-1:-1;;;;;17486:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17486:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17486:27:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17486:27:0;;;;;;;;;17329:184;;;;;;;;;;17603:1;17591:9;:13;17583:44;;;;;;;;;;;;;;;;-1:-1:-1;17644:5:0;;17267:389;-1:-1:-1;;;;17267:389:0:o;674:283:13:-;734:7;950:2;945;:7;;;;;;;;;674:283;-1:-1:-1;;;674:283:13:o;5997:15237:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5997:15237:0;;;-1:-1:-1;5997:15237:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::o;5:122:-1:-;;83:39;114:6;108:13;83:39;;;74:48;68:59;-1:-1;;;68:59;134:120;;211:38;241:6;235:13;211:38;;262:444;;368:4;356:17;;352:27;-1:-1;342:2;;393:1;390;383:12;342:2;423:6;417:13;445:65;460:49;502:6;460:49;;;445:65;;;436:74;;530:6;523:5;516:21;566:4;558:6;554:17;599:4;592:5;588:16;634:3;625:6;620:3;616:16;613:25;610:2;;;651:1;648;641:12;610:2;661:39;693:6;688:3;683;661:39;;;335:371;;;;;;;;843:120;;920:38;950:6;944:13;920:38;;970:1182;;;;;;;;1197:3;1185:9;1176:7;1172:23;1168:33;1165:2;;;1214:1;1211;1204:12;1165:2;1249:1;1266:64;1322:7;1302:9;1266:64;;;1256:74;;1228:108;1367:2;1385:64;1441:7;1432:6;1421:9;1417:22;1385:64;;;1375:74;;1346:109;1486:2;1504:64;1560:7;1551:6;1540:9;1536:22;1504:64;;;1494:74;;1465:109;1605:2;1623:64;1679:7;1670:6;1659:9;1655:22;1623:64;;;1613:74;;1584:109;1745:3;1734:9;1730:19;1724:26;-1:-1;;;;;1762:6;1759:30;1756:2;;;1802:1;1799;1792:12;1756:2;1822:74;1888:7;1879:6;1868:9;1864:22;1822:74;;;1812:84;;1703:199;1933:3;1952:64;2008:7;1999:6;1988:9;1984:22;1952:64;;;1942:74;;1912:110;2053:3;2072:64;2128:7;2119:6;2108:9;2104:22;2072:64;;;2062:74;;2032:110;1159:993;;;;;;;;;;;2159:803;;;;;;2339:3;2327:9;2318:7;2314:23;2310:33;2307:2;;;2356:1;2353;2346:12;2307:2;2391:1;2408:63;2463:7;2443:9;2408:63;;;2398:73;;2370:107;2508:2;2526:63;2581:7;2572:6;2561:9;2557:22;2526:63;;;2516:73;;2487:108;2626:2;2644:64;2700:7;2691:6;2680:9;2676:22;2644:64;;;2634:74;;2605:109;2745:2;2763:64;2819:7;2810:6;2799:9;2795:22;2763:64;;;2753:74;;2724:109;2864:3;2883:63;2938:7;2929:6;2918:9;2914:22;2883:63;;;2873:73;;2843:109;2301:661;;;;;;;;;2969:110;3042:31;3067:5;3042:31;;;3037:3;3030:44;3024:55;;;3087:397;3242:2;3230:15;;3279:66;3274:2;3265:12;;3258:88;3380:66;3375:2;3366:12;;3359:88;3475:2;3466:12;;3223:261;3493:296;3648:2;3636:15;;3685:66;3680:2;3671:12;;3664:88;3780:2;3771:12;;3629:160;3797:110;3870:31;3895:5;3870:31;;3914:599;4134:3;4119:19;;4149:61;4123:9;4183:6;4149:61;;;4221:62;4279:2;4268:9;4264:18;4255:6;4221:62;;;4294;4352:2;4341:9;4337:18;4328:6;4294:62;;;4367;4425:2;4414:9;4410:18;4401:6;4367:62;;;4440:63;4498:3;4487:9;4483:19;4474:6;4440:63;;;4105:408;;;;;;;;;4520:387;4701:2;4715:47;;;4686:18;;4776:121;4686:18;4776:121;;;4768:129;4672:235;-1:-1;;4672:235;4914:387;5095:2;5109:47;;;5080:18;;5170:121;5080:18;5170:121;;5308:256;5370:2;5364:9;5396:17;;;-1:-1;;;;;5456:34;;5492:22;;;5453:62;5450:2;;;5528:1;5525;5518:12;5450:2;5544;5537:22;5348:216;;-1:-1;5348:216;5571:259;;-1:-1;;;;;5707:6;5704:30;5701:2;;;5747:1;5744;5737:12;5701:2;-1:-1;5820:4;5791;5768:17;;;;-1:-1;;5764:33;5810:15;;5638:192;5837:128;-1:-1;;;;;5906:54;;5889:76;6364:107;-1:-1;;;;;6432:34;;6415:56;6479:268;6544:1;6551:101;6565:6;6562:1;6559:13;6551:101;;;6632:11;;;6626:18;6613:11;;;6606:39;6587:2;6580:10;6551:101;;;6667:6;6664:1;6661:13;6658:2;;;6732:1;6723:6;6718:3;6714:16;6707:27;6658:2;6528:219;;;;;;5997:15237:0;;;;;;" | |
}, | |
"deployedBytecode": { | |
"linkReferences": {}, | |
"object": "60806040526004361061013a5763ffffffff60e060020a6000350416630c15c365811461013c578063165d35e114610167578063185e5b4014610189578063243d9a5d146101a95780633fad1834146101be5780634162cc88146101d357806356a6d508146101f35780635b69a7d8146102085780635fdc6281146102285780636f9fb98a1461023d578063715018a6146102525780637a50413d146102675780638da5cb5b1461027c5780638e15f47314610291578063a241c089146102a6578063ad2e8c9b146102bb578063b0b30fee146102d0578063b1b91f7a146102f2578063b807873214610312578063bbe4fd5014610327578063c032846b1461033c578063c974402914610351578063ce2ce3fc14610366578063dbc837c514610388578063dcbacd111461039d578063f2fde38b146103b2575b005b34801561014857600080fd5b506101516103d2565b60405161015e9190612199565b60405180910390f35b34801561017357600080fd5b5061017c6103d8565b60405161015e91906120b8565b34801561019557600080fd5b506101516101a4366004611d44565b6103e7565b3480156101b557600080fd5b506101516103fb565b3480156101ca57600080fd5b50610151610401565b3480156101df57600080fd5b506101516101ee366004611d44565b610407565b3480156101ff57600080fd5b50610151610414565b34801561021457600080fd5b5061017c610223366004611d44565b61041a565b34801561023457600080fd5b50610151610437565b34801561024957600080fd5b5061015161043c565b34801561025e57600080fd5b5061013a610441565b34801561027357600080fd5b506101516104ce565b34801561028857600080fd5b5061017c6104d4565b34801561029d57600080fd5b506101516104e3565b3480156102b257600080fd5b506101516105b0565b3480156102c757600080fd5b50610151610aea565b3480156102dc57600080fd5b506102e5610af0565b60405161015e919061218b565b3480156102fe57600080fd5b5061013a61030d366004611d0a565b610afe565b34801561031e57600080fd5b50610151610d06565b34801561033357600080fd5b50610151610d0b565b34801561034857600080fd5b506102e5610d0f565b34801561035d57600080fd5b50610151610d18565b34801561037257600080fd5b5061037b610d1e565b60405161015e91906121a7565b34801561039457600080fd5b5061017c610db4565b3480156103a957600080fd5b50610151610dc3565b3480156103be57600080fd5b5061013a6103cd366004611cce565b610dc9565b60185490565b60006103e2610e02565b905090565b601081600281106103f457fe5b0154905081565b600e5490565b601a5490565b601281600281106103f457fe5b60195490565b6014816002811061042757fe5b0154600160a060020a0316905081565b603c81565b303190565b600954600160a060020a031633146104775760405160e560020a62461bcd02815260040161046e90612208565b60405180910390fd5b600654604051600160a060020a03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a26006805473ffffffffffffffffffffffffffffffffffffffff19169055565b60165490565b600654600160a060020a031681565b600080600080600080600760009054906101000a9004600160a060020a0316600160a060020a031663feaf968c6040518163ffffffff1660e060020a02815260040160a060405180830381600087803b15801561053f57600080fd5b505af1158015610553573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105779190810190611d80565b945094509450945094506000821115156105a65760405160e560020a62461bcd02815260040161046e90612218565b5091949350505050565b60175460009060609060ff1615156001146105e05760405160e560020a62461bcd02815260040161046e906121e8565b6105e8610e11565b60175460ff1615610ae6576000601b5560408051606081018252603a81527f687474703a2f2f6170692e776f726c64776561746865726f6e6c696e652e636f60208083019182527f6d2f7072656d69756d2f76312f776561746865722e617368783f0000000000008385015283518085018552601e81527f36323963366464303962626334333634623761333338313032303039313100008183015293518351939493600f9391909201918291908083835b602083106106b95780518252601f19909201916020918201910161069a565b51815160209384036101000a60001901801990921691161790527f6b65793d00000000000000000000000000000000000000000000000000000000919093019081528551600490910192860191508083835b6020831061072a5780518252601f19909201916020918201910161070b565b6001836020036101000a038019825116818451168082178552505050505050905001807f26713d0000000000000000000000000000000000000000000000000000000000815250600301828054600181600116156101000203166002900480156107cb5780601f106107a95761010080835404028352918201916107cb565b820191906000526020600020905b8154815290600101906020018083116107b7575b50507f26666f726d61743d6a736f6e266e756d5f6f665f646179733d31000000000000815260408051600519818403018152601a9092019052945061088e9350601492506000915061081a9050565b0154600160a060020a031660126000015483606060405190810160405280602181526020017f646174612e63757272656e745f636f6e646974696f6e2e302e7072656369704d81526020017f4d0000000000000000000000000000000000000000000000000000000000000081525061109e565b50606060405190810160405280602781526020017f68747470733a2f2f6170692e776561746865726269742e696f2f76322e302f6381526020017f757272656e743f00000000000000000000000000000000000000000000000000815250600f6040805190810160405280602081526020017f35653035616566303734313034303166616334393162303665623965386663388152506040516020018084805190602001908083835b602083106109565780518252601f199092019160209182019101610937565b6001836020036101000a038019825116818451168082178552505050505050905001807f636974793d000000000000000000000000000000000000000000000000000000815250600501838054600181600116156101000203166002900480156109f75780601f106109d55761010080835404028352918201916109f7565b820191906000526020600020905b8154815290600101906020018083116109e3575b5050807f266b65793d00000000000000000000000000000000000000000000000000000081525060050182805190602001908083835b60208310610a4c5780518252601f199092019160209182019101610a2d565b6001836020036101000a03801982511681845116808217855250505050505090500193505050506040516020818303038152906040529050610ae460146001600281101515610a9757fe5b0154600160a060020a0316601260010154836040805190810160405280600d81526020017f646174612e302e7072656369700000000000000000000000000000000000000081525061109e565b505b5090565b600c5490565b601754610100900460ff1690565b6000828152600560205260409020548290600160a060020a03163314610b395760405160e560020a62461bcd02815260040161046e90612228565b600081815260056020526040808220805473ffffffffffffffffffffffffffffffffffffffff191690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a260175460ff161515600114610bb35760405160e560020a62461bcd02815260040161046e906121e8565b610bd6610bc8603c600c63ffffffff61122216565b603c9063ffffffff61123916565b601954610bea90429063ffffffff61123916565b11610c0a5760405160e560020a62461bcd02815260040161046e906121d8565b816010601b54600281101515610c1c57fe5b0155601b80546001908101918290551015610cca57601154601054610c5391600291610c479161124b565b9063ffffffff61122216565b601881905542601955601a805460010190551515610c7957601680546001019055610cb8565b60006016556018546040517f2e5a5a6cf30e14f6500f404203cc44691f83c62354f375539ea7d45bcc49230591610caf91612199565b60405180910390a15b601654600311610cca57610cca611258565b7f9acb88f10af47daa34522605143d1719bad9aa6562e4c443c8abb9d594ea73f482604051610cf99190612199565b60405180910390a1505050565b600381565b4290565b60175460ff1690565b600d5490565b600f8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610daa5780601f10610d7f57610100808354040283529160200191610daa565b820191906000526020600020905b815481529060010190602001808311610d8d57829003601f168201915b5050505050905090565b600954600160a060020a031681565b600b5490565b600954600160a060020a03163314610df65760405160e560020a62461bcd02815260040161046e90612208565b610dff81611455565b50565b600254600160a060020a031690565b600042600c54600b54011015610dff57600c54600290610e3890603c63ffffffff61122216565b03601a54101515610e8357600954604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015610e7d573d6000803e3d6000fd5b50610f11565b600a54600160a060020a03166108fc610eac610e9d6104e3565b600d549063ffffffff61122216565b6040518115909202916000818181858888f19350505050158015610ed4573d6000803e3d6000fd5b50600954604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015610f0f573d6000803e3d6000fd5b505b610f19610e02565b6009546040517f70a08231000000000000000000000000000000000000000000000000000000008152919250600160a060020a038084169263a9059cbb929091169083906370a0823190610f719030906004016120b8565b602060405180830381600087803b158015610f8b57600080fd5b505af1158015610f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610fc39190810190611d62565b6040518363ffffffff1660e060020a028152600401610fe39291906120c6565b602060405180830381600087803b158015610ffd57600080fd5b505af1158015611011573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110359190810190611cec565b15156110565760405160e560020a62461bcd02815260040161046e906121b8565b6017805460ff191690556040517f71d9f146944417dd66115a997376d9878c3618f396c331a6c3aa82ce653eae1490611093904290303190612238565b60405180910390a150565b60006110a8611c45565b60175460ff1615156001146110d25760405160e560020a62461bcd02815260040161046e906121e8565b6110fd85307fb1b91f7a000000000000000000000000000000000000000000000000000000006114d3565b60408051808201909152600381527f676574000000000000000000000000000000000000000000000000000000000060208201529091506111469082908663ffffffff6114fe16565b60408051808201909152600481527f7061746800000000000000000000000000000000000000000000000000000000602082015261118c9082908563ffffffff6114fe16565b60408051808201909152600581527f74696d657300000000000000000000000000000000000000000000000000000060208201526111d3908290606463ffffffff61152d16565b6111e08682600854611557565b91507f9b79db1508864f538c7703d2267a0c858007ee5877c83d83aec1b431e5add541826040516112119190612199565b60405180910390a150949350505050565b6000818381151561122f57fe5b0490505b92915050565b60008282111561124557fe5b50900390565b8181018281101561123357fe5b60175460009060ff1615156001146112855760405160e560020a62461bcd02815260040161046e906121e8565b600a54604051600160a060020a0390911690303180156108fc02916000818181858888f193505050501580156112bf573d6000803e3d6000fd5b506112c8610e02565b6009546040517f70a08231000000000000000000000000000000000000000000000000000000008152919250600160a060020a038084169263a9059cbb929091169083906370a08231906113209030906004016120b8565b602060405180830381600087803b15801561133a57600080fd5b505af115801561134e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113729190810190611d62565b6040518363ffffffff1660e060020a0281526004016113929291906120c6565b602060405180830381600087803b1580156113ac57600080fd5b505af11580156113c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113e49190810190611cec565b15156114055760405160e560020a62461bcd02815260040161046e906121f8565b600e546018546040517fd8874104029b491ba57b1b4875bd4ba8d4a98bf0261e1fdfac96db44022f95f89261143b924292612246565b60405180910390a1506017805461ffff1916610100179055565b600160a060020a038116151561146a57600080fd5b600654604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6114db611c45565b6114e3611c45565b6114f58186868663ffffffff61172616565b95945050505050565b6080830151611513908363ffffffff61178116565b6080830151611528908263ffffffff61178116565b505050565b6080830151611542908363ffffffff61178116565b6080830151611528908263ffffffff61179e16565b6000306004546040516020018083600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401828152602001925050506040516020818303038152906040526040518082805190602001908083835b602083106115d35780518252601f1990920191602091820191016115b4565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912060045460608a015260008181526005909252838220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038c1617905592519295508594507fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af99350919050a2600254600160a060020a0316634000aea0858461168187611800565b6040518463ffffffff1660e060020a0281526004016116a29392919061215e565b602060405180830381600087803b1580156116bc57600080fd5b505af11580156116d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116f49190810190611cec565b15156117155760405160e560020a62461bcd02815260040161046e906121c8565b6004805460010190555b9392505050565b61172e611c45565b61173e85608001516101006118bd565b5050828452600160a060020a03821660208501527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1981166040850152835b949350505050565b61178e82600383516118f7565b611528828263ffffffff6119fa16565b67ffffffffffffffff198112156117be576117b98282611a14565b6117fc565b67ffffffffffffffff8113156117d8576117b98282611a53565b600081126117ec576117b9826000836118f7565b6117fc82600183600019036118f7565b5050565b80516020820151604080840151606085810151608087015151935191957f40429946000000000000000000000000000000000000000000000000000000009561185a956000958695939492939092916001916024016120e1565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19909316929092179091529050919050565b6118c5611c7a565b60208206156118da5760208206602003820191505b506020828101829052604080518085526000815290920101905290565b60178111611919576119138360ff848116602002168317611a7a565b50611528565b60ff811161194d5761193a836018602060ff8616021763ffffffff611a7a16565b506119138382600163ffffffff611a9216565b61ffff81116119825761196f836019602060ff8616021763ffffffff611a7a16565b506119138382600263ffffffff611a9216565b63ffffffff81116119b9576119a683601a602060ff8616021763ffffffff611a7a16565b506119138382600463ffffffff611a9216565b67ffffffffffffffff8111611528576119e183601b602060ff8616021763ffffffff611a7a16565b506119f48382600863ffffffff611a9216565b50505050565b611a02611c7a565b61171f83846000015151848551611aab565b611a258260c363ffffffff611a7a16565b506117fc828260001903604051602001611a3f9190612199565b604051602081830303815290604052611b61565b611a648260c263ffffffff611a7a16565b506117fc8282604051602001611a3f9190612199565b611a82611c7a565b61171f8384600001515184611b6e565b611a9a611c7a565b611779848560000151518585611bb9565b611ab3611c7a565b600080600085518511151515611ac857600080fd5b87602001518588011115611af257611af288611aea8a602001518a8901611c17565b600202611c2e565b875180518860208301019450808988011115611b0e5788870182525b60208801935050505b60208510611b395781518352601f199094019360209283019290910190611b17565b505181516020949094036101000a600019018019909116931692909217909152509192915050565b61178e82600283516118f7565b611b76611c7a565b60208401518310611b9257611b92848560200151600202611c2e565b8351805160208583010184815381861415611bae576001820183525b509495945050505050565b611bc1611c7a565b600085602001518584011115611be057611be086868501600202611c2e565b6001836101000a0390508551838682010185831982511617815281518588011115611c0b5784870182525b50959695505050505050565b600081831115611c28575081611233565b50919050565b8151611c3a83836118bd565b506119f483826119fa565b6040805160c081018252600080825260208201819052918101829052606081019190915260808101611c75611c7a565b905290565b60408051808201909152606081526000602082015290565b600061171f8235612272565b600061171f825161227e565b600061171f8235612283565b600061171f8251612283565b600061171f82516122a8565b600060208284031215611ce057600080fd5b60006117798484611c92565b600060208284031215611cfe57600080fd5b60006117798484611c9e565b60008060408385031215611d1d57600080fd5b6000611d298585611caa565b9250506020611d3a85828601611caa565b9150509250929050565b600060208284031215611d5657600080fd5b60006117798484611caa565b600060208284031215611d7457600080fd5b60006117798484611cb6565b600080600080600060a08688031215611d9857600080fd5b6000611da48888611cc2565b9550506020611db588828901611cb6565b9450506040611dc688828901611cb6565b9350506060611dd788828901611cb6565b9250506080611de888828901611cc2565b9150509295509295909350565b611dfe81612272565b82525050565b611dfe8161227e565b611dfe81612283565b611dfe81612286565b6000611e2a8261226e565b808452611e3e8160208601602086016122b7565b611e47816122e3565b9093016020019392505050565b602881527f556e61626c6520746f207472616e736665722072656d61696e696e67204c494e60208201527f4b20746f6b656e73000000000000000000000000000000000000000000000000604082015260600190565b602381527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160208201527f636c650000000000000000000000000000000000000000000000000000000000604082015260600190565b602481527f43616e206f6e6c7920636865636b207261696e66616c6c206f6e63652070657260208201527f2064617900000000000000000000000000000000000000000000000000000000604082015260600190565b603181527f436f6e74726163742068617320656e6465642c2063616e7420696e746572616360208201527f74207769746820697420616e796d6f7265000000000000000000000000000000604082015260600190565b601281527f556e61626c6520746f207472616e736665720000000000000000000000000000602082015260400190565b602381527f4f6e6c7920496e737572616e63652070726f76696465722063616e20646f207460208201527f6869730000000000000000000000000000000000000000000000000000000000604082015260600190565b601281527f526f756e64206e6f7420636f6d706c6574650000000000000000000000000000602082015260400190565b602881527f536f75726365206d75737420626520746865206f7261636c65206f662074686560208201527f2072657175657374000000000000000000000000000000000000000000000000604082015260600190565b602081016112338284611df5565b604081016120d48285611df5565b61171f6020830184611e0d565b61010081016120f0828b611df5565b6120fd602083018a611e0d565b61210a6040830189611e0d565b6121176060830188611df5565b6121246080830187611e16565b61213160a0830186611e0d565b61213e60c0830185611e0d565b81810360e08301526121508184611e1f565b9a9950505050505050505050565b6060810161216c8286611df5565b6121796020830185611e0d565b81810360408301526114f58184611e1f565b602081016112338284611e04565b602081016112338284611e0d565b6020808252810161171f8184611e1f565b6020808252810161123381611e54565b6020808252810161123381611eaa565b6020808252810161123381611f00565b6020808252810161123381611f56565b6020808252810161123381611fac565b6020808252810161123381611fdc565b6020808252810161123381612032565b6020808252810161123381612062565b604081016120d48285611e0d565b606081016122548286611e0d565b6122616020830185611e0d565b6117796040830184611e0d565b5190565b600160a060020a031690565b151590565b90565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690565b69ffffffffffffffffffff1690565b60005b838110156122d25781810151838201526020016122ba565b838111156119f45750506000910152565b601f01601f1916905600a265627a7a72305820ae7c6b1bc3e9c37bd83ce7ef0d6ebc72ee71c196bd8a89b84fa508d5c11d3f406c6578706572696d656e74616cf50037", | |
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x13A JUMPI PUSH4 0xFFFFFFFF PUSH1 0xE0 PUSH1 0x2 EXP PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0xC15C365 DUP2 EQ PUSH2 0x13C JUMPI DUP1 PUSH4 0x165D35E1 EQ PUSH2 0x167 JUMPI DUP1 PUSH4 0x185E5B40 EQ PUSH2 0x189 JUMPI DUP1 PUSH4 0x243D9A5D EQ PUSH2 0x1A9 JUMPI DUP1 PUSH4 0x3FAD1834 EQ PUSH2 0x1BE JUMPI DUP1 PUSH4 0x4162CC88 EQ PUSH2 0x1D3 JUMPI DUP1 PUSH4 0x56A6D508 EQ PUSH2 0x1F3 JUMPI DUP1 PUSH4 0x5B69A7D8 EQ PUSH2 0x208 JUMPI DUP1 PUSH4 0x5FDC6281 EQ PUSH2 0x228 JUMPI DUP1 PUSH4 0x6F9FB98A EQ PUSH2 0x23D JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x252 JUMPI DUP1 PUSH4 0x7A50413D EQ PUSH2 0x267 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x27C JUMPI DUP1 PUSH4 0x8E15F473 EQ PUSH2 0x291 JUMPI DUP1 PUSH4 0xA241C089 EQ PUSH2 0x2A6 JUMPI DUP1 PUSH4 0xAD2E8C9B EQ PUSH2 0x2BB JUMPI DUP1 PUSH4 0xB0B30FEE EQ PUSH2 0x2D0 JUMPI DUP1 PUSH4 0xB1B91F7A EQ PUSH2 0x2F2 JUMPI DUP1 PUSH4 0xB8078732 EQ PUSH2 0x312 JUMPI DUP1 PUSH4 0xBBE4FD50 EQ PUSH2 0x327 JUMPI DUP1 PUSH4 0xC032846B EQ PUSH2 0x33C JUMPI DUP1 PUSH4 0xC9744029 EQ PUSH2 0x351 JUMPI DUP1 PUSH4 0xCE2CE3FC EQ PUSH2 0x366 JUMPI DUP1 PUSH4 0xDBC837C5 EQ PUSH2 0x388 JUMPI DUP1 PUSH4 0xDCBACD11 EQ PUSH2 0x39D JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x3B2 JUMPI JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x148 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x3D2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15E SWAP2 SWAP1 PUSH2 0x2199 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x173 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17C PUSH2 0x3D8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15E SWAP2 SWAP1 PUSH2 0x20B8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x195 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x1A4 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D44 JUMP JUMPDEST PUSH2 0x3E7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x3FB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x401 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x1EE CALLDATASIZE PUSH1 0x4 PUSH2 0x1D44 JUMP JUMPDEST PUSH2 0x407 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x414 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x214 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17C PUSH2 0x223 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D44 JUMP JUMPDEST PUSH2 0x41A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x234 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x437 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x249 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x43C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x25E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13A PUSH2 0x441 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x273 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x4CE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x288 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17C PUSH2 0x4D4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x29D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x4E3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x5B0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0xAEA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E5 PUSH2 0xAF0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15E SWAP2 SWAP1 PUSH2 0x218B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13A PUSH2 0x30D CALLDATASIZE PUSH1 0x4 PUSH2 0x1D0A JUMP JUMPDEST PUSH2 0xAFE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x31E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0xD06 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x333 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0xD0B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x348 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E5 PUSH2 0xD0F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0xD18 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x37B PUSH2 0xD1E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15E SWAP2 SWAP1 PUSH2 0x21A7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x394 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17C PUSH2 0xDB4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0xDC3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13A PUSH2 0x3CD CALLDATASIZE PUSH1 0x4 PUSH2 0x1CCE JUMP JUMPDEST PUSH2 0xDC9 JUMP JUMPDEST PUSH1 0x18 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3E2 PUSH2 0xE02 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 PUSH1 0x2 DUP2 LT PUSH2 0x3F4 JUMPI INVALID JUMPDEST ADD SLOAD SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0xE SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1A SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 PUSH1 0x2 DUP2 LT PUSH2 0x3F4 JUMPI INVALID JUMPDEST PUSH1 0x19 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 PUSH1 0x2 DUP2 LT PUSH2 0x427 JUMPI INVALID JUMPDEST ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x3C DUP2 JUMP JUMPDEST ADDRESS BALANCE SWAP1 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x477 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x2208 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 PUSH32 0xF8DF31144D9C2F0F6B59D69B8B98ABD5459D07F2742C4DF920B25AAE33C64820 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH1 0x6 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x16 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x7 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0xFEAF968C PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0xA0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x53F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x553 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x577 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1D80 JUMP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP PUSH1 0x0 DUP3 GT ISZERO ISZERO PUSH2 0x5A6 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x2218 JUMP JUMPDEST POP SWAP2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x17 SLOAD PUSH1 0x0 SWAP1 PUSH1 0x60 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH1 0x1 EQ PUSH2 0x5E0 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21E8 JUMP JUMPDEST PUSH2 0x5E8 PUSH2 0xE11 JUMP JUMPDEST PUSH1 0x17 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xAE6 JUMPI PUSH1 0x0 PUSH1 0x1B SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x3A DUP2 MSTORE PUSH32 0x687474703A2F2F6170692E776F726C64776561746865726F6E6C696E652E636F PUSH1 0x20 DUP1 DUP4 ADD SWAP2 DUP3 MSTORE PUSH32 0x6D2F7072656D69756D2F76312F776561746865722E617368783F000000000000 DUP4 DUP6 ADD MSTORE DUP4 MLOAD DUP1 DUP6 ADD DUP6 MSTORE PUSH1 0x1E DUP2 MSTORE PUSH32 0x3632396336646430396262633433363462376133333831303230303931310000 DUP2 DUP4 ADD MSTORE SWAP4 MLOAD DUP4 MLOAD SWAP4 SWAP5 SWAP4 PUSH1 0xF SWAP4 SWAP2 SWAP1 SWAP3 ADD SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x6B9 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x69A JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH32 0x6B65793D00000000000000000000000000000000000000000000000000000000 SWAP2 SWAP1 SWAP4 ADD SWAP1 DUP2 MSTORE DUP6 MLOAD PUSH1 0x4 SWAP1 SWAP2 ADD SWAP3 DUP7 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x72A JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x70B JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD DUP1 PUSH32 0x26713D0000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x3 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x7CB JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x7A9 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x7CB JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x7B7 JUMPI JUMPDEST POP POP PUSH32 0x26666F726D61743D6A736F6E266E756D5F6F665F646179733D31000000000000 DUP2 MSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x5 NOT DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH1 0x1A SWAP1 SWAP3 ADD SWAP1 MSTORE SWAP5 POP PUSH2 0x88E SWAP4 POP PUSH1 0x14 SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH2 0x81A SWAP1 POP JUMP JUMPDEST ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x12 PUSH1 0x0 ADD SLOAD DUP4 PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x646174612E63757272656E745F636F6E646974696F6E2E302E7072656369704D DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4D00000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH2 0x109E JUMP JUMPDEST POP PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x68747470733A2F2F6170692E776561746865726269742E696F2F76322E302F63 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x757272656E743F00000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0xF PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x3565303561656630373431303430316661633439316230366562396538666338 DUP2 MSTORE POP PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP5 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x956 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x937 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD DUP1 PUSH32 0x636974793D000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x5 ADD DUP4 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x9F7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x9D5 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x9F7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x9E3 JUMPI JUMPDEST POP POP DUP1 PUSH32 0x266B65793D000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x5 ADD DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xA4C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xA2D JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP4 POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 POP PUSH2 0xAE4 PUSH1 0x14 PUSH1 0x1 PUSH1 0x2 DUP2 LT ISZERO ISZERO PUSH2 0xA97 JUMPI INVALID JUMPDEST ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x12 PUSH1 0x1 ADD SLOAD DUP4 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xD DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x646174612E302E70726563697000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH2 0x109E JUMP JUMPDEST POP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xC SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x17 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0xB39 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x2228 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 PUSH1 0x17 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH1 0x1 EQ PUSH2 0xBB3 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21E8 JUMP JUMPDEST PUSH2 0xBD6 PUSH2 0xBC8 PUSH1 0x3C PUSH1 0xC PUSH4 0xFFFFFFFF PUSH2 0x1222 AND JUMP JUMPDEST PUSH1 0x3C SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1239 AND JUMP JUMPDEST PUSH1 0x19 SLOAD PUSH2 0xBEA SWAP1 TIMESTAMP SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1239 AND JUMP JUMPDEST GT PUSH2 0xC0A JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21D8 JUMP JUMPDEST DUP2 PUSH1 0x10 PUSH1 0x1B SLOAD PUSH1 0x2 DUP2 LT ISZERO ISZERO PUSH2 0xC1C JUMPI INVALID JUMPDEST ADD SSTORE PUSH1 0x1B DUP1 SLOAD PUSH1 0x1 SWAP1 DUP2 ADD SWAP2 DUP3 SWAP1 SSTORE LT ISZERO PUSH2 0xCCA JUMPI PUSH1 0x11 SLOAD PUSH1 0x10 SLOAD PUSH2 0xC53 SWAP2 PUSH1 0x2 SWAP2 PUSH2 0xC47 SWAP2 PUSH2 0x124B JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1222 AND JUMP JUMPDEST PUSH1 0x18 DUP2 SWAP1 SSTORE TIMESTAMP PUSH1 0x19 SSTORE PUSH1 0x1A DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE ISZERO ISZERO PUSH2 0xC79 JUMPI PUSH1 0x16 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE PUSH2 0xCB8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x16 SSTORE PUSH1 0x18 SLOAD PUSH1 0x40 MLOAD PUSH32 0x2E5A5A6CF30E14F6500F404203CC44691F83C62354F375539EA7D45BCC492305 SWAP2 PUSH2 0xCAF SWAP2 PUSH2 0x2199 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST PUSH1 0x16 SLOAD PUSH1 0x3 GT PUSH2 0xCCA JUMPI PUSH2 0xCCA PUSH2 0x1258 JUMP JUMPDEST PUSH32 0x9ACB88F10AF47DAA34522605143D1719BAD9AA6562E4C443C8ABB9D594EA73F4 DUP3 PUSH1 0x40 MLOAD PUSH2 0xCF9 SWAP2 SWAP1 PUSH2 0x2199 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP JUMP JUMPDEST PUSH1 0x3 DUP2 JUMP JUMPDEST TIMESTAMP SWAP1 JUMP JUMPDEST PUSH1 0x17 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0xD SLOAD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xDAA JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xD7F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xDAA JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xD8D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0xB SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0xDF6 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x2208 JUMP JUMPDEST PUSH2 0xDFF DUP2 PUSH2 0x1455 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 TIMESTAMP PUSH1 0xC SLOAD PUSH1 0xB SLOAD ADD LT ISZERO PUSH2 0xDFF JUMPI PUSH1 0xC SLOAD PUSH1 0x2 SWAP1 PUSH2 0xE38 SWAP1 PUSH1 0x3C PUSH4 0xFFFFFFFF PUSH2 0x1222 AND JUMP JUMPDEST SUB PUSH1 0x1A SLOAD LT ISZERO ISZERO PUSH2 0xE83 JUMPI PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 ADDRESS BALANCE DUP1 ISZERO PUSH2 0x8FC MUL SWAP2 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xE7D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH2 0xF11 JUMP JUMPDEST PUSH1 0xA SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH2 0x8FC PUSH2 0xEAC PUSH2 0xE9D PUSH2 0x4E3 JUMP JUMPDEST PUSH1 0xD SLOAD SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1222 AND JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 ISZERO SWAP1 SWAP3 MUL SWAP2 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xED4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 ADDRESS BALANCE DUP1 ISZERO PUSH2 0x8FC MUL SWAP2 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xF0F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST PUSH2 0xF19 PUSH2 0xE02 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP5 AND SWAP3 PUSH4 0xA9059CBB SWAP3 SWAP1 SWAP2 AND SWAP1 DUP4 SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0xF71 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x20B8 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF9F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xFC3 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1D62 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xFE3 SWAP3 SWAP2 SWAP1 PUSH2 0x20C6 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xFFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1011 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1035 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1CEC JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1056 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21B8 JUMP JUMPDEST PUSH1 0x17 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x71D9F146944417DD66115A997376D9878C3618F396C331A6C3AA82CE653EAE14 SWAP1 PUSH2 0x1093 SWAP1 TIMESTAMP SWAP1 ADDRESS BALANCE SWAP1 PUSH2 0x2238 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10A8 PUSH2 0x1C45 JUMP JUMPDEST PUSH1 0x17 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH1 0x1 EQ PUSH2 0x10D2 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21E8 JUMP JUMPDEST PUSH2 0x10FD DUP6 ADDRESS PUSH32 0xB1B91F7A00000000000000000000000000000000000000000000000000000000 PUSH2 0x14D3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP2 MSTORE PUSH32 0x6765740000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH2 0x1146 SWAP1 DUP3 SWAP1 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x14FE AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0x7061746800000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x118C SWAP1 DUP3 SWAP1 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x14FE AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x5 DUP2 MSTORE PUSH32 0x74696D6573000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x11D3 SWAP1 DUP3 SWAP1 PUSH1 0x64 PUSH4 0xFFFFFFFF PUSH2 0x152D AND JUMP JUMPDEST PUSH2 0x11E0 DUP7 DUP3 PUSH1 0x8 SLOAD PUSH2 0x1557 JUMP JUMPDEST SWAP2 POP PUSH32 0x9B79DB1508864F538C7703D2267A0C858007EE5877C83D83AEC1B431E5ADD541 DUP3 PUSH1 0x40 MLOAD PUSH2 0x1211 SWAP2 SWAP1 PUSH2 0x2199 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 DUP2 ISZERO ISZERO PUSH2 0x122F JUMPI INVALID JUMPDEST DIV SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1245 JUMPI INVALID JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST DUP2 DUP2 ADD DUP3 DUP2 LT ISZERO PUSH2 0x1233 JUMPI INVALID JUMPDEST PUSH1 0x17 SLOAD PUSH1 0x0 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH1 0x1 EQ PUSH2 0x1285 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21E8 JUMP JUMPDEST PUSH1 0xA SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 ADDRESS BALANCE DUP1 ISZERO PUSH2 0x8FC MUL SWAP2 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x12BF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH2 0x12C8 PUSH2 0xE02 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP5 AND SWAP3 PUSH4 0xA9059CBB SWAP3 SWAP1 SWAP2 AND SWAP1 DUP4 SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0x1320 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x20B8 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x133A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x134E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1372 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1D62 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1392 SWAP3 SWAP2 SWAP1 PUSH2 0x20C6 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x13AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x13C0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x13E4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1CEC JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1405 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21F8 JUMP JUMPDEST PUSH1 0xE SLOAD PUSH1 0x18 SLOAD PUSH1 0x40 MLOAD PUSH32 0xD8874104029B491BA57B1B4875BD4BA8D4A98BF0261E1FDFAC96DB44022F95F8 SWAP3 PUSH2 0x143B SWAP3 TIMESTAMP SWAP3 PUSH2 0x2246 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP PUSH1 0x17 DUP1 SLOAD PUSH2 0xFFFF NOT AND PUSH2 0x100 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO ISZERO PUSH2 0x146A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x6 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x14DB PUSH2 0x1C45 JUMP JUMPDEST PUSH2 0x14E3 PUSH2 0x1C45 JUMP JUMPDEST PUSH2 0x14F5 DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x1726 AND JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x1513 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x1781 AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x1528 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x1781 AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x1542 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x1781 AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x1528 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x179E AND JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x15D3 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x15B4 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH1 0x4 SLOAD PUSH1 0x60 DUP11 ADD MSTORE PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP3 MSTORE DUP4 DUP3 KECCAK256 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP13 AND OR SWAP1 SSTORE SWAP3 MLOAD SWAP3 SWAP6 POP DUP6 SWAP5 POP PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP4 POP SWAP2 SWAP1 POP LOG2 PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0x1681 DUP8 PUSH2 0x1800 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x16A2 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x215E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x16BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x16D0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x16F4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1CEC JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1715 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21C8 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x172E PUSH2 0x1C45 JUMP JUMPDEST PUSH2 0x173E DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0x18BD JUMP JUMPDEST POP POP DUP3 DUP5 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x20 DUP6 ADD MSTORE PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT DUP2 AND PUSH1 0x40 DUP6 ADD MSTORE DUP4 JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x178E DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0x18F7 JUMP JUMPDEST PUSH2 0x1528 DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x19FA AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF NOT DUP2 SLT ISZERO PUSH2 0x17BE JUMPI PUSH2 0x17B9 DUP3 DUP3 PUSH2 0x1A14 JUMP JUMPDEST PUSH2 0x17FC JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 SGT ISZERO PUSH2 0x17D8 JUMPI PUSH2 0x17B9 DUP3 DUP3 PUSH2 0x1A53 JUMP JUMPDEST PUSH1 0x0 DUP2 SLT PUSH2 0x17EC JUMPI PUSH2 0x17B9 DUP3 PUSH1 0x0 DUP4 PUSH2 0x18F7 JUMP JUMPDEST PUSH2 0x17FC DUP3 PUSH1 0x1 DUP4 PUSH1 0x0 NOT SUB PUSH2 0x18F7 JUMP JUMPDEST POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x40 DUP1 DUP5 ADD MLOAD PUSH1 0x60 DUP6 DUP2 ADD MLOAD PUSH1 0x80 DUP8 ADD MLOAD MLOAD SWAP4 MLOAD SWAP2 SWAP6 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP6 PUSH2 0x185A SWAP6 PUSH1 0x0 SWAP6 DUP7 SWAP6 SWAP4 SWAP5 SWAP3 SWAP4 SWAP1 SWAP3 SWAP2 PUSH1 0x1 SWAP2 PUSH1 0x24 ADD PUSH2 0x20E1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x18C5 PUSH2 0x1C7A JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0x18DA JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0x1919 JUMPI PUSH2 0x1913 DUP4 PUSH1 0xFF DUP5 DUP2 AND PUSH1 0x20 MUL AND DUP4 OR PUSH2 0x1A7A JUMP JUMPDEST POP PUSH2 0x1528 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0x194D JUMPI PUSH2 0x193A DUP4 PUSH1 0x18 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x1913 DUP4 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1A92 AND JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0x1982 JUMPI PUSH2 0x196F DUP4 PUSH1 0x19 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x1913 DUP4 DUP3 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0x1A92 AND JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0x19B9 JUMPI PUSH2 0x19A6 DUP4 PUSH1 0x1A PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x1913 DUP4 DUP3 PUSH1 0x4 PUSH4 0xFFFFFFFF PUSH2 0x1A92 AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1528 JUMPI PUSH2 0x19E1 DUP4 PUSH1 0x1B PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x19F4 DUP4 DUP3 PUSH1 0x8 PUSH4 0xFFFFFFFF PUSH2 0x1A92 AND JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x1A02 PUSH2 0x1C7A JUMP JUMPDEST PUSH2 0x171F DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0x1AAB JUMP JUMPDEST PUSH2 0x1A25 DUP3 PUSH1 0xC3 PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x17FC DUP3 DUP3 PUSH1 0x0 NOT SUB PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x1A3F SWAP2 SWAP1 PUSH2 0x2199 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0x1B61 JUMP JUMPDEST PUSH2 0x1A64 DUP3 PUSH1 0xC2 PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x17FC DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x1A3F SWAP2 SWAP1 PUSH2 0x2199 JUMP JUMPDEST PUSH2 0x1A82 PUSH2 0x1C7A JUMP JUMPDEST PUSH2 0x171F DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0x1B6E JUMP JUMPDEST PUSH2 0x1A9A PUSH2 0x1C7A JUMP JUMPDEST PUSH2 0x1779 DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0x1BB9 JUMP JUMPDEST PUSH2 0x1AB3 PUSH2 0x1C7A JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP6 MLOAD DUP6 GT ISZERO ISZERO ISZERO PUSH2 0x1AC8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 PUSH1 0x20 ADD MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x1AF2 JUMPI PUSH2 0x1AF2 DUP9 PUSH2 0x1AEA DUP11 PUSH1 0x20 ADD MLOAD DUP11 DUP10 ADD PUSH2 0x1C17 JUMP JUMPDEST PUSH1 0x2 MUL PUSH2 0x1C2E JUMP JUMPDEST DUP8 MLOAD DUP1 MLOAD DUP9 PUSH1 0x20 DUP4 ADD ADD SWAP5 POP DUP1 DUP10 DUP9 ADD GT ISZERO PUSH2 0x1B0E JUMPI DUP9 DUP8 ADD DUP3 MSTORE JUMPDEST PUSH1 0x20 DUP9 ADD SWAP4 POP POP POP JUMPDEST PUSH1 0x20 DUP6 LT PUSH2 0x1B39 JUMPI DUP2 MLOAD DUP4 MSTORE PUSH1 0x1F NOT SWAP1 SWAP5 ADD SWAP4 PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1B17 JUMP JUMPDEST POP MLOAD DUP2 MLOAD PUSH1 0x20 SWAP5 SWAP1 SWAP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP2 AND SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x178E DUP3 PUSH1 0x2 DUP4 MLOAD PUSH2 0x18F7 JUMP JUMPDEST PUSH2 0x1B76 PUSH2 0x1C7A JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP4 LT PUSH2 0x1B92 JUMPI PUSH2 0x1B92 DUP5 DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x2 MUL PUSH2 0x1C2E JUMP JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0x1BAE JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1BC1 PUSH2 0x1C7A JUMP JUMPDEST PUSH1 0x0 DUP6 PUSH1 0x20 ADD MLOAD DUP6 DUP5 ADD GT ISZERO PUSH2 0x1BE0 JUMPI PUSH2 0x1BE0 DUP7 DUP7 DUP6 ADD PUSH1 0x2 MUL PUSH2 0x1C2E JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x1C0B JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0x1C28 JUMPI POP DUP2 PUSH2 0x1233 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP2 MLOAD PUSH2 0x1C3A DUP4 DUP4 PUSH2 0x18BD JUMP JUMPDEST POP PUSH2 0x19F4 DUP4 DUP3 PUSH2 0x19FA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x1C75 PUSH2 0x1C7A JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x171F DUP3 CALLDATALOAD PUSH2 0x2272 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x171F DUP3 MLOAD PUSH2 0x227E JUMP JUMPDEST PUSH1 0x0 PUSH2 0x171F DUP3 CALLDATALOAD PUSH2 0x2283 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x171F DUP3 MLOAD PUSH2 0x2283 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x171F DUP3 MLOAD PUSH2 0x22A8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1CE0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1779 DUP5 DUP5 PUSH2 0x1C92 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1CFE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1779 DUP5 DUP5 PUSH2 0x1C9E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1D1D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1D29 DUP6 DUP6 PUSH2 0x1CAA JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x1D3A DUP6 DUP3 DUP7 ADD PUSH2 0x1CAA JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1779 DUP5 DUP5 PUSH2 0x1CAA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1779 DUP5 DUP5 PUSH2 0x1CB6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1D98 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1DA4 DUP9 DUP9 PUSH2 0x1CC2 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH2 0x1DB5 DUP9 DUP3 DUP10 ADD PUSH2 0x1CB6 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH2 0x1DC6 DUP9 DUP3 DUP10 ADD PUSH2 0x1CB6 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 PUSH2 0x1DD7 DUP9 DUP3 DUP10 ADD PUSH2 0x1CB6 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 PUSH2 0x1DE8 DUP9 DUP3 DUP10 ADD PUSH2 0x1CC2 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH2 0x1DFE DUP2 PUSH2 0x2272 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x1DFE DUP2 PUSH2 0x227E JUMP JUMPDEST PUSH2 0x1DFE DUP2 PUSH2 0x2283 JUMP JUMPDEST PUSH2 0x1DFE DUP2 PUSH2 0x2286 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1E2A DUP3 PUSH2 0x226E JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x1E3E DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x22B7 JUMP JUMPDEST PUSH2 0x1E47 DUP2 PUSH2 0x22E3 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x28 DUP2 MSTORE PUSH32 0x556E61626C6520746F207472616E736665722072656D61696E696E67204C494E PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4B20746F6B656E73000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x24 DUP2 MSTORE PUSH32 0x43616E206F6E6C7920636865636B207261696E66616C6C206F6E636520706572 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x2064617900000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x31 DUP2 MSTORE PUSH32 0x436F6E74726163742068617320656E6465642C2063616E7420696E7465726163 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x74207769746820697420616E796D6F7265000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x556E61626C6520746F207472616E736665720000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x4F6E6C7920496E737572616E63652070726F76696465722063616E20646F2074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6869730000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x526F756E64206E6F7420636F6D706C6574650000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x28 DUP2 MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x1233 DUP3 DUP5 PUSH2 0x1DF5 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x20D4 DUP3 DUP6 PUSH2 0x1DF5 JUMP JUMPDEST PUSH2 0x171F PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x100 DUP2 ADD PUSH2 0x20F0 DUP3 DUP12 PUSH2 0x1DF5 JUMP JUMPDEST PUSH2 0x20FD PUSH1 0x20 DUP4 ADD DUP11 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x210A PUSH1 0x40 DUP4 ADD DUP10 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x2117 PUSH1 0x60 DUP4 ADD DUP9 PUSH2 0x1DF5 JUMP JUMPDEST PUSH2 0x2124 PUSH1 0x80 DUP4 ADD DUP8 PUSH2 0x1E16 JUMP JUMPDEST PUSH2 0x2131 PUSH1 0xA0 DUP4 ADD DUP7 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x213E PUSH1 0xC0 DUP4 ADD DUP6 PUSH2 0x1E0D JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0xE0 DUP4 ADD MSTORE PUSH2 0x2150 DUP2 DUP5 PUSH2 0x1E1F JUMP JUMPDEST SWAP11 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x216C DUP3 DUP7 PUSH2 0x1DF5 JUMP JUMPDEST PUSH2 0x2179 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1E0D JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x14F5 DUP2 DUP5 PUSH2 0x1E1F JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x1233 DUP3 DUP5 PUSH2 0x1E04 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x1233 DUP3 DUP5 PUSH2 0x1E0D JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x171F DUP2 DUP5 PUSH2 0x1E1F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1E54 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1EAA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1F00 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1F56 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1FAC JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1FDC JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x2032 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x2062 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x20D4 DUP3 DUP6 PUSH2 0x1E0D JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x2254 DUP3 DUP7 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x2261 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x1779 PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x1E0D JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 JUMP JUMPDEST PUSH10 0xFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x22D2 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x22BA JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x19F4 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0xae PUSH29 0x6B1BC3E9C37BD83CE7EF0D6EBC72EE71C196BD8A89B84FA508D5C11D3F BLOCKHASH PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY ", | |
"sourceMap": "5997:15237:0:-;;;;;;;;-1:-1:-1;;;5997:15237:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18734:98;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18734:98:0;;;;;;;;;;;;;;;;;;;;19990:106;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19990:106:0;;;;;;;;;;;;6595:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6595:37:0;;;;;;;;;18053:90;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18053:90:0;;;;19123:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19123:92:0;;;;6638:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6638:24:0;;;;;;;;;19319:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19319:120:0;;;;6668:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6668:25:0;;;;;;;;;6153:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6153:40:0;;;;17732:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17732:104:0;;;;1001:111:12;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1001:111:12;;;;18916:98:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18916:98:0;;;;238:20:12;;8:9:-1;5:2;;;30:1;27;20:12;5:2;238:20:12;;;;17267:389:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17267:389:0;;;;11616:1012;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11616:1012:0;;;;19504:84;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19504:84:0;;;;18547:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18547:92:0;;;;;;;;;;;;13604:1408;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13604:1408:0;;;;;;;;;6265:48;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6265:48:0;;;;19842:74;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19842:74:0;;;;18362:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18362:96:0;;;;18209:82;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18209:82:0;;;;17898:90;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17898:90:0;;;;;;;;;;;;6436:22;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6436:22:0;;;;19655:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19655:94:0;;;;1274:103:12;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1274:103:12;;;;;;;;;18734:98:0;18810:15;;18734:98;:::o;19990:106::-;20040:7;20066:23;:21;:23::i;:::-;20059:30;;19990:106;:::o;6595:37::-;;;;;;;;;;;;;-1:-1:-1;6595:37:0;:::o;18053:90::-;18125:11;;18053:90;:::o;19123:92::-;19196:12;;19123:92;:::o;6638:24::-;;;;;;;;;19319:120;19406:26;;19319:120;:::o;6668:25::-;;;;;;;;;;;;-1:-1:-1;;;;;6668:25:0;;-1:-1:-1;6668:25:0;:::o;6153:40::-;6191:2;6153:40;:::o;17732:104::-;17816:4;17808:21;17732:104;:::o;1001:111:12:-;8191:7:0;;-1:-1:-1;;;;;8191:7:0;8202:10;8191:21;8183:68;;;;-1:-1:-1;;;;;8183:68:0;;;;;;;;;;;;;;;;;1077:5:12;;1058:25;;-1:-1:-1;;;;;1077:5:12;;;;1058:25;;1077:5;;1058:25;1089:5;:18;;-1:-1:-1;;1089:18:12;;;1001:111::o;18916:98:0:-;18992:15;;18916:98;:::o;238:20:12:-;;;-1:-1:-1;;;;;238:20:12;;:::o;17267:389:0:-;17486:9;;:27;;;;;;;;17314:3;;;;;;;;;;;;-1:-1:-1;;;;;17486:9:0;;;;:25;;:27;;;;;-1:-1:-1;;17486:27:0;;;;;;;;17314:3;17486:9;:27;;;5:2:-1;;;;30:1;27;20:12;5:2;17486:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17486:27:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;17486:27:0;;;;;;;;;17329:184;;;;;;;;;;17603:1;17591:9;:13;17583:44;;;;;;-1:-1:-1;;;;;17583:44:0;;;;;;;;;-1:-1:-1;17644:5:0;;17267:389;-1:-1:-1;;;;17267:389:0:o;11616:1012::-;8641:14;;11677:17;;12122;;8641:14;;:22;;:14;:22;8633:84;;;;-1:-1:-1;;;;;8633:84:0;;;;;;;;;11844:18;:16;:18::i;:::-;11967:14;;;;11963:659;;;12016:1;11997:16;:20;12166:24;;;;;;;;;;;;;;;;;;;;;;;;12199;;;;;;;;;;;;;;;12149:123;;;;12166:24;;12199;12230:12;;12149:123;;;;;;;12166:24;12149:123;;12166:24;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;12149:123:0;;;;;;;;;;;;;;;;;;-1:-1:-1;12149:123:0;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;12149:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12149:123:0;;;;;;26:21:-1;;;-1:-1;;22:32;6:49;;12149:123:0;;;;;;;-1:-1:-1;12287:68:0;;-1:-1:-1;12301:7:0;;-1:-1:-1;12309:1:0;;-1:-1:-1;12301:10:0;;-1:-1:-1;12301:10:0;;;;12313:6;:9;12329:25;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12301:10:0;;;;12324:3;;12287:13;:68::i;:::-;;12474:14;;;;;;;;;;;;;;;;;;;;;;;12498:12;12519:14;;;;;;;;;;;;;;;;;;12457:77;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;12457:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;12457:77:0;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;12457:77:0;;;12444:91;;12549:58;12563:7;12571:1;12563:10;;;;;;;;;;;12575:9;;12591:15;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12563:10:0;;;;12586:3;;12549:13;:58::i;:::-;;11963:659;11616:1012;;:::o;19504:84::-;19573:8;;19504:84;:::o;18547:92::-;18620:12;;;;;;;;18547:92::o;13604:1408::-;8660:27:2;;;;:15;:27;;;;;;;;-1:-1:-1;;;;;8660:27:2;8646:10;:41;8638:94;;;;-1:-1:-1;;;;;8638:94:2;;;;;;;;;8745:27;;;;:15;:27;;;;;;8738:34;;-1:-1:-1;;8738:34:2;;;8783:30;8745:27;;8783:30;;;8641:14:0;;;;:22;;:14;:22;8633:84;;;;-1:-1:-1;;;;;8633:84:0;;;;;;;;;9040:42;9059:22;6191:2;9078;9059:22;:18;:22;:::i;:::-;6191:2;;9040:42;:18;:42;:::i;:::-;9009:26;;9001:35;;:3;;:35;:7;:35;:::i;:::-;:82;8993:130;;;;-1:-1:-1;;;;;8993:130:0;;;;;;;;;13954:9;13914:19;13934:16;;13914:37;;;;;;;;;;:49;13992:16;;;14011:1;13992:20;;;13973:39;;;;-1:-1:-1;14085:867:0;;;14169:22;;:19;14142:22;:57;;14197:1;;14142:50;;:26;:50::i;:::-;:54;:57;:54;:57;:::i;:::-;14123:15;:77;;;14241:3;14212:26;:32;14256:12;:16;;14271:1;14256:16;;;14425:20;14421:323;;;14524:15;:20;;14543:1;14524:20;;;14421:323;;;14671:1;14653:15;:19;14715:15;;14693:38;;;;;;;;;;;;;;;;14421:323;14767:15;;6312:1;-1:-1:-1;14763:180:0;;14914:16;:14;:16::i;:::-;14973:23;14986:9;14973:23;;;;;;;;;;;;;;;13604:1408;;;:::o;6265:48::-;6312:1;6265:48;:::o;19842:74::-;19906:3;19842:74;:::o;18362:96::-;18437:14;;;;18362:96;:::o;18209:82::-;18277:7;;18209:82;:::o;17898:90::-;17969:12;17962:19;;;;;;;;;;;;;-1:-1:-1;;17962:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;17944:6;;17962:19;;17969:12;;17962:19;;;17969:12;17962:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17898:90;:::o;6436:22::-;;;-1:-1:-1;;;;;6436:22:0;;:::o;19655:94::-;19733:9;;19655:94;:::o;1274:103:12:-;8191:7:0;;-1:-1:-1;;;;;8191:7:0;8202:10;8191:21;8183:68;;;;-1:-1:-1;;;;;8183:68:0;;;;;;;;;1343:29:12;1362:9;1343:18;:29::i;:::-;1274:103;:::o;5210:110:2:-;5310:4;;-1:-1:-1;;;;;5310:4:2;;5210:110::o;15959:1250:0:-;16833:23;8457:3;8446:8;;8434:9;;:20;:26;8430:58;;;16258:8;;16289:1;;16258:28;;6191:2;16258:28;:12;:28;:::i;:::-;:32;16241:12;;:50;;16237:513;;;16388:7;;:39;;-1:-1:-1;;;;;16388:7:0;;;;16413:4;16405:21;16388:39;;;;;:7;:39;:7;:39;16405:21;16388:7;:39;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16388:39:0;16237:513;;;16634:6;;-1:-1:-1;;;;;16634:6:0;:52;16650:35;16667:16;:14;:16::i;:::-;16650:7;;;:35;:11;:35;:::i;:::-;16634:52;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;16700:7:0;;:39;;-1:-1:-1;;;;;16700:7:0;;;;16725:4;16717:21;16700:39;;;;;:7;:39;:7;:39;16717:21;16700:7;:39;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16700:39:0;16237:513;16878:23;:21;:23::i;:::-;16934:7;;16943:29;;;;;16833:69;;-1:-1:-1;;;;;;16920:13:0;;;;;;16934:7;;;;;16920:13;;16943:14;;:29;;16966:4;;16943:29;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16943:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16943:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;16943:29:0;;;;;;;;;16920:53;;-1:-1:-1;;;16920:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16920:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16920:53:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;16920:53:0;;;;;;;;;16912:106;;;;;;-1:-1:-1;;;;;16912:106:0;;;;;;;;;17124:14;:22;;-1:-1:-1;;17124:22:0;;;17161:41;;;;;;17175:3;;17188:4;17180:21;;17161:41;;;;;;;;;;15959:1250;:::o;12713:622::-;12832:17;12927:28;;:::i;:::-;8641:14;;;;:22;;:14;:22;8633:84;;;;-1:-1:-1;;;;;8633:84:0;;;;;;;;;12958:81;12980:6;12996:4;13003:35;12958:21;:81::i;:::-;13061:20;;;;;;;;;;;;;;;;;12927:112;;-1:-1:-1;13061:20:0;;12927:112;;13076:4;13061:20;:7;:20;:::i;:::-;13129:22;;;;;;;;;;;;;;;;;;;:3;;13145:5;13129:22;:7;:22;:::i;:::-;13161:24;;;;;;;;;;;;;;;;;;;:3;;13181;13161:24;:10;:24;:::i;:::-;13216:57;13239:7;13248:3;13253:19;;13216:22;:57::i;:::-;13204:69;;13302:26;13318:9;13302:26;;;;;;;;;;;;;;;12713:622;;;;;;;:::o;674:283:13:-;734:7;950:2;945;:7;;;;;;;;938:14;;674:283;;;;;:::o;1069:116::-;1129:7;1151:8;;;;1144:16;;;;-1:-1:-1;1173:7:13;;;1069:116::o;1247:128::-;1328:7;;;1348;;;;1341:15;;;15134:692:0;8641:14;;15372:23;;8641:14;;:22;;:14;:22;8633:84;;;;-1:-1:-1;;;;;8633:84:0;;;;;;;;;15250:6;;:38;;-1:-1:-1;;;;;15250:6:0;;;;15274:4;15266:21;15250:38;;;;;:6;:38;:6;:38;15266:21;15250:6;:38;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15250:38:0;15417:23;:21;:23::i;:::-;15473:7;;15482:29;;;;;15372:69;;-1:-1:-1;;;;;;15459:13:0;;;;;;15473:7;;;;;15459:13;;15482:14;;:29;;15505:4;;15482:29;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15482:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15482:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15482:29:0;;;;;;;;;15459:53;;-1:-1:-1;;;15459:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15459:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15459:53:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15459:53:0;;;;;;;;;15451:84;;;;;;-1:-1:-1;;;;;15451:84:0;;;;;;;;;15580:11;;15593:15;;15559:50;;;;;;15575:3;;15559:50;;;;;;;;;;-1:-1:-1;15763:14:0;:22;;-1:-1:-1;;15795:19:0;15763:22;15795:19;;;15134:692::o;1512:171:12:-;-1:-1:-1;;;;;1582:23:12;;;;1574:32;;;;;;1638:5;;1617:38;;-1:-1:-1;;;;;1617:38:12;;;;1638:5;;1617:38;;1638:5;;1617:38;1661:5;:17;;-1:-1:-1;;1661:17:12;-1:-1:-1;;;;;1661:17:12;;;;;;;;;;1512:171::o;1725:295:2:-;1873:17;;:::i;:::-;1905:28;;:::i;:::-;1946:69;:3;1961:7;1970:16;1988:26;1946:69;:14;:69;:::i;:::-;1939:76;1725:295;-1:-1:-1;;;;;1725:295:2:o;1958:155:1:-;2046:8;;;;:27;;2068:4;2046:27;:21;:27;:::i;:::-;2079:8;;;;:29;;2101:6;2079:29;:21;:29;:::i;:::-;1958:155;;;:::o;2683:::-;2774:8;;;;:27;;2796:4;2774:27;:21;:27;:::i;:::-;2807:8;;;;:26;;2826:6;2807:26;:18;:26;:::i;3001:476:2:-;3197:8;;3174:32;;;;3191:4;3174:32;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;3174:32:2;;;;;;;;3164:43;;3125:17;;3174:32;;;;3164:43;;;;;3174:32;3164:43;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;3164:43:2;;;;;;;;;;;;;3226:8;;3213:10;;;:21;-1:-1:-1;3240:26:2;;;:15;:26;;;;;;:36;;-1:-1:-1;;3240:36:2;-1:-1:-1;;;;;3240:36:2;;;;;3287:29;;3164:43;;-1:-1:-1;3164:43:2;;-1:-1:-1;3287:29:2;;-1:-1:-1;;3287:29:2;-1:-1:-1;3287:29:2;3330:4;;-1:-1:-1;;;;;3330:4:2;:20;3351:7;3360:8;3370:19;3384:4;3370:13;:19::i;:::-;3330:60;;-1:-1:-1;;;3330:60:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3330:60:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3330:60:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;3330:60:2;;;;;;;;;3322:108;;;;;;-1:-1:-1;;;;;3322:108:2;;;;;;;;;3436:8;:13;;3448:1;3436:13;;;3001:476;;;;;;:::o;972:366:1:-;1121:17;;:::i;:::-;1153:50;1175:4;:8;;;336:3;1153:21;:50::i;:::-;-1:-1:-1;;1209:13:1;;;-1:-1:-1;;;;;1228:39:1;;:20;;;:39;-1:-1:-1;;1273:43:1;;:23;;;:43;1209:13;972:366;;;;;;;:::o;2833:198:10:-;2935:55;2946:3;396:1;2976:5;2970:19;2935:10;:55::i;:::-;3000:24;:3;3017:5;3000:24;:10;:24;:::i;1742:448::-;-1:-1:-1;;1834:28:10;;1831:353;;;1878:30;1897:3;1902:5;1878:18;:30::i;:::-;1831:353;;;1936:18;1928:5;:26;1925:259;;;1970:24;1983:3;1988:5;1970:12;:24::i;1925:259::-;2023:1;2014:10;;2011:173;;2040:44;2051:3;241:1;2077:5;2040:10;:44::i;2011:173::-;2115:58;2126:3;297:1;2166:5;-1:-1:-1;;2161:10:10;2115;:58::i;:::-;1742:448;;:::o;7481:527:2:-;7878:7;;7893:20;;;;7921:23;;;;;7569:5;7952:10;;;;7990:8;;;;:12;7598:405;;7569:5;;7628:29;;7598:405;;7628:6;;;;7878:7;;7893:20;;7921:23;;7952:10;7628:6;;7598:405;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;7598:405:2;;;49:4:-1;25:18;;61:17;;7598:405:2;182:15:-1;-1:-1;;7598:405:2;;;179:29:-1;;;;160:49;;;7598:405:2;-1:-1:-1;7481:527:2;;;:::o;942:395:9:-;1012:6;;:::i;:::-;1048:2;1037:8;:13;:18;1033:71;;1094:2;1083:8;:13;1077:2;:20;1065:32;;;;1033:71;-1:-1:-1;1151:12:9;;;;:23;;;1214:4;1208:11;;1226:16;;;-1:-1:-1;1249:14:9;;1291:18;;;1283:27;1270:41;;1151:12;942:395::o;709:724:10:-;824:2;815:11;;812:615;;842:44;:3;865:10;;;;;;864:20;;;842:15;:44::i;:::-;;812:615;;;915:4;906:13;;903:524;;935:41;:3;972:2;958:10;;;;;957:17;935:41;:15;:41;:::i;:::-;-1:-1:-1;990:23:10;:3;1004:5;1011:1;990:23;:13;:23;:::i;903:524::-;1042:6;1033:15;;1030:397;;1064:41;:3;1101:2;1087:10;;;;;1086:17;1064:41;:15;:41;:::i;:::-;-1:-1:-1;1119:23:10;:3;1133:5;1140:1;1119:23;:13;:23;:::i;1030:397::-;1171:10;1162:19;;1159:268;;1197:41;:3;1234:2;1220:10;;;;;1219:17;1197:41;:15;:41;:::i;:::-;-1:-1:-1;1252:23:10;:3;1266:5;1273:1;1252:23;:13;:23;:::i;1159:268::-;1304:18;1295:27;;1292:135;;1338:41;:3;1375:2;1361:10;;;;;1360:17;1338:41;:15;:41;:::i;:::-;-1:-1:-1;1393:23:10;:3;1407:5;1414:1;1393:23;:13;:23;:::i;:::-;;709:724;;;:::o;4496:155:9:-;4573:6;;:::i;:::-;4601:45;4607:3;4612;:7;;;:14;4628:4;4634;:11;4601:5;:45::i;2598:229:10:-;2694:72;:3;2716:48;2694:72;:15;:72;:::i;:::-;;2774:46;2786:3;2812:5;-1:-1:-1;;2807:10:10;2791:28;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2791:28:10;;;2774:11;:46::i;2383:209::-;2473:63;:3;2495:39;2473:63;:15;:63;:::i;:::-;;2544:41;2556:3;2577:5;2561:23;;;;;;;;;5811:144:9;5885:6;;:::i;:::-;5913:37;5924:3;5929;:7;;;:14;5945:4;5913:10;:37::i;9497:154::-;9578:6;;:::i;:::-;9606:40;9615:3;9620;:7;;;:14;9636:4;9642:3;9606:8;:40::i;2651:1140::-;2746:6;;:::i;:::-;2897:9;2912:8;3580:9;2782:4;:11;2775:3;:18;;2767:27;;;;;;;;2817:3;:12;;;2811:3;2805;:9;:24;2801:90;;;2839:45;2846:3;2851:28;2855:3;:12;;;2875:3;2869;:9;2851:3;:28::i;:::-;2882:1;2851:32;2839:6;:45::i;:::-;3006:3;3000:10;3077:6;3071:13;3193:3;3188:2;3180:6;3176:15;3172:25;3164:33;;3277:6;3271:3;3266;3262:13;3259:25;3256:2;;;3319:3;3314;3310:13;3302:6;3295:29;3256:2;3356;3350:4;3346:13;3339:20;;2935:430;;3417:129;3431:2;3424:9;;3417:129;;3486:10;;3473:24;;-1:-1:-1;;3435:9:9;;;;3520:2;3512:10;;;;3530:9;;;;3417:129;;;-1:-1:-1;3655:10:9;3704:11;;3600:2;:8;;;;3592:3;:17;-1:-1:-1;;3592:21:9;3667:9;;3651:26;;;3700:22;;3742:21;;;;3729:35;;;-1:-1:-1;3783:3:9;;;-1:-1:-1;;2651:1140:9:o;2196:181:10:-;2296:47;2307:3;346:1;2330:5;:12;2296:10;:47::i;4945:619:9:-;5028:6;;:::i;:::-;5060:12;;;;5053:19;;5049:69;;5082:29;5089:3;5094;:12;;;5109:1;5094:16;5082:6;:29::i;:::-;5204:3;5198:10;5275:6;5269:13;5387:2;5381:3;5373:6;5369:16;5365:25;5411:4;5405;5397:19;5482:6;5477:3;5474:15;5471:2;;;5527:1;5519:6;5515:14;5507:6;5500:30;5471:2;-1:-1:-1;5556:3:9;;4945:619;-1:-1:-1;;;;;4945:619:9:o;8610:642::-;8699:6;;:::i;:::-;8799:9;8736:3;:12;;;8730:3;8724;:9;:24;8720:73;;;8758:28;8765:3;8777;8771;:9;8784:1;8770:15;8758:6;:28::i;:::-;8824:1;8818:3;8811;:10;:14;8799:26;;8911:3;8905:10;9026:3;9020;9012:6;9008:16;9004:26;9082:4;9074;9070:9;9063:4;9057:11;9053:27;9050:37;9044:4;9037:51;9170:6;9164:13;9158:3;9153;9149:13;9146:32;9143:2;;;9213:3;9208;9204:13;9196:6;9189:29;9143:2;-1:-1:-1;9244:3:9;;8610:642;-1:-1:-1;;;;;;8610:642:9:o;1889:114::-;1939:4;1959:1;1955;:5;1951:34;;;-1:-1:-1;1977:1:9;1970:8;;1951:34;-1:-1:-1;1997:1:9;1889:114;-1:-1:-1;1889:114:9:o;1732:153::-;1823:7;;1836:19;1823:3;1846:8;1836:4;:19::i;:::-;;1861;1868:3;1873:6;1861;:19::i;5997:15237:0:-;;;;;;;;;-1:-1:-1;5997:15237:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;-1:-1:-1;5997:15237:0;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;130:116;;205:36;233:6;227:13;205:36;;253:118;;320:46;358:6;345:20;320:46;;378:120;;455:38;485:6;479:13;455:38;;759:120;;836:38;866:6;860:13;836:38;;886:241;;990:2;978:9;969:7;965:23;961:32;958:2;;;1006:1;1003;996:12;958:2;1041:1;1058:53;1103:7;1083:9;1058:53;;1134:257;;1246:2;1234:9;1225:7;1221:23;1217:32;1214:2;;;1262:1;1259;1252:12;1214:2;1297:1;1314:61;1367:7;1347:9;1314:61;;1398:366;;;1519:2;1507:9;1498:7;1494:23;1490:32;1487:2;;;1535:1;1532;1525:12;1487:2;1570:1;1587:53;1632:7;1612:9;1587:53;;;1577:63;;1549:97;1677:2;1695:53;1740:7;1731:6;1720:9;1716:22;1695:53;;;1685:63;;1656:98;1481:283;;;;;;1771:241;;1875:2;1863:9;1854:7;1850:23;1846:32;1843:2;;;1891:1;1888;1881:12;1843:2;1926:1;1943:53;1988:7;1968:9;1943:53;;2019:263;;2134:2;2122:9;2113:7;2109:23;2105:32;2102:2;;;2150:1;2147;2140:12;2102:2;2185:1;2202:64;2258:7;2238:9;2202:64;;2289:803;;;;;;2469:3;2457:9;2448:7;2444:23;2440:33;2437:2;;;2486:1;2483;2476:12;2437:2;2521:1;2538:63;2593:7;2573:9;2538:63;;;2528:73;;2500:107;2638:2;2656:63;2711:7;2702:6;2691:9;2687:22;2656:63;;;2646:73;;2617:108;2756:2;2774:64;2830:7;2821:6;2810:9;2806:22;2774:64;;;2764:74;;2735:109;2875:2;2893:64;2949:7;2940:6;2929:9;2925:22;2893:64;;;2883:74;;2854:109;2994:3;3013:63;3068:7;3059:6;3048:9;3044:22;3013:63;;;3003:73;;2973:109;2431:661;;;;;;;;;3099:110;3172:31;3197:5;3172:31;;;3167:3;3160:44;3154:55;;;3216:101;3283:28;3305:5;3283:28;;3324:110;3397:31;3422:5;3397:31;;3441:107;3512:30;3536:5;3512:30;;3555:297;;3655:38;3687:5;3655:38;;;3710:6;3705:3;3698:19;3722:63;3778:6;3771:4;3766:3;3762:14;3755:4;3748:5;3744:16;3722:63;;;3817:29;3839:6;3817:29;;;3797:50;;;3810:4;3797:50;;3635:217;-1:-1;;;3635:217;4577:397;4732:2;4720:15;;4769:66;4764:2;4755:12;;4748:88;4870:66;4865:2;4856:12;;4849:88;4965:2;4956:12;;4713:261;4983:397;5138:2;5126:15;;5175:66;5170:2;5161:12;;5154:88;5276:66;5271:2;5262:12;;5255:88;5371:2;5362:12;;5119:261;5389:397;5544:2;5532:15;;5581:66;5576:2;5567:12;;5560:88;5682:66;5677:2;5668:12;;5661:88;5777:2;5768:12;;5525:261;5795:397;5950:2;5938:15;;5987:66;5982:2;5973:12;;5966:88;6088:66;6083:2;6074:12;;6067:88;6183:2;6174:12;;5931:261;6201:296;6356:2;6344:15;;6393:66;6388:2;6379:12;;6372:88;6488:2;6479:12;;6337:160;6506:397;6661:2;6649:15;;6698:66;6693:2;6684:12;;6677:88;6799:66;6794:2;6785:12;;6778:88;6894:2;6885:12;;6642:261;6912:296;7067:2;7055:15;;7104:66;7099:2;7090:12;;7083:88;7199:2;7190:12;;7048:160;7217:397;7372:2;7360:15;;7409:66;7404:2;7395:12;;7388:88;7510:66;7505:2;7496:12;;7489:88;7605:2;7596:12;;7353:261;7739:193;7847:2;7832:18;;7861:61;7836:9;7895:6;7861:61;;7939:294;8075:2;8060:18;;8089:61;8064:9;8123:6;8089:61;;;8161:62;8219:2;8208:9;8204:18;8195:6;8161:62;;8240:977;8556:3;8541:19;;8571:61;8545:9;8605:6;8571:61;;;8643:62;8701:2;8690:9;8686:18;8677:6;8643:62;;;8716;8774:2;8763:9;8759:18;8750:6;8716:62;;;8789;8847:2;8836:9;8832:18;8823:6;8789:62;;;8862:61;8918:3;8907:9;8903:19;8894:6;8862:61;;;8934:63;8992:3;8981:9;8977:19;8968:6;8934:63;;;9008;9066:3;9055:9;9051:19;9042:6;9008:63;;;9120:9;9114:4;9110:20;9104:3;9093:9;9089:19;9082:49;9145:62;9202:4;9193:6;9145:62;;;9137:70;8527:690;-1:-1;;;;;;;;;;8527:690;9224:479;9406:2;9391:18;;9420:61;9395:9;9454:6;9420:61;;;9492:62;9550:2;9539:9;9535:18;9526:6;9492:62;;;9602:9;9596:4;9592:20;9587:2;9576:9;9572:18;9565:48;9627:66;9688:4;9679:6;9627:66;;9710:181;9812:2;9797:18;;9826:55;9801:9;9854:6;9826:55;;9898:193;10006:2;9991:18;;10020:61;9995:9;10054:6;10020:61;;10294:281;10422:2;10436:47;;;10407:18;;10497:68;10407:18;10551:6;10497:68;;10582:387;10763:2;10777:47;;;10748:18;;10838:121;10748:18;10838:121;;10976:387;11157:2;11171:47;;;11142:18;;11232:121;11142:18;11232:121;;11370:387;11551:2;11565:47;;;11536:18;;11626:121;11536:18;11626:121;;11764:387;11945:2;11959:47;;;11930:18;;12020:121;11930:18;12020:121;;12158:387;12339:2;12353:47;;;12324:18;;12414:121;12324:18;12414:121;;12552:387;12733:2;12747:47;;;12718:18;;12808:121;12718:18;12808:121;;12946:387;13127:2;13141:47;;;13112:18;;13202:121;13112:18;13202:121;;13340:387;13521:2;13535:47;;;13506:18;;13596:121;13506:18;13596:121;;13934:294;14070:2;14055:18;;14084:61;14059:9;14118:6;14084:61;;14235:395;14399:2;14384:18;;14413:61;14388:9;14447:6;14413:61;;;14485:62;14543:2;14532:9;14528:18;14519:6;14485:62;;;14558;14616:2;14605:9;14601:18;14592:6;14558:62;;14637:87;14707:12;;14691:33;14928:128;-1:-1;;;;;14997:54;;14980:76;15063:92;15136:13;15129:21;;15112:43;15162:79;15231:5;15214:27;15248:151;-1:-1;;15316:78;;15299:100;16068:107;16147:22;16136:34;;16119:56;16183:268;16248:1;16255:101;16269:6;16266:1;16263:13;16255:101;;;16336:11;;;16330:18;16317:11;;;16310:39;16291:2;16284:10;16255:101;;;16371:6;16368:1;16365:13;16362:2;;;-1:-1;;16436:1;16418:16;;16411:27;16232:219;16459:97;16547:2;16527:14;-1:-1;;16523:28;;16507:49" | |
}, | |
"gasEstimates": { | |
"creation": { | |
"codeDepositCost": "1799800", | |
"executionCost": "infinite", | |
"totalCost": "infinite" | |
}, | |
"external": { | |
"": "695", | |
"DAY_IN_SECONDS()": "524", | |
"DROUGHT_DAYS_THRESDHOLD()": "744", | |
"checkRainfallCallBack(bytes32,uint256)": "infinite", | |
"currentRainfallList(uint256)": "infinite", | |
"getChainlinkToken()": "755", | |
"getContractBalance()": "945", | |
"getContractPaid()": "923", | |
"getContractStartDate()": "1076", | |
"getContractStatus()": "1000", | |
"getCurrentRainfall()": "548", | |
"getCurrentRainfallDateChecked()": "680", | |
"getDaysWithoutRain()": "790", | |
"getDuration()": "878", | |
"getLatestPrice()": "infinite", | |
"getLocation()": "infinite", | |
"getNow()": "765", | |
"getPayoutValue()": "614", | |
"getPremium()": "1010", | |
"getRequestCount()": "636", | |
"insurer()": "1204", | |
"jobIds(uint256)": "infinite", | |
"oracles(uint256)": "1045", | |
"owner()": "962", | |
"renounceOwnership()": "22358", | |
"transferOwnership(address)": "23526", | |
"updateContract()": "infinite" | |
}, | |
"internal": { | |
"checkEndContract()": "infinite", | |
"checkRainfall(address,bytes32,string memory,string memory)": "infinite", | |
"payOutContract()": "infinite", | |
"stringToBytes32(string memory)": "infinite", | |
"uint2str(uint256)": "infinite" | |
} | |
}, | |
"methodIdentifiers": { | |
"DAY_IN_SECONDS()": "5fdc6281", | |
"DROUGHT_DAYS_THRESDHOLD()": "b8078732", | |
"checkRainfallCallBack(bytes32,uint256)": "b1b91f7a", | |
"currentRainfallList(uint256)": "185e5b40", | |
"getChainlinkToken()": "165d35e1", | |
"getContractBalance()": "6f9fb98a", | |
"getContractPaid()": "b0b30fee", | |
"getContractStartDate()": "dcbacd11", | |
"getContractStatus()": "c032846b", | |
"getCurrentRainfall()": "0c15c365", | |
"getCurrentRainfallDateChecked()": "56a6d508", | |
"getDaysWithoutRain()": "7a50413d", | |
"getDuration()": "ad2e8c9b", | |
"getLatestPrice()": "8e15f473", | |
"getLocation()": "ce2ce3fc", | |
"getNow()": "bbe4fd50", | |
"getPayoutValue()": "243d9a5d", | |
"getPremium()": "c9744029", | |
"getRequestCount()": "3fad1834", | |
"insurer()": "dbc837c5", | |
"jobIds(uint256)": "4162cc88", | |
"oracles(uint256)": "5b69a7d8", | |
"owner()": "8da5cb5b", | |
"renounceOwnership()": "715018a6", | |
"transferOwnership(address)": "f2fde38b", | |
"updateContract()": "a241c089" | |
} | |
}, | |
"abi": [ | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getCurrentRainfall", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getChainlinkToken", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "address" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"name": "currentRainfallList", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getPayoutValue", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getRequestCount", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"name": "jobIds", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "bytes32" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getCurrentRainfallDateChecked", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"name": "oracles", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "address" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "DAY_IN_SECONDS", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getContractBalance", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": false, | |
"inputs": [], | |
"name": "renounceOwnership", | |
"outputs": [], | |
"payable": false, | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getDaysWithoutRain", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "owner", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "address" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getLatestPrice", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "int256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": false, | |
"inputs": [], | |
"name": "updateContract", | |
"outputs": [ | |
{ | |
"name": "requestId", | |
"type": "bytes32" | |
} | |
], | |
"payable": false, | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getDuration", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getContractPaid", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "bool" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": false, | |
"inputs": [ | |
{ | |
"name": "_requestId", | |
"type": "bytes32" | |
}, | |
{ | |
"name": "_rainfall", | |
"type": "uint256" | |
} | |
], | |
"name": "checkRainfallCallBack", | |
"outputs": [], | |
"payable": false, | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "DROUGHT_DAYS_THRESDHOLD", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getNow", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getContractStatus", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "bool" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getPremium", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getLocation", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "string" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "insurer", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "address" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getContractStartDate", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": false, | |
"inputs": [ | |
{ | |
"name": "_newOwner", | |
"type": "address" | |
} | |
], | |
"name": "transferOwnership", | |
"outputs": [], | |
"payable": false, | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"name": "_client", | |
"type": "address" | |
}, | |
{ | |
"name": "_duration", | |
"type": "uint256" | |
}, | |
{ | |
"name": "_premium", | |
"type": "uint256" | |
}, | |
{ | |
"name": "_payoutValue", | |
"type": "uint256" | |
}, | |
{ | |
"name": "_cropLocation", | |
"type": "string" | |
}, | |
{ | |
"name": "_link", | |
"type": "address" | |
}, | |
{ | |
"name": "_oraclePaymentAmount", | |
"type": "uint256" | |
} | |
], | |
"payable": true, | |
"stateMutability": "payable", | |
"type": "constructor" | |
}, | |
{ | |
"payable": true, | |
"stateMutability": "payable", | |
"type": "fallback" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": false, | |
"name": "_insurer", | |
"type": "address" | |
}, | |
{ | |
"indexed": false, | |
"name": "_client", | |
"type": "address" | |
}, | |
{ | |
"indexed": false, | |
"name": "_duration", | |
"type": "uint256" | |
}, | |
{ | |
"indexed": false, | |
"name": "_premium", | |
"type": "uint256" | |
}, | |
{ | |
"indexed": false, | |
"name": "_totalCover", | |
"type": "uint256" | |
} | |
], | |
"name": "contractCreated", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": false, | |
"name": "_paidTime", | |
"type": "uint256" | |
}, | |
{ | |
"indexed": false, | |
"name": "_totalPaid", | |
"type": "uint256" | |
}, | |
{ | |
"indexed": false, | |
"name": "_finalRainfall", | |
"type": "uint256" | |
} | |
], | |
"name": "contractPaidOut", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": false, | |
"name": "_endTime", | |
"type": "uint256" | |
}, | |
{ | |
"indexed": false, | |
"name": "_totalReturned", | |
"type": "uint256" | |
} | |
], | |
"name": "contractEnded", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": false, | |
"name": "_rainfall", | |
"type": "uint256" | |
} | |
], | |
"name": "ranfallThresholdReset", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": false, | |
"name": "requestId", | |
"type": "bytes32" | |
} | |
], | |
"name": "dataRequestSent", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": false, | |
"name": "_rainfall", | |
"type": "uint256" | |
} | |
], | |
"name": "dataReceived", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": true, | |
"name": "previousOwner", | |
"type": "address" | |
} | |
], | |
"name": "OwnershipRenounced", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": true, | |
"name": "previousOwner", | |
"type": "address" | |
}, | |
{ | |
"indexed": true, | |
"name": "newOwner", | |
"type": "address" | |
} | |
], | |
"name": "OwnershipTransferred", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": true, | |
"name": "id", | |
"type": "bytes32" | |
} | |
], | |
"name": "ChainlinkRequested", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": true, | |
"name": "id", | |
"type": "bytes32" | |
} | |
], | |
"name": "ChainlinkFulfilled", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": true, | |
"name": "id", | |
"type": "bytes32" | |
} | |
], | |
"name": "ChainlinkCancelled", | |
"type": "event" | |
} | |
] | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"compiler": { | |
"version": "0.4.24+commit.e67f0147" | |
}, | |
"language": "Solidity", | |
"output": { | |
"abi": [ | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getCurrentRainfall", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getChainlinkToken", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "address" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"name": "currentRainfallList", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getPayoutValue", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getRequestCount", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"name": "jobIds", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "bytes32" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getCurrentRainfallDateChecked", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"name": "oracles", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "address" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "DAY_IN_SECONDS", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getContractBalance", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": false, | |
"inputs": [], | |
"name": "renounceOwnership", | |
"outputs": [], | |
"payable": false, | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getDaysWithoutRain", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "owner", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "address" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getLatestPrice", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "int256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": false, | |
"inputs": [], | |
"name": "updateContract", | |
"outputs": [ | |
{ | |
"name": "requestId", | |
"type": "bytes32" | |
} | |
], | |
"payable": false, | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getDuration", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getContractPaid", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "bool" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": false, | |
"inputs": [ | |
{ | |
"name": "_requestId", | |
"type": "bytes32" | |
}, | |
{ | |
"name": "_rainfall", | |
"type": "uint256" | |
} | |
], | |
"name": "checkRainfallCallBack", | |
"outputs": [], | |
"payable": false, | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "DROUGHT_DAYS_THRESDHOLD", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getNow", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getContractStatus", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "bool" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getPremium", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getLocation", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "string" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "insurer", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "address" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getContractStartDate", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": false, | |
"inputs": [ | |
{ | |
"name": "_newOwner", | |
"type": "address" | |
} | |
], | |
"name": "transferOwnership", | |
"outputs": [], | |
"payable": false, | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"name": "_client", | |
"type": "address" | |
}, | |
{ | |
"name": "_duration", | |
"type": "uint256" | |
}, | |
{ | |
"name": "_premium", | |
"type": "uint256" | |
}, | |
{ | |
"name": "_payoutValue", | |
"type": "uint256" | |
}, | |
{ | |
"name": "_cropLocation", | |
"type": "string" | |
}, | |
{ | |
"name": "_link", | |
"type": "address" | |
}, | |
{ | |
"name": "_oraclePaymentAmount", | |
"type": "uint256" | |
} | |
], | |
"payable": true, | |
"stateMutability": "payable", | |
"type": "constructor" | |
}, | |
{ | |
"payable": true, | |
"stateMutability": "payable", | |
"type": "fallback" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": false, | |
"name": "_insurer", | |
"type": "address" | |
}, | |
{ | |
"indexed": false, | |
"name": "_client", | |
"type": "address" | |
}, | |
{ | |
"indexed": false, | |
"name": "_duration", | |
"type": "uint256" | |
}, | |
{ | |
"indexed": false, | |
"name": "_premium", | |
"type": "uint256" | |
}, | |
{ | |
"indexed": false, | |
"name": "_totalCover", | |
"type": "uint256" | |
} | |
], | |
"name": "contractCreated", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": false, | |
"name": "_paidTime", | |
"type": "uint256" | |
}, | |
{ | |
"indexed": false, | |
"name": "_totalPaid", | |
"type": "uint256" | |
}, | |
{ | |
"indexed": false, | |
"name": "_finalRainfall", | |
"type": "uint256" | |
} | |
], | |
"name": "contractPaidOut", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": false, | |
"name": "_endTime", | |
"type": "uint256" | |
}, | |
{ | |
"indexed": false, | |
"name": "_totalReturned", | |
"type": "uint256" | |
} | |
], | |
"name": "contractEnded", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": false, | |
"name": "_rainfall", | |
"type": "uint256" | |
} | |
], | |
"name": "ranfallThresholdReset", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": false, | |
"name": "requestId", | |
"type": "bytes32" | |
} | |
], | |
"name": "dataRequestSent", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": false, | |
"name": "_rainfall", | |
"type": "uint256" | |
} | |
], | |
"name": "dataReceived", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": true, | |
"name": "previousOwner", | |
"type": "address" | |
} | |
], | |
"name": "OwnershipRenounced", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": true, | |
"name": "previousOwner", | |
"type": "address" | |
}, | |
{ | |
"indexed": true, | |
"name": "newOwner", | |
"type": "address" | |
} | |
], | |
"name": "OwnershipTransferred", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": true, | |
"name": "id", | |
"type": "bytes32" | |
} | |
], | |
"name": "ChainlinkRequested", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": true, | |
"name": "id", | |
"type": "bytes32" | |
} | |
], | |
"name": "ChainlinkFulfilled", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": true, | |
"name": "id", | |
"type": "bytes32" | |
} | |
], | |
"name": "ChainlinkCancelled", | |
"type": "event" | |
} | |
], | |
"devdoc": { | |
"methods": { | |
"checkRainfallCallBack(bytes32,uint256)": { | |
"details": "Callback function - This gets called by the Oracle Contract when the Oracle Node passes data back to the Oracle Contract The function will take the rainfall given by the Oracle and updated the Inusrance Contract state" | |
}, | |
"getChainlinkToken()": { | |
"details": "Get address of the chainlink token" | |
}, | |
"getContractBalance()": { | |
"details": "Get the balance of the contract" | |
}, | |
"getContractPaid()": { | |
"details": "Get whether the contract has been paid out or not" | |
}, | |
"getContractStartDate()": { | |
"details": "Get the contract start date" | |
}, | |
"getContractStatus()": { | |
"details": "Get the status of the contract" | |
}, | |
"getCurrentRainfall()": { | |
"details": "Get the current recorded rainfall for the contract" | |
}, | |
"getCurrentRainfallDateChecked()": { | |
"details": "Get the last time that the rainfall was checked for the contract" | |
}, | |
"getDaysWithoutRain()": { | |
"details": "Get the recorded number of days without rain" | |
}, | |
"getDuration()": { | |
"details": "Get the contract duration" | |
}, | |
"getLocation()": { | |
"details": "Get the Crop Location" | |
}, | |
"getNow()": { | |
"details": "Get the current date/time according to the blockchain" | |
}, | |
"getPayoutValue()": { | |
"details": "Get the Total Cover" | |
}, | |
"getPremium()": { | |
"details": "Get the Premium paid" | |
}, | |
"getRequestCount()": { | |
"details": "Get the count of requests that has occured for the Insurance Contract" | |
}, | |
"renounceOwnership()": { | |
"details": "Allows the current owner to relinquish control of the contract." | |
}, | |
"transferOwnership(address)": { | |
"details": "Allows the current owner to transfer control of the contract to a newOwner.", | |
"params": { | |
"_newOwner": "The address to transfer ownership to." | |
} | |
}, | |
"updateContract()": { | |
"details": "Calls out to an Oracle to obtain weather data" | |
} | |
} | |
}, | |
"userdoc": { | |
"methods": { | |
"getLatestPrice()": { | |
"notice": "Returns the latest price" | |
}, | |
"renounceOwnership()": { | |
"notice": "Renouncing to ownership will leave the contract without an owner. It will not be possible to call the functions with the `onlyOwner` modifier anymore." | |
} | |
} | |
} | |
}, | |
"settings": { | |
"compilationTarget": { | |
"79cf8c59f1fbf6e6a0327920c9a9c49a/Parametric-Crop-Insurance.sol": "InsuranceContract" | |
}, | |
"evmVersion": "byzantium", | |
"libraries": {}, | |
"optimizer": { | |
"enabled": true, | |
"runs": 200 | |
}, | |
"remappings": [] | |
}, | |
"sources": { | |
"79cf8c59f1fbf6e6a0327920c9a9c49a/Parametric-Crop-Insurance.sol": { | |
"keccak256": "0x69a7f1ba4320036e9ec8d803ef7386fa0e9c2a28fd65eab0600ff1da0ae56d35", | |
"urls": [ | |
"bzzr://df8956114b97ca4384c8d51110c4518189f561f1cbc9885cab289db60c69907f" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/Chainlink.sol": { | |
"keccak256": "0x3e8d01f8aead4e1eac6b3332d366ed8bc2ef5d889c2c8c344777b981d4071f63", | |
"urls": [ | |
"bzzr://7be4bdda81bc444446593968124112fb399d460f529d80761e50c47874b9cb4f" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/ChainlinkClient.sol": { | |
"keccak256": "0xc36504687b2b37000d8e6e25830cdb613c3e88509b0253aa09220e18876dc380", | |
"urls": [ | |
"bzzr://a678a44b26b199a1600d422f4f6eda5d805f00a360245037a1c465b48274fe6d" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/interfaces/AggregatorInterface.sol": { | |
"keccak256": "0xb21fa756e241d3fbfe7546158a7e1bb4a98f261744751c4e9dfe5f474ea46338", | |
"urls": [ | |
"bzzr://acb860d28a70616f38d2d7d72ce5c82a2221734deefe67ace468112e92679bf7" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/interfaces/AggregatorV3Interface.sol": { | |
"keccak256": "0xbf26d0dca0e2815b7c0bd09bddc9ceca339b8c9c2319ca74b2555273f5cbc19c", | |
"urls": [ | |
"bzzr://2fcac254d89fbaf4c08461c7d7eb787e9143c7945683cb368119829e532db63d" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/interfaces/ChainlinkRequestInterface.sol": { | |
"keccak256": "0x7d3983584065248fba8f0ce75fd86feac43ade43784466f87ea502254ddec992", | |
"urls": [ | |
"bzzr://30de07df8cb9fb4ec53aff0f115f88d65936ffd6e90d2aeb031a05d6bf4de6c1" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/interfaces/ENSInterface.sol": { | |
"keccak256": "0xd0b1a6134b5d6c0213bc4db5df8693ec41e13de3d97d43cc8d19639e516f9767", | |
"urls": [ | |
"bzzr://93d66e26b4b5cf6cfa8c6a5d04cb56ff27d49a2aee8f54858ac3db7658355b1f" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/interfaces/LinkTokenInterface.sol": { | |
"keccak256": "0x37f31fbd4f4f28ba236cbd9a61ae9b6f7806ea7fe0a684a855e4835f808f8b92", | |
"urls": [ | |
"bzzr://5518135de15ba1afd8bdac829875935dea5520b152d1f602cdc34551d3c0b806" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/interfaces/PointerInterface.sol": { | |
"keccak256": "0x8019f30a207af4ee80a8b2774e42aba721641254ed0a97826a54f33d7caef218", | |
"urls": [ | |
"bzzr://8ddbb9ae67ec27aed40d6013d6ea176c05f7cd61d4f6fa95492a03fa086d90af" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/vendor/Buffer.sol": { | |
"keccak256": "0x900b4c8ab35b4876d89835a8b050c96107ace250a70f64c5bba6a78a60f03883", | |
"urls": [ | |
"bzzr://408340da4e8fa35e608196ee508f11f9d44f6f70a10f0db0083ab20b5a894d59" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/vendor/CBOR.sol": { | |
"keccak256": "0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d", | |
"urls": [ | |
"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/vendor/ENSResolver.sol": { | |
"keccak256": "0x08965df63f00cb8d164d6fc36a0c388740725906b0bfb79b17391d5dfeabf683", | |
"urls": [ | |
"bzzr://0700cb12e032ed8ed8327e446dfd805ae9fa28785a2909a73def511fe374b8cd" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/vendor/Ownable.sol": { | |
"keccak256": "0x84c7090c27cf3657b73d9e26b6b316975fa0bd233b8169f254de0c3b3acfaefc", | |
"urls": [ | |
"bzzr://b983355647976c1daa5de581a1b6a41be9c5adc17cce257b8679649db78f8a11" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/vendor/SafeMathChainlink.sol": { | |
"keccak256": "0xb822782dea15f1fa4992c27639e9f9e4a4758b2c2fd8b12ec90c4de336de9074", | |
"urls": [ | |
"bzzr://1328bb1e33d56d48209e5bbea79fa18b212e8df3f449ac9a75d20962cc36cce5" | |
] | |
} | |
}, | |
"version": 1 | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"deploy": { | |
"VM:-": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"main:1": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"ropsten:3": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"rinkeby:4": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"kovan:42": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"görli:5": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"Custom": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
} | |
}, | |
"data": { | |
"bytecode": { | |
"linkReferences": {}, | |
"object": "608060405260008054600160a060020a0319908116331790915560018054909116739326bfa02add2366b30bacb125260af641031331179055613a59806100476000396000f300608060405260043610620000b95763ffffffff60e060020a6000350416630ad1c2fa8114620000bb578063125716d614620000f85780635d0c1476146200012c5780635fdc628114620001535780636896c870146200017a5780636f9fb98a146200019f57806371f2864014620001b75780637c463db014620001dc5780638e15f47314620001f4578063a1219c42146200020c578063dbc837c51462000216578063dfdf79e8146200022e578063e3db17b81462000245575b005b348015620000c857600080fd5b50620000e0620000da36600462000a7e565b6200026a565b604051620000ef919062000e23565b60405180910390f35b3480156200010557600080fd5b506200011d6200011736600462000a7e565b62000288565b604051620000ef919062000e13565b3480156200013957600080fd5b50620001446200030f565b604051620000ef919062000d39565b3480156200016057600080fd5b506200016b6200031e565b604051620000ef919062000e33565b3480156200018757600080fd5b506200016b6200019936600462000a7e565b62000323565b348015620001ac57600080fd5b506200016b620003a3565b348015620001c457600080fd5b506200016b620001d636600462000a7e565b620003a8565b348015620001e957600080fd5b5062000144620003ed565b3480156200020157600080fd5b506200016b62000405565b620000b9620004e2565b3480156200022357600080fd5b506200014462000672565b620001446200023f36600462000ac8565b62000681565b3480156200025257600080fd5b50620000b96200026436600462000a7e565b620008f4565b600160a060020a039081166000908152600260205260409020541690565b60008082905080600160a060020a031663c032846b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015620002cd57600080fd5b505af1158015620002e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000308919081019062000b61565b9392505050565b600054600160a060020a031690565b603c81565b60008082905080600160a060020a0316633fad18346040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156200036857600080fd5b505af11580156200037d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000308919081019062000b82565b303190565b60008082905080600160a060020a0316630c15c3656040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156200036857600080fd5b73a36085f69e2889c224210f603d836748e7dc008881565b600080600080600080600160009054906101000a9004600160a060020a0316600160a060020a031663feaf968c6040518163ffffffff1660e060020a02815260040160a060405180830381600087803b1580156200046257600080fd5b505af115801562000477573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200049d919081019062000ba3565b94509450945094509450600082111515620004d85760405160e560020a62461bcd028152600401620004cf9062000e67565b60405180910390fd5b5091949350505050565b60008054600160a060020a03163314620005135760405160e560020a62461bcd028152600401620004cf9062000e55565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815273a36085f69e2889c224210f603d836748e7dc008890819063a9059cbb90339083906370a08231906200057290309060040162000d39565b602060405180830381600087803b1580156200058d57600080fd5b505af1158015620005a2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620005c8919081019062000b82565b6040518363ffffffff1660e060020a028152600401620005ea92919062000d49565b602060405180830381600087803b1580156200060557600080fd5b505af11580156200061a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000640919081019062000b61565b1515620006645760405160e560020a62461bcd028152600401620004cf9062000e43565b600054600160a060020a0316ff5b600054600160a060020a031681565b6000805481908190600160a060020a03163314620006b65760405160e560020a62461bcd028152600401620004cf9062000e55565b620006dc620006c462000405565b670de0b6b3a764000087029063ffffffff6200097816565b888888888873a36085f69e2889c224210f603d836748e7dc008867016345785d8a000062000709620009bd565b6200071b979695949392919062000d96565b6040518091039082f08015801562000737573d6000803e3d6000fd5b50600160a060020a03811660008181526002602052604090819020805473ffffffffffffffffffffffffffffffffffffffff1916909217909155519093507fa44aa7756c3391a11525eeee40213754bf3aee2a051d2597433fb40572a47d769150620007a99084903490899062000d68565b60405180910390a181600160a060020a031663165d35e16040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015620007f057600080fd5b505af115801562000805573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200082b919081019062000aa7565b9050600160a060020a03811663a9059cbb836200085867016345785d8a0000600263ffffffff6200099016565b6200086b8b603c63ffffffff6200097816565b600201026040518363ffffffff1660e060020a0281526004016200089192919062000d49565b602060405180830381600087803b158015620008ac57600080fd5b505af1158015620008c1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620008e7919081019062000b61565b5090979650505050505050565b600081905080600160a060020a031663a241c0896040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156200093857600080fd5b505af11580156200094d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000973919081019062000b82565b505050565b600081838115156200098657fe5b0490505b92915050565b6000821515620009a3575060006200098a565b50818102818382811515620009b457fe5b04146200098a57fe5b604051612ad88062000f4883390190565b600062000308823562000ece565b600062000308825162000ece565b600062000308825162000eda565b600062000308825162000edf565b6000601f8201831362000a1857600080fd5b813562000a2f62000a298262000ea1565b62000e79565b9150808252602083016020830185838301111562000a4c57600080fd5b62000a5983828462000efe565b50505092915050565b600062000308823562000edf565b600062000308825162000ee2565b60006020828403121562000a9157600080fd5b600062000a9f8484620009ce565b949350505050565b60006020828403121562000aba57600080fd5b600062000a9f8484620009dc565b600080600080600060a0868803121562000ae157600080fd5b600062000aef8888620009ce565b955050602062000b028882890162000a62565b945050604062000b158882890162000a62565b935050606062000b288882890162000a62565b925050608086013567ffffffffffffffff81111562000b4657600080fd5b62000b548882890162000a06565b9150509295509295909350565b60006020828403121562000b7457600080fd5b600062000a9f8484620009ea565b60006020828403121562000b9557600080fd5b600062000a9f8484620009f8565b600080600080600060a0868803121562000bbc57600080fd5b600062000bca888862000a70565b955050602062000bdd88828901620009f8565b945050604062000bf088828901620009f8565b935050606062000c0388828901620009f8565b925050608062000b548882890162000a70565b62000c218162000ece565b82525050565b62000c218162000eda565b62000c218162000ef1565b62000c218162000edf565b600062000c558262000eca565b80845262000c6b81602086016020860162000f0a565b62000c768162000f3d565b9093016020019392505050565b601281527f556e61626c6520746f207472616e736665720000000000000000000000000000602082015260400190565b602381527f4f6e6c7920496e737572616e63652070726f76696465722063616e20646f207460208201527f6869730000000000000000000000000000000000000000000000000000000000604082015260600190565b601281527f526f756e64206e6f7420636f6d706c6574650000000000000000000000000000602082015260400190565b602081016200098a828462000c16565b6040810162000d59828562000c16565b62000308602083018462000c3d565b6060810162000d78828662000c16565b62000d87602083018562000c3d565b62000a9f604083018462000c3d565b60e0810162000da6828a62000c16565b62000db5602083018962000c3d565b62000dc4604083018862000c3d565b62000dd3606083018762000c3d565b818103608083015262000de7818662000c48565b905062000df860a083018562000c16565b62000e0760c083018462000c3d565b98975050505050505050565b602081016200098a828462000c27565b602081016200098a828462000c32565b602081016200098a828462000c3d565b602080825281016200098a8162000c83565b602080825281016200098a8162000cb3565b602080825281016200098a8162000d09565b60405181810167ffffffffffffffff8111828210171562000e9957600080fd5b604052919050565b600067ffffffffffffffff82111562000eb957600080fd5b506020601f91909101601f19160190565b5190565b600160a060020a031690565b151590565b90565b69ffffffffffffffffffff1690565b60006200098a8262000ece565b82818337506000910152565b60005b8381101562000f2757818101518382015260200162000f0d565b8381111562000f37576000848401525b50505050565b601f01601f19169056006080604081905260016004556017805461ff00191690556000601881905542601955601a819055601b5562002ad83881900390819083398101806040526200004b9190810190620004a2565b60068054600160a060020a0319908116331790915560078054909116739326bfa02add2366b30bacb125260af641031331179055620000938264010000000062000234810204565b6008819055620000c5620000af64010000000062000256810204565b8590640100000000620012226200035a82021704565b3410156200010a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200010190620006dd565b60405180910390fd5b6009805433600160a060020a031991821617909155600a8054909116600160a060020a03891617905542600b55600c869055600d859055600e84905560006016556017805460ff1916600117905582516200016d90600f90602086019062000370565b50601480547305c8fadf1798437c143683e665800d58a42b6e19600160a060020a031991821681179092556015805490911690911790557f61313765386662663463626634366565623739653034623365623836346134656012819055601355600954600a54600c54600d54600e546040517f0203790cae2ea31823a6382172bd46011fcfbab29b22bb78b4b2f266febf6072956200021f95600160a060020a03918216959116939092909162000687565b60405180910390a150505050505050620007a1565b60028054600160a060020a031916600160a060020a0392909216919091179055565b600080600080600080600760009054906101000a9004600160a060020a0316600160a060020a031663feaf968c6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160a060405180830381600087803b158015620002cc57600080fd5b505af1158015620002e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000307919081019062000565565b9450945094509450945060008211151562000350576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200010190620006f5565b5091949350505050565b600081838115156200036857fe5b049392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003b357805160ff1916838001178555620003e3565b82800160010185558215620003e3579182015b82811115620003e3578251825591602001919060010190620003c6565b50620003f1929150620003f5565b5090565b6200041291905b80821115620003f15760008155600101620003fc565b90565b600062000423825162000756565b9392505050565b600062000423825162000412565b6000601f820183136200044a57600080fd5b8151620004616200045b826200072e565b62000707565b915080825260208301602083018583830111156200047e57600080fd5b6200048b8382846200076e565b50505092915050565b600062000423825162000762565b600080600080600080600060e0888a031215620004be57600080fd5b6000620004cc8a8a62000415565b9750506020620004df8a828b016200042a565b9650506040620004f28a828b016200042a565b9550506060620005058a828b016200042a565b94505060808801516001604060020a038111156200052257600080fd5b620005308a828b0162000438565b93505060a0620005438a828b0162000415565b92505060c0620005568a828b016200042a565b91505092959891949750929550565b600080600080600060a086880312156200057e57600080fd5b60006200058c888862000494565b95505060206200059f888289016200042a565b9450506040620005b2888289016200042a565b9350506060620005c5888289016200042a565b9250506080620005d88882890162000494565b9150509295509295909350565b620005f08162000756565b82525050565b602181527f4e6f7420656e6f7567682066756e64732073656e7420746f20636f6e7472616360208201527f7400000000000000000000000000000000000000000000000000000000000000604082015260600190565b601281527f526f756e64206e6f7420636f6d706c6574650000000000000000000000000000602082015260400190565b620005f08162000412565b60a08101620006978288620005e5565b620006a66020830187620005e5565b620006b560408301866200067c565b620006c460608301856200067c565b620006d360808301846200067c565b9695505050505050565b60208082528101620006ef81620005f6565b92915050565b60208082528101620006ef816200064c565b6040518181016001604060020a03811182821017156200072657600080fd5b604052919050565b60006001604060020a038211156200074557600080fd5b506020601f91909101601f19160190565b600160a060020a031690565b6001605060020a031690565b60005b838110156200078b57818101518382015260200162000771565b838111156200079b576000848401525b50505050565b61232780620007b16000396000f30060806040526004361061013a5763ffffffff60e060020a6000350416630c15c365811461013c578063165d35e114610167578063185e5b4014610189578063243d9a5d146101a95780633fad1834146101be5780634162cc88146101d357806356a6d508146101f35780635b69a7d8146102085780635fdc6281146102285780636f9fb98a1461023d578063715018a6146102525780637a50413d146102675780638da5cb5b1461027c5780638e15f47314610291578063a241c089146102a6578063ad2e8c9b146102bb578063b0b30fee146102d0578063b1b91f7a146102f2578063b807873214610312578063bbe4fd5014610327578063c032846b1461033c578063c974402914610351578063ce2ce3fc14610366578063dbc837c514610388578063dcbacd111461039d578063f2fde38b146103b2575b005b34801561014857600080fd5b506101516103d2565b60405161015e9190612199565b60405180910390f35b34801561017357600080fd5b5061017c6103d8565b60405161015e91906120b8565b34801561019557600080fd5b506101516101a4366004611d44565b6103e7565b3480156101b557600080fd5b506101516103fb565b3480156101ca57600080fd5b50610151610401565b3480156101df57600080fd5b506101516101ee366004611d44565b610407565b3480156101ff57600080fd5b50610151610414565b34801561021457600080fd5b5061017c610223366004611d44565b61041a565b34801561023457600080fd5b50610151610437565b34801561024957600080fd5b5061015161043c565b34801561025e57600080fd5b5061013a610441565b34801561027357600080fd5b506101516104ce565b34801561028857600080fd5b5061017c6104d4565b34801561029d57600080fd5b506101516104e3565b3480156102b257600080fd5b506101516105b0565b3480156102c757600080fd5b50610151610aea565b3480156102dc57600080fd5b506102e5610af0565b60405161015e919061218b565b3480156102fe57600080fd5b5061013a61030d366004611d0a565b610afe565b34801561031e57600080fd5b50610151610d06565b34801561033357600080fd5b50610151610d0b565b34801561034857600080fd5b506102e5610d0f565b34801561035d57600080fd5b50610151610d18565b34801561037257600080fd5b5061037b610d1e565b60405161015e91906121a7565b34801561039457600080fd5b5061017c610db4565b3480156103a957600080fd5b50610151610dc3565b3480156103be57600080fd5b5061013a6103cd366004611cce565b610dc9565b60185490565b60006103e2610e02565b905090565b601081600281106103f457fe5b0154905081565b600e5490565b601a5490565b601281600281106103f457fe5b60195490565b6014816002811061042757fe5b0154600160a060020a0316905081565b603c81565b303190565b600954600160a060020a031633146104775760405160e560020a62461bcd02815260040161046e90612208565b60405180910390fd5b600654604051600160a060020a03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a26006805473ffffffffffffffffffffffffffffffffffffffff19169055565b60165490565b600654600160a060020a031681565b600080600080600080600760009054906101000a9004600160a060020a0316600160a060020a031663feaf968c6040518163ffffffff1660e060020a02815260040160a060405180830381600087803b15801561053f57600080fd5b505af1158015610553573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105779190810190611d80565b945094509450945094506000821115156105a65760405160e560020a62461bcd02815260040161046e90612218565b5091949350505050565b60175460009060609060ff1615156001146105e05760405160e560020a62461bcd02815260040161046e906121e8565b6105e8610e11565b60175460ff1615610ae6576000601b5560408051606081018252603a81527f687474703a2f2f6170692e776f726c64776561746865726f6e6c696e652e636f60208083019182527f6d2f7072656d69756d2f76312f776561746865722e617368783f0000000000008385015283518085018552601e81527f36323963366464303962626334333634623761333338313032303039313100008183015293518351939493600f9391909201918291908083835b602083106106b95780518252601f19909201916020918201910161069a565b51815160209384036101000a60001901801990921691161790527f6b65793d00000000000000000000000000000000000000000000000000000000919093019081528551600490910192860191508083835b6020831061072a5780518252601f19909201916020918201910161070b565b6001836020036101000a038019825116818451168082178552505050505050905001807f26713d0000000000000000000000000000000000000000000000000000000000815250600301828054600181600116156101000203166002900480156107cb5780601f106107a95761010080835404028352918201916107cb565b820191906000526020600020905b8154815290600101906020018083116107b7575b50507f26666f726d61743d6a736f6e266e756d5f6f665f646179733d31000000000000815260408051600519818403018152601a9092019052945061088e9350601492506000915061081a9050565b0154600160a060020a031660126000015483606060405190810160405280602181526020017f646174612e63757272656e745f636f6e646974696f6e2e302e7072656369704d81526020017f4d0000000000000000000000000000000000000000000000000000000000000081525061109e565b50606060405190810160405280602781526020017f68747470733a2f2f6170692e776561746865726269742e696f2f76322e302f6381526020017f757272656e743f00000000000000000000000000000000000000000000000000815250600f6040805190810160405280602081526020017f35653035616566303734313034303166616334393162303665623965386663388152506040516020018084805190602001908083835b602083106109565780518252601f199092019160209182019101610937565b6001836020036101000a038019825116818451168082178552505050505050905001807f636974793d000000000000000000000000000000000000000000000000000000815250600501838054600181600116156101000203166002900480156109f75780601f106109d55761010080835404028352918201916109f7565b820191906000526020600020905b8154815290600101906020018083116109e3575b5050807f266b65793d00000000000000000000000000000000000000000000000000000081525060050182805190602001908083835b60208310610a4c5780518252601f199092019160209182019101610a2d565b6001836020036101000a03801982511681845116808217855250505050505090500193505050506040516020818303038152906040529050610ae460146001600281101515610a9757fe5b0154600160a060020a0316601260010154836040805190810160405280600d81526020017f646174612e302e7072656369700000000000000000000000000000000000000081525061109e565b505b5090565b600c5490565b601754610100900460ff1690565b6000828152600560205260409020548290600160a060020a03163314610b395760405160e560020a62461bcd02815260040161046e90612228565b600081815260056020526040808220805473ffffffffffffffffffffffffffffffffffffffff191690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a260175460ff161515600114610bb35760405160e560020a62461bcd02815260040161046e906121e8565b610bd6610bc8603c600c63ffffffff61122216565b603c9063ffffffff61123916565b601954610bea90429063ffffffff61123916565b11610c0a5760405160e560020a62461bcd02815260040161046e906121d8565b816010601b54600281101515610c1c57fe5b0155601b80546001908101918290551015610cca57601154601054610c5391600291610c479161124b565b9063ffffffff61122216565b601881905542601955601a805460010190551515610c7957601680546001019055610cb8565b60006016556018546040517f2e5a5a6cf30e14f6500f404203cc44691f83c62354f375539ea7d45bcc49230591610caf91612199565b60405180910390a15b601654600311610cca57610cca611258565b7f9acb88f10af47daa34522605143d1719bad9aa6562e4c443c8abb9d594ea73f482604051610cf99190612199565b60405180910390a1505050565b600381565b4290565b60175460ff1690565b600d5490565b600f8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610daa5780601f10610d7f57610100808354040283529160200191610daa565b820191906000526020600020905b815481529060010190602001808311610d8d57829003601f168201915b5050505050905090565b600954600160a060020a031681565b600b5490565b600954600160a060020a03163314610df65760405160e560020a62461bcd02815260040161046e90612208565b610dff81611455565b50565b600254600160a060020a031690565b600042600c54600b54011015610dff57600c54600290610e3890603c63ffffffff61122216565b03601a54101515610e8357600954604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015610e7d573d6000803e3d6000fd5b50610f11565b600a54600160a060020a03166108fc610eac610e9d6104e3565b600d549063ffffffff61122216565b6040518115909202916000818181858888f19350505050158015610ed4573d6000803e3d6000fd5b50600954604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015610f0f573d6000803e3d6000fd5b505b610f19610e02565b6009546040517f70a08231000000000000000000000000000000000000000000000000000000008152919250600160a060020a038084169263a9059cbb929091169083906370a0823190610f719030906004016120b8565b602060405180830381600087803b158015610f8b57600080fd5b505af1158015610f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610fc39190810190611d62565b6040518363ffffffff1660e060020a028152600401610fe39291906120c6565b602060405180830381600087803b158015610ffd57600080fd5b505af1158015611011573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110359190810190611cec565b15156110565760405160e560020a62461bcd02815260040161046e906121b8565b6017805460ff191690556040517f71d9f146944417dd66115a997376d9878c3618f396c331a6c3aa82ce653eae1490611093904290303190612238565b60405180910390a150565b60006110a8611c45565b60175460ff1615156001146110d25760405160e560020a62461bcd02815260040161046e906121e8565b6110fd85307fb1b91f7a000000000000000000000000000000000000000000000000000000006114d3565b60408051808201909152600381527f676574000000000000000000000000000000000000000000000000000000000060208201529091506111469082908663ffffffff6114fe16565b60408051808201909152600481527f7061746800000000000000000000000000000000000000000000000000000000602082015261118c9082908563ffffffff6114fe16565b60408051808201909152600581527f74696d657300000000000000000000000000000000000000000000000000000060208201526111d3908290606463ffffffff61152d16565b6111e08682600854611557565b91507f9b79db1508864f538c7703d2267a0c858007ee5877c83d83aec1b431e5add541826040516112119190612199565b60405180910390a150949350505050565b6000818381151561122f57fe5b0490505b92915050565b60008282111561124557fe5b50900390565b8181018281101561123357fe5b60175460009060ff1615156001146112855760405160e560020a62461bcd02815260040161046e906121e8565b600a54604051600160a060020a0390911690303180156108fc02916000818181858888f193505050501580156112bf573d6000803e3d6000fd5b506112c8610e02565b6009546040517f70a08231000000000000000000000000000000000000000000000000000000008152919250600160a060020a038084169263a9059cbb929091169083906370a08231906113209030906004016120b8565b602060405180830381600087803b15801561133a57600080fd5b505af115801561134e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113729190810190611d62565b6040518363ffffffff1660e060020a0281526004016113929291906120c6565b602060405180830381600087803b1580156113ac57600080fd5b505af11580156113c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113e49190810190611cec565b15156114055760405160e560020a62461bcd02815260040161046e906121f8565b600e546018546040517fd8874104029b491ba57b1b4875bd4ba8d4a98bf0261e1fdfac96db44022f95f89261143b924292612246565b60405180910390a1506017805461ffff1916610100179055565b600160a060020a038116151561146a57600080fd5b600654604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6114db611c45565b6114e3611c45565b6114f58186868663ffffffff61172616565b95945050505050565b6080830151611513908363ffffffff61178116565b6080830151611528908263ffffffff61178116565b505050565b6080830151611542908363ffffffff61178116565b6080830151611528908263ffffffff61179e16565b6000306004546040516020018083600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401828152602001925050506040516020818303038152906040526040518082805190602001908083835b602083106115d35780518252601f1990920191602091820191016115b4565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912060045460608a015260008181526005909252838220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038c1617905592519295508594507fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af99350919050a2600254600160a060020a0316634000aea0858461168187611800565b6040518463ffffffff1660e060020a0281526004016116a29392919061215e565b602060405180830381600087803b1580156116bc57600080fd5b505af11580156116d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116f49190810190611cec565b15156117155760405160e560020a62461bcd02815260040161046e906121c8565b6004805460010190555b9392505050565b61172e611c45565b61173e85608001516101006118bd565b5050828452600160a060020a03821660208501527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1981166040850152835b949350505050565b61178e82600383516118f7565b611528828263ffffffff6119fa16565b67ffffffffffffffff198112156117be576117b98282611a14565b6117fc565b67ffffffffffffffff8113156117d8576117b98282611a53565b600081126117ec576117b9826000836118f7565b6117fc82600183600019036118f7565b5050565b80516020820151604080840151606085810151608087015151935191957f40429946000000000000000000000000000000000000000000000000000000009561185a956000958695939492939092916001916024016120e1565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19909316929092179091529050919050565b6118c5611c7a565b60208206156118da5760208206602003820191505b506020828101829052604080518085526000815290920101905290565b60178111611919576119138360ff848116602002168317611a7a565b50611528565b60ff811161194d5761193a836018602060ff8616021763ffffffff611a7a16565b506119138382600163ffffffff611a9216565b61ffff81116119825761196f836019602060ff8616021763ffffffff611a7a16565b506119138382600263ffffffff611a9216565b63ffffffff81116119b9576119a683601a602060ff8616021763ffffffff611a7a16565b506119138382600463ffffffff611a9216565b67ffffffffffffffff8111611528576119e183601b602060ff8616021763ffffffff611a7a16565b506119f48382600863ffffffff611a9216565b50505050565b611a02611c7a565b61171f83846000015151848551611aab565b611a258260c363ffffffff611a7a16565b506117fc828260001903604051602001611a3f9190612199565b604051602081830303815290604052611b61565b611a648260c263ffffffff611a7a16565b506117fc8282604051602001611a3f9190612199565b611a82611c7a565b61171f8384600001515184611b6e565b611a9a611c7a565b611779848560000151518585611bb9565b611ab3611c7a565b600080600085518511151515611ac857600080fd5b87602001518588011115611af257611af288611aea8a602001518a8901611c17565b600202611c2e565b875180518860208301019450808988011115611b0e5788870182525b60208801935050505b60208510611b395781518352601f199094019360209283019290910190611b17565b505181516020949094036101000a600019018019909116931692909217909152509192915050565b61178e82600283516118f7565b611b76611c7a565b60208401518310611b9257611b92848560200151600202611c2e565b8351805160208583010184815381861415611bae576001820183525b509495945050505050565b611bc1611c7a565b600085602001518584011115611be057611be086868501600202611c2e565b6001836101000a0390508551838682010185831982511617815281518588011115611c0b5784870182525b50959695505050505050565b600081831115611c28575081611233565b50919050565b8151611c3a83836118bd565b506119f483826119fa565b6040805160c081018252600080825260208201819052918101829052606081019190915260808101611c75611c7a565b905290565b60408051808201909152606081526000602082015290565b600061171f8235612272565b600061171f825161227e565b600061171f8235612283565b600061171f8251612283565b600061171f82516122a8565b600060208284031215611ce057600080fd5b60006117798484611c92565b600060208284031215611cfe57600080fd5b60006117798484611c9e565b60008060408385031215611d1d57600080fd5b6000611d298585611caa565b9250506020611d3a85828601611caa565b9150509250929050565b600060208284031215611d5657600080fd5b60006117798484611caa565b600060208284031215611d7457600080fd5b60006117798484611cb6565b600080600080600060a08688031215611d9857600080fd5b6000611da48888611cc2565b9550506020611db588828901611cb6565b9450506040611dc688828901611cb6565b9350506060611dd788828901611cb6565b9250506080611de888828901611cc2565b9150509295509295909350565b611dfe81612272565b82525050565b611dfe8161227e565b611dfe81612283565b611dfe81612286565b6000611e2a8261226e565b808452611e3e8160208601602086016122b7565b611e47816122e3565b9093016020019392505050565b602881527f556e61626c6520746f207472616e736665722072656d61696e696e67204c494e60208201527f4b20746f6b656e73000000000000000000000000000000000000000000000000604082015260600190565b602381527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160208201527f636c650000000000000000000000000000000000000000000000000000000000604082015260600190565b602481527f43616e206f6e6c7920636865636b207261696e66616c6c206f6e63652070657260208201527f2064617900000000000000000000000000000000000000000000000000000000604082015260600190565b603181527f436f6e74726163742068617320656e6465642c2063616e7420696e746572616360208201527f74207769746820697420616e796d6f7265000000000000000000000000000000604082015260600190565b601281527f556e61626c6520746f207472616e736665720000000000000000000000000000602082015260400190565b602381527f4f6e6c7920496e737572616e63652070726f76696465722063616e20646f207460208201527f6869730000000000000000000000000000000000000000000000000000000000604082015260600190565b601281527f526f756e64206e6f7420636f6d706c6574650000000000000000000000000000602082015260400190565b602881527f536f75726365206d75737420626520746865206f7261636c65206f662074686560208201527f2072657175657374000000000000000000000000000000000000000000000000604082015260600190565b602081016112338284611df5565b604081016120d48285611df5565b61171f6020830184611e0d565b61010081016120f0828b611df5565b6120fd602083018a611e0d565b61210a6040830189611e0d565b6121176060830188611df5565b6121246080830187611e16565b61213160a0830186611e0d565b61213e60c0830185611e0d565b81810360e08301526121508184611e1f565b9a9950505050505050505050565b6060810161216c8286611df5565b6121796020830185611e0d565b81810360408301526114f58184611e1f565b602081016112338284611e04565b602081016112338284611e0d565b6020808252810161171f8184611e1f565b6020808252810161123381611e54565b6020808252810161123381611eaa565b6020808252810161123381611f00565b6020808252810161123381611f56565b6020808252810161123381611fac565b6020808252810161123381611fdc565b6020808252810161123381612032565b6020808252810161123381612062565b604081016120d48285611e0d565b606081016122548286611e0d565b6122616020830185611e0d565b6117796040830184611e0d565b5190565b600160a060020a031690565b151590565b90565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690565b69ffffffffffffffffffff1690565b60005b838110156122d25781810151838201526020016122ba565b838111156119f45750506000910152565b601f01601f1916905600a265627a7a72305820ae7c6b1bc3e9c37bd83ce7ef0d6ebc72ee71c196bd8a89b84fa508d5c11d3f406c6578706572696d656e74616cf50037a265627a7a723058206a9ff78faeb5974430352b268145bc943bed6f9b68339ef70368b5e9bb8d6c6e6c6578706572696d656e74616cf50037", | |
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP1 DUP2 AND CALLER OR SWAP1 SWAP2 SSTORE PUSH1 0x1 DUP1 SLOAD SWAP1 SWAP2 AND PUSH20 0x9326BFA02ADD2366B30BACB125260AF641031331 OR SWAP1 SSTORE PUSH2 0x3A59 DUP1 PUSH2 0x47 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH3 0xB9 JUMPI PUSH4 0xFFFFFFFF PUSH1 0xE0 PUSH1 0x2 EXP PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0xAD1C2FA DUP2 EQ PUSH3 0xBB JUMPI DUP1 PUSH4 0x125716D6 EQ PUSH3 0xF8 JUMPI DUP1 PUSH4 0x5D0C1476 EQ PUSH3 0x12C JUMPI DUP1 PUSH4 0x5FDC6281 EQ PUSH3 0x153 JUMPI DUP1 PUSH4 0x6896C870 EQ PUSH3 0x17A JUMPI DUP1 PUSH4 0x6F9FB98A EQ PUSH3 0x19F JUMPI DUP1 PUSH4 0x71F28640 EQ PUSH3 0x1B7 JUMPI DUP1 PUSH4 0x7C463DB0 EQ PUSH3 0x1DC JUMPI DUP1 PUSH4 0x8E15F473 EQ PUSH3 0x1F4 JUMPI DUP1 PUSH4 0xA1219C42 EQ PUSH3 0x20C JUMPI DUP1 PUSH4 0xDBC837C5 EQ PUSH3 0x216 JUMPI DUP1 PUSH4 0xDFDF79E8 EQ PUSH3 0x22E JUMPI DUP1 PUSH4 0xE3DB17B8 EQ PUSH3 0x245 JUMPI JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH3 0xC8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0xE0 PUSH3 0xDA CALLDATASIZE PUSH1 0x4 PUSH3 0xA7E JUMP JUMPDEST PUSH3 0x26A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0xEF SWAP2 SWAP1 PUSH3 0xE23 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH3 0x105 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0x11D PUSH3 0x117 CALLDATASIZE PUSH1 0x4 PUSH3 0xA7E JUMP JUMPDEST PUSH3 0x288 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0xEF SWAP2 SWAP1 PUSH3 0xE13 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH3 0x139 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0x144 PUSH3 0x30F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0xEF SWAP2 SWAP1 PUSH3 0xD39 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH3 0x160 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0x16B PUSH3 0x31E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0xEF SWAP2 SWAP1 PUSH3 0xE33 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH3 0x187 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0x16B PUSH3 0x199 CALLDATASIZE PUSH1 0x4 PUSH3 0xA7E JUMP JUMPDEST PUSH3 0x323 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH3 0x1AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0x16B PUSH3 0x3A3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH3 0x1C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0x16B PUSH3 0x1D6 CALLDATASIZE PUSH1 0x4 PUSH3 0xA7E JUMP JUMPDEST PUSH3 0x3A8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH3 0x1E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0x144 PUSH3 0x3ED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH3 0x201 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0x16B PUSH3 0x405 JUMP JUMPDEST PUSH3 0xB9 PUSH3 0x4E2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH3 0x223 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0x144 PUSH3 0x672 JUMP JUMPDEST PUSH3 0x144 PUSH3 0x23F CALLDATASIZE PUSH1 0x4 PUSH3 0xAC8 JUMP JUMPDEST PUSH3 0x681 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH3 0x252 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0xB9 PUSH3 0x264 CALLDATASIZE PUSH1 0x4 PUSH3 0xA7E JUMP JUMPDEST PUSH3 0x8F4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0xC032846B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x2CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x2E2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x308 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0xB61 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x3C DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0x3FAD1834 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x368 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x37D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x308 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0xB82 JUMP JUMPDEST ADDRESS BALANCE SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0xC15C365 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x368 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xA36085F69E2889C224210F603D836748E7DC0088 DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0xFEAF968C PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0xA0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x462 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x477 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x49D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0xBA3 JUMP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP PUSH1 0x0 DUP3 GT ISZERO ISZERO PUSH3 0x4D8 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x4CF SWAP1 PUSH3 0xE67 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH3 0x513 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x4CF SWAP1 PUSH3 0xE55 JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xA36085F69E2889C224210F603D836748E7DC0088 SWAP1 DUP2 SWAP1 PUSH4 0xA9059CBB SWAP1 CALLER SWAP1 DUP4 SWAP1 PUSH4 0x70A08231 SWAP1 PUSH3 0x572 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH3 0xD39 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x58D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x5A2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x5C8 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0xB82 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x5EA SWAP3 SWAP2 SWAP1 PUSH3 0xD49 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x605 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x61A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x640 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0xB61 JUMP JUMPDEST ISZERO ISZERO PUSH3 0x664 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x4CF SWAP1 PUSH3 0xE43 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SELFDESTRUCT JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD DUP2 SWAP1 DUP2 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH3 0x6B6 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x4CF SWAP1 PUSH3 0xE55 JUMP JUMPDEST PUSH3 0x6DC PUSH3 0x6C4 PUSH3 0x405 JUMP JUMPDEST PUSH8 0xDE0B6B3A7640000 DUP8 MUL SWAP1 PUSH4 0xFFFFFFFF PUSH3 0x978 AND JUMP JUMPDEST DUP9 DUP9 DUP9 DUP9 DUP9 PUSH20 0xA36085F69E2889C224210F603D836748E7DC0088 PUSH8 0x16345785D8A0000 PUSH3 0x709 PUSH3 0x9BD JUMP JUMPDEST PUSH3 0x71B SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH3 0xD96 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 DUP3 CREATE DUP1 ISZERO DUP1 ISZERO PUSH3 0x737 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE MLOAD SWAP1 SWAP4 POP PUSH32 0xA44AA7756C3391A11525EEEE40213754BF3AEE2A051D2597433FB40572A47D76 SWAP2 POP PUSH3 0x7A9 SWAP1 DUP5 SWAP1 CALLVALUE SWAP1 DUP10 SWAP1 PUSH3 0xD68 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0x165D35E1 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x7F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x805 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x82B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0xAA7 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH4 0xA9059CBB DUP4 PUSH3 0x858 PUSH8 0x16345785D8A0000 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH3 0x990 AND JUMP JUMPDEST PUSH3 0x86B DUP12 PUSH1 0x3C PUSH4 0xFFFFFFFF PUSH3 0x978 AND JUMP JUMPDEST PUSH1 0x2 ADD MUL PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x891 SWAP3 SWAP2 SWAP1 PUSH3 0xD49 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x8AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x8C1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x8E7 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0xB61 JUMP JUMPDEST POP SWAP1 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0xA241C089 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x938 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x94D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x973 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0xB82 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 DUP2 ISZERO ISZERO PUSH3 0x986 JUMPI INVALID JUMPDEST DIV SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 ISZERO ISZERO PUSH3 0x9A3 JUMPI POP PUSH1 0x0 PUSH3 0x98A JUMP JUMPDEST POP DUP2 DUP2 MUL DUP2 DUP4 DUP3 DUP2 ISZERO ISZERO PUSH3 0x9B4 JUMPI INVALID JUMPDEST DIV EQ PUSH3 0x98A JUMPI INVALID JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2AD8 DUP1 PUSH3 0xF48 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x308 DUP3 CALLDATALOAD PUSH3 0xECE JUMP JUMPDEST PUSH1 0x0 PUSH3 0x308 DUP3 MLOAD PUSH3 0xECE JUMP JUMPDEST PUSH1 0x0 PUSH3 0x308 DUP3 MLOAD PUSH3 0xEDA JUMP JUMPDEST PUSH1 0x0 PUSH3 0x308 DUP3 MLOAD PUSH3 0xEDF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH3 0xA18 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH3 0xA2F PUSH3 0xA29 DUP3 PUSH3 0xEA1 JUMP JUMPDEST PUSH3 0xE79 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH3 0xA4C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0xA59 DUP4 DUP3 DUP5 PUSH3 0xEFE JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x308 DUP3 CALLDATALOAD PUSH3 0xEDF JUMP JUMPDEST PUSH1 0x0 PUSH3 0x308 DUP3 MLOAD PUSH3 0xEE2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0xA91 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0xA9F DUP5 DUP5 PUSH3 0x9CE JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0xABA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0xA9F DUP5 DUP5 PUSH3 0x9DC JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH3 0xAE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0xAEF DUP9 DUP9 PUSH3 0x9CE JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH3 0xB02 DUP9 DUP3 DUP10 ADD PUSH3 0xA62 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH3 0xB15 DUP9 DUP3 DUP10 ADD PUSH3 0xA62 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 PUSH3 0xB28 DUP9 DUP3 DUP10 ADD PUSH3 0xA62 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0xB46 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0xB54 DUP9 DUP3 DUP10 ADD PUSH3 0xA06 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0xB74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0xA9F DUP5 DUP5 PUSH3 0x9EA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0xB95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0xA9F DUP5 DUP5 PUSH3 0x9F8 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH3 0xBBC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0xBCA DUP9 DUP9 PUSH3 0xA70 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH3 0xBDD DUP9 DUP3 DUP10 ADD PUSH3 0x9F8 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH3 0xBF0 DUP9 DUP3 DUP10 ADD PUSH3 0x9F8 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 PUSH3 0xC03 DUP9 DUP3 DUP10 ADD PUSH3 0x9F8 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 PUSH3 0xB54 DUP9 DUP3 DUP10 ADD PUSH3 0xA70 JUMP JUMPDEST PUSH3 0xC21 DUP2 PUSH3 0xECE JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH3 0xC21 DUP2 PUSH3 0xEDA JUMP JUMPDEST PUSH3 0xC21 DUP2 PUSH3 0xEF1 JUMP JUMPDEST PUSH3 0xC21 DUP2 PUSH3 0xEDF JUMP JUMPDEST PUSH1 0x0 PUSH3 0xC55 DUP3 PUSH3 0xECA JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH3 0xC6B DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH3 0xF0A JUMP JUMPDEST PUSH3 0xC76 DUP2 PUSH3 0xF3D JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x556E61626C6520746F207472616E736665720000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x4F6E6C7920496E737572616E63652070726F76696465722063616E20646F2074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6869730000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x526F756E64206E6F7420636F6D706C6574650000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH3 0x98A DUP3 DUP5 PUSH3 0xC16 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH3 0xD59 DUP3 DUP6 PUSH3 0xC16 JUMP JUMPDEST PUSH3 0x308 PUSH1 0x20 DUP4 ADD DUP5 PUSH3 0xC3D JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH3 0xD78 DUP3 DUP7 PUSH3 0xC16 JUMP JUMPDEST PUSH3 0xD87 PUSH1 0x20 DUP4 ADD DUP6 PUSH3 0xC3D JUMP JUMPDEST PUSH3 0xA9F PUSH1 0x40 DUP4 ADD DUP5 PUSH3 0xC3D JUMP JUMPDEST PUSH1 0xE0 DUP2 ADD PUSH3 0xDA6 DUP3 DUP11 PUSH3 0xC16 JUMP JUMPDEST PUSH3 0xDB5 PUSH1 0x20 DUP4 ADD DUP10 PUSH3 0xC3D JUMP JUMPDEST PUSH3 0xDC4 PUSH1 0x40 DUP4 ADD DUP9 PUSH3 0xC3D JUMP JUMPDEST PUSH3 0xDD3 PUSH1 0x60 DUP4 ADD DUP8 PUSH3 0xC3D JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x80 DUP4 ADD MSTORE PUSH3 0xDE7 DUP2 DUP7 PUSH3 0xC48 JUMP JUMPDEST SWAP1 POP PUSH3 0xDF8 PUSH1 0xA0 DUP4 ADD DUP6 PUSH3 0xC16 JUMP JUMPDEST PUSH3 0xE07 PUSH1 0xC0 DUP4 ADD DUP5 PUSH3 0xC3D JUMP JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH3 0x98A DUP3 DUP5 PUSH3 0xC27 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH3 0x98A DUP3 DUP5 PUSH3 0xC32 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH3 0x98A DUP3 DUP5 PUSH3 0xC3D JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH3 0x98A DUP2 PUSH3 0xC83 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH3 0x98A DUP2 PUSH3 0xCB3 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH3 0x98A DUP2 PUSH3 0xD09 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH3 0xE99 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH3 0xEB9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH10 0xFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x98A DUP3 PUSH3 0xECE JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0xF27 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0xF0D JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0xF37 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP PUSH1 0x80 PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x4 SSTORE PUSH1 0x17 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE PUSH1 0x0 PUSH1 0x18 DUP2 SWAP1 SSTORE TIMESTAMP PUSH1 0x19 SSTORE PUSH1 0x1A DUP2 SWAP1 SSTORE PUSH1 0x1B SSTORE PUSH3 0x2AD8 CODESIZE DUP2 SWAP1 SUB SWAP1 DUP2 SWAP1 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x4B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x4A2 JUMP JUMPDEST PUSH1 0x6 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP1 DUP2 AND CALLER OR SWAP1 SWAP2 SSTORE PUSH1 0x7 DUP1 SLOAD SWAP1 SWAP2 AND PUSH20 0x9326BFA02ADD2366B30BACB125260AF641031331 OR SWAP1 SSTORE PUSH3 0x93 DUP3 PUSH5 0x100000000 PUSH3 0x234 DUP2 MUL DIV JUMP JUMPDEST PUSH1 0x8 DUP2 SWAP1 SSTORE PUSH3 0xC5 PUSH3 0xAF PUSH5 0x100000000 PUSH3 0x256 DUP2 MUL DIV JUMP JUMPDEST DUP6 SWAP1 PUSH5 0x100000000 PUSH3 0x1222 PUSH3 0x35A DUP3 MUL OR DIV JUMP JUMPDEST CALLVALUE LT ISZERO PUSH3 0x10A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x101 SWAP1 PUSH3 0x6DD JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x9 DUP1 SLOAD CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0xA DUP1 SLOAD SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP10 AND OR SWAP1 SSTORE TIMESTAMP PUSH1 0xB SSTORE PUSH1 0xC DUP7 SWAP1 SSTORE PUSH1 0xD DUP6 SWAP1 SSTORE PUSH1 0xE DUP5 SWAP1 SSTORE PUSH1 0x0 PUSH1 0x16 SSTORE PUSH1 0x17 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE DUP3 MLOAD PUSH3 0x16D SWAP1 PUSH1 0xF SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH3 0x370 JUMP JUMPDEST POP PUSH1 0x14 DUP1 SLOAD PUSH20 0x5C8FADF1798437C143683E665800D58A42B6E19 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH1 0x15 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE PUSH32 0x6131376538666266346362663436656562373965303462336562383634613465 PUSH1 0x12 DUP2 SWAP1 SSTORE PUSH1 0x13 SSTORE PUSH1 0x9 SLOAD PUSH1 0xA SLOAD PUSH1 0xC SLOAD PUSH1 0xD SLOAD PUSH1 0xE SLOAD PUSH1 0x40 MLOAD PUSH32 0x203790CAE2EA31823A6382172BD46011FCFBAB29B22BB78B4B2F266FEBF6072 SWAP6 PUSH3 0x21F SWAP6 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP2 DUP3 AND SWAP6 SWAP2 AND SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 PUSH3 0x687 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP POP PUSH3 0x7A1 JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x7 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0xFEAF968C PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0xA0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x2CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x2E1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x307 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x565 JUMP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP PUSH1 0x0 DUP3 GT ISZERO ISZERO PUSH3 0x350 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x101 SWAP1 PUSH3 0x6F5 JUMP JUMPDEST POP SWAP2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 DUP2 ISZERO ISZERO PUSH3 0x368 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x3B3 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x3E3 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x3E3 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x3E3 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x3C6 JUMP JUMPDEST POP PUSH3 0x3F1 SWAP3 SWAP2 POP PUSH3 0x3F5 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x412 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x3F1 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x3FC JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x423 DUP3 MLOAD PUSH3 0x756 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x423 DUP3 MLOAD PUSH3 0x412 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH3 0x44A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x461 PUSH3 0x45B DUP3 PUSH3 0x72E JUMP JUMPDEST PUSH3 0x707 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH3 0x47E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x48B DUP4 DUP3 DUP5 PUSH3 0x76E JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x423 DUP3 MLOAD PUSH3 0x762 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH3 0x4BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x4CC DUP11 DUP11 PUSH3 0x415 JUMP JUMPDEST SWAP8 POP POP PUSH1 0x20 PUSH3 0x4DF DUP11 DUP3 DUP12 ADD PUSH3 0x42A JUMP JUMPDEST SWAP7 POP POP PUSH1 0x40 PUSH3 0x4F2 DUP11 DUP3 DUP12 ADD PUSH3 0x42A JUMP JUMPDEST SWAP6 POP POP PUSH1 0x60 PUSH3 0x505 DUP11 DUP3 DUP12 ADD PUSH3 0x42A JUMP JUMPDEST SWAP5 POP POP PUSH1 0x80 DUP9 ADD MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x522 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x530 DUP11 DUP3 DUP12 ADD PUSH3 0x438 JUMP JUMPDEST SWAP4 POP POP PUSH1 0xA0 PUSH3 0x543 DUP11 DUP3 DUP12 ADD PUSH3 0x415 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xC0 PUSH3 0x556 DUP11 DUP3 DUP12 ADD PUSH3 0x42A JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH3 0x57E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x58C DUP9 DUP9 PUSH3 0x494 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH3 0x59F DUP9 DUP3 DUP10 ADD PUSH3 0x42A JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH3 0x5B2 DUP9 DUP3 DUP10 ADD PUSH3 0x42A JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 PUSH3 0x5C5 DUP9 DUP3 DUP10 ADD PUSH3 0x42A JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 PUSH3 0x5D8 DUP9 DUP3 DUP10 ADD PUSH3 0x494 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH3 0x5F0 DUP2 PUSH3 0x756 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x21 DUP2 MSTORE PUSH32 0x4E6F7420656E6F7567682066756E64732073656E7420746F20636F6E74726163 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x7400000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x526F756E64206E6F7420636F6D706C6574650000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH3 0x5F0 DUP2 PUSH3 0x412 JUMP JUMPDEST PUSH1 0xA0 DUP2 ADD PUSH3 0x697 DUP3 DUP9 PUSH3 0x5E5 JUMP JUMPDEST PUSH3 0x6A6 PUSH1 0x20 DUP4 ADD DUP8 PUSH3 0x5E5 JUMP JUMPDEST PUSH3 0x6B5 PUSH1 0x40 DUP4 ADD DUP7 PUSH3 0x67C JUMP JUMPDEST PUSH3 0x6C4 PUSH1 0x60 DUP4 ADD DUP6 PUSH3 0x67C JUMP JUMPDEST PUSH3 0x6D3 PUSH1 0x80 DUP4 ADD DUP5 PUSH3 0x67C JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH3 0x6EF DUP2 PUSH3 0x5F6 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH3 0x6EF DUP2 PUSH3 0x64C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH3 0x726 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP3 GT ISZERO PUSH3 0x745 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x50 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x78B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x771 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0x79B JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x2327 DUP1 PUSH3 0x7B1 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x13A JUMPI PUSH4 0xFFFFFFFF PUSH1 0xE0 PUSH1 0x2 EXP PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0xC15C365 DUP2 EQ PUSH2 0x13C JUMPI DUP1 PUSH4 0x165D35E1 EQ PUSH2 0x167 JUMPI DUP1 PUSH4 0x185E5B40 EQ PUSH2 0x189 JUMPI DUP1 PUSH4 0x243D9A5D EQ PUSH2 0x1A9 JUMPI DUP1 PUSH4 0x3FAD1834 EQ PUSH2 0x1BE JUMPI DUP1 PUSH4 0x4162CC88 EQ PUSH2 0x1D3 JUMPI DUP1 PUSH4 0x56A6D508 EQ PUSH2 0x1F3 JUMPI DUP1 PUSH4 0x5B69A7D8 EQ PUSH2 0x208 JUMPI DUP1 PUSH4 0x5FDC6281 EQ PUSH2 0x228 JUMPI DUP1 PUSH4 0x6F9FB98A EQ PUSH2 0x23D JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x252 JUMPI DUP1 PUSH4 0x7A50413D EQ PUSH2 0x267 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x27C JUMPI DUP1 PUSH4 0x8E15F473 EQ PUSH2 0x291 JUMPI DUP1 PUSH4 0xA241C089 EQ PUSH2 0x2A6 JUMPI DUP1 PUSH4 0xAD2E8C9B EQ PUSH2 0x2BB JUMPI DUP1 PUSH4 0xB0B30FEE EQ PUSH2 0x2D0 JUMPI DUP1 PUSH4 0xB1B91F7A EQ PUSH2 0x2F2 JUMPI DUP1 PUSH4 0xB8078732 EQ PUSH2 0x312 JUMPI DUP1 PUSH4 0xBBE4FD50 EQ PUSH2 0x327 JUMPI DUP1 PUSH4 0xC032846B EQ PUSH2 0x33C JUMPI DUP1 PUSH4 0xC9744029 EQ PUSH2 0x351 JUMPI DUP1 PUSH4 0xCE2CE3FC EQ PUSH2 0x366 JUMPI DUP1 PUSH4 0xDBC837C5 EQ PUSH2 0x388 JUMPI DUP1 PUSH4 0xDCBACD11 EQ PUSH2 0x39D JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x3B2 JUMPI JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x148 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x3D2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15E SWAP2 SWAP1 PUSH2 0x2199 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x173 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17C PUSH2 0x3D8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15E SWAP2 SWAP1 PUSH2 0x20B8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x195 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x1A4 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D44 JUMP JUMPDEST PUSH2 0x3E7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x3FB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x401 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x1EE CALLDATASIZE PUSH1 0x4 PUSH2 0x1D44 JUMP JUMPDEST PUSH2 0x407 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x414 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x214 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17C PUSH2 0x223 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D44 JUMP JUMPDEST PUSH2 0x41A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x234 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x437 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x249 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x43C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x25E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13A PUSH2 0x441 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x273 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x4CE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x288 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17C PUSH2 0x4D4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x29D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x4E3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x5B0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0xAEA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E5 PUSH2 0xAF0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15E SWAP2 SWAP1 PUSH2 0x218B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13A PUSH2 0x30D CALLDATASIZE PUSH1 0x4 PUSH2 0x1D0A JUMP JUMPDEST PUSH2 0xAFE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x31E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0xD06 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x333 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0xD0B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x348 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E5 PUSH2 0xD0F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0xD18 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x37B PUSH2 0xD1E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15E SWAP2 SWAP1 PUSH2 0x21A7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x394 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17C PUSH2 0xDB4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0xDC3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13A PUSH2 0x3CD CALLDATASIZE PUSH1 0x4 PUSH2 0x1CCE JUMP JUMPDEST PUSH2 0xDC9 JUMP JUMPDEST PUSH1 0x18 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3E2 PUSH2 0xE02 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 PUSH1 0x2 DUP2 LT PUSH2 0x3F4 JUMPI INVALID JUMPDEST ADD SLOAD SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0xE SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1A SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 PUSH1 0x2 DUP2 LT PUSH2 0x3F4 JUMPI INVALID JUMPDEST PUSH1 0x19 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 PUSH1 0x2 DUP2 LT PUSH2 0x427 JUMPI INVALID JUMPDEST ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x3C DUP2 JUMP JUMPDEST ADDRESS BALANCE SWAP1 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x477 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x2208 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 PUSH32 0xF8DF31144D9C2F0F6B59D69B8B98ABD5459D07F2742C4DF920B25AAE33C64820 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH1 0x6 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x16 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x7 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0xFEAF968C PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0xA0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x53F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x553 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x577 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1D80 JUMP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP PUSH1 0x0 DUP3 GT ISZERO ISZERO PUSH2 0x5A6 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x2218 JUMP JUMPDEST POP SWAP2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x17 SLOAD PUSH1 0x0 SWAP1 PUSH1 0x60 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH1 0x1 EQ PUSH2 0x5E0 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21E8 JUMP JUMPDEST PUSH2 0x5E8 PUSH2 0xE11 JUMP JUMPDEST PUSH1 0x17 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xAE6 JUMPI PUSH1 0x0 PUSH1 0x1B SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x3A DUP2 MSTORE PUSH32 0x687474703A2F2F6170692E776F726C64776561746865726F6E6C696E652E636F PUSH1 0x20 DUP1 DUP4 ADD SWAP2 DUP3 MSTORE PUSH32 0x6D2F7072656D69756D2F76312F776561746865722E617368783F000000000000 DUP4 DUP6 ADD MSTORE DUP4 MLOAD DUP1 DUP6 ADD DUP6 MSTORE PUSH1 0x1E DUP2 MSTORE PUSH32 0x3632396336646430396262633433363462376133333831303230303931310000 DUP2 DUP4 ADD MSTORE SWAP4 MLOAD DUP4 MLOAD SWAP4 SWAP5 SWAP4 PUSH1 0xF SWAP4 SWAP2 SWAP1 SWAP3 ADD SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x6B9 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x69A JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH32 0x6B65793D00000000000000000000000000000000000000000000000000000000 SWAP2 SWAP1 SWAP4 ADD SWAP1 DUP2 MSTORE DUP6 MLOAD PUSH1 0x4 SWAP1 SWAP2 ADD SWAP3 DUP7 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x72A JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x70B JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD DUP1 PUSH32 0x26713D0000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x3 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x7CB JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x7A9 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x7CB JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x7B7 JUMPI JUMPDEST POP POP PUSH32 0x26666F726D61743D6A736F6E266E756D5F6F665F646179733D31000000000000 DUP2 MSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x5 NOT DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH1 0x1A SWAP1 SWAP3 ADD SWAP1 MSTORE SWAP5 POP PUSH2 0x88E SWAP4 POP PUSH1 0x14 SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH2 0x81A SWAP1 POP JUMP JUMPDEST ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x12 PUSH1 0x0 ADD SLOAD DUP4 PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x646174612E63757272656E745F636F6E646974696F6E2E302E7072656369704D DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4D00000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH2 0x109E JUMP JUMPDEST POP PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x68747470733A2F2F6170692E776561746865726269742E696F2F76322E302F63 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x757272656E743F00000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0xF PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x3565303561656630373431303430316661633439316230366562396538666338 DUP2 MSTORE POP PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP5 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x956 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x937 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD DUP1 PUSH32 0x636974793D000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x5 ADD DUP4 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x9F7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x9D5 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x9F7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x9E3 JUMPI JUMPDEST POP POP DUP1 PUSH32 0x266B65793D000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x5 ADD DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xA4C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xA2D JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP4 POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 POP PUSH2 0xAE4 PUSH1 0x14 PUSH1 0x1 PUSH1 0x2 DUP2 LT ISZERO ISZERO PUSH2 0xA97 JUMPI INVALID JUMPDEST ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x12 PUSH1 0x1 ADD SLOAD DUP4 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xD DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x646174612E302E70726563697000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH2 0x109E JUMP JUMPDEST POP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xC SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x17 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0xB39 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x2228 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 PUSH1 0x17 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH1 0x1 EQ PUSH2 0xBB3 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21E8 JUMP JUMPDEST PUSH2 0xBD6 PUSH2 0xBC8 PUSH1 0x3C PUSH1 0xC PUSH4 0xFFFFFFFF PUSH2 0x1222 AND JUMP JUMPDEST PUSH1 0x3C SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1239 AND JUMP JUMPDEST PUSH1 0x19 SLOAD PUSH2 0xBEA SWAP1 TIMESTAMP SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1239 AND JUMP JUMPDEST GT PUSH2 0xC0A JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21D8 JUMP JUMPDEST DUP2 PUSH1 0x10 PUSH1 0x1B SLOAD PUSH1 0x2 DUP2 LT ISZERO ISZERO PUSH2 0xC1C JUMPI INVALID JUMPDEST ADD SSTORE PUSH1 0x1B DUP1 SLOAD PUSH1 0x1 SWAP1 DUP2 ADD SWAP2 DUP3 SWAP1 SSTORE LT ISZERO PUSH2 0xCCA JUMPI PUSH1 0x11 SLOAD PUSH1 0x10 SLOAD PUSH2 0xC53 SWAP2 PUSH1 0x2 SWAP2 PUSH2 0xC47 SWAP2 PUSH2 0x124B JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1222 AND JUMP JUMPDEST PUSH1 0x18 DUP2 SWAP1 SSTORE TIMESTAMP PUSH1 0x19 SSTORE PUSH1 0x1A DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE ISZERO ISZERO PUSH2 0xC79 JUMPI PUSH1 0x16 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE PUSH2 0xCB8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x16 SSTORE PUSH1 0x18 SLOAD PUSH1 0x40 MLOAD PUSH32 0x2E5A5A6CF30E14F6500F404203CC44691F83C62354F375539EA7D45BCC492305 SWAP2 PUSH2 0xCAF SWAP2 PUSH2 0x2199 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST PUSH1 0x16 SLOAD PUSH1 0x3 GT PUSH2 0xCCA JUMPI PUSH2 0xCCA PUSH2 0x1258 JUMP JUMPDEST PUSH32 0x9ACB88F10AF47DAA34522605143D1719BAD9AA6562E4C443C8ABB9D594EA73F4 DUP3 PUSH1 0x40 MLOAD PUSH2 0xCF9 SWAP2 SWAP1 PUSH2 0x2199 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP JUMP JUMPDEST PUSH1 0x3 DUP2 JUMP JUMPDEST TIMESTAMP SWAP1 JUMP JUMPDEST PUSH1 0x17 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0xD SLOAD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xDAA JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xD7F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xDAA JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xD8D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0xB SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0xDF6 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x2208 JUMP JUMPDEST PUSH2 0xDFF DUP2 PUSH2 0x1455 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 TIMESTAMP PUSH1 0xC SLOAD PUSH1 0xB SLOAD ADD LT ISZERO PUSH2 0xDFF JUMPI PUSH1 0xC SLOAD PUSH1 0x2 SWAP1 PUSH2 0xE38 SWAP1 PUSH1 0x3C PUSH4 0xFFFFFFFF PUSH2 0x1222 AND JUMP JUMPDEST SUB PUSH1 0x1A SLOAD LT ISZERO ISZERO PUSH2 0xE83 JUMPI PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 ADDRESS BALANCE DUP1 ISZERO PUSH2 0x8FC MUL SWAP2 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xE7D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH2 0xF11 JUMP JUMPDEST PUSH1 0xA SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH2 0x8FC PUSH2 0xEAC PUSH2 0xE9D PUSH2 0x4E3 JUMP JUMPDEST PUSH1 0xD SLOAD SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1222 AND JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 ISZERO SWAP1 SWAP3 MUL SWAP2 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xED4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 ADDRESS BALANCE DUP1 ISZERO PUSH2 0x8FC MUL SWAP2 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xF0F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST PUSH2 0xF19 PUSH2 0xE02 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP5 AND SWAP3 PUSH4 0xA9059CBB SWAP3 SWAP1 SWAP2 AND SWAP1 DUP4 SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0xF71 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x20B8 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF9F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xFC3 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1D62 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xFE3 SWAP3 SWAP2 SWAP1 PUSH2 0x20C6 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xFFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1011 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1035 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1CEC JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1056 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21B8 JUMP JUMPDEST PUSH1 0x17 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x71D9F146944417DD66115A997376D9878C3618F396C331A6C3AA82CE653EAE14 SWAP1 PUSH2 0x1093 SWAP1 TIMESTAMP SWAP1 ADDRESS BALANCE SWAP1 PUSH2 0x2238 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10A8 PUSH2 0x1C45 JUMP JUMPDEST PUSH1 0x17 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH1 0x1 EQ PUSH2 0x10D2 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21E8 JUMP JUMPDEST PUSH2 0x10FD DUP6 ADDRESS PUSH32 0xB1B91F7A00000000000000000000000000000000000000000000000000000000 PUSH2 0x14D3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP2 MSTORE PUSH32 0x6765740000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH2 0x1146 SWAP1 DUP3 SWAP1 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x14FE AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0x7061746800000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x118C SWAP1 DUP3 SWAP1 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x14FE AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x5 DUP2 MSTORE PUSH32 0x74696D6573000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x11D3 SWAP1 DUP3 SWAP1 PUSH1 0x64 PUSH4 0xFFFFFFFF PUSH2 0x152D AND JUMP JUMPDEST PUSH2 0x11E0 DUP7 DUP3 PUSH1 0x8 SLOAD PUSH2 0x1557 JUMP JUMPDEST SWAP2 POP PUSH32 0x9B79DB1508864F538C7703D2267A0C858007EE5877C83D83AEC1B431E5ADD541 DUP3 PUSH1 0x40 MLOAD PUSH2 0x1211 SWAP2 SWAP1 PUSH2 0x2199 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 DUP2 ISZERO ISZERO PUSH2 0x122F JUMPI INVALID JUMPDEST DIV SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1245 JUMPI INVALID JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST DUP2 DUP2 ADD DUP3 DUP2 LT ISZERO PUSH2 0x1233 JUMPI INVALID JUMPDEST PUSH1 0x17 SLOAD PUSH1 0x0 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH1 0x1 EQ PUSH2 0x1285 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21E8 JUMP JUMPDEST PUSH1 0xA SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 ADDRESS BALANCE DUP1 ISZERO PUSH2 0x8FC MUL SWAP2 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x12BF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH2 0x12C8 PUSH2 0xE02 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP5 AND SWAP3 PUSH4 0xA9059CBB SWAP3 SWAP1 SWAP2 AND SWAP1 DUP4 SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0x1320 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x20B8 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x133A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x134E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1372 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1D62 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1392 SWAP3 SWAP2 SWAP1 PUSH2 0x20C6 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x13AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x13C0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x13E4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1CEC JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1405 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21F8 JUMP JUMPDEST PUSH1 0xE SLOAD PUSH1 0x18 SLOAD PUSH1 0x40 MLOAD PUSH32 0xD8874104029B491BA57B1B4875BD4BA8D4A98BF0261E1FDFAC96DB44022F95F8 SWAP3 PUSH2 0x143B SWAP3 TIMESTAMP SWAP3 PUSH2 0x2246 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP PUSH1 0x17 DUP1 SLOAD PUSH2 0xFFFF NOT AND PUSH2 0x100 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO ISZERO PUSH2 0x146A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x6 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x14DB PUSH2 0x1C45 JUMP JUMPDEST PUSH2 0x14E3 PUSH2 0x1C45 JUMP JUMPDEST PUSH2 0x14F5 DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x1726 AND JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x1513 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x1781 AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x1528 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x1781 AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x1542 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x1781 AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x1528 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x179E AND JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x15D3 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x15B4 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH1 0x4 SLOAD PUSH1 0x60 DUP11 ADD MSTORE PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP3 MSTORE DUP4 DUP3 KECCAK256 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP13 AND OR SWAP1 SSTORE SWAP3 MLOAD SWAP3 SWAP6 POP DUP6 SWAP5 POP PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP4 POP SWAP2 SWAP1 POP LOG2 PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0x1681 DUP8 PUSH2 0x1800 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x16A2 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x215E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x16BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x16D0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x16F4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1CEC JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1715 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21C8 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x172E PUSH2 0x1C45 JUMP JUMPDEST PUSH2 0x173E DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0x18BD JUMP JUMPDEST POP POP DUP3 DUP5 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x20 DUP6 ADD MSTORE PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT DUP2 AND PUSH1 0x40 DUP6 ADD MSTORE DUP4 JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x178E DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0x18F7 JUMP JUMPDEST PUSH2 0x1528 DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x19FA AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF NOT DUP2 SLT ISZERO PUSH2 0x17BE JUMPI PUSH2 0x17B9 DUP3 DUP3 PUSH2 0x1A14 JUMP JUMPDEST PUSH2 0x17FC JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 SGT ISZERO PUSH2 0x17D8 JUMPI PUSH2 0x17B9 DUP3 DUP3 PUSH2 0x1A53 JUMP JUMPDEST PUSH1 0x0 DUP2 SLT PUSH2 0x17EC JUMPI PUSH2 0x17B9 DUP3 PUSH1 0x0 DUP4 PUSH2 0x18F7 JUMP JUMPDEST PUSH2 0x17FC DUP3 PUSH1 0x1 DUP4 PUSH1 0x0 NOT SUB PUSH2 0x18F7 JUMP JUMPDEST POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x40 DUP1 DUP5 ADD MLOAD PUSH1 0x60 DUP6 DUP2 ADD MLOAD PUSH1 0x80 DUP8 ADD MLOAD MLOAD SWAP4 MLOAD SWAP2 SWAP6 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP6 PUSH2 0x185A SWAP6 PUSH1 0x0 SWAP6 DUP7 SWAP6 SWAP4 SWAP5 SWAP3 SWAP4 SWAP1 SWAP3 SWAP2 PUSH1 0x1 SWAP2 PUSH1 0x24 ADD PUSH2 0x20E1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x18C5 PUSH2 0x1C7A JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0x18DA JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0x1919 JUMPI PUSH2 0x1913 DUP4 PUSH1 0xFF DUP5 DUP2 AND PUSH1 0x20 MUL AND DUP4 OR PUSH2 0x1A7A JUMP JUMPDEST POP PUSH2 0x1528 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0x194D JUMPI PUSH2 0x193A DUP4 PUSH1 0x18 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x1913 DUP4 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1A92 AND JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0x1982 JUMPI PUSH2 0x196F DUP4 PUSH1 0x19 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x1913 DUP4 DUP3 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0x1A92 AND JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0x19B9 JUMPI PUSH2 0x19A6 DUP4 PUSH1 0x1A PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x1913 DUP4 DUP3 PUSH1 0x4 PUSH4 0xFFFFFFFF PUSH2 0x1A92 AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1528 JUMPI PUSH2 0x19E1 DUP4 PUSH1 0x1B PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x19F4 DUP4 DUP3 PUSH1 0x8 PUSH4 0xFFFFFFFF PUSH2 0x1A92 AND JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x1A02 PUSH2 0x1C7A JUMP JUMPDEST PUSH2 0x171F DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0x1AAB JUMP JUMPDEST PUSH2 0x1A25 DUP3 PUSH1 0xC3 PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x17FC DUP3 DUP3 PUSH1 0x0 NOT SUB PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x1A3F SWAP2 SWAP1 PUSH2 0x2199 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0x1B61 JUMP JUMPDEST PUSH2 0x1A64 DUP3 PUSH1 0xC2 PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x17FC DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x1A3F SWAP2 SWAP1 PUSH2 0x2199 JUMP JUMPDEST PUSH2 0x1A82 PUSH2 0x1C7A JUMP JUMPDEST PUSH2 0x171F DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0x1B6E JUMP JUMPDEST PUSH2 0x1A9A PUSH2 0x1C7A JUMP JUMPDEST PUSH2 0x1779 DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0x1BB9 JUMP JUMPDEST PUSH2 0x1AB3 PUSH2 0x1C7A JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP6 MLOAD DUP6 GT ISZERO ISZERO ISZERO PUSH2 0x1AC8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 PUSH1 0x20 ADD MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x1AF2 JUMPI PUSH2 0x1AF2 DUP9 PUSH2 0x1AEA DUP11 PUSH1 0x20 ADD MLOAD DUP11 DUP10 ADD PUSH2 0x1C17 JUMP JUMPDEST PUSH1 0x2 MUL PUSH2 0x1C2E JUMP JUMPDEST DUP8 MLOAD DUP1 MLOAD DUP9 PUSH1 0x20 DUP4 ADD ADD SWAP5 POP DUP1 DUP10 DUP9 ADD GT ISZERO PUSH2 0x1B0E JUMPI DUP9 DUP8 ADD DUP3 MSTORE JUMPDEST PUSH1 0x20 DUP9 ADD SWAP4 POP POP POP JUMPDEST PUSH1 0x20 DUP6 LT PUSH2 0x1B39 JUMPI DUP2 MLOAD DUP4 MSTORE PUSH1 0x1F NOT SWAP1 SWAP5 ADD SWAP4 PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1B17 JUMP JUMPDEST POP MLOAD DUP2 MLOAD PUSH1 0x20 SWAP5 SWAP1 SWAP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP2 AND SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x178E DUP3 PUSH1 0x2 DUP4 MLOAD PUSH2 0x18F7 JUMP JUMPDEST PUSH2 0x1B76 PUSH2 0x1C7A JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP4 LT PUSH2 0x1B92 JUMPI PUSH2 0x1B92 DUP5 DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x2 MUL PUSH2 0x1C2E JUMP JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0x1BAE JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1BC1 PUSH2 0x1C7A JUMP JUMPDEST PUSH1 0x0 DUP6 PUSH1 0x20 ADD MLOAD DUP6 DUP5 ADD GT ISZERO PUSH2 0x1BE0 JUMPI PUSH2 0x1BE0 DUP7 DUP7 DUP6 ADD PUSH1 0x2 MUL PUSH2 0x1C2E JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x1C0B JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0x1C28 JUMPI POP DUP2 PUSH2 0x1233 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP2 MLOAD PUSH2 0x1C3A DUP4 DUP4 PUSH2 0x18BD JUMP JUMPDEST POP PUSH2 0x19F4 DUP4 DUP3 PUSH2 0x19FA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x1C75 PUSH2 0x1C7A JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x171F DUP3 CALLDATALOAD PUSH2 0x2272 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x171F DUP3 MLOAD PUSH2 0x227E JUMP JUMPDEST PUSH1 0x0 PUSH2 0x171F DUP3 CALLDATALOAD PUSH2 0x2283 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x171F DUP3 MLOAD PUSH2 0x2283 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x171F DUP3 MLOAD PUSH2 0x22A8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1CE0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1779 DUP5 DUP5 PUSH2 0x1C92 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1CFE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1779 DUP5 DUP5 PUSH2 0x1C9E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1D1D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1D29 DUP6 DUP6 PUSH2 0x1CAA JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x1D3A DUP6 DUP3 DUP7 ADD PUSH2 0x1CAA JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1779 DUP5 DUP5 PUSH2 0x1CAA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1779 DUP5 DUP5 PUSH2 0x1CB6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1D98 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1DA4 DUP9 DUP9 PUSH2 0x1CC2 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH2 0x1DB5 DUP9 DUP3 DUP10 ADD PUSH2 0x1CB6 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH2 0x1DC6 DUP9 DUP3 DUP10 ADD PUSH2 0x1CB6 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 PUSH2 0x1DD7 DUP9 DUP3 DUP10 ADD PUSH2 0x1CB6 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 PUSH2 0x1DE8 DUP9 DUP3 DUP10 ADD PUSH2 0x1CC2 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH2 0x1DFE DUP2 PUSH2 0x2272 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x1DFE DUP2 PUSH2 0x227E JUMP JUMPDEST PUSH2 0x1DFE DUP2 PUSH2 0x2283 JUMP JUMPDEST PUSH2 0x1DFE DUP2 PUSH2 0x2286 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1E2A DUP3 PUSH2 0x226E JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x1E3E DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x22B7 JUMP JUMPDEST PUSH2 0x1E47 DUP2 PUSH2 0x22E3 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x28 DUP2 MSTORE PUSH32 0x556E61626C6520746F207472616E736665722072656D61696E696E67204C494E PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4B20746F6B656E73000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x24 DUP2 MSTORE PUSH32 0x43616E206F6E6C7920636865636B207261696E66616C6C206F6E636520706572 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x2064617900000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x31 DUP2 MSTORE PUSH32 0x436F6E74726163742068617320656E6465642C2063616E7420696E7465726163 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x74207769746820697420616E796D6F7265000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x556E61626C6520746F207472616E736665720000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x4F6E6C7920496E737572616E63652070726F76696465722063616E20646F2074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6869730000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x526F756E64206E6F7420636F6D706C6574650000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x28 DUP2 MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x1233 DUP3 DUP5 PUSH2 0x1DF5 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x20D4 DUP3 DUP6 PUSH2 0x1DF5 JUMP JUMPDEST PUSH2 0x171F PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x100 DUP2 ADD PUSH2 0x20F0 DUP3 DUP12 PUSH2 0x1DF5 JUMP JUMPDEST PUSH2 0x20FD PUSH1 0x20 DUP4 ADD DUP11 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x210A PUSH1 0x40 DUP4 ADD DUP10 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x2117 PUSH1 0x60 DUP4 ADD DUP9 PUSH2 0x1DF5 JUMP JUMPDEST PUSH2 0x2124 PUSH1 0x80 DUP4 ADD DUP8 PUSH2 0x1E16 JUMP JUMPDEST PUSH2 0x2131 PUSH1 0xA0 DUP4 ADD DUP7 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x213E PUSH1 0xC0 DUP4 ADD DUP6 PUSH2 0x1E0D JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0xE0 DUP4 ADD MSTORE PUSH2 0x2150 DUP2 DUP5 PUSH2 0x1E1F JUMP JUMPDEST SWAP11 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x216C DUP3 DUP7 PUSH2 0x1DF5 JUMP JUMPDEST PUSH2 0x2179 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1E0D JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x14F5 DUP2 DUP5 PUSH2 0x1E1F JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x1233 DUP3 DUP5 PUSH2 0x1E04 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x1233 DUP3 DUP5 PUSH2 0x1E0D JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x171F DUP2 DUP5 PUSH2 0x1E1F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1E54 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1EAA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1F00 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1F56 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1FAC JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1FDC JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x2032 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x2062 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x20D4 DUP3 DUP6 PUSH2 0x1E0D JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x2254 DUP3 DUP7 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x2261 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x1779 PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x1E0D JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 JUMP JUMPDEST PUSH10 0xFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x22D2 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x22BA JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x19F4 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0xae PUSH29 0x6B1BC3E9C37BD83CE7EF0D6EBC72EE71C196BD8A89B84FA508D5C11D3F BLOCKHASH PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY LOG2 PUSH6 0x627A7A723058 KECCAK256 PUSH11 0x9FF78FAEB5974430352B26 DUP2 GASLIMIT 0xbc SWAP5 EXTCODESIZE 0xed PUSH16 0x9B68339EF70368B5E9BB8D6C6E6C6578 PUSH17 0x6572696D656E74616CF500370000000000 ", | |
"sourceMap": "1024:4971:0:-;;;1100:35;;;-1:-1:-1;;;;;;1100:35:0;;;1125:10;1100:35;;;;;1667:77;;;;;1701:42;1667:77;;;1024:4971;;;;;;" | |
}, | |
"deployedBytecode": { | |
"linkReferences": {}, | |
"object": "608060405260043610620000b95763ffffffff60e060020a6000350416630ad1c2fa8114620000bb578063125716d614620000f85780635d0c1476146200012c5780635fdc628114620001535780636896c870146200017a5780636f9fb98a146200019f57806371f2864014620001b75780637c463db014620001dc5780638e15f47314620001f4578063a1219c42146200020c578063dbc837c51462000216578063dfdf79e8146200022e578063e3db17b81462000245575b005b348015620000c857600080fd5b50620000e0620000da36600462000a7e565b6200026a565b604051620000ef919062000e23565b60405180910390f35b3480156200010557600080fd5b506200011d6200011736600462000a7e565b62000288565b604051620000ef919062000e13565b3480156200013957600080fd5b50620001446200030f565b604051620000ef919062000d39565b3480156200016057600080fd5b506200016b6200031e565b604051620000ef919062000e33565b3480156200018757600080fd5b506200016b6200019936600462000a7e565b62000323565b348015620001ac57600080fd5b506200016b620003a3565b348015620001c457600080fd5b506200016b620001d636600462000a7e565b620003a8565b348015620001e957600080fd5b5062000144620003ed565b3480156200020157600080fd5b506200016b62000405565b620000b9620004e2565b3480156200022357600080fd5b506200014462000672565b620001446200023f36600462000ac8565b62000681565b3480156200025257600080fd5b50620000b96200026436600462000a7e565b620008f4565b600160a060020a039081166000908152600260205260409020541690565b60008082905080600160a060020a031663c032846b6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015620002cd57600080fd5b505af1158015620002e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000308919081019062000b61565b9392505050565b600054600160a060020a031690565b603c81565b60008082905080600160a060020a0316633fad18346040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156200036857600080fd5b505af11580156200037d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000308919081019062000b82565b303190565b60008082905080600160a060020a0316630c15c3656040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156200036857600080fd5b73a36085f69e2889c224210f603d836748e7dc008881565b600080600080600080600160009054906101000a9004600160a060020a0316600160a060020a031663feaf968c6040518163ffffffff1660e060020a02815260040160a060405180830381600087803b1580156200046257600080fd5b505af115801562000477573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200049d919081019062000ba3565b94509450945094509450600082111515620004d85760405160e560020a62461bcd028152600401620004cf9062000e67565b60405180910390fd5b5091949350505050565b60008054600160a060020a03163314620005135760405160e560020a62461bcd028152600401620004cf9062000e55565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815273a36085f69e2889c224210f603d836748e7dc008890819063a9059cbb90339083906370a08231906200057290309060040162000d39565b602060405180830381600087803b1580156200058d57600080fd5b505af1158015620005a2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620005c8919081019062000b82565b6040518363ffffffff1660e060020a028152600401620005ea92919062000d49565b602060405180830381600087803b1580156200060557600080fd5b505af11580156200061a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000640919081019062000b61565b1515620006645760405160e560020a62461bcd028152600401620004cf9062000e43565b600054600160a060020a0316ff5b600054600160a060020a031681565b6000805481908190600160a060020a03163314620006b65760405160e560020a62461bcd028152600401620004cf9062000e55565b620006dc620006c462000405565b670de0b6b3a764000087029063ffffffff6200097816565b888888888873a36085f69e2889c224210f603d836748e7dc008867016345785d8a000062000709620009bd565b6200071b979695949392919062000d96565b6040518091039082f08015801562000737573d6000803e3d6000fd5b50600160a060020a03811660008181526002602052604090819020805473ffffffffffffffffffffffffffffffffffffffff1916909217909155519093507fa44aa7756c3391a11525eeee40213754bf3aee2a051d2597433fb40572a47d769150620007a99084903490899062000d68565b60405180910390a181600160a060020a031663165d35e16040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015620007f057600080fd5b505af115801562000805573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200082b919081019062000aa7565b9050600160a060020a03811663a9059cbb836200085867016345785d8a0000600263ffffffff6200099016565b6200086b8b603c63ffffffff6200097816565b600201026040518363ffffffff1660e060020a0281526004016200089192919062000d49565b602060405180830381600087803b158015620008ac57600080fd5b505af1158015620008c1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620008e7919081019062000b61565b5090979650505050505050565b600081905080600160a060020a031663a241c0896040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156200093857600080fd5b505af11580156200094d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000973919081019062000b82565b505050565b600081838115156200098657fe5b0490505b92915050565b6000821515620009a3575060006200098a565b50818102818382811515620009b457fe5b04146200098a57fe5b604051612ad88062000f4883390190565b600062000308823562000ece565b600062000308825162000ece565b600062000308825162000eda565b600062000308825162000edf565b6000601f8201831362000a1857600080fd5b813562000a2f62000a298262000ea1565b62000e79565b9150808252602083016020830185838301111562000a4c57600080fd5b62000a5983828462000efe565b50505092915050565b600062000308823562000edf565b600062000308825162000ee2565b60006020828403121562000a9157600080fd5b600062000a9f8484620009ce565b949350505050565b60006020828403121562000aba57600080fd5b600062000a9f8484620009dc565b600080600080600060a0868803121562000ae157600080fd5b600062000aef8888620009ce565b955050602062000b028882890162000a62565b945050604062000b158882890162000a62565b935050606062000b288882890162000a62565b925050608086013567ffffffffffffffff81111562000b4657600080fd5b62000b548882890162000a06565b9150509295509295909350565b60006020828403121562000b7457600080fd5b600062000a9f8484620009ea565b60006020828403121562000b9557600080fd5b600062000a9f8484620009f8565b600080600080600060a0868803121562000bbc57600080fd5b600062000bca888862000a70565b955050602062000bdd88828901620009f8565b945050604062000bf088828901620009f8565b935050606062000c0388828901620009f8565b925050608062000b548882890162000a70565b62000c218162000ece565b82525050565b62000c218162000eda565b62000c218162000ef1565b62000c218162000edf565b600062000c558262000eca565b80845262000c6b81602086016020860162000f0a565b62000c768162000f3d565b9093016020019392505050565b601281527f556e61626c6520746f207472616e736665720000000000000000000000000000602082015260400190565b602381527f4f6e6c7920496e737572616e63652070726f76696465722063616e20646f207460208201527f6869730000000000000000000000000000000000000000000000000000000000604082015260600190565b601281527f526f756e64206e6f7420636f6d706c6574650000000000000000000000000000602082015260400190565b602081016200098a828462000c16565b6040810162000d59828562000c16565b62000308602083018462000c3d565b6060810162000d78828662000c16565b62000d87602083018562000c3d565b62000a9f604083018462000c3d565b60e0810162000da6828a62000c16565b62000db5602083018962000c3d565b62000dc4604083018862000c3d565b62000dd3606083018762000c3d565b818103608083015262000de7818662000c48565b905062000df860a083018562000c16565b62000e0760c083018462000c3d565b98975050505050505050565b602081016200098a828462000c27565b602081016200098a828462000c32565b602081016200098a828462000c3d565b602080825281016200098a8162000c83565b602080825281016200098a8162000cb3565b602080825281016200098a8162000d09565b60405181810167ffffffffffffffff8111828210171562000e9957600080fd5b604052919050565b600067ffffffffffffffff82111562000eb957600080fd5b506020601f91909101601f19160190565b5190565b600160a060020a031690565b151590565b90565b69ffffffffffffffffffff1690565b60006200098a8262000ece565b82818337506000910152565b60005b8381101562000f2757818101518382015260200162000f0d565b8381111562000f37576000848401525b50505050565b601f01601f19169056006080604081905260016004556017805461ff00191690556000601881905542601955601a819055601b5562002ad83881900390819083398101806040526200004b9190810190620004a2565b60068054600160a060020a0319908116331790915560078054909116739326bfa02add2366b30bacb125260af641031331179055620000938264010000000062000234810204565b6008819055620000c5620000af64010000000062000256810204565b8590640100000000620012226200035a82021704565b3410156200010a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200010190620006dd565b60405180910390fd5b6009805433600160a060020a031991821617909155600a8054909116600160a060020a03891617905542600b55600c869055600d859055600e84905560006016556017805460ff1916600117905582516200016d90600f90602086019062000370565b50601480547305c8fadf1798437c143683e665800d58a42b6e19600160a060020a031991821681179092556015805490911690911790557f61313765386662663463626634366565623739653034623365623836346134656012819055601355600954600a54600c54600d54600e546040517f0203790cae2ea31823a6382172bd46011fcfbab29b22bb78b4b2f266febf6072956200021f95600160a060020a03918216959116939092909162000687565b60405180910390a150505050505050620007a1565b60028054600160a060020a031916600160a060020a0392909216919091179055565b600080600080600080600760009054906101000a9004600160a060020a0316600160a060020a031663feaf968c6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160a060405180830381600087803b158015620002cc57600080fd5b505af1158015620002e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000307919081019062000565565b9450945094509450945060008211151562000350576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200010190620006f5565b5091949350505050565b600081838115156200036857fe5b049392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003b357805160ff1916838001178555620003e3565b82800160010185558215620003e3579182015b82811115620003e3578251825591602001919060010190620003c6565b50620003f1929150620003f5565b5090565b6200041291905b80821115620003f15760008155600101620003fc565b90565b600062000423825162000756565b9392505050565b600062000423825162000412565b6000601f820183136200044a57600080fd5b8151620004616200045b826200072e565b62000707565b915080825260208301602083018583830111156200047e57600080fd5b6200048b8382846200076e565b50505092915050565b600062000423825162000762565b600080600080600080600060e0888a031215620004be57600080fd5b6000620004cc8a8a62000415565b9750506020620004df8a828b016200042a565b9650506040620004f28a828b016200042a565b9550506060620005058a828b016200042a565b94505060808801516001604060020a038111156200052257600080fd5b620005308a828b0162000438565b93505060a0620005438a828b0162000415565b92505060c0620005568a828b016200042a565b91505092959891949750929550565b600080600080600060a086880312156200057e57600080fd5b60006200058c888862000494565b95505060206200059f888289016200042a565b9450506040620005b2888289016200042a565b9350506060620005c5888289016200042a565b9250506080620005d88882890162000494565b9150509295509295909350565b620005f08162000756565b82525050565b602181527f4e6f7420656e6f7567682066756e64732073656e7420746f20636f6e7472616360208201527f7400000000000000000000000000000000000000000000000000000000000000604082015260600190565b601281527f526f756e64206e6f7420636f6d706c6574650000000000000000000000000000602082015260400190565b620005f08162000412565b60a08101620006978288620005e5565b620006a66020830187620005e5565b620006b560408301866200067c565b620006c460608301856200067c565b620006d360808301846200067c565b9695505050505050565b60208082528101620006ef81620005f6565b92915050565b60208082528101620006ef816200064c565b6040518181016001604060020a03811182821017156200072657600080fd5b604052919050565b60006001604060020a038211156200074557600080fd5b506020601f91909101601f19160190565b600160a060020a031690565b6001605060020a031690565b60005b838110156200078b57818101518382015260200162000771565b838111156200079b576000848401525b50505050565b61232780620007b16000396000f30060806040526004361061013a5763ffffffff60e060020a6000350416630c15c365811461013c578063165d35e114610167578063185e5b4014610189578063243d9a5d146101a95780633fad1834146101be5780634162cc88146101d357806356a6d508146101f35780635b69a7d8146102085780635fdc6281146102285780636f9fb98a1461023d578063715018a6146102525780637a50413d146102675780638da5cb5b1461027c5780638e15f47314610291578063a241c089146102a6578063ad2e8c9b146102bb578063b0b30fee146102d0578063b1b91f7a146102f2578063b807873214610312578063bbe4fd5014610327578063c032846b1461033c578063c974402914610351578063ce2ce3fc14610366578063dbc837c514610388578063dcbacd111461039d578063f2fde38b146103b2575b005b34801561014857600080fd5b506101516103d2565b60405161015e9190612199565b60405180910390f35b34801561017357600080fd5b5061017c6103d8565b60405161015e91906120b8565b34801561019557600080fd5b506101516101a4366004611d44565b6103e7565b3480156101b557600080fd5b506101516103fb565b3480156101ca57600080fd5b50610151610401565b3480156101df57600080fd5b506101516101ee366004611d44565b610407565b3480156101ff57600080fd5b50610151610414565b34801561021457600080fd5b5061017c610223366004611d44565b61041a565b34801561023457600080fd5b50610151610437565b34801561024957600080fd5b5061015161043c565b34801561025e57600080fd5b5061013a610441565b34801561027357600080fd5b506101516104ce565b34801561028857600080fd5b5061017c6104d4565b34801561029d57600080fd5b506101516104e3565b3480156102b257600080fd5b506101516105b0565b3480156102c757600080fd5b50610151610aea565b3480156102dc57600080fd5b506102e5610af0565b60405161015e919061218b565b3480156102fe57600080fd5b5061013a61030d366004611d0a565b610afe565b34801561031e57600080fd5b50610151610d06565b34801561033357600080fd5b50610151610d0b565b34801561034857600080fd5b506102e5610d0f565b34801561035d57600080fd5b50610151610d18565b34801561037257600080fd5b5061037b610d1e565b60405161015e91906121a7565b34801561039457600080fd5b5061017c610db4565b3480156103a957600080fd5b50610151610dc3565b3480156103be57600080fd5b5061013a6103cd366004611cce565b610dc9565b60185490565b60006103e2610e02565b905090565b601081600281106103f457fe5b0154905081565b600e5490565b601a5490565b601281600281106103f457fe5b60195490565b6014816002811061042757fe5b0154600160a060020a0316905081565b603c81565b303190565b600954600160a060020a031633146104775760405160e560020a62461bcd02815260040161046e90612208565b60405180910390fd5b600654604051600160a060020a03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a26006805473ffffffffffffffffffffffffffffffffffffffff19169055565b60165490565b600654600160a060020a031681565b600080600080600080600760009054906101000a9004600160a060020a0316600160a060020a031663feaf968c6040518163ffffffff1660e060020a02815260040160a060405180830381600087803b15801561053f57600080fd5b505af1158015610553573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506105779190810190611d80565b945094509450945094506000821115156105a65760405160e560020a62461bcd02815260040161046e90612218565b5091949350505050565b60175460009060609060ff1615156001146105e05760405160e560020a62461bcd02815260040161046e906121e8565b6105e8610e11565b60175460ff1615610ae6576000601b5560408051606081018252603a81527f687474703a2f2f6170692e776f726c64776561746865726f6e6c696e652e636f60208083019182527f6d2f7072656d69756d2f76312f776561746865722e617368783f0000000000008385015283518085018552601e81527f36323963366464303962626334333634623761333338313032303039313100008183015293518351939493600f9391909201918291908083835b602083106106b95780518252601f19909201916020918201910161069a565b51815160209384036101000a60001901801990921691161790527f6b65793d00000000000000000000000000000000000000000000000000000000919093019081528551600490910192860191508083835b6020831061072a5780518252601f19909201916020918201910161070b565b6001836020036101000a038019825116818451168082178552505050505050905001807f26713d0000000000000000000000000000000000000000000000000000000000815250600301828054600181600116156101000203166002900480156107cb5780601f106107a95761010080835404028352918201916107cb565b820191906000526020600020905b8154815290600101906020018083116107b7575b50507f26666f726d61743d6a736f6e266e756d5f6f665f646179733d31000000000000815260408051600519818403018152601a9092019052945061088e9350601492506000915061081a9050565b0154600160a060020a031660126000015483606060405190810160405280602181526020017f646174612e63757272656e745f636f6e646974696f6e2e302e7072656369704d81526020017f4d0000000000000000000000000000000000000000000000000000000000000081525061109e565b50606060405190810160405280602781526020017f68747470733a2f2f6170692e776561746865726269742e696f2f76322e302f6381526020017f757272656e743f00000000000000000000000000000000000000000000000000815250600f6040805190810160405280602081526020017f35653035616566303734313034303166616334393162303665623965386663388152506040516020018084805190602001908083835b602083106109565780518252601f199092019160209182019101610937565b6001836020036101000a038019825116818451168082178552505050505050905001807f636974793d000000000000000000000000000000000000000000000000000000815250600501838054600181600116156101000203166002900480156109f75780601f106109d55761010080835404028352918201916109f7565b820191906000526020600020905b8154815290600101906020018083116109e3575b5050807f266b65793d00000000000000000000000000000000000000000000000000000081525060050182805190602001908083835b60208310610a4c5780518252601f199092019160209182019101610a2d565b6001836020036101000a03801982511681845116808217855250505050505090500193505050506040516020818303038152906040529050610ae460146001600281101515610a9757fe5b0154600160a060020a0316601260010154836040805190810160405280600d81526020017f646174612e302e7072656369700000000000000000000000000000000000000081525061109e565b505b5090565b600c5490565b601754610100900460ff1690565b6000828152600560205260409020548290600160a060020a03163314610b395760405160e560020a62461bcd02815260040161046e90612228565b600081815260056020526040808220805473ffffffffffffffffffffffffffffffffffffffff191690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a260175460ff161515600114610bb35760405160e560020a62461bcd02815260040161046e906121e8565b610bd6610bc8603c600c63ffffffff61122216565b603c9063ffffffff61123916565b601954610bea90429063ffffffff61123916565b11610c0a5760405160e560020a62461bcd02815260040161046e906121d8565b816010601b54600281101515610c1c57fe5b0155601b80546001908101918290551015610cca57601154601054610c5391600291610c479161124b565b9063ffffffff61122216565b601881905542601955601a805460010190551515610c7957601680546001019055610cb8565b60006016556018546040517f2e5a5a6cf30e14f6500f404203cc44691f83c62354f375539ea7d45bcc49230591610caf91612199565b60405180910390a15b601654600311610cca57610cca611258565b7f9acb88f10af47daa34522605143d1719bad9aa6562e4c443c8abb9d594ea73f482604051610cf99190612199565b60405180910390a1505050565b600381565b4290565b60175460ff1690565b600d5490565b600f8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610daa5780601f10610d7f57610100808354040283529160200191610daa565b820191906000526020600020905b815481529060010190602001808311610d8d57829003601f168201915b5050505050905090565b600954600160a060020a031681565b600b5490565b600954600160a060020a03163314610df65760405160e560020a62461bcd02815260040161046e90612208565b610dff81611455565b50565b600254600160a060020a031690565b600042600c54600b54011015610dff57600c54600290610e3890603c63ffffffff61122216565b03601a54101515610e8357600954604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015610e7d573d6000803e3d6000fd5b50610f11565b600a54600160a060020a03166108fc610eac610e9d6104e3565b600d549063ffffffff61122216565b6040518115909202916000818181858888f19350505050158015610ed4573d6000803e3d6000fd5b50600954604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015610f0f573d6000803e3d6000fd5b505b610f19610e02565b6009546040517f70a08231000000000000000000000000000000000000000000000000000000008152919250600160a060020a038084169263a9059cbb929091169083906370a0823190610f719030906004016120b8565b602060405180830381600087803b158015610f8b57600080fd5b505af1158015610f9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610fc39190810190611d62565b6040518363ffffffff1660e060020a028152600401610fe39291906120c6565b602060405180830381600087803b158015610ffd57600080fd5b505af1158015611011573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110359190810190611cec565b15156110565760405160e560020a62461bcd02815260040161046e906121b8565b6017805460ff191690556040517f71d9f146944417dd66115a997376d9878c3618f396c331a6c3aa82ce653eae1490611093904290303190612238565b60405180910390a150565b60006110a8611c45565b60175460ff1615156001146110d25760405160e560020a62461bcd02815260040161046e906121e8565b6110fd85307fb1b91f7a000000000000000000000000000000000000000000000000000000006114d3565b60408051808201909152600381527f676574000000000000000000000000000000000000000000000000000000000060208201529091506111469082908663ffffffff6114fe16565b60408051808201909152600481527f7061746800000000000000000000000000000000000000000000000000000000602082015261118c9082908563ffffffff6114fe16565b60408051808201909152600581527f74696d657300000000000000000000000000000000000000000000000000000060208201526111d3908290606463ffffffff61152d16565b6111e08682600854611557565b91507f9b79db1508864f538c7703d2267a0c858007ee5877c83d83aec1b431e5add541826040516112119190612199565b60405180910390a150949350505050565b6000818381151561122f57fe5b0490505b92915050565b60008282111561124557fe5b50900390565b8181018281101561123357fe5b60175460009060ff1615156001146112855760405160e560020a62461bcd02815260040161046e906121e8565b600a54604051600160a060020a0390911690303180156108fc02916000818181858888f193505050501580156112bf573d6000803e3d6000fd5b506112c8610e02565b6009546040517f70a08231000000000000000000000000000000000000000000000000000000008152919250600160a060020a038084169263a9059cbb929091169083906370a08231906113209030906004016120b8565b602060405180830381600087803b15801561133a57600080fd5b505af115801561134e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113729190810190611d62565b6040518363ffffffff1660e060020a0281526004016113929291906120c6565b602060405180830381600087803b1580156113ac57600080fd5b505af11580156113c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113e49190810190611cec565b15156114055760405160e560020a62461bcd02815260040161046e906121f8565b600e546018546040517fd8874104029b491ba57b1b4875bd4ba8d4a98bf0261e1fdfac96db44022f95f89261143b924292612246565b60405180910390a1506017805461ffff1916610100179055565b600160a060020a038116151561146a57600080fd5b600654604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6114db611c45565b6114e3611c45565b6114f58186868663ffffffff61172616565b95945050505050565b6080830151611513908363ffffffff61178116565b6080830151611528908263ffffffff61178116565b505050565b6080830151611542908363ffffffff61178116565b6080830151611528908263ffffffff61179e16565b6000306004546040516020018083600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401828152602001925050506040516020818303038152906040526040518082805190602001908083835b602083106115d35780518252601f1990920191602091820191016115b4565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912060045460608a015260008181526005909252838220805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038c1617905592519295508594507fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af99350919050a2600254600160a060020a0316634000aea0858461168187611800565b6040518463ffffffff1660e060020a0281526004016116a29392919061215e565b602060405180830381600087803b1580156116bc57600080fd5b505af11580156116d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116f49190810190611cec565b15156117155760405160e560020a62461bcd02815260040161046e906121c8565b6004805460010190555b9392505050565b61172e611c45565b61173e85608001516101006118bd565b5050828452600160a060020a03821660208501527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1981166040850152835b949350505050565b61178e82600383516118f7565b611528828263ffffffff6119fa16565b67ffffffffffffffff198112156117be576117b98282611a14565b6117fc565b67ffffffffffffffff8113156117d8576117b98282611a53565b600081126117ec576117b9826000836118f7565b6117fc82600183600019036118f7565b5050565b80516020820151604080840151606085810151608087015151935191957f40429946000000000000000000000000000000000000000000000000000000009561185a956000958695939492939092916001916024016120e1565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19909316929092179091529050919050565b6118c5611c7a565b60208206156118da5760208206602003820191505b506020828101829052604080518085526000815290920101905290565b60178111611919576119138360ff848116602002168317611a7a565b50611528565b60ff811161194d5761193a836018602060ff8616021763ffffffff611a7a16565b506119138382600163ffffffff611a9216565b61ffff81116119825761196f836019602060ff8616021763ffffffff611a7a16565b506119138382600263ffffffff611a9216565b63ffffffff81116119b9576119a683601a602060ff8616021763ffffffff611a7a16565b506119138382600463ffffffff611a9216565b67ffffffffffffffff8111611528576119e183601b602060ff8616021763ffffffff611a7a16565b506119f48382600863ffffffff611a9216565b50505050565b611a02611c7a565b61171f83846000015151848551611aab565b611a258260c363ffffffff611a7a16565b506117fc828260001903604051602001611a3f9190612199565b604051602081830303815290604052611b61565b611a648260c263ffffffff611a7a16565b506117fc8282604051602001611a3f9190612199565b611a82611c7a565b61171f8384600001515184611b6e565b611a9a611c7a565b611779848560000151518585611bb9565b611ab3611c7a565b600080600085518511151515611ac857600080fd5b87602001518588011115611af257611af288611aea8a602001518a8901611c17565b600202611c2e565b875180518860208301019450808988011115611b0e5788870182525b60208801935050505b60208510611b395781518352601f199094019360209283019290910190611b17565b505181516020949094036101000a600019018019909116931692909217909152509192915050565b61178e82600283516118f7565b611b76611c7a565b60208401518310611b9257611b92848560200151600202611c2e565b8351805160208583010184815381861415611bae576001820183525b509495945050505050565b611bc1611c7a565b600085602001518584011115611be057611be086868501600202611c2e565b6001836101000a0390508551838682010185831982511617815281518588011115611c0b5784870182525b50959695505050505050565b600081831115611c28575081611233565b50919050565b8151611c3a83836118bd565b506119f483826119fa565b6040805160c081018252600080825260208201819052918101829052606081019190915260808101611c75611c7a565b905290565b60408051808201909152606081526000602082015290565b600061171f8235612272565b600061171f825161227e565b600061171f8235612283565b600061171f8251612283565b600061171f82516122a8565b600060208284031215611ce057600080fd5b60006117798484611c92565b600060208284031215611cfe57600080fd5b60006117798484611c9e565b60008060408385031215611d1d57600080fd5b6000611d298585611caa565b9250506020611d3a85828601611caa565b9150509250929050565b600060208284031215611d5657600080fd5b60006117798484611caa565b600060208284031215611d7457600080fd5b60006117798484611cb6565b600080600080600060a08688031215611d9857600080fd5b6000611da48888611cc2565b9550506020611db588828901611cb6565b9450506040611dc688828901611cb6565b9350506060611dd788828901611cb6565b9250506080611de888828901611cc2565b9150509295509295909350565b611dfe81612272565b82525050565b611dfe8161227e565b611dfe81612283565b611dfe81612286565b6000611e2a8261226e565b808452611e3e8160208601602086016122b7565b611e47816122e3565b9093016020019392505050565b602881527f556e61626c6520746f207472616e736665722072656d61696e696e67204c494e60208201527f4b20746f6b656e73000000000000000000000000000000000000000000000000604082015260600190565b602381527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160208201527f636c650000000000000000000000000000000000000000000000000000000000604082015260600190565b602481527f43616e206f6e6c7920636865636b207261696e66616c6c206f6e63652070657260208201527f2064617900000000000000000000000000000000000000000000000000000000604082015260600190565b603181527f436f6e74726163742068617320656e6465642c2063616e7420696e746572616360208201527f74207769746820697420616e796d6f7265000000000000000000000000000000604082015260600190565b601281527f556e61626c6520746f207472616e736665720000000000000000000000000000602082015260400190565b602381527f4f6e6c7920496e737572616e63652070726f76696465722063616e20646f207460208201527f6869730000000000000000000000000000000000000000000000000000000000604082015260600190565b601281527f526f756e64206e6f7420636f6d706c6574650000000000000000000000000000602082015260400190565b602881527f536f75726365206d75737420626520746865206f7261636c65206f662074686560208201527f2072657175657374000000000000000000000000000000000000000000000000604082015260600190565b602081016112338284611df5565b604081016120d48285611df5565b61171f6020830184611e0d565b61010081016120f0828b611df5565b6120fd602083018a611e0d565b61210a6040830189611e0d565b6121176060830188611df5565b6121246080830187611e16565b61213160a0830186611e0d565b61213e60c0830185611e0d565b81810360e08301526121508184611e1f565b9a9950505050505050505050565b6060810161216c8286611df5565b6121796020830185611e0d565b81810360408301526114f58184611e1f565b602081016112338284611e04565b602081016112338284611e0d565b6020808252810161171f8184611e1f565b6020808252810161123381611e54565b6020808252810161123381611eaa565b6020808252810161123381611f00565b6020808252810161123381611f56565b6020808252810161123381611fac565b6020808252810161123381611fdc565b6020808252810161123381612032565b6020808252810161123381612062565b604081016120d48285611e0d565b606081016122548286611e0d565b6122616020830185611e0d565b6117796040830184611e0d565b5190565b600160a060020a031690565b151590565b90565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690565b69ffffffffffffffffffff1690565b60005b838110156122d25781810151838201526020016122ba565b838111156119f45750506000910152565b601f01601f1916905600a265627a7a72305820ae7c6b1bc3e9c37bd83ce7ef0d6ebc72ee71c196bd8a89b84fa508d5c11d3f406c6578706572696d656e74616cf50037a265627a7a723058206a9ff78faeb5974430352b268145bc943bed6f9b68339ef70368b5e9bb8d6c6e6c6578706572696d656e74616cf50037", | |
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH3 0xB9 JUMPI PUSH4 0xFFFFFFFF PUSH1 0xE0 PUSH1 0x2 EXP PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0xAD1C2FA DUP2 EQ PUSH3 0xBB JUMPI DUP1 PUSH4 0x125716D6 EQ PUSH3 0xF8 JUMPI DUP1 PUSH4 0x5D0C1476 EQ PUSH3 0x12C JUMPI DUP1 PUSH4 0x5FDC6281 EQ PUSH3 0x153 JUMPI DUP1 PUSH4 0x6896C870 EQ PUSH3 0x17A JUMPI DUP1 PUSH4 0x6F9FB98A EQ PUSH3 0x19F JUMPI DUP1 PUSH4 0x71F28640 EQ PUSH3 0x1B7 JUMPI DUP1 PUSH4 0x7C463DB0 EQ PUSH3 0x1DC JUMPI DUP1 PUSH4 0x8E15F473 EQ PUSH3 0x1F4 JUMPI DUP1 PUSH4 0xA1219C42 EQ PUSH3 0x20C JUMPI DUP1 PUSH4 0xDBC837C5 EQ PUSH3 0x216 JUMPI DUP1 PUSH4 0xDFDF79E8 EQ PUSH3 0x22E JUMPI DUP1 PUSH4 0xE3DB17B8 EQ PUSH3 0x245 JUMPI JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH3 0xC8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0xE0 PUSH3 0xDA CALLDATASIZE PUSH1 0x4 PUSH3 0xA7E JUMP JUMPDEST PUSH3 0x26A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0xEF SWAP2 SWAP1 PUSH3 0xE23 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH3 0x105 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0x11D PUSH3 0x117 CALLDATASIZE PUSH1 0x4 PUSH3 0xA7E JUMP JUMPDEST PUSH3 0x288 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0xEF SWAP2 SWAP1 PUSH3 0xE13 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH3 0x139 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0x144 PUSH3 0x30F JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0xEF SWAP2 SWAP1 PUSH3 0xD39 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH3 0x160 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0x16B PUSH3 0x31E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH3 0xEF SWAP2 SWAP1 PUSH3 0xE33 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH3 0x187 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0x16B PUSH3 0x199 CALLDATASIZE PUSH1 0x4 PUSH3 0xA7E JUMP JUMPDEST PUSH3 0x323 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH3 0x1AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0x16B PUSH3 0x3A3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH3 0x1C4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0x16B PUSH3 0x1D6 CALLDATASIZE PUSH1 0x4 PUSH3 0xA7E JUMP JUMPDEST PUSH3 0x3A8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH3 0x1E9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0x144 PUSH3 0x3ED JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH3 0x201 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0x16B PUSH3 0x405 JUMP JUMPDEST PUSH3 0xB9 PUSH3 0x4E2 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH3 0x223 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0x144 PUSH3 0x672 JUMP JUMPDEST PUSH3 0x144 PUSH3 0x23F CALLDATASIZE PUSH1 0x4 PUSH3 0xAC8 JUMP JUMPDEST PUSH3 0x681 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH3 0x252 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH3 0xB9 PUSH3 0x264 CALLDATASIZE PUSH1 0x4 PUSH3 0xA7E JUMP JUMPDEST PUSH3 0x8F4 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0xC032846B PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x2CD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x2E2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x308 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0xB61 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x3C DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0x3FAD1834 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x368 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x37D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x308 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0xB82 JUMP JUMPDEST ADDRESS BALANCE SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0xC15C365 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x368 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH20 0xA36085F69E2889C224210F603D836748E7DC0088 DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0xFEAF968C PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0xA0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x462 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x477 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x49D SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0xBA3 JUMP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP PUSH1 0x0 DUP3 GT ISZERO ISZERO PUSH3 0x4D8 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x4CF SWAP1 PUSH3 0xE67 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP SWAP2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH3 0x513 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x4CF SWAP1 PUSH3 0xE55 JUMP JUMPDEST POP PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH20 0xA36085F69E2889C224210F603D836748E7DC0088 SWAP1 DUP2 SWAP1 PUSH4 0xA9059CBB SWAP1 CALLER SWAP1 DUP4 SWAP1 PUSH4 0x70A08231 SWAP1 PUSH3 0x572 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH3 0xD39 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x58D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x5A2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x5C8 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0xB82 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x5EA SWAP3 SWAP2 SWAP1 PUSH3 0xD49 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x605 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x61A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x640 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0xB61 JUMP JUMPDEST ISZERO ISZERO PUSH3 0x664 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x4CF SWAP1 PUSH3 0xE43 JUMP JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SELFDESTRUCT JUMPDEST PUSH1 0x0 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD DUP2 SWAP1 DUP2 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH3 0x6B6 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x4CF SWAP1 PUSH3 0xE55 JUMP JUMPDEST PUSH3 0x6DC PUSH3 0x6C4 PUSH3 0x405 JUMP JUMPDEST PUSH8 0xDE0B6B3A7640000 DUP8 MUL SWAP1 PUSH4 0xFFFFFFFF PUSH3 0x978 AND JUMP JUMPDEST DUP9 DUP9 DUP9 DUP9 DUP9 PUSH20 0xA36085F69E2889C224210F603D836748E7DC0088 PUSH8 0x16345785D8A0000 PUSH3 0x709 PUSH3 0x9BD JUMP JUMPDEST PUSH3 0x71B SWAP8 SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 SWAP1 PUSH3 0xD96 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 DUP3 CREATE DUP1 ISZERO DUP1 ISZERO PUSH3 0x737 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x2 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 DUP2 SWAP1 KECCAK256 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SWAP3 OR SWAP1 SWAP2 SSTORE MLOAD SWAP1 SWAP4 POP PUSH32 0xA44AA7756C3391A11525EEEE40213754BF3AEE2A051D2597433FB40572A47D76 SWAP2 POP PUSH3 0x7A9 SWAP1 DUP5 SWAP1 CALLVALUE SWAP1 DUP10 SWAP1 PUSH3 0xD68 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 DUP2 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0x165D35E1 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x7F0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x805 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x82B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0xAA7 JUMP JUMPDEST SWAP1 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND PUSH4 0xA9059CBB DUP4 PUSH3 0x858 PUSH8 0x16345785D8A0000 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH3 0x990 AND JUMP JUMPDEST PUSH3 0x86B DUP12 PUSH1 0x3C PUSH4 0xFFFFFFFF PUSH3 0x978 AND JUMP JUMPDEST PUSH1 0x2 ADD MUL PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x891 SWAP3 SWAP2 SWAP1 PUSH3 0xD49 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x8AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x8C1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x8E7 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0xB61 JUMP JUMPDEST POP SWAP1 SWAP8 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP DUP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0xA241C089 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x938 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x94D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x973 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0xB82 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 DUP2 ISZERO ISZERO PUSH3 0x986 JUMPI INVALID JUMPDEST DIV SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 ISZERO ISZERO PUSH3 0x9A3 JUMPI POP PUSH1 0x0 PUSH3 0x98A JUMP JUMPDEST POP DUP2 DUP2 MUL DUP2 DUP4 DUP3 DUP2 ISZERO ISZERO PUSH3 0x9B4 JUMPI INVALID JUMPDEST DIV EQ PUSH3 0x98A JUMPI INVALID JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x2AD8 DUP1 PUSH3 0xF48 DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x308 DUP3 CALLDATALOAD PUSH3 0xECE JUMP JUMPDEST PUSH1 0x0 PUSH3 0x308 DUP3 MLOAD PUSH3 0xECE JUMP JUMPDEST PUSH1 0x0 PUSH3 0x308 DUP3 MLOAD PUSH3 0xEDA JUMP JUMPDEST PUSH1 0x0 PUSH3 0x308 DUP3 MLOAD PUSH3 0xEDF JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH3 0xA18 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 CALLDATALOAD PUSH3 0xA2F PUSH3 0xA29 DUP3 PUSH3 0xEA1 JUMP JUMPDEST PUSH3 0xE79 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH3 0xA4C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0xA59 DUP4 DUP3 DUP5 PUSH3 0xEFE JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x308 DUP3 CALLDATALOAD PUSH3 0xEDF JUMP JUMPDEST PUSH1 0x0 PUSH3 0x308 DUP3 MLOAD PUSH3 0xEE2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0xA91 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0xA9F DUP5 DUP5 PUSH3 0x9CE JUMP JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0xABA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0xA9F DUP5 DUP5 PUSH3 0x9DC JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH3 0xAE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0xAEF DUP9 DUP9 PUSH3 0x9CE JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH3 0xB02 DUP9 DUP3 DUP10 ADD PUSH3 0xA62 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH3 0xB15 DUP9 DUP3 DUP10 ADD PUSH3 0xA62 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 PUSH3 0xB28 DUP9 DUP3 DUP10 ADD PUSH3 0xA62 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 DUP7 ADD CALLDATALOAD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT ISZERO PUSH3 0xB46 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0xB54 DUP9 DUP3 DUP10 ADD PUSH3 0xA06 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0xB74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0xA9F DUP5 DUP5 PUSH3 0x9EA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH3 0xB95 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0xA9F DUP5 DUP5 PUSH3 0x9F8 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH3 0xBBC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0xBCA DUP9 DUP9 PUSH3 0xA70 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH3 0xBDD DUP9 DUP3 DUP10 ADD PUSH3 0x9F8 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH3 0xBF0 DUP9 DUP3 DUP10 ADD PUSH3 0x9F8 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 PUSH3 0xC03 DUP9 DUP3 DUP10 ADD PUSH3 0x9F8 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 PUSH3 0xB54 DUP9 DUP3 DUP10 ADD PUSH3 0xA70 JUMP JUMPDEST PUSH3 0xC21 DUP2 PUSH3 0xECE JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH3 0xC21 DUP2 PUSH3 0xEDA JUMP JUMPDEST PUSH3 0xC21 DUP2 PUSH3 0xEF1 JUMP JUMPDEST PUSH3 0xC21 DUP2 PUSH3 0xEDF JUMP JUMPDEST PUSH1 0x0 PUSH3 0xC55 DUP3 PUSH3 0xECA JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH3 0xC6B DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH3 0xF0A JUMP JUMPDEST PUSH3 0xC76 DUP2 PUSH3 0xF3D JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x556E61626C6520746F207472616E736665720000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x4F6E6C7920496E737572616E63652070726F76696465722063616E20646F2074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6869730000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x526F756E64206E6F7420636F6D706C6574650000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH3 0x98A DUP3 DUP5 PUSH3 0xC16 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH3 0xD59 DUP3 DUP6 PUSH3 0xC16 JUMP JUMPDEST PUSH3 0x308 PUSH1 0x20 DUP4 ADD DUP5 PUSH3 0xC3D JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH3 0xD78 DUP3 DUP7 PUSH3 0xC16 JUMP JUMPDEST PUSH3 0xD87 PUSH1 0x20 DUP4 ADD DUP6 PUSH3 0xC3D JUMP JUMPDEST PUSH3 0xA9F PUSH1 0x40 DUP4 ADD DUP5 PUSH3 0xC3D JUMP JUMPDEST PUSH1 0xE0 DUP2 ADD PUSH3 0xDA6 DUP3 DUP11 PUSH3 0xC16 JUMP JUMPDEST PUSH3 0xDB5 PUSH1 0x20 DUP4 ADD DUP10 PUSH3 0xC3D JUMP JUMPDEST PUSH3 0xDC4 PUSH1 0x40 DUP4 ADD DUP9 PUSH3 0xC3D JUMP JUMPDEST PUSH3 0xDD3 PUSH1 0x60 DUP4 ADD DUP8 PUSH3 0xC3D JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x80 DUP4 ADD MSTORE PUSH3 0xDE7 DUP2 DUP7 PUSH3 0xC48 JUMP JUMPDEST SWAP1 POP PUSH3 0xDF8 PUSH1 0xA0 DUP4 ADD DUP6 PUSH3 0xC16 JUMP JUMPDEST PUSH3 0xE07 PUSH1 0xC0 DUP4 ADD DUP5 PUSH3 0xC3D JUMP JUMPDEST SWAP9 SWAP8 POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH3 0x98A DUP3 DUP5 PUSH3 0xC27 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH3 0x98A DUP3 DUP5 PUSH3 0xC32 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH3 0x98A DUP3 DUP5 PUSH3 0xC3D JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH3 0x98A DUP2 PUSH3 0xC83 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH3 0x98A DUP2 PUSH3 0xCB3 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH3 0x98A DUP2 PUSH3 0xD09 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH3 0xE99 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH8 0xFFFFFFFFFFFFFFFF DUP3 GT ISZERO PUSH3 0xEB9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH10 0xFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x98A DUP3 PUSH3 0xECE JUMP JUMPDEST DUP3 DUP2 DUP4 CALLDATACOPY POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0xF27 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0xF0D JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0xF37 JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP PUSH1 0x80 PUSH1 0x40 DUP2 SWAP1 MSTORE PUSH1 0x1 PUSH1 0x4 SSTORE PUSH1 0x17 DUP1 SLOAD PUSH2 0xFF00 NOT AND SWAP1 SSTORE PUSH1 0x0 PUSH1 0x18 DUP2 SWAP1 SSTORE TIMESTAMP PUSH1 0x19 SSTORE PUSH1 0x1A DUP2 SWAP1 SSTORE PUSH1 0x1B SSTORE PUSH3 0x2AD8 CODESIZE DUP2 SWAP1 SUB SWAP1 DUP2 SWAP1 DUP4 CODECOPY DUP2 ADD DUP1 PUSH1 0x40 MSTORE PUSH3 0x4B SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x4A2 JUMP JUMPDEST PUSH1 0x6 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP1 DUP2 AND CALLER OR SWAP1 SWAP2 SSTORE PUSH1 0x7 DUP1 SLOAD SWAP1 SWAP2 AND PUSH20 0x9326BFA02ADD2366B30BACB125260AF641031331 OR SWAP1 SSTORE PUSH3 0x93 DUP3 PUSH5 0x100000000 PUSH3 0x234 DUP2 MUL DIV JUMP JUMPDEST PUSH1 0x8 DUP2 SWAP1 SSTORE PUSH3 0xC5 PUSH3 0xAF PUSH5 0x100000000 PUSH3 0x256 DUP2 MUL DIV JUMP JUMPDEST DUP6 SWAP1 PUSH5 0x100000000 PUSH3 0x1222 PUSH3 0x35A DUP3 MUL OR DIV JUMP JUMPDEST CALLVALUE LT ISZERO PUSH3 0x10A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x101 SWAP1 PUSH3 0x6DD JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x9 DUP1 SLOAD CALLER PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP2 DUP3 AND OR SWAP1 SWAP2 SSTORE PUSH1 0xA DUP1 SLOAD SWAP1 SWAP2 AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP10 AND OR SWAP1 SSTORE TIMESTAMP PUSH1 0xB SSTORE PUSH1 0xC DUP7 SWAP1 SSTORE PUSH1 0xD DUP6 SWAP1 SSTORE PUSH1 0xE DUP5 SWAP1 SSTORE PUSH1 0x0 PUSH1 0x16 SSTORE PUSH1 0x17 DUP1 SLOAD PUSH1 0xFF NOT AND PUSH1 0x1 OR SWAP1 SSTORE DUP3 MLOAD PUSH3 0x16D SWAP1 PUSH1 0xF SWAP1 PUSH1 0x20 DUP7 ADD SWAP1 PUSH3 0x370 JUMP JUMPDEST POP PUSH1 0x14 DUP1 SLOAD PUSH20 0x5C8FADF1798437C143683E665800D58A42B6E19 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT SWAP2 DUP3 AND DUP2 OR SWAP1 SWAP3 SSTORE PUSH1 0x15 DUP1 SLOAD SWAP1 SWAP2 AND SWAP1 SWAP2 OR SWAP1 SSTORE PUSH32 0x6131376538666266346362663436656562373965303462336562383634613465 PUSH1 0x12 DUP2 SWAP1 SSTORE PUSH1 0x13 SSTORE PUSH1 0x9 SLOAD PUSH1 0xA SLOAD PUSH1 0xC SLOAD PUSH1 0xD SLOAD PUSH1 0xE SLOAD PUSH1 0x40 MLOAD PUSH32 0x203790CAE2EA31823A6382172BD46011FCFBAB29B22BB78B4B2F266FEBF6072 SWAP6 PUSH3 0x21F SWAP6 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP2 DUP3 AND SWAP6 SWAP2 AND SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 PUSH3 0x687 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP POP POP POP POP PUSH3 0x7A1 JUMP JUMPDEST PUSH1 0x2 DUP1 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x7 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0xFEAF968C PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH29 0x100000000000000000000000000000000000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0xA0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x2CC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH3 0x2E1 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH3 0x307 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH3 0x565 JUMP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP PUSH1 0x0 DUP3 GT ISZERO ISZERO PUSH3 0x350 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x101 SWAP1 PUSH3 0x6F5 JUMP JUMPDEST POP SWAP2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 DUP2 ISZERO ISZERO PUSH3 0x368 JUMPI INVALID JUMPDEST DIV SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH3 0x3B3 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x3E3 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x3E3 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x3E3 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x3C6 JUMP JUMPDEST POP PUSH3 0x3F1 SWAP3 SWAP2 POP PUSH3 0x3F5 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH3 0x412 SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x3F1 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x3FC JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH3 0x423 DUP3 MLOAD PUSH3 0x756 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x423 DUP3 MLOAD PUSH3 0x412 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1F DUP3 ADD DUP4 SGT PUSH3 0x44A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 MLOAD PUSH3 0x461 PUSH3 0x45B DUP3 PUSH3 0x72E JUMP JUMPDEST PUSH3 0x707 JUMP JUMPDEST SWAP2 POP DUP1 DUP3 MSTORE PUSH1 0x20 DUP4 ADD PUSH1 0x20 DUP4 ADD DUP6 DUP4 DUP4 ADD GT ISZERO PUSH3 0x47E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x48B DUP4 DUP3 DUP5 PUSH3 0x76E JUMP JUMPDEST POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x423 DUP3 MLOAD PUSH3 0x762 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xE0 DUP9 DUP11 SUB SLT ISZERO PUSH3 0x4BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x4CC DUP11 DUP11 PUSH3 0x415 JUMP JUMPDEST SWAP8 POP POP PUSH1 0x20 PUSH3 0x4DF DUP11 DUP3 DUP12 ADD PUSH3 0x42A JUMP JUMPDEST SWAP7 POP POP PUSH1 0x40 PUSH3 0x4F2 DUP11 DUP3 DUP12 ADD PUSH3 0x42A JUMP JUMPDEST SWAP6 POP POP PUSH1 0x60 PUSH3 0x505 DUP11 DUP3 DUP12 ADD PUSH3 0x42A JUMP JUMPDEST SWAP5 POP POP PUSH1 0x80 DUP9 ADD MLOAD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT ISZERO PUSH3 0x522 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH3 0x530 DUP11 DUP3 DUP12 ADD PUSH3 0x438 JUMP JUMPDEST SWAP4 POP POP PUSH1 0xA0 PUSH3 0x543 DUP11 DUP3 DUP12 ADD PUSH3 0x415 JUMP JUMPDEST SWAP3 POP POP PUSH1 0xC0 PUSH3 0x556 DUP11 DUP3 DUP12 ADD PUSH3 0x42A JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 SWAP9 SWAP2 SWAP5 SWAP8 POP SWAP3 SWAP6 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH3 0x57E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH3 0x58C DUP9 DUP9 PUSH3 0x494 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH3 0x59F DUP9 DUP3 DUP10 ADD PUSH3 0x42A JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH3 0x5B2 DUP9 DUP3 DUP10 ADD PUSH3 0x42A JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 PUSH3 0x5C5 DUP9 DUP3 DUP10 ADD PUSH3 0x42A JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 PUSH3 0x5D8 DUP9 DUP3 DUP10 ADD PUSH3 0x494 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH3 0x5F0 DUP2 PUSH3 0x756 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x21 DUP2 MSTORE PUSH32 0x4E6F7420656E6F7567682066756E64732073656E7420746F20636F6E74726163 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x7400000000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x526F756E64206E6F7420636F6D706C6574650000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH3 0x5F0 DUP2 PUSH3 0x412 JUMP JUMPDEST PUSH1 0xA0 DUP2 ADD PUSH3 0x697 DUP3 DUP9 PUSH3 0x5E5 JUMP JUMPDEST PUSH3 0x6A6 PUSH1 0x20 DUP4 ADD DUP8 PUSH3 0x5E5 JUMP JUMPDEST PUSH3 0x6B5 PUSH1 0x40 DUP4 ADD DUP7 PUSH3 0x67C JUMP JUMPDEST PUSH3 0x6C4 PUSH1 0x60 DUP4 ADD DUP6 PUSH3 0x67C JUMP JUMPDEST PUSH3 0x6D3 PUSH1 0x80 DUP4 ADD DUP5 PUSH3 0x67C JUMP JUMPDEST SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH3 0x6EF DUP2 PUSH3 0x5F6 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH3 0x6EF DUP2 PUSH3 0x64C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 DUP2 ADD PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP2 GT DUP3 DUP3 LT OR ISZERO PUSH3 0x726 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x40 MSTORE SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 PUSH1 0x40 PUSH1 0x2 EXP SUB DUP3 GT ISZERO PUSH3 0x745 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x20 PUSH1 0x1F SWAP2 SWAP1 SWAP2 ADD PUSH1 0x1F NOT AND ADD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x50 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH3 0x78B JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH3 0x771 JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH3 0x79B JUMPI PUSH1 0x0 DUP5 DUP5 ADD MSTORE JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x2327 DUP1 PUSH3 0x7B1 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x13A JUMPI PUSH4 0xFFFFFFFF PUSH1 0xE0 PUSH1 0x2 EXP PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0xC15C365 DUP2 EQ PUSH2 0x13C JUMPI DUP1 PUSH4 0x165D35E1 EQ PUSH2 0x167 JUMPI DUP1 PUSH4 0x185E5B40 EQ PUSH2 0x189 JUMPI DUP1 PUSH4 0x243D9A5D EQ PUSH2 0x1A9 JUMPI DUP1 PUSH4 0x3FAD1834 EQ PUSH2 0x1BE JUMPI DUP1 PUSH4 0x4162CC88 EQ PUSH2 0x1D3 JUMPI DUP1 PUSH4 0x56A6D508 EQ PUSH2 0x1F3 JUMPI DUP1 PUSH4 0x5B69A7D8 EQ PUSH2 0x208 JUMPI DUP1 PUSH4 0x5FDC6281 EQ PUSH2 0x228 JUMPI DUP1 PUSH4 0x6F9FB98A EQ PUSH2 0x23D JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x252 JUMPI DUP1 PUSH4 0x7A50413D EQ PUSH2 0x267 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x27C JUMPI DUP1 PUSH4 0x8E15F473 EQ PUSH2 0x291 JUMPI DUP1 PUSH4 0xA241C089 EQ PUSH2 0x2A6 JUMPI DUP1 PUSH4 0xAD2E8C9B EQ PUSH2 0x2BB JUMPI DUP1 PUSH4 0xB0B30FEE EQ PUSH2 0x2D0 JUMPI DUP1 PUSH4 0xB1B91F7A EQ PUSH2 0x2F2 JUMPI DUP1 PUSH4 0xB8078732 EQ PUSH2 0x312 JUMPI DUP1 PUSH4 0xBBE4FD50 EQ PUSH2 0x327 JUMPI DUP1 PUSH4 0xC032846B EQ PUSH2 0x33C JUMPI DUP1 PUSH4 0xC9744029 EQ PUSH2 0x351 JUMPI DUP1 PUSH4 0xCE2CE3FC EQ PUSH2 0x366 JUMPI DUP1 PUSH4 0xDBC837C5 EQ PUSH2 0x388 JUMPI DUP1 PUSH4 0xDCBACD11 EQ PUSH2 0x39D JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x3B2 JUMPI JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x148 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x3D2 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15E SWAP2 SWAP1 PUSH2 0x2199 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x173 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17C PUSH2 0x3D8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15E SWAP2 SWAP1 PUSH2 0x20B8 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x195 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x1A4 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D44 JUMP JUMPDEST PUSH2 0x3E7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1B5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x3FB JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1CA JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x401 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1DF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x1EE CALLDATASIZE PUSH1 0x4 PUSH2 0x1D44 JUMP JUMPDEST PUSH2 0x407 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x1FF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x414 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x214 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17C PUSH2 0x223 CALLDATASIZE PUSH1 0x4 PUSH2 0x1D44 JUMP JUMPDEST PUSH2 0x41A JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x234 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x437 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x249 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x43C JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x25E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13A PUSH2 0x441 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x273 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x4CE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x288 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17C PUSH2 0x4D4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x29D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x4E3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2B2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0x5B0 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2C7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0xAEA JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2DC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E5 PUSH2 0xAF0 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15E SWAP2 SWAP1 PUSH2 0x218B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x2FE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13A PUSH2 0x30D CALLDATASIZE PUSH1 0x4 PUSH2 0x1D0A JUMP JUMPDEST PUSH2 0xAFE JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x31E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0xD06 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x333 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0xD0B JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x348 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x2E5 PUSH2 0xD0F JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x35D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0xD18 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x372 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x37B PUSH2 0xD1E JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15E SWAP2 SWAP1 PUSH2 0x21A7 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x394 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17C PUSH2 0xDB4 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3A9 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x151 PUSH2 0xDC3 JUMP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x3BE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13A PUSH2 0x3CD CALLDATASIZE PUSH1 0x4 PUSH2 0x1CCE JUMP JUMPDEST PUSH2 0xDC9 JUMP JUMPDEST PUSH1 0x18 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3E2 PUSH2 0xE02 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x10 DUP2 PUSH1 0x2 DUP2 LT PUSH2 0x3F4 JUMPI INVALID JUMPDEST ADD SLOAD SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0xE SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1A SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 PUSH1 0x2 DUP2 LT PUSH2 0x3F4 JUMPI INVALID JUMPDEST PUSH1 0x19 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x14 DUP2 PUSH1 0x2 DUP2 LT PUSH2 0x427 JUMPI INVALID JUMPDEST ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 POP DUP2 JUMP JUMPDEST PUSH1 0x3C DUP2 JUMP JUMPDEST ADDRESS BALANCE SWAP1 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0x477 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x2208 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 PUSH32 0xF8DF31144D9C2F0F6B59D69B8B98ABD5459D07F2742C4DF920B25AAE33C64820 SWAP1 PUSH1 0x0 SWAP1 LOG2 PUSH1 0x6 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x16 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x7 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0xFEAF968C PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0xA0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x53F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x553 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x577 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1D80 JUMP JUMPDEST SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP PUSH1 0x0 DUP3 GT ISZERO ISZERO PUSH2 0x5A6 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x2218 JUMP JUMPDEST POP SWAP2 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x17 SLOAD PUSH1 0x0 SWAP1 PUSH1 0x60 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH1 0x1 EQ PUSH2 0x5E0 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21E8 JUMP JUMPDEST PUSH2 0x5E8 PUSH2 0xE11 JUMP JUMPDEST PUSH1 0x17 SLOAD PUSH1 0xFF AND ISZERO PUSH2 0xAE6 JUMPI PUSH1 0x0 PUSH1 0x1B SSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE PUSH1 0x3A DUP2 MSTORE PUSH32 0x687474703A2F2F6170692E776F726C64776561746865726F6E6C696E652E636F PUSH1 0x20 DUP1 DUP4 ADD SWAP2 DUP3 MSTORE PUSH32 0x6D2F7072656D69756D2F76312F776561746865722E617368783F000000000000 DUP4 DUP6 ADD MSTORE DUP4 MLOAD DUP1 DUP6 ADD DUP6 MSTORE PUSH1 0x1E DUP2 MSTORE PUSH32 0x3632396336646430396262633433363462376133333831303230303931310000 DUP2 DUP4 ADD MSTORE SWAP4 MLOAD DUP4 MLOAD SWAP4 SWAP5 SWAP4 PUSH1 0xF SWAP4 SWAP2 SWAP1 SWAP3 ADD SWAP2 DUP3 SWAP2 SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x6B9 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x69A JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH32 0x6B65793D00000000000000000000000000000000000000000000000000000000 SWAP2 SWAP1 SWAP4 ADD SWAP1 DUP2 MSTORE DUP6 MLOAD PUSH1 0x4 SWAP1 SWAP2 ADD SWAP3 DUP7 ADD SWAP2 POP DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x72A JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x70B JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD DUP1 PUSH32 0x26713D0000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x3 ADD DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x7CB JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x7A9 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x7CB JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x7B7 JUMPI JUMPDEST POP POP PUSH32 0x26666F726D61743D6A736F6E266E756D5F6F665F646179733D31000000000000 DUP2 MSTORE PUSH1 0x40 DUP1 MLOAD PUSH1 0x5 NOT DUP2 DUP5 SUB ADD DUP2 MSTORE PUSH1 0x1A SWAP1 SWAP3 ADD SWAP1 MSTORE SWAP5 POP PUSH2 0x88E SWAP4 POP PUSH1 0x14 SWAP3 POP PUSH1 0x0 SWAP2 POP PUSH2 0x81A SWAP1 POP JUMP JUMPDEST ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x12 PUSH1 0x0 ADD SLOAD DUP4 PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x21 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x646174612E63757272656E745F636F6E646974696F6E2E302E7072656369704D DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x4D00000000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH2 0x109E JUMP JUMPDEST POP PUSH1 0x60 PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x27 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x68747470733A2F2F6170692E776561746865726269742E696F2F76322E302F63 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x757272656E743F00000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0xF PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x3565303561656630373431303430316661633439316230366562396538666338 DUP2 MSTORE POP PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP5 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x956 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x937 JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD DUP1 PUSH32 0x636974793D000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x5 ADD DUP4 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV DUP1 ISZERO PUSH2 0x9F7 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x9D5 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 DUP3 ADD SWAP2 PUSH2 0x9F7 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x9E3 JUMPI JUMPDEST POP POP DUP1 PUSH32 0x266B65793D000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x5 ADD DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0xA4C JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0xA2D JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP1 DUP3 OR DUP6 MSTORE POP POP POP POP POP POP SWAP1 POP ADD SWAP4 POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 POP PUSH2 0xAE4 PUSH1 0x14 PUSH1 0x1 PUSH1 0x2 DUP2 LT ISZERO ISZERO PUSH2 0xA97 JUMPI INVALID JUMPDEST ADD SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x12 PUSH1 0x1 ADD SLOAD DUP4 PUSH1 0x40 DUP1 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xD DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x646174612E302E70726563697000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH2 0x109E JUMP JUMPDEST POP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH1 0xC SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x17 SLOAD PUSH2 0x100 SWAP1 DIV PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP3 SWAP1 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0xB39 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x2228 JUMP JUMPDEST PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 SSTORE MLOAD DUP3 SWAP2 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A SWAP2 LOG2 PUSH1 0x17 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH1 0x1 EQ PUSH2 0xBB3 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21E8 JUMP JUMPDEST PUSH2 0xBD6 PUSH2 0xBC8 PUSH1 0x3C PUSH1 0xC PUSH4 0xFFFFFFFF PUSH2 0x1222 AND JUMP JUMPDEST PUSH1 0x3C SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1239 AND JUMP JUMPDEST PUSH1 0x19 SLOAD PUSH2 0xBEA SWAP1 TIMESTAMP SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1239 AND JUMP JUMPDEST GT PUSH2 0xC0A JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21D8 JUMP JUMPDEST DUP2 PUSH1 0x10 PUSH1 0x1B SLOAD PUSH1 0x2 DUP2 LT ISZERO ISZERO PUSH2 0xC1C JUMPI INVALID JUMPDEST ADD SSTORE PUSH1 0x1B DUP1 SLOAD PUSH1 0x1 SWAP1 DUP2 ADD SWAP2 DUP3 SWAP1 SSTORE LT ISZERO PUSH2 0xCCA JUMPI PUSH1 0x11 SLOAD PUSH1 0x10 SLOAD PUSH2 0xC53 SWAP2 PUSH1 0x2 SWAP2 PUSH2 0xC47 SWAP2 PUSH2 0x124B JUMP JUMPDEST SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1222 AND JUMP JUMPDEST PUSH1 0x18 DUP2 SWAP1 SSTORE TIMESTAMP PUSH1 0x19 SSTORE PUSH1 0x1A DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE ISZERO ISZERO PUSH2 0xC79 JUMPI PUSH1 0x16 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE PUSH2 0xCB8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x16 SSTORE PUSH1 0x18 SLOAD PUSH1 0x40 MLOAD PUSH32 0x2E5A5A6CF30E14F6500F404203CC44691F83C62354F375539EA7D45BCC492305 SWAP2 PUSH2 0xCAF SWAP2 PUSH2 0x2199 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMPDEST PUSH1 0x16 SLOAD PUSH1 0x3 GT PUSH2 0xCCA JUMPI PUSH2 0xCCA PUSH2 0x1258 JUMP JUMPDEST PUSH32 0x9ACB88F10AF47DAA34522605143D1719BAD9AA6562E4C443C8ABB9D594EA73F4 DUP3 PUSH1 0x40 MLOAD PUSH2 0xCF9 SWAP2 SWAP1 PUSH2 0x2199 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP POP POP JUMP JUMPDEST PUSH1 0x3 DUP2 JUMP JUMPDEST TIMESTAMP SWAP1 JUMP JUMPDEST PUSH1 0x17 SLOAD PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0xD SLOAD SWAP1 JUMP JUMPDEST PUSH1 0xF DUP1 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT PUSH2 0x100 PUSH1 0x1 DUP9 AND ISZERO MUL ADD SWAP1 SWAP6 AND SWAP5 SWAP1 SWAP5 DIV SWAP4 DUP5 ADD DUP2 SWAP1 DIV DUP2 MUL DUP3 ADD DUP2 ADD SWAP1 SWAP3 MSTORE DUP3 DUP2 MSTORE PUSH1 0x60 SWAP4 SWAP1 SWAP3 SWAP1 SWAP2 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0xDAA JUMPI DUP1 PUSH1 0x1F LT PUSH2 0xD7F JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0xDAA JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0xD8D JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND DUP2 JUMP JUMPDEST PUSH1 0xB SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND CALLER EQ PUSH2 0xDF6 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x2208 JUMP JUMPDEST PUSH2 0xDFF DUP2 PUSH2 0x1455 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x0 TIMESTAMP PUSH1 0xC SLOAD PUSH1 0xB SLOAD ADD LT ISZERO PUSH2 0xDFF JUMPI PUSH1 0xC SLOAD PUSH1 0x2 SWAP1 PUSH2 0xE38 SWAP1 PUSH1 0x3C PUSH4 0xFFFFFFFF PUSH2 0x1222 AND JUMP JUMPDEST SUB PUSH1 0x1A SLOAD LT ISZERO ISZERO PUSH2 0xE83 JUMPI PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 ADDRESS BALANCE DUP1 ISZERO PUSH2 0x8FC MUL SWAP2 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xE7D JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH2 0xF11 JUMP JUMPDEST PUSH1 0xA SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH2 0x8FC PUSH2 0xEAC PUSH2 0xE9D PUSH2 0x4E3 JUMP JUMPDEST PUSH1 0xD SLOAD SWAP1 PUSH4 0xFFFFFFFF PUSH2 0x1222 AND JUMP JUMPDEST PUSH1 0x40 MLOAD DUP2 ISZERO SWAP1 SWAP3 MUL SWAP2 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xED4 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 ADDRESS BALANCE DUP1 ISZERO PUSH2 0x8FC MUL SWAP2 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0xF0F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMPDEST PUSH2 0xF19 PUSH2 0xE02 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP5 AND SWAP3 PUSH4 0xA9059CBB SWAP3 SWAP1 SWAP2 AND SWAP1 DUP4 SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0xF71 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x20B8 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xF8B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF9F JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0xFC3 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1D62 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xFE3 SWAP3 SWAP2 SWAP1 PUSH2 0x20C6 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xFFD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x1011 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1035 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1CEC JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1056 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21B8 JUMP JUMPDEST PUSH1 0x17 DUP1 SLOAD PUSH1 0xFF NOT AND SWAP1 SSTORE PUSH1 0x40 MLOAD PUSH32 0x71D9F146944417DD66115A997376D9878C3618F396C331A6C3AA82CE653EAE14 SWAP1 PUSH2 0x1093 SWAP1 TIMESTAMP SWAP1 ADDRESS BALANCE SWAP1 PUSH2 0x2238 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x10A8 PUSH2 0x1C45 JUMP JUMPDEST PUSH1 0x17 SLOAD PUSH1 0xFF AND ISZERO ISZERO PUSH1 0x1 EQ PUSH2 0x10D2 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21E8 JUMP JUMPDEST PUSH2 0x10FD DUP6 ADDRESS PUSH32 0xB1B91F7A00000000000000000000000000000000000000000000000000000000 PUSH2 0x14D3 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x3 DUP2 MSTORE PUSH32 0x6765740000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 SWAP2 POP PUSH2 0x1146 SWAP1 DUP3 SWAP1 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x14FE AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x4 DUP2 MSTORE PUSH32 0x7061746800000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x118C SWAP1 DUP3 SWAP1 DUP6 PUSH4 0xFFFFFFFF PUSH2 0x14FE AND JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x5 DUP2 MSTORE PUSH32 0x74696D6573000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH2 0x11D3 SWAP1 DUP3 SWAP1 PUSH1 0x64 PUSH4 0xFFFFFFFF PUSH2 0x152D AND JUMP JUMPDEST PUSH2 0x11E0 DUP7 DUP3 PUSH1 0x8 SLOAD PUSH2 0x1557 JUMP JUMPDEST SWAP2 POP PUSH32 0x9B79DB1508864F538C7703D2267A0C858007EE5877C83D83AEC1B431E5ADD541 DUP3 PUSH1 0x40 MLOAD PUSH2 0x1211 SWAP2 SWAP1 PUSH2 0x2199 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 DUP2 ISZERO ISZERO PUSH2 0x122F JUMPI INVALID JUMPDEST DIV SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 GT ISZERO PUSH2 0x1245 JUMPI INVALID JUMPDEST POP SWAP1 SUB SWAP1 JUMP JUMPDEST DUP2 DUP2 ADD DUP3 DUP2 LT ISZERO PUSH2 0x1233 JUMPI INVALID JUMPDEST PUSH1 0x17 SLOAD PUSH1 0x0 SWAP1 PUSH1 0xFF AND ISZERO ISZERO PUSH1 0x1 EQ PUSH2 0x1285 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21E8 JUMP JUMPDEST PUSH1 0xA SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP1 SWAP2 AND SWAP1 ADDRESS BALANCE DUP1 ISZERO PUSH2 0x8FC MUL SWAP2 PUSH1 0x0 DUP2 DUP2 DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x12BF JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH2 0x12C8 PUSH2 0xE02 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH32 0x70A0823100000000000000000000000000000000000000000000000000000000 DUP2 MSTORE SWAP2 SWAP3 POP PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP5 AND SWAP3 PUSH4 0xA9059CBB SWAP3 SWAP1 SWAP2 AND SWAP1 DUP4 SWAP1 PUSH4 0x70A08231 SWAP1 PUSH2 0x1320 SWAP1 ADDRESS SWAP1 PUSH1 0x4 ADD PUSH2 0x20B8 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x133A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x134E JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x1372 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1D62 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x1392 SWAP3 SWAP2 SWAP1 PUSH2 0x20C6 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x13AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x13C0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x13E4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1CEC JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1405 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21F8 JUMP JUMPDEST PUSH1 0xE SLOAD PUSH1 0x18 SLOAD PUSH1 0x40 MLOAD PUSH32 0xD8874104029B491BA57B1B4875BD4BA8D4A98BF0261E1FDFAC96DB44022F95F8 SWAP3 PUSH2 0x143B SWAP3 TIMESTAMP SWAP3 PUSH2 0x2246 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP PUSH1 0x17 DUP1 SLOAD PUSH2 0xFFFF NOT AND PUSH2 0x100 OR SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP2 AND ISZERO ISZERO PUSH2 0x146A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x6 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x6 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x14DB PUSH2 0x1C45 JUMP JUMPDEST PUSH2 0x14E3 PUSH2 0x1C45 JUMP JUMPDEST PUSH2 0x14F5 DUP2 DUP7 DUP7 DUP7 PUSH4 0xFFFFFFFF PUSH2 0x1726 AND JUMP JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x1513 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x1781 AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x1528 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x1781 AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x1542 SWAP1 DUP4 PUSH4 0xFFFFFFFF PUSH2 0x1781 AND JUMP JUMPDEST PUSH1 0x80 DUP4 ADD MLOAD PUSH2 0x1528 SWAP1 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x179E AND JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH13 0x1000000000000000000000000 MUL DUP2 MSTORE PUSH1 0x14 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD DUP1 DUP3 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 JUMPDEST PUSH1 0x20 DUP4 LT PUSH2 0x15D3 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x1F NOT SWAP1 SWAP3 ADD SWAP2 PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 ADD PUSH2 0x15B4 JUMP JUMPDEST MLOAD DUP2 MLOAD PUSH1 0x20 SWAP4 DUP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP3 AND SWAP2 AND OR SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD SWAP3 SWAP1 SWAP5 ADD DUP3 SWAP1 SUB SWAP1 SWAP2 KECCAK256 PUSH1 0x4 SLOAD PUSH1 0x60 DUP11 ADD MSTORE PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x5 SWAP1 SWAP3 MSTORE DUP4 DUP3 KECCAK256 DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP13 AND OR SWAP1 SSTORE SWAP3 MLOAD SWAP3 SWAP6 POP DUP6 SWAP5 POP PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 SWAP4 POP SWAP2 SWAP1 POP LOG2 PUSH1 0x2 SLOAD PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0x1681 DUP8 PUSH2 0x1800 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 PUSH1 0x2 EXP MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x16A2 SWAP4 SWAP3 SWAP2 SWAP1 PUSH2 0x215E JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x16BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x16D0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH2 0x16F4 SWAP2 SWAP1 DUP2 ADD SWAP1 PUSH2 0x1CEC JUMP JUMPDEST ISZERO ISZERO PUSH2 0x1715 JUMPI PUSH1 0x40 MLOAD PUSH1 0xE5 PUSH1 0x2 EXP PUSH3 0x461BCD MUL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x46E SWAP1 PUSH2 0x21C8 JUMP JUMPDEST PUSH1 0x4 DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x172E PUSH2 0x1C45 JUMP JUMPDEST PUSH2 0x173E DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0x18BD JUMP JUMPDEST POP POP DUP3 DUP5 MSTORE PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB DUP3 AND PUSH1 0x20 DUP6 ADD MSTORE PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT DUP2 AND PUSH1 0x40 DUP6 ADD MSTORE DUP4 JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x178E DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0x18F7 JUMP JUMPDEST PUSH2 0x1528 DUP3 DUP3 PUSH4 0xFFFFFFFF PUSH2 0x19FA AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF NOT DUP2 SLT ISZERO PUSH2 0x17BE JUMPI PUSH2 0x17B9 DUP3 DUP3 PUSH2 0x1A14 JUMP JUMPDEST PUSH2 0x17FC JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 SGT ISZERO PUSH2 0x17D8 JUMPI PUSH2 0x17B9 DUP3 DUP3 PUSH2 0x1A53 JUMP JUMPDEST PUSH1 0x0 DUP2 SLT PUSH2 0x17EC JUMPI PUSH2 0x17B9 DUP3 PUSH1 0x0 DUP4 PUSH2 0x18F7 JUMP JUMPDEST PUSH2 0x17FC DUP3 PUSH1 0x1 DUP4 PUSH1 0x0 NOT SUB PUSH2 0x18F7 JUMP JUMPDEST POP POP JUMP JUMPDEST DUP1 MLOAD PUSH1 0x20 DUP3 ADD MLOAD PUSH1 0x40 DUP1 DUP5 ADD MLOAD PUSH1 0x60 DUP6 DUP2 ADD MLOAD PUSH1 0x80 DUP8 ADD MLOAD MLOAD SWAP4 MLOAD SWAP2 SWAP6 PUSH32 0x4042994600000000000000000000000000000000000000000000000000000000 SWAP6 PUSH2 0x185A SWAP6 PUSH1 0x0 SWAP6 DUP7 SWAP6 SWAP4 SWAP5 SWAP3 SWAP4 SWAP1 SWAP3 SWAP2 PUSH1 0x1 SWAP2 PUSH1 0x24 ADD PUSH2 0x20E1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F NOT DUP2 DUP5 SUB ADD DUP2 MSTORE SWAP2 SWAP1 MSTORE PUSH1 0x20 DUP2 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT SWAP1 SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x18C5 PUSH2 0x1C7A JUMP JUMPDEST PUSH1 0x20 DUP3 MOD ISZERO PUSH2 0x18DA JUMPI PUSH1 0x20 DUP3 MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x40 DUP1 MLOAD DUP1 DUP6 MSTORE PUSH1 0x0 DUP2 MSTORE SWAP1 SWAP3 ADD ADD SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0x1919 JUMPI PUSH2 0x1913 DUP4 PUSH1 0xFF DUP5 DUP2 AND PUSH1 0x20 MUL AND DUP4 OR PUSH2 0x1A7A JUMP JUMPDEST POP PUSH2 0x1528 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0x194D JUMPI PUSH2 0x193A DUP4 PUSH1 0x18 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x1913 DUP4 DUP3 PUSH1 0x1 PUSH4 0xFFFFFFFF PUSH2 0x1A92 AND JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0x1982 JUMPI PUSH2 0x196F DUP4 PUSH1 0x19 PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x1913 DUP4 DUP3 PUSH1 0x2 PUSH4 0xFFFFFFFF PUSH2 0x1A92 AND JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0x19B9 JUMPI PUSH2 0x19A6 DUP4 PUSH1 0x1A PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x1913 DUP4 DUP3 PUSH1 0x4 PUSH4 0xFFFFFFFF PUSH2 0x1A92 AND JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x1528 JUMPI PUSH2 0x19E1 DUP4 PUSH1 0x1B PUSH1 0x20 PUSH1 0xFF DUP7 AND MUL OR PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x19F4 DUP4 DUP3 PUSH1 0x8 PUSH4 0xFFFFFFFF PUSH2 0x1A92 AND JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH2 0x1A02 PUSH2 0x1C7A JUMP JUMPDEST PUSH2 0x171F DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0x1AAB JUMP JUMPDEST PUSH2 0x1A25 DUP3 PUSH1 0xC3 PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x17FC DUP3 DUP3 PUSH1 0x0 NOT SUB PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x1A3F SWAP2 SWAP1 PUSH2 0x2199 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0x1B61 JUMP JUMPDEST PUSH2 0x1A64 DUP3 PUSH1 0xC2 PUSH4 0xFFFFFFFF PUSH2 0x1A7A AND JUMP JUMPDEST POP PUSH2 0x17FC DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD PUSH2 0x1A3F SWAP2 SWAP1 PUSH2 0x2199 JUMP JUMPDEST PUSH2 0x1A82 PUSH2 0x1C7A JUMP JUMPDEST PUSH2 0x171F DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0x1B6E JUMP JUMPDEST PUSH2 0x1A9A PUSH2 0x1C7A JUMP JUMPDEST PUSH2 0x1779 DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0x1BB9 JUMP JUMPDEST PUSH2 0x1AB3 PUSH2 0x1C7A JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP6 MLOAD DUP6 GT ISZERO ISZERO ISZERO PUSH2 0x1AC8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP8 PUSH1 0x20 ADD MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x1AF2 JUMPI PUSH2 0x1AF2 DUP9 PUSH2 0x1AEA DUP11 PUSH1 0x20 ADD MLOAD DUP11 DUP10 ADD PUSH2 0x1C17 JUMP JUMPDEST PUSH1 0x2 MUL PUSH2 0x1C2E JUMP JUMPDEST DUP8 MLOAD DUP1 MLOAD DUP9 PUSH1 0x20 DUP4 ADD ADD SWAP5 POP DUP1 DUP10 DUP9 ADD GT ISZERO PUSH2 0x1B0E JUMPI DUP9 DUP8 ADD DUP3 MSTORE JUMPDEST PUSH1 0x20 DUP9 ADD SWAP4 POP POP POP JUMPDEST PUSH1 0x20 DUP6 LT PUSH2 0x1B39 JUMPI DUP2 MLOAD DUP4 MSTORE PUSH1 0x1F NOT SWAP1 SWAP5 ADD SWAP4 PUSH1 0x20 SWAP3 DUP4 ADD SWAP3 SWAP1 SWAP2 ADD SWAP1 PUSH2 0x1B17 JUMP JUMPDEST POP MLOAD DUP2 MLOAD PUSH1 0x20 SWAP5 SWAP1 SWAP5 SUB PUSH2 0x100 EXP PUSH1 0x0 NOT ADD DUP1 NOT SWAP1 SWAP2 AND SWAP4 AND SWAP3 SWAP1 SWAP3 OR SWAP1 SWAP2 MSTORE POP SWAP2 SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x178E DUP3 PUSH1 0x2 DUP4 MLOAD PUSH2 0x18F7 JUMP JUMPDEST PUSH2 0x1B76 PUSH2 0x1C7A JUMP JUMPDEST PUSH1 0x20 DUP5 ADD MLOAD DUP4 LT PUSH2 0x1B92 JUMPI PUSH2 0x1B92 DUP5 DUP6 PUSH1 0x20 ADD MLOAD PUSH1 0x2 MUL PUSH2 0x1C2E JUMP JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0x1BAE JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP SWAP5 SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH2 0x1BC1 PUSH2 0x1C7A JUMP JUMPDEST PUSH1 0x0 DUP6 PUSH1 0x20 ADD MLOAD DUP6 DUP5 ADD GT ISZERO PUSH2 0x1BE0 JUMPI PUSH2 0x1BE0 DUP7 DUP7 DUP6 ADD PUSH1 0x2 MUL PUSH2 0x1C2E JUMP JUMPDEST PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x1C0B JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP SWAP6 SWAP7 SWAP6 POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0x1C28 JUMPI POP DUP2 PUSH2 0x1233 JUMP JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST DUP2 MLOAD PUSH2 0x1C3A DUP4 DUP4 PUSH2 0x18BD JUMP JUMPDEST POP PUSH2 0x19F4 DUP4 DUP3 PUSH2 0x19FA JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0xC0 DUP2 ADD DUP3 MSTORE PUSH1 0x0 DUP1 DUP3 MSTORE PUSH1 0x20 DUP3 ADD DUP2 SWAP1 MSTORE SWAP2 DUP2 ADD DUP3 SWAP1 MSTORE PUSH1 0x60 DUP2 ADD SWAP2 SWAP1 SWAP2 MSTORE PUSH1 0x80 DUP2 ADD PUSH2 0x1C75 PUSH2 0x1C7A JUMP JUMPDEST SWAP1 MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD SWAP1 SWAP2 MSTORE PUSH1 0x60 DUP2 MSTORE PUSH1 0x0 PUSH1 0x20 DUP3 ADD MSTORE SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x171F DUP3 CALLDATALOAD PUSH2 0x2272 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x171F DUP3 MLOAD PUSH2 0x227E JUMP JUMPDEST PUSH1 0x0 PUSH2 0x171F DUP3 CALLDATALOAD PUSH2 0x2283 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x171F DUP3 MLOAD PUSH2 0x2283 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x171F DUP3 MLOAD PUSH2 0x22A8 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1CE0 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1779 DUP5 DUP5 PUSH2 0x1C92 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1CFE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1779 DUP5 DUP5 PUSH2 0x1C9E JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1D1D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1D29 DUP6 DUP6 PUSH2 0x1CAA JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x1D3A DUP6 DUP3 DUP7 ADD PUSH2 0x1CAA JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D56 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1779 DUP5 DUP5 PUSH2 0x1CAA JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D74 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1779 DUP5 DUP5 PUSH2 0x1CB6 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0xA0 DUP7 DUP9 SUB SLT ISZERO PUSH2 0x1D98 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1DA4 DUP9 DUP9 PUSH2 0x1CC2 JUMP JUMPDEST SWAP6 POP POP PUSH1 0x20 PUSH2 0x1DB5 DUP9 DUP3 DUP10 ADD PUSH2 0x1CB6 JUMP JUMPDEST SWAP5 POP POP PUSH1 0x40 PUSH2 0x1DC6 DUP9 DUP3 DUP10 ADD PUSH2 0x1CB6 JUMP JUMPDEST SWAP4 POP POP PUSH1 0x60 PUSH2 0x1DD7 DUP9 DUP3 DUP10 ADD PUSH2 0x1CB6 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x80 PUSH2 0x1DE8 DUP9 DUP3 DUP10 ADD PUSH2 0x1CC2 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP6 POP SWAP3 SWAP6 SWAP1 SWAP4 POP JUMP JUMPDEST PUSH2 0x1DFE DUP2 PUSH2 0x2272 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH2 0x1DFE DUP2 PUSH2 0x227E JUMP JUMPDEST PUSH2 0x1DFE DUP2 PUSH2 0x2283 JUMP JUMPDEST PUSH2 0x1DFE DUP2 PUSH2 0x2286 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x1E2A DUP3 PUSH2 0x226E JUMP JUMPDEST DUP1 DUP5 MSTORE PUSH2 0x1E3E DUP2 PUSH1 0x20 DUP7 ADD PUSH1 0x20 DUP7 ADD PUSH2 0x22B7 JUMP JUMPDEST PUSH2 0x1E47 DUP2 PUSH2 0x22E3 JUMP JUMPDEST SWAP1 SWAP4 ADD PUSH1 0x20 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x28 DUP2 MSTORE PUSH32 0x556E61626C6520746F207472616E736665722072656D61696E696E67204C494E PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x4B20746F6B656E73000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x756E61626C6520746F207472616E73666572416E6443616C6C20746F206F7261 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x636C650000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x24 DUP2 MSTORE PUSH32 0x43616E206F6E6C7920636865636B207261696E66616C6C206F6E636520706572 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x2064617900000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x31 DUP2 MSTORE PUSH32 0x436F6E74726163742068617320656E6465642C2063616E7420696E7465726163 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x74207769746820697420616E796D6F7265000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x556E61626C6520746F207472616E736665720000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x23 DUP2 MSTORE PUSH32 0x4F6E6C7920496E737572616E63652070726F76696465722063616E20646F2074 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x6869730000000000000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x12 DUP2 MSTORE PUSH32 0x526F756E64206E6F7420636F6D706C6574650000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE PUSH1 0x40 ADD SWAP1 JUMP JUMPDEST PUSH1 0x28 DUP2 MSTORE PUSH32 0x536F75726365206D75737420626520746865206F7261636C65206F6620746865 PUSH1 0x20 DUP3 ADD MSTORE PUSH32 0x2072657175657374000000000000000000000000000000000000000000000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x1233 DUP3 DUP5 PUSH2 0x1DF5 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x20D4 DUP3 DUP6 PUSH2 0x1DF5 JUMP JUMPDEST PUSH2 0x171F PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x100 DUP2 ADD PUSH2 0x20F0 DUP3 DUP12 PUSH2 0x1DF5 JUMP JUMPDEST PUSH2 0x20FD PUSH1 0x20 DUP4 ADD DUP11 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x210A PUSH1 0x40 DUP4 ADD DUP10 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x2117 PUSH1 0x60 DUP4 ADD DUP9 PUSH2 0x1DF5 JUMP JUMPDEST PUSH2 0x2124 PUSH1 0x80 DUP4 ADD DUP8 PUSH2 0x1E16 JUMP JUMPDEST PUSH2 0x2131 PUSH1 0xA0 DUP4 ADD DUP7 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x213E PUSH1 0xC0 DUP4 ADD DUP6 PUSH2 0x1E0D JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0xE0 DUP4 ADD MSTORE PUSH2 0x2150 DUP2 DUP5 PUSH2 0x1E1F JUMP JUMPDEST SWAP11 SWAP10 POP POP POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x216C DUP3 DUP7 PUSH2 0x1DF5 JUMP JUMPDEST PUSH2 0x2179 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1E0D JUMP JUMPDEST DUP2 DUP2 SUB PUSH1 0x40 DUP4 ADD MSTORE PUSH2 0x14F5 DUP2 DUP5 PUSH2 0x1E1F JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x1233 DUP3 DUP5 PUSH2 0x1E04 JUMP JUMPDEST PUSH1 0x20 DUP2 ADD PUSH2 0x1233 DUP3 DUP5 PUSH2 0x1E0D JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x171F DUP2 DUP5 PUSH2 0x1E1F JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1E54 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1EAA JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1F00 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1F56 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1FAC JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x1FDC JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x2032 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 ADD PUSH2 0x1233 DUP2 PUSH2 0x2062 JUMP JUMPDEST PUSH1 0x40 DUP2 ADD PUSH2 0x20D4 DUP3 DUP6 PUSH2 0x1E0D JUMP JUMPDEST PUSH1 0x60 DUP2 ADD PUSH2 0x2254 DUP3 DUP7 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x2261 PUSH1 0x20 DUP4 ADD DUP6 PUSH2 0x1E0D JUMP JUMPDEST PUSH2 0x1779 PUSH1 0x40 DUP4 ADD DUP5 PUSH2 0x1E0D JUMP JUMPDEST MLOAD SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0xA0 PUSH1 0x2 EXP SUB AND SWAP1 JUMP JUMPDEST ISZERO ISZERO SWAP1 JUMP JUMPDEST SWAP1 JUMP JUMPDEST PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 JUMP JUMPDEST PUSH10 0xFFFFFFFFFFFFFFFFFFFF AND SWAP1 JUMP JUMPDEST PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x22D2 JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x22BA JUMP JUMPDEST DUP4 DUP2 GT ISZERO PUSH2 0x19F4 JUMPI POP POP PUSH1 0x0 SWAP2 ADD MSTORE JUMP JUMPDEST PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP1 JUMP STOP LOG2 PUSH6 0x627A7A723058 KECCAK256 0xae PUSH29 0x6B1BC3E9C37BD83CE7EF0D6EBC72EE71C196BD8A89B84FA508D5C11D3F BLOCKHASH PUSH13 0x6578706572696D656E74616CF5 STOP CALLDATACOPY LOG2 PUSH6 0x627A7A723058 KECCAK256 PUSH11 0x9FF78FAEB5974430352B26 DUP2 GASLIMIT 0xbc SWAP5 EXTCODESIZE 0xed PUSH16 0x9B68339EF70368B5E9BB8D6C6E6C6578 PUSH17 0x6572696D656E74616CF500370000000000 ", | |
"sourceMap": "1024:4971:0:-;;;;;;;;;-1:-1:-1;;;1024:4971:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3439:126;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3439:126:0;;;;;;;;;;;;;;;;;;;;;;;;;4610:178;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4610:178:0;;;;;;;;;;;;;;;;;4442:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4442:85:0;;;;;;;;;;;;1188:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1188:40:0;;;;;;;;;;;;4159:183;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4159:183:0;;;;;;;;;4875:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4875:104:0;;;;3884:182;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3884:182:0;;;;;;;;;1377:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1377:79:0;;;;5497:389;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5497:389:0;;;;5178:261;;;;1100:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1100:35:0;;;;2266:1093;;;;;;;;;;3644:147;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3644:147:0;;;;;;;;;3439:126;-1:-1:-1;;;;;3538:20:0;;;3502:17;3538:20;;;:9;:20;;;;;;;;3439:126::o;4610:178::-;4678:4;4694:19;4734:8;4694:49;;4760:1;-1:-1:-1;;;;;4760:19:0;;:21;;;;;-1:-1:-1;;;4760:21:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4760:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4760:21:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;4760:21:0;;;;;;;;;4753:28;4610:178;-1:-1:-1;;;4610:178:0:o;4442:85::-;4487:7;4513;-1:-1:-1;;;;;4513:7:0;4442:85;:::o;1188:40::-;1226:2;1188:40;:::o;4159:183::-;4233:4;4249:19;4289:9;4249:50;;4316:1;-1:-1:-1;;;;;4316:17:0;;:19;;;;;-1:-1:-1;;;4316:19:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4316:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4316:19:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;4316:19:0;;;;;;;;4875:104;4959:4;4951:21;4875:104;:::o;3884:182::-;3954:4;3970:19;4010:9;3970:50;;4037:1;-1:-1:-1;;;;;4037:20:0;;:22;;;;;-1:-1:-1;;;4037:22:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;1377:79:0;1414:42;1377:79;:::o;5497:389::-;5544:3;5573:14;5602:9;5625:14;5653;5681:22;5716:9;;;;;;;;;-1:-1:-1;;;;;5716:9:0;-1:-1:-1;;;;;5716:25:0;;:27;;;;;-1:-1:-1;;;5716:27:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5716:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5716:27:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;5716:27:0;;;;;;;;;5559:184;;;;;;;;;;5833:1;5821:9;:13;5813:44;;;;;;-1:-1:-1;;;;;5813:44:0;;;;;;;;;;;;;;;;;-1:-1:-1;5874:5:0;;5497:389;-1:-1:-1;;;;5497:389:0:o;5178:261::-;5248:23;1893:7;;-1:-1:-1;;;;;1893:7:0;1904:10;1893:21;1885:68;;;;-1:-1:-1;;;;;1885:68:0;;;;;;;;;-1:-1:-1;5348:29:0;;;;;1414:42;;;;5322:13;;5336:10;;1414:42;;5348:14;;:29;;5371:4;;5348:29;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5348:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5348:29:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;5348:29:0;;;;;;;;;5322:56;;;;;-1:-1:-1;;;5322:56:0;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5322:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5322:56:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;5322:56:0;;;;;;;;;5314:87;;;;;;-1:-1:-1;;;;;5314:87:0;;;;;;;;;5424:7;;-1:-1:-1;;;;;5424:7:0;5411:21;1100:35;;;-1:-1:-1;;;;;1100:35:0;;:::o;2266:1093::-;2411:7;1893;;2411;;;;-1:-1:-1;;;;;1893:7:0;1904:10;1893:21;1885:68;;;;-1:-1:-1;;;;;1885:68:0;;;;;;;;;2586:52;2620:16;:14;:16::i;:::-;2602:7;2587:22;;;2586:52;:28;:52;:::i;:::-;2640:7;2649:9;2660:8;2670:12;2684:13;1414:42;1347:12;2556:169;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;;;2745:21:0;;;;;;:9;:21;;;;;;;:25;;-1:-1:-1;;2745:25:0;;;;;;;2911:52;2556:169;;-1:-1:-1;2911:52:0;;-1:-1:-1;2911:52:0;;2556:169;;2939:9;;2950:12;;2911:52;;;;;;;;;;3178:1;-1:-1:-1;;;;;3178:19:0;;:21;;;;;-1:-1:-1;;;3178:21:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3178:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3178:21:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;3178:21:0;;;;;;;;;3133:67;-1:-1:-1;;;;;;3210:13:0;;;3232:1;3276:21;1347:12;3295:1;3276:21;:18;:21;:::i;:::-;3238:29;:9;1226:2;3238:29;:13;:29;:::i;:::-;3271:1;3237:35;3236:61;3210:88;;;;;-1:-1:-1;;;3210:88:0;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3210:88:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3210:88:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;3210:88:0;;;;;;;;;-1:-1:-1;3341:1:0;;2266:1093;-1:-1:-1;;;;;;;2266:1093:0:o;3644:147::-;3706:19;3746:9;3706:50;;3766:1;-1:-1:-1;;;;;3766:16:0;;:18;;;;;-1:-1:-1;;;3766:18:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3766:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3766:18:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;3766:18:0;;;;;;;;;;3644:147;;:::o;674:283:13:-;734:7;950:2;945;:7;;;;;;;;938:14;;674:283;;;;;:::o;212:380::-;272:9;498:7;;494:36;;;-1:-1:-1;522:1:13;515:8;;494:36;-1:-1:-1;540:7:13;;;545:2;540;:7;560:6;;;;;;;;:12;553:20;;;1024:4971:0;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;130:122;;208:39;239:6;233:13;208:39;;259:116;;334:36;362:6;356:13;334:36;;382:122;;460:39;491:6;485:13;460:39;;639:442;;734:4;722:17;;718:27;-1:-1;708:2;;759:1;756;749:12;708:2;796:6;783:20;818:65;833:49;875:6;833:49;;;818:65;;;809:74;;903:6;896:5;889:21;939:4;931:6;927:17;972:4;965:5;961:16;1007:3;998:6;993:3;989:16;986:25;983:2;;;1024:1;1021;1014:12;983:2;1034:41;1068:6;1063:3;1058;1034:41;;;701:380;;;;;;;;1089:118;;1156:46;1194:6;1181:20;1156:46;;1343:120;;1420:38;1450:6;1444:13;1420:38;;1470:241;;1574:2;1562:9;1553:7;1549:23;1545:32;1542:2;;;1590:1;1587;1580:12;1542:2;1625:1;1642:53;1687:7;1667:9;1642:53;;;1632:63;1536:175;-1:-1;;;;1536:175;1718:263;;1833:2;1821:9;1812:7;1808:23;1804:32;1801:2;;;1849:1;1846;1839:12;1801:2;1884:1;1901:64;1957:7;1937:9;1901:64;;1988:849;;;;;;2170:3;2158:9;2149:7;2145:23;2141:33;2138:2;;;2187:1;2184;2177:12;2138:2;2222:1;2239:53;2284:7;2264:9;2239:53;;;2229:63;;2201:97;2329:2;2347:53;2392:7;2383:6;2372:9;2368:22;2347:53;;;2337:63;;2308:98;2437:2;2455:53;2500:7;2491:6;2480:9;2476:22;2455:53;;;2445:63;;2416:98;2545:2;2563:53;2608:7;2599:6;2588:9;2584:22;2563:53;;;2553:63;;2524:98;2681:3;2670:9;2666:19;2653:33;2706:18;2698:6;2695:30;2692:2;;;2738:1;2735;2728:12;2692:2;2758:63;2813:7;2804:6;2793:9;2789:22;2758:63;;;2748:73;;2632:195;2132:705;;;;;;;;;2844:257;;2956:2;2944:9;2935:7;2931:23;2927:32;2924:2;;;2972:1;2969;2962:12;2924:2;3007:1;3024:61;3077:7;3057:9;3024:61;;3108:263;;3223:2;3211:9;3202:7;3198:23;3194:32;3191:2;;;3239:1;3236;3229:12;3191:2;3274:1;3291:64;3347:7;3327:9;3291:64;;3648:803;;;;;;3828:3;3816:9;3807:7;3803:23;3799:33;3796:2;;;3845:1;3842;3835:12;3796:2;3880:1;3897:63;3952:7;3932:9;3897:63;;;3887:73;;3859:107;3997:2;4015:63;4070:7;4061:6;4050:9;4046:22;4015:63;;;4005:73;;3976:108;4115:2;4133:64;4189:7;4180:6;4169:9;4165:22;4133:64;;;4123:74;;4094:109;4234:2;4252:64;4308:7;4299:6;4288:9;4284:22;4252:64;;;4242:74;;4213:109;4353:3;4372:63;4427:7;4418:6;4407:9;4403:22;4372:63;;4458:110;4531:31;4556:5;4531:31;;;4526:3;4519:44;4513:55;;;4575:101;4642:28;4664:5;4642:28;;4683:168;4782:63;4839:5;4782:63;;4858:107;4929:30;4953:5;4929:30;;4972:300;;5074:39;5107:5;5074:39;;;5130:6;5125:3;5118:19;5142:63;5198:6;5191:4;5186:3;5182:14;5175:4;5168:5;5164:16;5142:63;;;5237:29;5259:6;5237:29;;;5217:50;;;5230:4;5217:50;;5054:218;-1:-1;;;5054:218;5280:296;5435:2;5423:15;;5472:66;5467:2;5458:12;;5451:88;5567:2;5558:12;;5416:160;5585:397;5740:2;5728:15;;5777:66;5772:2;5763:12;;5756:88;5878:66;5873:2;5864:12;;5857:88;5973:2;5964:12;;5721:261;5991:296;6146:2;6134:15;;6183:66;6178:2;6169:12;;6162:88;6278:2;6269:12;;6127:160;6412:193;6520:2;6505:18;;6534:61;6509:9;6568:6;6534:61;;6612:294;6748:2;6733:18;;6762:61;6737:9;6796:6;6762:61;;;6834:62;6892:2;6881:9;6877:18;6868:6;6834:62;;6913:395;7077:2;7062:18;;7091:61;7066:9;7125:6;7091:61;;;7163:62;7221:2;7210:9;7206:18;7197:6;7163:62;;;7236;7294:2;7283:9;7279:18;7270:6;7236:62;;7315:891;7611:3;7596:19;;7626:61;7600:9;7660:6;7626:61;;;7698:62;7756:2;7745:9;7741:18;7732:6;7698:62;;;7771;7829:2;7818:9;7814:18;7805:6;7771:62;;;7844;7902:2;7891:9;7887:18;7878:6;7844:62;;;7955:9;7949:4;7945:20;7939:3;7928:9;7924:19;7917:49;7980:68;8043:4;8034:6;7980:68;;;7972:76;;8059:63;8117:3;8106:9;8102:19;8093:6;8059:63;;;8133;8191:3;8180:9;8176:19;8167:6;8133:63;;;7582:624;;;;;;;;;;;8213:181;8315:2;8300:18;;8329:55;8304:9;8357:6;8329:55;;8401:245;8535:2;8520:18;;8549:87;8524:9;8609:6;8549:87;;8653:189;8759:2;8744:18;;8773:59;8748:9;8805:6;8773:59;;8849:387;9030:2;9044:47;;;9015:18;;9105:121;9015:18;9105:121;;9243:387;9424:2;9438:47;;;9409:18;;9499:121;9409:18;9499:121;;9637:387;9818:2;9832:47;;;9803:18;;9893:121;9803:18;9893:121;;10231:256;10293:2;10287:9;10319:17;;;10394:18;10379:34;;10415:22;;;10376:62;10373:2;;;10451:1;10448;10441:12;10373:2;10467;10460:22;10271:216;;-1:-1;10271:216;10494:259;;10638:18;10630:6;10627:30;10624:2;;;10670:1;10667;10660:12;10624:2;-1:-1;10743:4;10714;10691:17;;;;-1:-1;;10687:33;10733:15;;10561:192;10760:92;10835:12;;10819:33;10859:128;-1:-1;;;;;10928:54;;10911:76;10994:92;11067:13;11060:21;;11043:43;11093:78;11161:5;11144:27;11755:107;11834:22;11823:34;;11806:56;11869:141;;11974:31;11999:5;11974:31;;12018:145;12099:6;12094:3;12089;12076:30;-1:-1;12155:1;12137:16;;12130:27;12069:94;12172:268;12237:1;12244:101;12258:6;12255:1;12252:13;12244:101;;;12325:11;;;12319:18;12306:11;;;12299:39;12280:2;12273:10;12244:101;;;12360:6;12357:1;12354:13;12351:2;;;12425:1;12416:6;12411:3;12407:16;12400:27;12351:2;12221:219;;;;;12448:97;12536:2;12516:14;-1:-1;;12512:28;;12496:49" | |
}, | |
"gasEstimates": { | |
"creation": { | |
"codeDepositCost": "2987400", | |
"executionCost": "43779", | |
"totalCost": "3031179" | |
}, | |
"external": { | |
"": "409", | |
"DAY_IN_SECONDS()": "414", | |
"LINK_KOVAN()": "577", | |
"endContractProvider()": "infinite", | |
"getContract(address)": "infinite", | |
"getContractBalance()": "857", | |
"getContractRainfall(address)": "infinite", | |
"getContractRequestCount(address)": "infinite", | |
"getContractStatus(address)": "infinite", | |
"getInsurer()": "742", | |
"getLatestPrice()": "infinite", | |
"insurer()": "918", | |
"newContract(address,uint256,uint256,uint256,string)": "infinite", | |
"updateContract(address)": "infinite" | |
} | |
}, | |
"methodIdentifiers": { | |
"DAY_IN_SECONDS()": "5fdc6281", | |
"LINK_KOVAN()": "7c463db0", | |
"endContractProvider()": "a1219c42", | |
"getContract(address)": "0ad1c2fa", | |
"getContractBalance()": "6f9fb98a", | |
"getContractRainfall(address)": "71f28640", | |
"getContractRequestCount(address)": "6896c870", | |
"getContractStatus(address)": "125716d6", | |
"getInsurer()": "5d0c1476", | |
"getLatestPrice()": "8e15f473", | |
"insurer()": "dbc837c5", | |
"newContract(address,uint256,uint256,uint256,string)": "dfdf79e8", | |
"updateContract(address)": "e3db17b8" | |
} | |
}, | |
"abi": [ | |
{ | |
"constant": true, | |
"inputs": [ | |
{ | |
"name": "_contract", | |
"type": "address" | |
} | |
], | |
"name": "getContract", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "address" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [ | |
{ | |
"name": "_address", | |
"type": "address" | |
} | |
], | |
"name": "getContractStatus", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "bool" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getInsurer", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "address" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "DAY_IN_SECONDS", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [ | |
{ | |
"name": "_contract", | |
"type": "address" | |
} | |
], | |
"name": "getContractRequestCount", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getContractBalance", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [ | |
{ | |
"name": "_contract", | |
"type": "address" | |
} | |
], | |
"name": "getContractRainfall", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "LINK_KOVAN", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "address" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getLatestPrice", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "int256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": false, | |
"inputs": [], | |
"name": "endContractProvider", | |
"outputs": [], | |
"payable": true, | |
"stateMutability": "payable", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "insurer", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "address" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": false, | |
"inputs": [ | |
{ | |
"name": "_client", | |
"type": "address" | |
}, | |
{ | |
"name": "_duration", | |
"type": "uint256" | |
}, | |
{ | |
"name": "_premium", | |
"type": "uint256" | |
}, | |
{ | |
"name": "_payoutValue", | |
"type": "uint256" | |
}, | |
{ | |
"name": "_cropLocation", | |
"type": "string" | |
} | |
], | |
"name": "newContract", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "address" | |
} | |
], | |
"payable": true, | |
"stateMutability": "payable", | |
"type": "function" | |
}, | |
{ | |
"constant": false, | |
"inputs": [ | |
{ | |
"name": "_contract", | |
"type": "address" | |
} | |
], | |
"name": "updateContract", | |
"outputs": [], | |
"payable": false, | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"payable": true, | |
"stateMutability": "payable", | |
"type": "constructor" | |
}, | |
{ | |
"payable": true, | |
"stateMutability": "payable", | |
"type": "fallback" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": false, | |
"name": "_insuranceContract", | |
"type": "address" | |
}, | |
{ | |
"indexed": false, | |
"name": "_premium", | |
"type": "uint256" | |
}, | |
{ | |
"indexed": false, | |
"name": "_totalCover", | |
"type": "uint256" | |
} | |
], | |
"name": "contractCreated", | |
"type": "event" | |
} | |
] | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"compiler": { | |
"version": "0.4.24+commit.e67f0147" | |
}, | |
"language": "Solidity", | |
"output": { | |
"abi": [ | |
{ | |
"constant": true, | |
"inputs": [ | |
{ | |
"name": "_contract", | |
"type": "address" | |
} | |
], | |
"name": "getContract", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "address" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [ | |
{ | |
"name": "_address", | |
"type": "address" | |
} | |
], | |
"name": "getContractStatus", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "bool" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getInsurer", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "address" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "DAY_IN_SECONDS", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [ | |
{ | |
"name": "_contract", | |
"type": "address" | |
} | |
], | |
"name": "getContractRequestCount", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getContractBalance", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [ | |
{ | |
"name": "_contract", | |
"type": "address" | |
} | |
], | |
"name": "getContractRainfall", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "LINK_KOVAN", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "address" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "getLatestPrice", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "int256" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": false, | |
"inputs": [], | |
"name": "endContractProvider", | |
"outputs": [], | |
"payable": true, | |
"stateMutability": "payable", | |
"type": "function" | |
}, | |
{ | |
"constant": true, | |
"inputs": [], | |
"name": "insurer", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "address" | |
} | |
], | |
"payable": false, | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"constant": false, | |
"inputs": [ | |
{ | |
"name": "_client", | |
"type": "address" | |
}, | |
{ | |
"name": "_duration", | |
"type": "uint256" | |
}, | |
{ | |
"name": "_premium", | |
"type": "uint256" | |
}, | |
{ | |
"name": "_payoutValue", | |
"type": "uint256" | |
}, | |
{ | |
"name": "_cropLocation", | |
"type": "string" | |
} | |
], | |
"name": "newContract", | |
"outputs": [ | |
{ | |
"name": "", | |
"type": "address" | |
} | |
], | |
"payable": true, | |
"stateMutability": "payable", | |
"type": "function" | |
}, | |
{ | |
"constant": false, | |
"inputs": [ | |
{ | |
"name": "_contract", | |
"type": "address" | |
} | |
], | |
"name": "updateContract", | |
"outputs": [], | |
"payable": false, | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"payable": true, | |
"stateMutability": "payable", | |
"type": "constructor" | |
}, | |
{ | |
"payable": true, | |
"stateMutability": "payable", | |
"type": "fallback" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": false, | |
"name": "_insuranceContract", | |
"type": "address" | |
}, | |
{ | |
"indexed": false, | |
"name": "_premium", | |
"type": "uint256" | |
}, | |
{ | |
"indexed": false, | |
"name": "_totalCover", | |
"type": "uint256" | |
} | |
], | |
"name": "contractCreated", | |
"type": "event" | |
} | |
], | |
"devdoc": { | |
"methods": { | |
"endContractProvider()": { | |
"details": "Function to end provider contract, in case of bugs or needing to update logic etc, funds are returned to insurance provider, including any remaining LINK tokens" | |
}, | |
"getContract(address)": { | |
"details": "returns the contract for a given address" | |
}, | |
"getContractBalance()": { | |
"details": "Return how much ether is in this master contract" | |
}, | |
"getContractRainfall(address)": { | |
"details": "gets the current rainfall for a given contract address" | |
}, | |
"getContractRequestCount(address)": { | |
"details": "gets the current rainfall for a given contract address" | |
}, | |
"getContractStatus(address)": { | |
"details": "Get the status of a given Contract" | |
}, | |
"getInsurer()": { | |
"details": "Get the insurer address for this insurance provider" | |
}, | |
"newContract(address,uint256,uint256,uint256,string)": { | |
"details": "Create a new contract for client, automatically approved and deployed to the blockchain" | |
}, | |
"updateContract(address)": { | |
"details": "updates the contract for a given address" | |
} | |
} | |
}, | |
"userdoc": { | |
"methods": { | |
"getLatestPrice()": { | |
"notice": "Returns the latest price" | |
} | |
} | |
} | |
}, | |
"settings": { | |
"compilationTarget": { | |
"79cf8c59f1fbf6e6a0327920c9a9c49a/Parametric-Crop-Insurance.sol": "InsuranceProvider" | |
}, | |
"evmVersion": "byzantium", | |
"libraries": {}, | |
"optimizer": { | |
"enabled": true, | |
"runs": 200 | |
}, | |
"remappings": [] | |
}, | |
"sources": { | |
"79cf8c59f1fbf6e6a0327920c9a9c49a/Parametric-Crop-Insurance.sol": { | |
"keccak256": "0x69a7f1ba4320036e9ec8d803ef7386fa0e9c2a28fd65eab0600ff1da0ae56d35", | |
"urls": [ | |
"bzzr://df8956114b97ca4384c8d51110c4518189f561f1cbc9885cab289db60c69907f" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/Chainlink.sol": { | |
"keccak256": "0x3e8d01f8aead4e1eac6b3332d366ed8bc2ef5d889c2c8c344777b981d4071f63", | |
"urls": [ | |
"bzzr://7be4bdda81bc444446593968124112fb399d460f529d80761e50c47874b9cb4f" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/ChainlinkClient.sol": { | |
"keccak256": "0xc36504687b2b37000d8e6e25830cdb613c3e88509b0253aa09220e18876dc380", | |
"urls": [ | |
"bzzr://a678a44b26b199a1600d422f4f6eda5d805f00a360245037a1c465b48274fe6d" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/interfaces/AggregatorInterface.sol": { | |
"keccak256": "0xb21fa756e241d3fbfe7546158a7e1bb4a98f261744751c4e9dfe5f474ea46338", | |
"urls": [ | |
"bzzr://acb860d28a70616f38d2d7d72ce5c82a2221734deefe67ace468112e92679bf7" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/interfaces/AggregatorV3Interface.sol": { | |
"keccak256": "0xbf26d0dca0e2815b7c0bd09bddc9ceca339b8c9c2319ca74b2555273f5cbc19c", | |
"urls": [ | |
"bzzr://2fcac254d89fbaf4c08461c7d7eb787e9143c7945683cb368119829e532db63d" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/interfaces/ChainlinkRequestInterface.sol": { | |
"keccak256": "0x7d3983584065248fba8f0ce75fd86feac43ade43784466f87ea502254ddec992", | |
"urls": [ | |
"bzzr://30de07df8cb9fb4ec53aff0f115f88d65936ffd6e90d2aeb031a05d6bf4de6c1" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/interfaces/ENSInterface.sol": { | |
"keccak256": "0xd0b1a6134b5d6c0213bc4db5df8693ec41e13de3d97d43cc8d19639e516f9767", | |
"urls": [ | |
"bzzr://93d66e26b4b5cf6cfa8c6a5d04cb56ff27d49a2aee8f54858ac3db7658355b1f" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/interfaces/LinkTokenInterface.sol": { | |
"keccak256": "0x37f31fbd4f4f28ba236cbd9a61ae9b6f7806ea7fe0a684a855e4835f808f8b92", | |
"urls": [ | |
"bzzr://5518135de15ba1afd8bdac829875935dea5520b152d1f602cdc34551d3c0b806" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/interfaces/PointerInterface.sol": { | |
"keccak256": "0x8019f30a207af4ee80a8b2774e42aba721641254ed0a97826a54f33d7caef218", | |
"urls": [ | |
"bzzr://8ddbb9ae67ec27aed40d6013d6ea176c05f7cd61d4f6fa95492a03fa086d90af" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/vendor/Buffer.sol": { | |
"keccak256": "0x900b4c8ab35b4876d89835a8b050c96107ace250a70f64c5bba6a78a60f03883", | |
"urls": [ | |
"bzzr://408340da4e8fa35e608196ee508f11f9d44f6f70a10f0db0083ab20b5a894d59" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/vendor/CBOR.sol": { | |
"keccak256": "0x93faa5cd4bb12e81f73ee0edd3c1fe4fa6dbb0a0a7ab550e46b3c3d845268c9d", | |
"urls": [ | |
"bzzr://c7f8bd088823a62b35a8138d5b2ff380d0527a030121a226c2a47559ea7d3679" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/vendor/ENSResolver.sol": { | |
"keccak256": "0x08965df63f00cb8d164d6fc36a0c388740725906b0bfb79b17391d5dfeabf683", | |
"urls": [ | |
"bzzr://0700cb12e032ed8ed8327e446dfd805ae9fa28785a2909a73def511fe374b8cd" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/vendor/Ownable.sol": { | |
"keccak256": "0x84c7090c27cf3657b73d9e26b6b316975fa0bd233b8169f254de0c3b3acfaefc", | |
"urls": [ | |
"bzzr://b983355647976c1daa5de581a1b6a41be9c5adc17cce257b8679649db78f8a11" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/vendor/SafeMathChainlink.sol": { | |
"keccak256": "0xb822782dea15f1fa4992c27639e9f9e4a4758b2c2fd8b12ec90c4de336de9074", | |
"urls": [ | |
"bzzr://1328bb1e33d56d48209e5bbea79fa18b212e8df3f449ac9a75d20962cc36cce5" | |
] | |
} | |
}, | |
"version": 1 | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity 0.4.24; | |
pragma experimental ABIEncoderV2; | |
//Truffle Imports | |
//import "chainlink/contracts/ChainlinkClient.sol"; | |
//import "chainlink/contracts/vendor/Ownable.sol"; | |
//import "chainlink/contracts/interfaces/LinkTokenInterface.sol"; | |
//Remix imports - used when testing in remix | |
import "https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/ChainlinkClient.sol"; | |
import "https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/vendor/Ownable.sol"; | |
import "https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/interfaces/LinkTokenInterface.sol"; | |
import "https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/interfaces/AggregatorInterface.sol"; | |
import "https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/vendor/SafeMathChainlink.sol"; | |
import "https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.4/interfaces/AggregatorV3Interface.sol"; | |
contract InsuranceProvider { | |
using SafeMathChainlink for uint; | |
address public insurer = msg.sender; | |
AggregatorV3Interface internal priceFeed; | |
uint public constant DAY_IN_SECONDS = 60; //How many seconds in a day. 60 for testing, 86400 for Production | |
uint256 constant private ORACLE_PAYMENT = 0.1 * 10**18; // 0.1 LINK | |
address public constant LINK_KOVAN = 0xa36085F69e2889c224210F603D836748e7dC0088 ; //address of LINK token on Kovan | |
//here is where all the insurance contracts are stored. | |
mapping (address => InsuranceContract) contracts; | |
constructor() public payable { | |
priceFeed = AggregatorV3Interface(0x9326BFA02ADD2366b30bacB125260Af641031331); | |
} | |
/** | |
* @dev Prevents a function being run unless it's called by the Insurance Provider | |
*/ | |
modifier onlyOwner() { | |
require(insurer == msg.sender,'Only Insurance provider can do this'); | |
_; | |
} | |
/** | |
* @dev Event to log when a contract is created | |
*/ | |
event contractCreated(address _insuranceContract, uint _premium, uint _totalCover); | |
/** | |
* @dev Create a new contract for client, automatically approved and deployed to the blockchain | |
*/ | |
function newContract(address _client, uint _duration, uint _premium, uint _payoutValue, string _cropLocation) public payable onlyOwner() returns(address) { | |
//create contract, send payout amount so contract is fully funded plus a small buffer | |
InsuranceContract i = (new InsuranceContract).value((_payoutValue * 1 ether).div(uint(getLatestPrice())))(_client, _duration, _premium, _payoutValue, _cropLocation, LINK_KOVAN,ORACLE_PAYMENT); | |
contracts[address(i)] = i; //store insurance contract in contracts Map | |
//emit an event to say the contract has been created and funded | |
emit contractCreated(address(i), msg.value, _payoutValue); | |
//now that contract has been created, we need to fund it with enough LINK tokens to fulfil 1 Oracle request per day, with a small buffer added | |
LinkTokenInterface link = LinkTokenInterface(i.getChainlinkToken()); | |
link.transfer(address(i), ((_duration.div(DAY_IN_SECONDS)) + 2) * ORACLE_PAYMENT.mul(2)); | |
return address(i); | |
} | |
/** | |
* @dev returns the contract for a given address | |
*/ | |
function getContract(address _contract) external view returns (InsuranceContract) { | |
return contracts[_contract]; | |
} | |
/** | |
* @dev updates the contract for a given address | |
*/ | |
function updateContract(address _contract) external { | |
InsuranceContract i = InsuranceContract(_contract); | |
i.updateContract(); | |
} | |
/** | |
* @dev gets the current rainfall for a given contract address | |
*/ | |
function getContractRainfall(address _contract) external view returns(uint) { | |
InsuranceContract i = InsuranceContract(_contract); | |
return i.getCurrentRainfall(); | |
} | |
/** | |
* @dev gets the current rainfall for a given contract address | |
*/ | |
function getContractRequestCount(address _contract) external view returns(uint) { | |
InsuranceContract i = InsuranceContract(_contract); | |
return i.getRequestCount(); | |
} | |
/** | |
* @dev Get the insurer address for this insurance provider | |
*/ | |
function getInsurer() external view returns (address) { | |
return insurer; | |
} | |
/** | |
* @dev Get the status of a given Contract | |
*/ | |
function getContractStatus(address _address) external view returns (bool) { | |
InsuranceContract i = InsuranceContract(_address); | |
return i.getContractStatus(); | |
} | |
/** | |
* @dev Return how much ether is in this master contract | |
*/ | |
function getContractBalance() external view returns (uint) { | |
return address(this).balance; | |
} | |
/** | |
* @dev Function to end provider contract, in case of bugs or needing to update logic etc, funds are returned to insurance provider, including any remaining LINK tokens | |
*/ | |
function endContractProvider() external payable onlyOwner() { | |
LinkTokenInterface link = LinkTokenInterface(LINK_KOVAN); | |
require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer"); | |
selfdestruct(insurer); | |
} | |
/** | |
* Returns the latest price | |
*/ | |
function getLatestPrice() public view returns (int) { | |
( | |
uint80 roundID, | |
int price, | |
uint startedAt, | |
uint timeStamp, | |
uint80 answeredInRound | |
) = priceFeed.latestRoundData(); | |
// If the round is not complete yet, timestamp is 0 | |
require(timeStamp > 0, "Round not complete"); | |
return price; | |
} | |
/** | |
* @dev fallback function, to receive ether | |
*/ | |
function() external payable { } | |
} | |
contract InsuranceContract is ChainlinkClient, Ownable { | |
using SafeMathChainlink for uint; | |
AggregatorV3Interface internal priceFeed; | |
uint public constant DAY_IN_SECONDS = 60; //How many seconds in a day. 60 for testing, 86400 for Production | |
uint public constant DROUGHT_DAYS_THRESDHOLD = 3 ; //Number of consecutive days without rainfall to be defined as a drought | |
uint256 private oraclePaymentAmount; | |
address public insurer; | |
address client; | |
uint startDate; | |
uint duration; | |
uint premium; | |
uint payoutValue; | |
string cropLocation; | |
uint256[2] public currentRainfallList; | |
bytes32[2] public jobIds; | |
address[2] public oracles; | |
string constant WORLD_WEATHER_ONLINE_URL = "http://api.worldweatheronline.com/premium/v1/weather.ashx?"; | |
string constant WORLD_WEATHER_ONLINE_KEY = "629c6dd09bbc4364b7a33810200911"; | |
string constant WORLD_WEATHER_ONLINE_PATH = "data.current_condition.0.precipMM"; | |
string constant OPEN_WEATHER_URL = "https://openweathermap.org/data/2.5/weather?"; | |
string constant OPEN_WEATHER_KEY = "b4e40205aeb3f27b74333393de24ca79"; | |
string constant OPEN_WEATHER_PATH = "rain.1h"; | |
string constant WEATHERBIT_URL = "https://api.weatherbit.io/v2.0/current?"; | |
string constant WEATHERBIT_KEY = "5e05aef07410401fac491b06eb9e8fc8"; | |
string constant WEATHERBIT_PATH = "data.0.precip"; | |
uint daysWithoutRain; //how many days there has been with 0 rain | |
bool contractActive; //is the contract currently active, or has it ended | |
bool contractPaid = false; | |
uint currentRainfall = 0; //what is the current rainfall for the location | |
uint currentRainfallDateChecked = now; //when the last rainfall check was performed | |
uint requestCount = 0; //how many requests for rainfall data have been made so far for this insurance contract | |
uint dataRequestsSent = 0; //variable used to determine if both requests have been sent or not | |
/** | |
* @dev Prevents a function being run unless it's called by Insurance Provider | |
*/ | |
modifier onlyOwner() { | |
require(insurer == msg.sender,'Only Insurance provider can do this'); | |
_; | |
} | |
/** | |
* @dev Prevents a function being run unless the Insurance Contract duration has been reached | |
*/ | |
modifier onContractEnded() { | |
if (startDate + duration < now) { | |
_; | |
} | |
} | |
/** | |
* @dev Prevents a function being run unless contract is still active | |
*/ | |
modifier onContractActive() { | |
require(contractActive == true ,'Contract has ended, cant interact with it anymore'); | |
_; | |
} | |
/** | |
* @dev Prevents a data request to be called unless it's been a day since the last call (to avoid spamming and spoofing results) | |
* apply a tolerance of 2/24 of a day or 2 hours. | |
*/ | |
modifier callFrequencyOncePerDay() { | |
require(now.sub(currentRainfallDateChecked) > (DAY_IN_SECONDS.sub(DAY_IN_SECONDS.div(12))),'Can only check rainfall once per day'); | |
_; | |
} | |
event contractCreated(address _insurer, address _client, uint _duration, uint _premium, uint _totalCover); | |
event contractPaidOut(uint _paidTime, uint _totalPaid, uint _finalRainfall); | |
event contractEnded(uint _endTime, uint _totalReturned); | |
event ranfallThresholdReset(uint _rainfall); | |
event dataRequestSent(bytes32 requestId); | |
event dataReceived(uint _rainfall); | |
/** | |
* @dev Creates a new Insurance contract | |
*/ | |
constructor(address _client, uint _duration, uint _premium, uint _payoutValue, string _cropLocation, | |
address _link, uint256 _oraclePaymentAmount) payable Ownable() public { | |
//set ETH/USD Price Feed | |
priceFeed = AggregatorV3Interface(0x9326BFA02ADD2366b30bacB125260Af641031331); | |
//initialize variables required for Chainlink Network interaction | |
setChainlinkToken(_link); | |
oraclePaymentAmount = _oraclePaymentAmount; | |
//first ensure insurer has fully funded the contract | |
require(msg.value >= _payoutValue.div(uint(getLatestPrice())), "Not enough funds sent to contract"); | |
//now initialize values for the contract | |
insurer= msg.sender; | |
client = _client; | |
startDate = now ; //contract will be effective immediately on creation | |
duration = _duration; | |
premium = _premium; | |
payoutValue = _payoutValue; | |
daysWithoutRain = 0; | |
contractActive = true; | |
cropLocation = _cropLocation; | |
//set the oracles and jodids to values from nodes on market.link | |
//oracles[0] = 0x240bae5a27233fd3ac5440b5a598467725f7d1cd; | |
//oracles[1] = 0x5b4247e58fe5a54a116e4a3be32b31be7030c8a3; | |
//jobIds[0] = '1bc4f827ff5942eaaa7540b7dd1e20b9'; | |
//jobIds[1] = 'e67ddf1f394d44e79a9a2132efd00050'; | |
//or if you have your own node and job setup you can use it for both requests | |
oracles[0] = 0x05c8fadf1798437c143683e665800d58a42b6e19; | |
oracles[1] = 0x05c8fadf1798437c143683e665800d58a42b6e19; | |
jobIds[0] = 'a17e8fbf4cbf46eeb79e04b3eb864a4e'; | |
jobIds[1] = 'a17e8fbf4cbf46eeb79e04b3eb864a4e'; | |
emit contractCreated(insurer, | |
client, | |
duration, | |
premium, | |
payoutValue); | |
} | |
/** | |
* @dev Calls out to an Oracle to obtain weather data | |
*/ | |
function updateContract() public onContractActive() returns (bytes32 requestId) { | |
//first call end contract in case of insurance contract duration expiring, if it hasn't then this functin execution will resume | |
checkEndContract(); | |
//contract may have been marked inactive above, only do request if needed | |
if (contractActive) { | |
dataRequestsSent = 0; | |
//First build up a request to World Weather Online to get the current rainfall | |
string memory url = string(abi.encodePacked(WORLD_WEATHER_ONLINE_URL, "key=",WORLD_WEATHER_ONLINE_KEY,"&q=",cropLocation,"&format=json&num_of_days=1")); | |
checkRainfall(oracles[0], jobIds[0], url, WORLD_WEATHER_ONLINE_PATH); | |
// Now build up the second request to WeatherBit | |
url = string(abi.encodePacked(WEATHERBIT_URL, "city=",cropLocation,"&key=",WEATHERBIT_KEY)); | |
checkRainfall(oracles[1], jobIds[1], url, WEATHERBIT_PATH); | |
} | |
} | |
/** | |
* @dev Calls out to an Oracle to obtain weather data | |
*/ | |
function checkRainfall(address _oracle, bytes32 _jobId, string _url, string _path) private onContractActive() returns (bytes32 requestId) { | |
//First build up a request to get the current rainfall | |
Chainlink.Request memory req = buildChainlinkRequest(_jobId, address(this), this.checkRainfallCallBack.selector); | |
req.add("get", _url); //sends the GET request to the oracle | |
req.add("path", _path); | |
req.addInt("times", 100); | |
requestId = sendChainlinkRequestTo(_oracle, req, oraclePaymentAmount); | |
emit dataRequestSent(requestId); | |
} | |
/** | |
* @dev Callback function - This gets called by the Oracle Contract when the Oracle Node passes data back to the Oracle Contract | |
* The function will take the rainfall given by the Oracle and updated the Inusrance Contract state | |
*/ | |
function checkRainfallCallBack(bytes32 _requestId, uint256 _rainfall) public recordChainlinkFulfillment(_requestId) onContractActive() callFrequencyOncePerDay() { | |
//set current temperature to value returned from Oracle, and store date this was retrieved (to avoid spam and gaming the contract) | |
currentRainfallList[dataRequestsSent] = _rainfall; | |
dataRequestsSent = dataRequestsSent + 1; | |
//set current rainfall to average of both values | |
if (dataRequestsSent > 1) { | |
currentRainfall = (currentRainfallList[0].add(currentRainfallList[1]).div(2)); | |
currentRainfallDateChecked = now; | |
requestCount +=1; | |
//check if payout conditions have been met, if so call payoutcontract, which should also end/kill contract at the end | |
if (currentRainfall == 0 ) { //temp threshold has been met, add a day of over threshold | |
daysWithoutRain += 1; | |
} else { | |
//there was rain today, so reset daysWithoutRain parameter | |
daysWithoutRain = 0; | |
emit ranfallThresholdReset(currentRainfall); | |
} | |
if (daysWithoutRain >= DROUGHT_DAYS_THRESDHOLD) { // day threshold has been met | |
//need to pay client out insurance amount | |
payOutContract(); | |
} | |
} | |
emit dataReceived(_rainfall); | |
} | |
/** | |
* @dev Insurance conditions have been met, do payout of total cover amount to client | |
*/ | |
function payOutContract() private onContractActive() { | |
//Transfer agreed amount to client | |
client.transfer(address(this).balance); | |
//Transfer any remaining funds (premium) back to Insurer | |
LinkTokenInterface link = LinkTokenInterface(chainlinkTokenAddress()); | |
require(link.transfer(insurer, link.balanceOf(address(this))), "Unable to transfer"); | |
emit contractPaidOut(now, payoutValue, currentRainfall); | |
//now that amount has been transferred, can end the contract | |
//mark contract as ended, so no future calls can be done | |
contractActive = false; | |
contractPaid = true; | |
} | |
/** | |
* @dev Insurance conditions have not been met, and contract expired, end contract and return funds | |
*/ | |
function checkEndContract() private onContractEnded() { | |
//Insurer needs to have performed at least 1 weather call per day to be eligible to retrieve funds back. | |
//We will allow for 1 missed weather call to account for unexpected issues on a given day. | |
if (requestCount >= (duration.div(DAY_IN_SECONDS) - 2)) { | |
//return funds back to insurance provider then end/kill the contract | |
insurer.transfer(address(this).balance); | |
} else { //insurer hasn't done the minimum number of data requests, client is eligible to receive his premium back | |
// need to use ETH/USD price feed to calculate ETH amount | |
client.transfer(premium.div(uint(getLatestPrice()))); | |
insurer.transfer(address(this).balance); | |
} | |
//transfer any remaining LINK tokens back to the insurer | |
LinkTokenInterface link = LinkTokenInterface(chainlinkTokenAddress()); | |
require(link.transfer(insurer, link.balanceOf(address(this))), "Unable to transfer remaining LINK tokens"); | |
//mark contract as ended, so no future state changes can occur on the contract | |
contractActive = false; | |
emit contractEnded(now, address(this).balance); | |
} | |
/** | |
* Returns the latest price | |
*/ | |
function getLatestPrice() public view returns (int) { | |
( | |
uint80 roundID, | |
int price, | |
uint startedAt, | |
uint timeStamp, | |
uint80 answeredInRound | |
) = priceFeed.latestRoundData(); | |
// If the round is not complete yet, timestamp is 0 | |
require(timeStamp > 0, "Round not complete"); | |
return price; | |
} | |
/** | |
* @dev Get the balance of the contract | |
*/ | |
function getContractBalance() external view returns (uint) { | |
return address(this).balance; | |
} | |
/** | |
* @dev Get the Crop Location | |
*/ | |
function getLocation() external view returns (string) { | |
return cropLocation; | |
} | |
/** | |
* @dev Get the Total Cover | |
*/ | |
function getPayoutValue() external view returns (uint) { | |
return payoutValue; | |
} | |
/** | |
* @dev Get the Premium paid | |
*/ | |
function getPremium() external view returns (uint) { | |
return premium; | |
} | |
/** | |
* @dev Get the status of the contract | |
*/ | |
function getContractStatus() external view returns (bool) { | |
return contractActive; | |
} | |
/** | |
* @dev Get whether the contract has been paid out or not | |
*/ | |
function getContractPaid() external view returns (bool) { | |
return contractPaid; | |
} | |
/** | |
* @dev Get the current recorded rainfall for the contract | |
*/ | |
function getCurrentRainfall() external view returns (uint) { | |
return currentRainfall; | |
} | |
/** | |
* @dev Get the recorded number of days without rain | |
*/ | |
function getDaysWithoutRain() external view returns (uint) { | |
return daysWithoutRain; | |
} | |
/** | |
* @dev Get the count of requests that has occured for the Insurance Contract | |
*/ | |
function getRequestCount() external view returns (uint) { | |
return requestCount; | |
} | |
/** | |
* @dev Get the last time that the rainfall was checked for the contract | |
*/ | |
function getCurrentRainfallDateChecked() external view returns (uint) { | |
return currentRainfallDateChecked; | |
} | |
/** | |
* @dev Get the contract duration | |
*/ | |
function getDuration() external view returns (uint) { | |
return duration; | |
} | |
/** | |
* @dev Get the contract start date | |
*/ | |
function getContractStartDate() external view returns (uint) { | |
return startDate; | |
} | |
/** | |
* @dev Get the current date/time according to the blockchain | |
*/ | |
function getNow() external view returns (uint) { | |
return now; | |
} | |
/** | |
* @dev Get address of the chainlink token | |
*/ | |
function getChainlinkToken() public view returns (address) { | |
return chainlinkTokenAddress(); | |
} | |
/** | |
* @dev Helper function for converting a string to a bytes32 object | |
*/ | |
function stringToBytes32(string memory source) private pure returns (bytes32 result) { | |
bytes memory tempEmptyStringTest = bytes(source); | |
if (tempEmptyStringTest.length == 0) { | |
return 0x0; | |
} | |
assembly { // solhint-disable-line no-inline-assembly | |
result := mload(add(source, 32)) | |
} | |
} | |
/** | |
* @dev Helper function for converting uint to a string | |
*/ | |
function uint2str(uint _i) internal pure returns (string memory _uintAsString) { | |
if (_i == 0) { | |
return "0"; | |
} | |
uint j = _i; | |
uint len; | |
while (j != 0) { | |
len++; | |
j /= 10; | |
} | |
bytes memory bstr = new bytes(len); | |
uint k = len - 1; | |
while (_i != 0) { | |
bstr[k--] = byte(uint8(48 + _i % 10)); | |
_i /= 10; | |
} | |
return string(bstr); | |
} | |
/** | |
* @dev Fallback function so contrat can receive ether when required | |
*/ | |
function() external payable { } | |
} | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This example code is designed to quickly deploy an example contract using Remix. | |
pragma solidity ^0.6.0; | |
import "https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/ChainlinkClient.sol"; | |
contract APIConsumer is ChainlinkClient { | |
uint256 public volume; | |
address private oracle; | |
bytes32 private jobId; | |
uint256 private fee; | |
/** | |
* Network: Kovan | |
* Chainlink - 0xc57B33452b4F7BB189bB5AfaE9cc4aBa1f7a4FD8 | |
* Chainlink - d5270d1c311941d0b08bead21fea7747 | |
* Fee: 0.1 LINK | |
*/ | |
constructor() public { | |
setPublicChainlinkToken(); | |
oracle = 0xc57B33452b4F7BB189bB5AfaE9cc4aBa1f7a4FD8; | |
jobId = "d5270d1c311941d0b08bead21fea7747"; | |
fee = 0.1 * 10 ** 18; // 0.1 LINK | |
} | |
/** | |
* Create a Chainlink request to retrieve API response, find the target | |
* data, then multiply by 1000000000000000000 (to remove decimal places from data). | |
************************************************************************************ | |
* STOP! * | |
* THIS FUNCTION WILL FAIL IF THIS CONTRACT DOES NOT OWN LINK * | |
* ---------------------------------------------------------- * | |
* Learn how to obtain testnet LINK and fund this contract: * | |
* ------- https://docs.chain.link/docs/acquire-link -------- * | |
* ---- https://docs.chain.link/docs/fund-your-contract ----- * | |
* * | |
************************************************************************************/ | |
function requestVolumeData() public returns (bytes32 requestId) | |
{ | |
Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfill.selector); | |
// Set the URL to perform the GET request on | |
request.add("get", "https://min-api.cryptocompare.com/data/pricemultifull?fsyms=ETH&tsyms=USD"); | |
// Set the path to find the desired data in the API response, where the response format is: | |
// {"RAW": | |
// {"ETH": | |
// {"USD": | |
// { | |
// ..., | |
// "VOLUME24HOUR": xxx.xxx, | |
// ... | |
// } | |
// } | |
// } | |
// } | |
request.add("path", "RAW.ETH.USD.VOLUME24HOUR"); | |
// Multiply the result by 1000000000000000000 to remove decimals | |
int timesAmount = 10**18; | |
request.addInt("times", timesAmount); | |
// Sends the request | |
return sendChainlinkRequestTo(oracle, request, fee); | |
} | |
/** | |
* Receive the response in the form of uint256 | |
*/ | |
function fulfill(bytes32 _requestId, uint256 _volume) public recordChainlinkFulfillment(_requestId) | |
{ | |
volume = _volume; | |
} | |
/** | |
* Withdraw LINK from this contract | |
* | |
* NOTE: DO NOT USE THIS IN PRODUCTION AS IT CAN BE CALLED BY ANY ADDRESS. | |
* THIS IS PURELY FOR EXAMPLE PURPOSES ONLY. | |
*/ | |
function withdrawLink() external { | |
LinkTokenInterface linkToken = LinkTokenInterface(chainlinkTokenAddress()); | |
require(linkToken.transfer(msg.sender, linkToken.balanceOf(address(this))), "Unable to transfer"); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"deploy": { | |
"VM:-": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"main:1": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"ropsten:3": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"rinkeby:4": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"kovan:42": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"görli:5": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"Custom": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
} | |
}, | |
"data": { | |
"bytecode": { | |
"linkReferences": {}, | |
"object": "6080604052600160045534801561001557600080fd5b506100246100b460201b60201c565b73aa1dc356dc4b18f30c347798fd5379f3d77abc5b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f633764643732636131346234346630633962366366636434623765633061326360088190555067016345785d8a000060098190555061019d565b61015773c89bd4e1632d3a43cb03aaad5262cbe4038bc57173ffffffffffffffffffffffffffffffffffffffff166338cc48316040518163ffffffff1660e01b815260040160206040518083038186803b15801561011157600080fd5b505afa158015610125573d6000803e3d6000fd5b505050506040513d602081101561013b57600080fd5b810190808051906020019092919050505061015960201b60201c565b565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611224806101ac6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80634357855e14610051578063684ede7f146100895780638dc654a2146100cb578063c618a1e4146100d5575b600080fd5b6100876004803603604081101561006757600080fd5b8101908080359060200190929190803590602001909291905050506100f3565b005b6100b56004803603602081101561009f57600080fd5b810190808035906020019092919050505061021a565b6040518082815260200191505060405180910390f35b6100d36103f4565b005b6100dd6105c2565b6040518082815260200191505060405180910390f35b816005600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061117e6028913960400191505060405180910390fd5b6005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055807f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a60405160405180910390a281600681905550505050565b60006102246110d3565b61023860085430634357855e60e01b6105c8565b905061029c6040518060400160405280600381526020017f67657400000000000000000000000000000000000000000000000000000000008152506040518060800160405280604981526020016111a660499139836105f99092919063ffffffff16565b6102e66040518060400160405280600a81526020017f72616e646f6d5f6b657900000000000000000000000000000000000000000000815250848361062c9092919063ffffffff16565b6103656040518060400160405280600481526020017f70617468000000000000000000000000000000000000000000000000000000008152506040518060400160405280601881526020017f5241572e4554482e5553442e564f4c554d453234484f55520000000000000000815250836105f99092919063ffffffff16565b6000670de0b6b3a764000090506103bc6040518060400160405280600581526020017f74696d6573000000000000000000000000000000000000000000000000000000815250828461065f9092919063ffffffff16565b6103eb600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600954610692565b92505050919050565b60006103fe61091b565b90508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561048457600080fd5b505afa158015610498573d6000803e3d6000fd5b505050506040513d60208110156104ae57600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561051257600080fd5b505af1158015610526573d6000803e3d6000fd5b505050506040513d602081101561053c57600080fd5b81019080805190602001909291905050506105bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f556e61626c6520746f207472616e73666572000000000000000000000000000081525060200191505060405180910390fd5b50565b60065481565b6105d06110d3565b6105d86110d3565b6105ef85858584610945909392919063ffffffff16565b9150509392505050565b6106108284608001516109f590919063ffffffff16565b6106278184608001516109f590919063ffffffff16565b505050565b6106438284608001516109f590919063ffffffff16565b61065a818460800151610a1a90919063ffffffff16565b505050565b6106768284608001516109f590919063ffffffff16565b61068d818460800151610a2a90919063ffffffff16565b505050565b600030600454604051602001808373ffffffffffffffffffffffffffffffffffffffff1660601b815260140182815260200192505050604051602081830303815290604052805190602001209050600454836060018181525050836005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550807fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af960405160405180910390a2600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634000aea085846107b487610ace565b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561082557808201518184015260208101905061080a565b50505050905090810190601f1680156108525780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561087357600080fd5b505af1158015610887573d6000803e3d6000fd5b505050506040513d602081101561089d57600080fd5b8101908080519060200190929190505050610903576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061115b6023913960400191505060405180910390fd5b60016004600082825401925050819055509392505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61094d6110d3565b61095d8560800151610100610c4f565b508385600001818152505082856020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508185604001907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681525050849050949350505050565b610a028260038351610ca3565b610a158183610de890919063ffffffff16565b505050565b610a2682600083610ca3565b5050565b7fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000811215610a6157610a5c8282610e0a565b610aca565b67ffffffffffffffff811315610a8057610a7b8282610e78565b610ac9565b60008112610a9957610a9482600083610ca3565b610ac8565b610ac7826001837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03610ca3565b5b5b5b5050565b6060634042994660e01b60008084600001518560200151866040015187606001516001896080015160000151604051602401808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff168152602001857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610bb2578082015181840152602081019050610b97565b50505050905090810190601f168015610bdf5780820380516001836020036101000a031916815260200191505b509950505050505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050919050565b610c57611140565b600060208381610c6357fe5b0614610c7c5760208281610c7357fe5b06602003820191505b81836020018181525050604051808452600081528281016020016040525082905092915050565b60178111610cd057610cca8160058460ff16901b60ff161784610ec490919063ffffffff16565b50610de3565b60ff8111610d1257610cf5601860058460ff16901b1784610ec490919063ffffffff16565b50610d0c81600185610ee49092919063ffffffff16565b50610de2565b61ffff8111610d5557610d38601960058460ff16901b1784610ec490919063ffffffff16565b50610d4f81600285610ee49092919063ffffffff16565b50610de1565b63ffffffff8111610d9a57610d7d601a60058460ff16901b1784610ec490919063ffffffff16565b50610d9481600485610ee49092919063ffffffff16565b50610de0565b67ffffffffffffffff8111610ddf57610dc6601b60058460ff16901b1784610ec490919063ffffffff16565b50610ddd81600885610ee49092919063ffffffff16565b505b5b5b5b5b505050565b610df0611140565b610e0283846000015151848551610f06565b905092915050565b610e2860036005600660ff16901b1783610ec490919063ffffffff16565b50610e7482827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0360405160200180828152602001915050604051602081830303815290604052610fbf565b5050565b610e9660026005600660ff16901b1783610ec490919063ffffffff16565b50610ec0828260405160200180828152602001915050604051602081830303815290604052610fbf565b5050565b610ecc611140565b610edc8384600001515184610fe4565b905092915050565b610eec611140565b610efd848560000151518585611032565b90509392505050565b610f0e611140565b8251821115610f1c57600080fd5b84602001518285011115610f4757610f46856002610f408860200151888701611093565b026110af565b5b600080865180518760208301019350808887011115610f665787860182525b60208701925050505b60208410610f925780518252602082019150602081019050602084039350610f6f565b60006001856020036101000a03905080198251168184511681811785525050879350505050949350505050565b610fcc8260028351610ca3565b610fdf8183610de890919063ffffffff16565b505050565b610fec611140565b83602001518310611009576110088460028660200151026110af565b5b8351805160208583010184815381861415611025576001820183525b5050508390509392505050565b61103a611140565b8460200151848301111561105857611057856002868501026110af565b5b60006001836101000a03905085518386820101858319825116178152815185880111156110855784870182525b505085915050949350505050565b6000818311156110a5578290506110a9565b8190505b92915050565b6060826000015190506110c28383610c4f565b506110cd8382610de8565b50505050565b6040518060a0016040528060008019168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020016000815260200161113a611140565b81525090565b60405180604001604052806060815260200160008152509056fe756e61626c6520746f207472616e73666572416e6443616c6c20746f206f7261636c65536f75726365206d75737420626520746865206f7261636c65206f6620746865207265717565737468747470733a2f2f6d696e2d6170692e63727970746f636f6d706172652e636f6d2f646174612f70726963656d756c746966756c6c3f6673796d733d455448267473796d733d555344a2646970667358221220949f3ae5f5e3177bbd509cf9e9fb421d3449c194dc2098ecf1556d20ecdba51564736f6c634300060c0033", | |
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x1 PUSH1 0x4 SSTORE CALLVALUE DUP1 ISZERO PUSH2 0x15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x24 PUSH2 0xB4 PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST PUSH20 0xAA1DC356DC4B18F30C347798FD5379F3D77ABC5B PUSH1 0x7 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH32 0x6337646437326361313462343466306339623663666364346237656330613263 PUSH1 0x8 DUP2 SWAP1 SSTORE POP PUSH8 0x16345785D8A0000 PUSH1 0x9 DUP2 SWAP1 SSTORE POP PUSH2 0x19D JUMP JUMPDEST PUSH2 0x157 PUSH20 0xC89BD4E1632D3A43CB03AAAD5262CBE4038BC571 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x38CC4831 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x111 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x125 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x13B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x159 PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST JUMP JUMPDEST DUP1 PUSH1 0x2 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH2 0x1224 DUP1 PUSH2 0x1AC PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x4357855E EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0x684EDE7F EQ PUSH2 0x89 JUMPI DUP1 PUSH4 0x8DC654A2 EQ PUSH2 0xCB JUMPI DUP1 PUSH4 0xC618A1E4 EQ PUSH2 0xD5 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x87 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x67 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xF3 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xB5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x21A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xD3 PUSH2 0x3F4 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xDD PUSH2 0x5C2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST DUP2 PUSH1 0x5 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x1AB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x117E PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x5 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE DUP1 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP2 PUSH1 0x6 DUP2 SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x224 PUSH2 0x10D3 JUMP JUMPDEST PUSH2 0x238 PUSH1 0x8 SLOAD ADDRESS PUSH4 0x4357855E PUSH1 0xE0 SHL PUSH2 0x5C8 JUMP JUMPDEST SWAP1 POP PUSH2 0x29C PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6765740000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x49 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x11A6 PUSH1 0x49 SWAP2 CODECOPY DUP4 PUSH2 0x5F9 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x2E6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xA DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x72616E646F6D5F6B657900000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP5 DUP4 PUSH2 0x62C SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x365 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7061746800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x18 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5241572E4554482E5553442E564F4C554D453234484F55520000000000000000 DUP2 MSTORE POP DUP4 PUSH2 0x5F9 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x0 PUSH8 0xDE0B6B3A7640000 SWAP1 POP PUSH2 0x3BC PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x74696D6573000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP3 DUP5 PUSH2 0x65F SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x3EB PUSH1 0x7 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x9 SLOAD PUSH2 0x692 JUMP JUMPDEST SWAP3 POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3FE PUSH2 0x91B JUMP JUMPDEST SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xA9059CBB CALLER DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x484 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x498 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x512 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x526 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x53C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x5BF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x556E61626C6520746F207472616E736665720000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x5D0 PUSH2 0x10D3 JUMP JUMPDEST PUSH2 0x5D8 PUSH2 0x10D3 JUMP JUMPDEST PUSH2 0x5EF DUP6 DUP6 DUP6 DUP5 PUSH2 0x945 SWAP1 SWAP4 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x610 DUP3 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x9F5 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x627 DUP2 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x9F5 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x643 DUP3 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x9F5 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x65A DUP2 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0xA1A SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x676 DUP3 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x9F5 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x68D DUP2 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0xA2A SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 SHL DUP2 MSTORE PUSH1 0x14 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x4 SLOAD DUP4 PUSH1 0x60 ADD DUP2 DUP2 MSTORE POP POP DUP4 PUSH1 0x5 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP1 PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0x7B4 DUP8 PUSH2 0xACE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x825 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x80A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x852 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x873 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x887 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x89D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x903 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x115B PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x4 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x94D PUSH2 0x10D3 JUMP JUMPDEST PUSH2 0x95D DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0xC4F JUMP JUMPDEST POP DUP4 DUP6 PUSH1 0x0 ADD DUP2 DUP2 MSTORE POP POP DUP3 DUP6 PUSH1 0x20 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP DUP2 DUP6 PUSH1 0x40 ADD SWAP1 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 DUP2 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE POP POP DUP5 SWAP1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xA02 DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0xCA3 JUMP JUMPDEST PUSH2 0xA15 DUP2 DUP4 PUSH2 0xDE8 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xA26 DUP3 PUSH1 0x0 DUP4 PUSH2 0xCA3 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 DUP2 SLT ISZERO PUSH2 0xA61 JUMPI PUSH2 0xA5C DUP3 DUP3 PUSH2 0xE0A JUMP JUMPDEST PUSH2 0xACA JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 SGT ISZERO PUSH2 0xA80 JUMPI PUSH2 0xA7B DUP3 DUP3 PUSH2 0xE78 JUMP JUMPDEST PUSH2 0xAC9 JUMP JUMPDEST PUSH1 0x0 DUP2 SLT PUSH2 0xA99 JUMPI PUSH2 0xA94 DUP3 PUSH1 0x0 DUP4 PUSH2 0xCA3 JUMP JUMPDEST PUSH2 0xAC8 JUMP JUMPDEST PUSH2 0xAC7 DUP3 PUSH1 0x1 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SUB PUSH2 0xCA3 JUMP JUMPDEST JUMPDEST JUMPDEST JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x40429946 PUSH1 0xE0 SHL PUSH1 0x0 DUP1 DUP5 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP8 PUSH1 0x60 ADD MLOAD PUSH1 0x1 DUP10 PUSH1 0x80 ADD MLOAD PUSH1 0x0 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD DUP1 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 DUP2 MSTORE PUSH1 0x20 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xBB2 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xB97 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xBDF JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xC57 PUSH2 0x1140 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP4 DUP2 PUSH2 0xC63 JUMPI INVALID JUMPDEST MOD EQ PUSH2 0xC7C JUMPI PUSH1 0x20 DUP3 DUP2 PUSH2 0xC73 JUMPI INVALID JUMPDEST MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST DUP2 DUP4 PUSH1 0x20 ADD DUP2 DUP2 MSTORE POP POP PUSH1 0x40 MLOAD DUP1 DUP5 MSTORE PUSH1 0x0 DUP2 MSTORE DUP3 DUP2 ADD PUSH1 0x20 ADD PUSH1 0x40 MSTORE POP DUP3 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0xCD0 JUMPI PUSH2 0xCCA DUP2 PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL PUSH1 0xFF AND OR DUP5 PUSH2 0xEC4 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xDE3 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0xD12 JUMPI PUSH2 0xCF5 PUSH1 0x18 PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0xEC4 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xD0C DUP2 PUSH1 0x1 DUP6 PUSH2 0xEE4 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xDE2 JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0xD55 JUMPI PUSH2 0xD38 PUSH1 0x19 PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0xEC4 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xD4F DUP2 PUSH1 0x2 DUP6 PUSH2 0xEE4 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xDE1 JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0xD9A JUMPI PUSH2 0xD7D PUSH1 0x1A PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0xEC4 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xD94 DUP2 PUSH1 0x4 DUP6 PUSH2 0xEE4 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xDE0 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDDF JUMPI PUSH2 0xDC6 PUSH1 0x1B PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0xEC4 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xDDD DUP2 PUSH1 0x8 DUP6 PUSH2 0xEE4 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP JUMPDEST JUMPDEST JUMPDEST JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xDF0 PUSH2 0x1140 JUMP JUMPDEST PUSH2 0xE02 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0xF06 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xE28 PUSH1 0x3 PUSH1 0x5 PUSH1 0x6 PUSH1 0xFF AND SWAP1 SHL OR DUP4 PUSH2 0xEC4 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xE74 DUP3 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SUB PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0xFBF JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0xE96 PUSH1 0x2 PUSH1 0x5 PUSH1 0x6 PUSH1 0xFF AND SWAP1 SHL OR DUP4 PUSH2 0xEC4 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xEC0 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0xFBF JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0xECC PUSH2 0x1140 JUMP JUMPDEST PUSH2 0xEDC DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0xFE4 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xEEC PUSH2 0x1140 JUMP JUMPDEST PUSH2 0xEFD DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0x1032 JUMP JUMPDEST SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xF0E PUSH2 0x1140 JUMP JUMPDEST DUP3 MLOAD DUP3 GT ISZERO PUSH2 0xF1C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP3 DUP6 ADD GT ISZERO PUSH2 0xF47 JUMPI PUSH2 0xF46 DUP6 PUSH1 0x2 PUSH2 0xF40 DUP9 PUSH1 0x20 ADD MLOAD DUP9 DUP8 ADD PUSH2 0x1093 JUMP JUMPDEST MUL PUSH2 0x10AF JUMP JUMPDEST JUMPDEST PUSH1 0x0 DUP1 DUP7 MLOAD DUP1 MLOAD DUP8 PUSH1 0x20 DUP4 ADD ADD SWAP4 POP DUP1 DUP9 DUP8 ADD GT ISZERO PUSH2 0xF66 JUMPI DUP8 DUP7 ADD DUP3 MSTORE JUMPDEST PUSH1 0x20 DUP8 ADD SWAP3 POP POP POP JUMPDEST PUSH1 0x20 DUP5 LT PUSH2 0xF92 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP5 SUB SWAP4 POP PUSH2 0xF6F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP6 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB SWAP1 POP DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP2 DUP2 OR DUP6 MSTORE POP POP DUP8 SWAP4 POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xFCC DUP3 PUSH1 0x2 DUP4 MLOAD PUSH2 0xCA3 JUMP JUMPDEST PUSH2 0xFDF DUP2 DUP4 PUSH2 0xDE8 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xFEC PUSH2 0x1140 JUMP JUMPDEST DUP4 PUSH1 0x20 ADD MLOAD DUP4 LT PUSH2 0x1009 JUMPI PUSH2 0x1008 DUP5 PUSH1 0x2 DUP7 PUSH1 0x20 ADD MLOAD MUL PUSH2 0x10AF JUMP JUMPDEST JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0x1025 JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP POP POP DUP4 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x103A PUSH2 0x1140 JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP5 DUP4 ADD GT ISZERO PUSH2 0x1058 JUMPI PUSH2 0x1057 DUP6 PUSH1 0x2 DUP7 DUP6 ADD MUL PUSH2 0x10AF JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x1085 JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP POP DUP6 SWAP2 POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0x10A5 JUMPI DUP3 SWAP1 POP PUSH2 0x10A9 JUMP JUMPDEST DUP2 SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 PUSH1 0x0 ADD MLOAD SWAP1 POP PUSH2 0x10C2 DUP4 DUP4 PUSH2 0xC4F JUMP JUMPDEST POP PUSH2 0x10CD DUP4 DUP3 PUSH2 0xDE8 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x113A PUSH2 0x1140 JUMP JUMPDEST DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP INVALID PUSH22 0x6E61626C6520746F207472616E73666572416E644361 PUSH13 0x6C20746F206F7261636C65536F PUSH22 0x726365206D75737420626520746865206F7261636C65 KECCAK256 PUSH16 0x66207468652072657175657374687474 PUSH17 0x733A2F2F6D696E2D6170692E6372797074 PUSH16 0x636F6D706172652E636F6D2F64617461 0x2F PUSH17 0x726963656D756C746966756C6C3F667379 PUSH14 0x733D455448267473796D733D5553 DIFFICULTY LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP5 SWAP16 GASPRICE 0xE5 CREATE2 0xE3 OR PUSH28 0xBD509CF9E9FB421D3449C194DC2098ECF1556D20ECDBA51564736F6C PUSH4 0x4300060C STOP CALLER ", | |
"sourceMap": "233:3345:0:-:0;;;1163:1:2;1132:32;;572:218:0;;;;;;;;;;603:25;:23;;;:25;;:::i;:::-;647:42;638:6;;:51;;;;;;;;;;;;;;;;;;699:42;:5;:42;;;;757:14;751:3;:20;;;;233:3345;;5051:123:2;5101:68;951:42;5119:47;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5101:17;;;:68;;:::i;:::-;5051:123::o;4834:94::-;4917:5;4891:4;;:32;;;;;;;;;;;;;;;;;;4834:94;:::o;233:3345:0:-;;;;;;;" | |
}, | |
"deployedBytecode": { | |
"immutableReferences": {}, | |
"linkReferences": {}, | |
"object": "608060405234801561001057600080fd5b506004361061004c5760003560e01c80634357855e14610051578063684ede7f146100895780638dc654a2146100cb578063c618a1e4146100d5575b600080fd5b6100876004803603604081101561006757600080fd5b8101908080359060200190929190803590602001909291905050506100f3565b005b6100b56004803603602081101561009f57600080fd5b810190808035906020019092919050505061021a565b6040518082815260200191505060405180910390f35b6100d36103f4565b005b6100dd6105c2565b6040518082815260200191505060405180910390f35b816005600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146101ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061117e6028913960400191505060405180910390fd5b6005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055807f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a60405160405180910390a281600681905550505050565b60006102246110d3565b61023860085430634357855e60e01b6105c8565b905061029c6040518060400160405280600381526020017f67657400000000000000000000000000000000000000000000000000000000008152506040518060800160405280604981526020016111a660499139836105f99092919063ffffffff16565b6102e66040518060400160405280600a81526020017f72616e646f6d5f6b657900000000000000000000000000000000000000000000815250848361062c9092919063ffffffff16565b6103656040518060400160405280600481526020017f70617468000000000000000000000000000000000000000000000000000000008152506040518060400160405280601881526020017f5241572e4554482e5553442e564f4c554d453234484f55520000000000000000815250836105f99092919063ffffffff16565b6000670de0b6b3a764000090506103bc6040518060400160405280600581526020017f74696d6573000000000000000000000000000000000000000000000000000000815250828461065f9092919063ffffffff16565b6103eb600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683600954610692565b92505050919050565b60006103fe61091b565b90508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561048457600080fd5b505afa158015610498573d6000803e3d6000fd5b505050506040513d60208110156104ae57600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561051257600080fd5b505af1158015610526573d6000803e3d6000fd5b505050506040513d602081101561053c57600080fd5b81019080805190602001909291905050506105bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f556e61626c6520746f207472616e73666572000000000000000000000000000081525060200191505060405180910390fd5b50565b60065481565b6105d06110d3565b6105d86110d3565b6105ef85858584610945909392919063ffffffff16565b9150509392505050565b6106108284608001516109f590919063ffffffff16565b6106278184608001516109f590919063ffffffff16565b505050565b6106438284608001516109f590919063ffffffff16565b61065a818460800151610a1a90919063ffffffff16565b505050565b6106768284608001516109f590919063ffffffff16565b61068d818460800151610a2a90919063ffffffff16565b505050565b600030600454604051602001808373ffffffffffffffffffffffffffffffffffffffff1660601b815260140182815260200192505050604051602081830303815290604052805190602001209050600454836060018181525050836005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550807fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af960405160405180910390a2600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634000aea085846107b487610ace565b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561082557808201518184015260208101905061080a565b50505050905090810190601f1680156108525780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561087357600080fd5b505af1158015610887573d6000803e3d6000fd5b505050506040513d602081101561089d57600080fd5b8101908080519060200190929190505050610903576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061115b6023913960400191505060405180910390fd5b60016004600082825401925050819055509392505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61094d6110d3565b61095d8560800151610100610c4f565b508385600001818152505082856020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508185604001907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681525050849050949350505050565b610a028260038351610ca3565b610a158183610de890919063ffffffff16565b505050565b610a2682600083610ca3565b5050565b7fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000811215610a6157610a5c8282610e0a565b610aca565b67ffffffffffffffff811315610a8057610a7b8282610e78565b610ac9565b60008112610a9957610a9482600083610ca3565b610ac8565b610ac7826001837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03610ca3565b5b5b5b5050565b6060634042994660e01b60008084600001518560200151866040015187606001516001896080015160000151604051602401808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff168152602001857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610bb2578082015181840152602081019050610b97565b50505050905090810190601f168015610bdf5780820380516001836020036101000a031916815260200191505b509950505050505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050919050565b610c57611140565b600060208381610c6357fe5b0614610c7c5760208281610c7357fe5b06602003820191505b81836020018181525050604051808452600081528281016020016040525082905092915050565b60178111610cd057610cca8160058460ff16901b60ff161784610ec490919063ffffffff16565b50610de3565b60ff8111610d1257610cf5601860058460ff16901b1784610ec490919063ffffffff16565b50610d0c81600185610ee49092919063ffffffff16565b50610de2565b61ffff8111610d5557610d38601960058460ff16901b1784610ec490919063ffffffff16565b50610d4f81600285610ee49092919063ffffffff16565b50610de1565b63ffffffff8111610d9a57610d7d601a60058460ff16901b1784610ec490919063ffffffff16565b50610d9481600485610ee49092919063ffffffff16565b50610de0565b67ffffffffffffffff8111610ddf57610dc6601b60058460ff16901b1784610ec490919063ffffffff16565b50610ddd81600885610ee49092919063ffffffff16565b505b5b5b5b5b505050565b610df0611140565b610e0283846000015151848551610f06565b905092915050565b610e2860036005600660ff16901b1783610ec490919063ffffffff16565b50610e7482827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0360405160200180828152602001915050604051602081830303815290604052610fbf565b5050565b610e9660026005600660ff16901b1783610ec490919063ffffffff16565b50610ec0828260405160200180828152602001915050604051602081830303815290604052610fbf565b5050565b610ecc611140565b610edc8384600001515184610fe4565b905092915050565b610eec611140565b610efd848560000151518585611032565b90509392505050565b610f0e611140565b8251821115610f1c57600080fd5b84602001518285011115610f4757610f46856002610f408860200151888701611093565b026110af565b5b600080865180518760208301019350808887011115610f665787860182525b60208701925050505b60208410610f925780518252602082019150602081019050602084039350610f6f565b60006001856020036101000a03905080198251168184511681811785525050879350505050949350505050565b610fcc8260028351610ca3565b610fdf8183610de890919063ffffffff16565b505050565b610fec611140565b83602001518310611009576110088460028660200151026110af565b5b8351805160208583010184815381861415611025576001820183525b5050508390509392505050565b61103a611140565b8460200151848301111561105857611057856002868501026110af565b5b60006001836101000a03905085518386820101858319825116178152815185880111156110855784870182525b505085915050949350505050565b6000818311156110a5578290506110a9565b8190505b92915050565b6060826000015190506110c28383610c4f565b506110cd8382610de8565b50505050565b6040518060a0016040528060008019168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020016000815260200161113a611140565b81525090565b60405180604001604052806060815260200160008152509056fe756e61626c6520746f207472616e73666572416e6443616c6c20746f206f7261636c65536f75726365206d75737420626520746865206f7261636c65206f6620746865207265717565737468747470733a2f2f6d696e2d6170692e63727970746f636f6d706172652e636f6d2f646174612f70726963656d756c746966756c6c3f6673796d733d455448267473796d733d555344a2646970667358221220949f3ae5f5e3177bbd509cf9e9fb421d3449c194dc2098ecf1556d20ecdba51564736f6c634300060c0033", | |
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4C JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x4357855E EQ PUSH2 0x51 JUMPI DUP1 PUSH4 0x684EDE7F EQ PUSH2 0x89 JUMPI DUP1 PUSH4 0x8DC654A2 EQ PUSH2 0xCB JUMPI DUP1 PUSH4 0xC618A1E4 EQ PUSH2 0xD5 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x87 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x67 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xF3 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xB5 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x9F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x21A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xD3 PUSH2 0x3F4 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xDD PUSH2 0x5C2 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST DUP2 PUSH1 0x5 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x1AB JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x117E PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x5 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE DUP1 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP2 PUSH1 0x6 DUP2 SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x224 PUSH2 0x10D3 JUMP JUMPDEST PUSH2 0x238 PUSH1 0x8 SLOAD ADDRESS PUSH4 0x4357855E PUSH1 0xE0 SHL PUSH2 0x5C8 JUMP JUMPDEST SWAP1 POP PUSH2 0x29C PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x3 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x6765740000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x80 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x49 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x11A6 PUSH1 0x49 SWAP2 CODECOPY DUP4 PUSH2 0x5F9 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x2E6 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xA DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x72616E646F6D5F6B657900000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP5 DUP4 PUSH2 0x62C SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x365 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x4 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x7061746800000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x18 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x5241572E4554482E5553442E564F4C554D453234484F55520000000000000000 DUP2 MSTORE POP DUP4 PUSH2 0x5F9 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x0 PUSH8 0xDE0B6B3A7640000 SWAP1 POP PUSH2 0x3BC PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x74696D6573000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP3 DUP5 PUSH2 0x65F SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x3EB PUSH1 0x7 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH1 0x9 SLOAD PUSH2 0x692 JUMP JUMPDEST SWAP3 POP POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3FE PUSH2 0x91B JUMP JUMPDEST SWAP1 POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xA9059CBB CALLER DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x70A08231 ADDRESS PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x484 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x498 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x4AE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x512 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x526 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x53C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x5BF JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x12 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x556E61626C6520746F207472616E736665720000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x6 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x5D0 PUSH2 0x10D3 JUMP JUMPDEST PUSH2 0x5D8 PUSH2 0x10D3 JUMP JUMPDEST PUSH2 0x5EF DUP6 DUP6 DUP6 DUP5 PUSH2 0x945 SWAP1 SWAP4 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x610 DUP3 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x9F5 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x627 DUP2 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x9F5 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x643 DUP3 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x9F5 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x65A DUP2 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0xA1A SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x676 DUP3 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x9F5 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x68D DUP2 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0xA2A SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 SHL DUP2 MSTORE PUSH1 0x14 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x4 SLOAD DUP4 PUSH1 0x60 ADD DUP2 DUP2 MSTORE POP POP DUP4 PUSH1 0x5 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP1 PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0x7B4 DUP8 PUSH2 0xACE JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x825 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x80A JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x852 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x873 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x887 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x89D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x903 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x115B PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x4 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x94D PUSH2 0x10D3 JUMP JUMPDEST PUSH2 0x95D DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0xC4F JUMP JUMPDEST POP DUP4 DUP6 PUSH1 0x0 ADD DUP2 DUP2 MSTORE POP POP DUP3 DUP6 PUSH1 0x20 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP DUP2 DUP6 PUSH1 0x40 ADD SWAP1 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 DUP2 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE POP POP DUP5 SWAP1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xA02 DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0xCA3 JUMP JUMPDEST PUSH2 0xA15 DUP2 DUP4 PUSH2 0xDE8 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xA26 DUP3 PUSH1 0x0 DUP4 PUSH2 0xCA3 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 DUP2 SLT ISZERO PUSH2 0xA61 JUMPI PUSH2 0xA5C DUP3 DUP3 PUSH2 0xE0A JUMP JUMPDEST PUSH2 0xACA JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 SGT ISZERO PUSH2 0xA80 JUMPI PUSH2 0xA7B DUP3 DUP3 PUSH2 0xE78 JUMP JUMPDEST PUSH2 0xAC9 JUMP JUMPDEST PUSH1 0x0 DUP2 SLT PUSH2 0xA99 JUMPI PUSH2 0xA94 DUP3 PUSH1 0x0 DUP4 PUSH2 0xCA3 JUMP JUMPDEST PUSH2 0xAC8 JUMP JUMPDEST PUSH2 0xAC7 DUP3 PUSH1 0x1 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SUB PUSH2 0xCA3 JUMP JUMPDEST JUMPDEST JUMPDEST JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x40429946 PUSH1 0xE0 SHL PUSH1 0x0 DUP1 DUP5 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP8 PUSH1 0x60 ADD MLOAD PUSH1 0x1 DUP10 PUSH1 0x80 ADD MLOAD PUSH1 0x0 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD DUP1 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 DUP2 MSTORE PUSH1 0x20 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xBB2 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xB97 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xBDF JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xC57 PUSH2 0x1140 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP4 DUP2 PUSH2 0xC63 JUMPI INVALID JUMPDEST MOD EQ PUSH2 0xC7C JUMPI PUSH1 0x20 DUP3 DUP2 PUSH2 0xC73 JUMPI INVALID JUMPDEST MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST DUP2 DUP4 PUSH1 0x20 ADD DUP2 DUP2 MSTORE POP POP PUSH1 0x40 MLOAD DUP1 DUP5 MSTORE PUSH1 0x0 DUP2 MSTORE DUP3 DUP2 ADD PUSH1 0x20 ADD PUSH1 0x40 MSTORE POP DUP3 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0xCD0 JUMPI PUSH2 0xCCA DUP2 PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL PUSH1 0xFF AND OR DUP5 PUSH2 0xEC4 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xDE3 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0xD12 JUMPI PUSH2 0xCF5 PUSH1 0x18 PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0xEC4 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xD0C DUP2 PUSH1 0x1 DUP6 PUSH2 0xEE4 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xDE2 JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0xD55 JUMPI PUSH2 0xD38 PUSH1 0x19 PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0xEC4 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xD4F DUP2 PUSH1 0x2 DUP6 PUSH2 0xEE4 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xDE1 JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0xD9A JUMPI PUSH2 0xD7D PUSH1 0x1A PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0xEC4 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xD94 DUP2 PUSH1 0x4 DUP6 PUSH2 0xEE4 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xDE0 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xDDF JUMPI PUSH2 0xDC6 PUSH1 0x1B PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0xEC4 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xDDD DUP2 PUSH1 0x8 DUP6 PUSH2 0xEE4 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP JUMPDEST JUMPDEST JUMPDEST JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xDF0 PUSH2 0x1140 JUMP JUMPDEST PUSH2 0xE02 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0xF06 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xE28 PUSH1 0x3 PUSH1 0x5 PUSH1 0x6 PUSH1 0xFF AND SWAP1 SHL OR DUP4 PUSH2 0xEC4 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xE74 DUP3 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SUB PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0xFBF JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0xE96 PUSH1 0x2 PUSH1 0x5 PUSH1 0x6 PUSH1 0xFF AND SWAP1 SHL OR DUP4 PUSH2 0xEC4 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xEC0 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0xFBF JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0xECC PUSH2 0x1140 JUMP JUMPDEST PUSH2 0xEDC DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0xFE4 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xEEC PUSH2 0x1140 JUMP JUMPDEST PUSH2 0xEFD DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0x1032 JUMP JUMPDEST SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xF0E PUSH2 0x1140 JUMP JUMPDEST DUP3 MLOAD DUP3 GT ISZERO PUSH2 0xF1C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP3 DUP6 ADD GT ISZERO PUSH2 0xF47 JUMPI PUSH2 0xF46 DUP6 PUSH1 0x2 PUSH2 0xF40 DUP9 PUSH1 0x20 ADD MLOAD DUP9 DUP8 ADD PUSH2 0x1093 JUMP JUMPDEST MUL PUSH2 0x10AF JUMP JUMPDEST JUMPDEST PUSH1 0x0 DUP1 DUP7 MLOAD DUP1 MLOAD DUP8 PUSH1 0x20 DUP4 ADD ADD SWAP4 POP DUP1 DUP9 DUP8 ADD GT ISZERO PUSH2 0xF66 JUMPI DUP8 DUP7 ADD DUP3 MSTORE JUMPDEST PUSH1 0x20 DUP8 ADD SWAP3 POP POP POP JUMPDEST PUSH1 0x20 DUP5 LT PUSH2 0xF92 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP5 SUB SWAP4 POP PUSH2 0xF6F JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP6 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB SWAP1 POP DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP2 DUP2 OR DUP6 MSTORE POP POP DUP8 SWAP4 POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xFCC DUP3 PUSH1 0x2 DUP4 MLOAD PUSH2 0xCA3 JUMP JUMPDEST PUSH2 0xFDF DUP2 DUP4 PUSH2 0xDE8 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xFEC PUSH2 0x1140 JUMP JUMPDEST DUP4 PUSH1 0x20 ADD MLOAD DUP4 LT PUSH2 0x1009 JUMPI PUSH2 0x1008 DUP5 PUSH1 0x2 DUP7 PUSH1 0x20 ADD MLOAD MUL PUSH2 0x10AF JUMP JUMPDEST JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0x1025 JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP POP POP DUP4 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x103A PUSH2 0x1140 JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP5 DUP4 ADD GT ISZERO PUSH2 0x1058 JUMPI PUSH2 0x1057 DUP6 PUSH1 0x2 DUP7 DUP6 ADD MUL PUSH2 0x10AF JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0x1085 JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP POP DUP6 SWAP2 POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0x10A5 JUMPI DUP3 SWAP1 POP PUSH2 0x10A9 JUMP JUMPDEST DUP2 SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 PUSH1 0x0 ADD MLOAD SWAP1 POP PUSH2 0x10C2 DUP4 DUP4 PUSH2 0xC4F JUMP JUMPDEST POP PUSH2 0x10CD DUP4 DUP3 PUSH2 0xDE8 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0x113A PUSH2 0x1140 JUMP JUMPDEST DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP INVALID PUSH22 0x6E61626C6520746F207472616E73666572416E644361 PUSH13 0x6C20746F206F7261636C65536F PUSH22 0x726365206D75737420626520746865206F7261636C65 KECCAK256 PUSH16 0x66207468652072657175657374687474 PUSH17 0x733A2F2F6D696E2D6170692E6372797074 PUSH16 0x636F6D706172652E636F6D2F64617461 0x2F PUSH17 0x726963656D756C746966756C6C3F667379 PUSH14 0x733D455448267473796D733D5553 DIFFICULTY LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP5 SWAP16 GASPRICE 0xE5 CREATE2 0xE3 OR PUSH28 0xBD509CF9E9FB421D3449C194DC2098ECF1556D20ECDBA51564736F6C PUSH4 0x4300060C STOP CALLER ", | |
"sourceMap": "233:3345:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3006:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1784:1144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3345:231;;;:::i;:::-;;282:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3006:137;3094:10;8743:15:2;:27;8759:10;8743:27;;;;;;;;;;;;;;;;;;;;;8729:41;;:10;:41;;;8721:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8840:15;:27;8856:10;8840:27;;;;;;;;;;;;8833:34;;;;;;;;;;;8897:10;8878:30;;;;;;;;;;3129:7:0::1;3120:6;:16;;;;3006:137:::0;;;:::o;1784:1144::-;1851:17;1885:32;;:::i;:::-;1920:66;1942:5;;1957:4;1964:21;;;1920;:66::i;:::-;1885:101;;2058:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:11;;:95;;;;;:::i;:::-;2163:45;;;;;;;;;;;;;;;;;;2193:14;2163:7;:15;;:45;;;;;:::i;:::-;2613:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:11;;:47;;;;;:::i;:::-;2752:15;2770:6;2752:24;;2786:36;;;;;;;;;;;;;;;;;;2810:11;2786:7;:14;;:36;;;;;:::i;:::-;2877:44;2900:6;;;;;;;;;;;2908:7;2917:3;;2877:22;:44::i;:::-;2870:51;;;;1784:1144;;;:::o;3345:231::-;3388:28;3438:23;:21;:23::i;:::-;3388:74;;3480:9;:18;;;3499:10;3511:9;:19;;;3539:4;3511:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3480:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3472:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3345:231;:::o;282:21::-;;;;:::o;1767:295:2:-;1915:24;;:::i;:::-;1947:28;;:::i;:::-;1988:69;2003:7;2012:16;2030:26;1988:3;:14;;:69;;;;;;:::i;:::-;1981:76;;;1767:295;;;;;:::o;1988:169:1:-;2090:27;2112:4;2090;:8;;;:21;;:27;;;;:::i;:::-;2123:29;2145:6;2123:4;:8;;;:21;;:29;;;;:::i;:::-;1988:169;;;:::o;3112:165::-;3212:27;3234:4;3212;:8;;;:21;;:27;;;;:::i;:::-;3245;3265:6;3245:4;:8;;;:19;;:27;;;;:::i;:::-;3112:165;;;:::o;2741:162::-;2839:27;2861:4;2839;:8;;;:21;;:27;;;;:::i;:::-;2872:26;2891:6;2872:4;:8;;;:18;;:26;;;;:::i;:::-;2741:162;;;:::o;3072:488:2:-;3196:17;3262:4;3268:12;;3245:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3235:47;;;;;;3223:59;;3301:12;;3288:4;:10;;:25;;;;;3348:7;3319:15;:26;3335:9;3319:26;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;3385:9;3366:29;;;;;;;;;;3409:4;;;;;;;;;;;:20;;;3430:7;3439:8;3449:19;3463:4;3449:13;:19::i;:::-;3409:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3401:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3531:1;3515:12;;:17;;;;;;;;;;;3072:488;;;;;:::o;5293:110::-;5361:7;5393:4;;;;;;;;;;;5378:20;;5293:110;:::o;998:365:1:-;1147:24;;:::i;:::-;1179:49;1200:4;:8;;;365:3;1179:20;:49::i;:::-;;1244:3;1234:4;:7;;:13;;;;;1276:16;1253:4;:20;;:39;;;;;;;;;;;1324:17;1298:4;:23;;:43;;;;;;;;;;;;;1354:4;1347:11;;998:365;;;;;;:::o;2841:198:8:-;2943:55;2954:3;404:1;2984:5;2978:19;2943:10;:55::i;:::-;3008:24;3025:5;3008:3;:10;;:24;;;;:::i;:::-;;2841:198;;:::o;1608:136::-;1699:38;1710:3;249:1;1731:5;1699:10;:38::i;:::-;1608:136;;:::o;1750:448::-;1850:20;1842:5;:28;1839:353;;;1886:30;1905:3;1910:5;1886:18;:30::i;:::-;1839:353;;;1944:18;1936:5;:26;1933:259;;;1978:24;1991:3;1996:5;1978:12;:24::i;:::-;1933:259;;;2031:1;2022:5;:10;2019:173;;2048:44;2059:3;249:1;2085:5;2048:10;:44::i;:::-;2019:173;;;2123:58;2134:3;305:1;2174:5;2169:2;:10;2123;:58::i;:::-;2019:173;1933:259;1839:353;1750:448;;:::o;7564:527:2:-;7652:12;7711:29;;;719:1;663;7961:4;:7;;;7976:4;:20;;;8004:4;:23;;;8035:4;:10;;;765:1;8073:4;:8;;;:12;;;7681:405;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7674:412;;7564:527;;;:::o;982:395:7:-;1052:13;;:::i;:::-;1094:1;1088:2;1077:8;:13;;;;;;:18;1073:71;;1134:2;1123:8;:13;;;;;;1117:2;:20;1105:32;;;;1073:71;1206:8;1191:3;:12;;:23;;;;;1254:4;1248:11;1278:3;1273;1266:16;1301:1;1296:3;1289:14;1340:8;1335:3;1331:18;1327:2;1323:27;1317:4;1310:41;1229:128;1369:3;1362:10;;982:395;;;;:::o;717:724:8:-;832:2;823:5;:11;820:615;;850:44;887:5;882:1;873:5;:10;;;;872:20;;;850:3;:15;;:44;;;;:::i;:::-;;820:615;;;923:4;914:5;:13;911:524;;943:41;980:2;975:1;966:5;:10;;;;965:17;943:3;:15;;:41;;;;:::i;:::-;;998:23;1012:5;1019:1;998:3;:13;;:23;;;;;:::i;:::-;;911:524;;;1050:6;1041:5;:15;1038:397;;1072:41;1109:2;1104:1;1095:5;:10;;;;1094:17;1072:3;:15;;:41;;;;:::i;:::-;;1127:23;1141:5;1148:1;1127:3;:13;;:23;;;;;:::i;:::-;;1038:397;;;1179:10;1170:5;:19;1167:268;;1205:41;1242:2;1237:1;1228:5;:10;;;;1227:17;1205:3;:15;;:41;;;;:::i;:::-;;1260:23;1274:5;1281:1;1260:3;:13;;:23;;;;;:::i;:::-;;1167:268;;;1312:18;1303:5;:27;1300:135;;1346:41;1383:2;1378:1;1369:5;:10;;;;1368:17;1346:3;:15;;:41;;;;:::i;:::-;;1401:23;1415:5;1422:1;1401:3;:13;;:23;;;;;:::i;:::-;;1300:135;1167:268;1038:397;911:524;820:615;717:724;;;:::o;4536:155:7:-;4613:13;;:::i;:::-;4641:45;4647:3;4652;:7;;;:14;4668:4;4674;:11;4641:5;:45::i;:::-;4634:52;;4536:155;;;;:::o;2606:229:8:-;2702:72;709:1;2743;547;2725:19;;;;2724:48;2702:3;:15;;:72;;;;:::i;:::-;;2782:46;2794:3;2820:5;2815:2;:10;2799:28;;;;;;;;;;;;;;;;;;;;;;;;;2782:11;:46::i;:::-;2606:229;;:::o;2391:209::-;2481:63;652:1;2522;547;2504:19;;;;2503:39;2481:3;:15;;:63;;;;:::i;:::-;;2552:41;2564:3;2585:5;2569:23;;;;;;;;;;;;;;;;;;;;;;;;;2552:11;:41::i;:::-;2391:209;;:::o;5851:144:7:-;5925:13;;:::i;:::-;5953:37;5964:3;5969;:7;;;:14;5985:4;5953:10;:37::i;:::-;5946:44;;5851:144;;;;:::o;9543:154::-;9624:13;;:::i;:::-;9652:40;9661:3;9666;:7;;;:14;9682:4;9688:3;9652:8;:40::i;:::-;9645:47;;9543:154;;;;;:::o;2691:1140::-;2786:13;;:::i;:::-;2822:4;:11;2815:3;:18;;2807:27;;;;;;2857:3;:12;;;2851:3;2845;:9;:24;2841:90;;;2879:45;2886:3;2922:1;2891:28;2895:3;:12;;;2915:3;2909;:9;2891:3;:28::i;:::-;:32;2879:6;:45::i;:::-;2841:90;2937:9;2952:8;3046:3;3040:10;3117:6;3111:13;3233:3;3228:2;3220:6;3216:15;3212:25;3204:33;;3317:6;3311:3;3306;3302:13;3299:25;3296:2;;;3359:3;3354;3350:13;3342:6;3335:29;3296:2;3396;3390:4;3386:13;3379:20;;2975:430;;3457:129;3471:2;3464:3;:9;3457:129;;3532:3;3526:10;3520:4;3513:24;3560:2;3552:10;;;;3577:2;3570:9;;;;3482:2;3475:9;;;;3457:129;;;3620:9;3652:1;3645:3;3640:2;:8;3632:3;:17;:21;3620:33;;3711:4;3707:9;3701:3;3695:10;3691:26;3757:4;3750;3744:11;3740:22;3795:7;3785:8;3782:21;3776:4;3769:35;3668:142;;3823:3;3816:10;;;;;2691:1140;;;;;;:::o;2204:181:8:-;2304:47;2315:3;354:1;2338:5;:12;2304:10;:47::i;:::-;2361:17;2372:5;2361:3;:10;;:17;;;;:::i;:::-;;2204:181;;:::o;4985:619:7:-;5068:13;;:::i;:::-;5100:3;:12;;;5093:3;:19;5089:69;;5122:29;5129:3;5149:1;5134:3;:12;;;:16;5122:6;:29::i;:::-;5089:69;5244:3;5238:10;5315:6;5309:13;5427:2;5421:3;5413:6;5409:16;5405:25;5451:4;5445;5437:19;5522:6;5517:3;5514:15;5511:2;;;5567:1;5559:6;5555:14;5547:6;5540:30;5511:2;5173:411;;;5596:3;5589:10;;4985:619;;;;;:::o;8650:642::-;8739:13;;:::i;:::-;8776:3;:12;;;8770:3;8764;:9;:24;8760:73;;;8798:28;8805:3;8824:1;8817:3;8811;:9;8810:15;8798:6;:28::i;:::-;8760:73;8839:9;8864:1;8858:3;8851;:10;:14;8839:26;;8951:3;8945:10;9066:3;9060;9052:6;9048:16;9044:26;9122:4;9114;9110:9;9103:4;9097:11;9093:27;9090:37;9084:4;9077:51;9210:6;9204:13;9198:3;9193;9189:13;9186:32;9183:2;;;9253:3;9248;9244:13;9236:6;9229:29;9183:2;8880:392;;9284:3;9277:10;;;8650:642;;;;;;:::o;1929:114::-;1979:4;1999:1;1995;:5;1991:34;;;2017:1;2010:8;;;;1991:34;2037:1;2030:8;;1929:114;;;;;:::o;1772:153::-;1841:19;1863:3;:7;;;1841:29;;1876:19;1881:3;1886:8;1876:4;:19::i;:::-;;1901;1908:3;1913:6;1901;:19::i;:::-;;1772:153;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o" | |
}, | |
"gasEstimates": { | |
"creation": { | |
"codeDepositCost": "928800", | |
"executionCost": "infinite", | |
"totalCost": "infinite" | |
}, | |
"external": { | |
"fulfill(bytes32,uint256)": "infinite", | |
"requestVolumeData(uint256)": "infinite", | |
"volume()": "1049", | |
"withdrawLink()": "infinite" | |
} | |
}, | |
"methodIdentifiers": { | |
"fulfill(bytes32,uint256)": "4357855e", | |
"requestVolumeData(uint256)": "684ede7f", | |
"volume()": "c618a1e4", | |
"withdrawLink()": "8dc654a2" | |
} | |
}, | |
"abi": [ | |
{ | |
"inputs": [], | |
"stateMutability": "nonpayable", | |
"type": "constructor" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": true, | |
"internalType": "bytes32", | |
"name": "id", | |
"type": "bytes32" | |
} | |
], | |
"name": "ChainlinkCancelled", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": true, | |
"internalType": "bytes32", | |
"name": "id", | |
"type": "bytes32" | |
} | |
], | |
"name": "ChainlinkFulfilled", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": true, | |
"internalType": "bytes32", | |
"name": "id", | |
"type": "bytes32" | |
} | |
], | |
"name": "ChainlinkRequested", | |
"type": "event" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "bytes32", | |
"name": "_requestId", | |
"type": "bytes32" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "_volume", | |
"type": "uint256" | |
} | |
], | |
"name": "fulfill", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "massive_number", | |
"type": "uint256" | |
} | |
], | |
"name": "requestVolumeData", | |
"outputs": [ | |
{ | |
"internalType": "bytes32", | |
"name": "requestId", | |
"type": "bytes32" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "volume", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "withdrawLink", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
} | |
] | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"compiler": { | |
"version": "0.6.12+commit.27d51765" | |
}, | |
"language": "Solidity", | |
"output": { | |
"abi": [ | |
{ | |
"inputs": [], | |
"stateMutability": "nonpayable", | |
"type": "constructor" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": true, | |
"internalType": "bytes32", | |
"name": "id", | |
"type": "bytes32" | |
} | |
], | |
"name": "ChainlinkCancelled", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": true, | |
"internalType": "bytes32", | |
"name": "id", | |
"type": "bytes32" | |
} | |
], | |
"name": "ChainlinkFulfilled", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": true, | |
"internalType": "bytes32", | |
"name": "id", | |
"type": "bytes32" | |
} | |
], | |
"name": "ChainlinkRequested", | |
"type": "event" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "bytes32", | |
"name": "_requestId", | |
"type": "bytes32" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "_volume", | |
"type": "uint256" | |
} | |
], | |
"name": "fulfill", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "massive_number", | |
"type": "uint256" | |
} | |
], | |
"name": "requestVolumeData", | |
"outputs": [ | |
{ | |
"internalType": "bytes32", | |
"name": "requestId", | |
"type": "bytes32" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "volume", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "withdrawLink", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
} | |
], | |
"devdoc": { | |
"kind": "dev", | |
"methods": {}, | |
"version": 1 | |
}, | |
"userdoc": { | |
"kind": "user", | |
"methods": { | |
"constructor": "Network: Kovan Chainlink - 0x2f90A6D021db21e1B2A077c5a37B3C7E75D15b7e Chainlink - 29fa9aa13bf1468788b7cc4a500a45b8 Fee: 0.1 LINK", | |
"fulfill(bytes32,uint256)": { | |
"notice": "Receive the response in the form of uint256" | |
}, | |
"requestVolumeData(uint256)": { | |
"notice": "Create a Chainlink request to retrieve API response, find the target data, then multiply by 1000000000000000000 (to remove decimal places from data).************************************************************************************ STOP! * THIS FUNCTION WILL FAIL IF THIS CONTRACT DOES NOT OWN LINK * ---------------------------------------------------------- * Learn how to obtain testnet LINK and fund this contract: * ------- https://docs.chain.link/docs/acquire-link -------- * ---- https://docs.chain.link/docs/fund-your-contract ----- * ************************************************************************************" | |
}, | |
"withdrawLink()": { | |
"notice": "Withdraw LINK from this contract NOTE: DO NOT USE THIS IN PRODUCTION AS IT CAN BE CALLED BY ANY ADDRESS. THIS IS PURELY FOR EXAMPLE PURPOSES ONLY." | |
} | |
}, | |
"version": 1 | |
} | |
}, | |
"settings": { | |
"compilationTarget": { | |
"8a173a65099261582a652ba18b7d96c1/APIConsumer.sol": "APIConsumer" | |
}, | |
"evmVersion": "istanbul", | |
"libraries": {}, | |
"metadata": { | |
"bytecodeHash": "ipfs" | |
}, | |
"optimizer": { | |
"enabled": false, | |
"runs": 200 | |
}, | |
"remappings": [] | |
}, | |
"sources": { | |
"8a173a65099261582a652ba18b7d96c1/APIConsumer.sol": { | |
"keccak256": "0x00aaeea4f056b58dcf6daa61186d95ec516f755a6facf9260de38113e88ee413", | |
"urls": [ | |
"bzz-raw://6faf20ecf7701c1aa56a03563e9b84935548e95cc297acedc4414e8408f6494b", | |
"dweb:/ipfs/QmYqK4iN9td3Rp7piMfRC3eDCvYjbqKwDJLxGSm7e7fF47" | |
] | |
}, | |
"https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/Chainlink.sol": { | |
"keccak256": "0x7bef34fd97f611103c6113025e3d6af755f326069767e72266698f64258e62b6", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://82125916319b872093aa8599d2c00bd07d363386a74a4d0268c6edf25c366f82", | |
"dweb:/ipfs/QmXTnVy1XEw387NduvHHFQNmnzYTwFUhVz95kRvRrcwdHd" | |
] | |
}, | |
"https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/ChainlinkClient.sol": { | |
"keccak256": "0x9f8883b8b5b76bba151e5f30d4c353b8a3f15ee3d97117deee4cccd91fe8640f", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://ee9b132779ac24df4f8a5e45dfc256acc70eb5e43f715de36593e488f20a44ff", | |
"dweb:/ipfs/QmagJ1htVpP2ZYLAdHEpSEMx1Xd3csbUHAhLctryVDsNFg" | |
] | |
}, | |
"https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/interfaces/ChainlinkRequestInterface.sol": { | |
"keccak256": "0xe513c0f60edf13da7d82625489cf2008c7b66170f3b1ed1606b84c73f95b17ad", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://78e083ef252b80bb63a5aa126bc7283cd9b88767dfdf0190d46802bc32756ecf", | |
"dweb:/ipfs/QmdTyEQwX5ecoXR1rBh8DLDJpCYVDM85JjjR2sEJdE9wAA" | |
] | |
}, | |
"https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/interfaces/ENSInterface.sol": { | |
"keccak256": "0xdef864af6e516477773ea246b73531b1836de5bea4ac1cfd8be6e7f4b3f3c3fd", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://ad3346f5a393cd62d8de678a77d8dc323d8f9e21f0aaa504d0d0b990c8b61477", | |
"dweb:/ipfs/QmQ2n8329Fzb7Zbzk5wqYvAfKJ9QPwTdCUmm9zUqhL67a1" | |
] | |
}, | |
"https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/interfaces/LinkTokenInterface.sol": { | |
"keccak256": "0xe245a7be950c94d87bb775ae9ee9fbd693fbe2987778e6ce0b04605ea44b7b68", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://bd2c3165d949fc66fe407b96eb3dc2092c7e800f4c073b411bf7b96de3e156c9", | |
"dweb:/ipfs/QmcfJhR1Np4GsLWnww2Duqks2wEzYk8VDTvCAYy7MisG1r" | |
] | |
}, | |
"https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/interfaces/PointerInterface.sol": { | |
"keccak256": "0x08aed19c3bef1ae2d90fc0d9d28a497fd7f312991ed08fedfe545de6b9a476e4", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://b2e7b4acfbd4cfbd4c3e266011955954ec0f5a2323647e81b936c66cb35e1b5e", | |
"dweb:/ipfs/QmXVrpdo76r2WhxE7gJPj3dGycZYKKvK39VNVaB7HyhAbT" | |
] | |
}, | |
"https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/vendor/BufferChainlink.sol": { | |
"keccak256": "0x14f13139229a2fef8f705f29f91de0bc81bcd5070ec75b4bd3fd82c1536ca685", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://9a403d7f17b316c7b8837a25df0563de2a1c3121b7cd43473abce8ce6742bd29", | |
"dweb:/ipfs/QmWZYi4xJGjPt1pEM7mS7XsA1eF2zpcxiiuGHuiTndXHo7" | |
] | |
}, | |
"https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/vendor/CBORChainlink.sol": { | |
"keccak256": "0xd4e84a8ade1a2dba213842fea48ca1c7ea5d0eb4105b06c603966b955834e105", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://1d5dde29effbd8bc604215034a01c0f00957b666a016b9e5e478e01c789f1b1b", | |
"dweb:/ipfs/QmTepdEiHcoxDKmodo5zqaZNc68r1zrdEhb3PAaGG4dhv8" | |
] | |
}, | |
"https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/vendor/ENSResolver.sol": { | |
"keccak256": "0xfd992937d215ad669f69e91fefbe62cad8973ae329b4e810ca9b26a1ae0b6bb7", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://afb189e69fb705795bf41dea9ff20bab191164fc4876803168372f9bf1a1a0f1", | |
"dweb:/ipfs/QmUBbNkFiJh9BrPepNVYMpxnEk1a5xqun8VT6Zb2jC3FtV" | |
] | |
} | |
}, | |
"version": 1 | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"deploy": { | |
"VM:-": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"main:1": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"ropsten:3": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"rinkeby:4": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"kovan:42": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"görli:5": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"Custom": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
} | |
}, | |
"data": { | |
"bytecode": { | |
"linkReferences": {}, | |
"object": "6080604052600160045534801561001557600080fd5b506100246100b460201b60201c565b732f90a6d021db21e1b2a077c5a37b3c7e75d15b7e600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f3866346565646131613837323430373761303536306565383465623030366234600781905550670de0b6b3a764000060088190555061019d565b61015773c89bd4e1632d3a43cb03aaad5262cbe4038bc57173ffffffffffffffffffffffffffffffffffffffff166338cc48316040518163ffffffff1660e01b815260040160206040518083038186803b15801561011157600080fd5b505afa158015610125573d6000803e3d6000fd5b505050506040513d602081101561013b57600080fd5b810190808051906020019092919050505061015960201b60201c565b565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610f0e806101ac6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80631604f9ea146100465780634357855e146100505780639d1b464a14610088575b600080fd5b61004e6100a6565b005b6100866004803603604081101561006657600080fd5b8101908080359060200190929190803590602001909291905050506101c1565b005b6100906102e8565b6040518082815260200191505060405180910390f35b6100ae610e06565b6100c260075430634357855e60e01b6102ee565b90506101436040518060400160405280600581526020017f696e6465780000000000000000000000000000000000000000000000000000008152506040518060400160405280600c81526020017f444546495f4b58425455534400000000000000000000000000000000000000008152508361031f9092919063ffffffff16565b61018e6040518060400160405280600581526020017f74696d65730000000000000000000000000000000000000000000000000000008152506064836103529092919063ffffffff16565b6101bd600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600854610385565b5050565b816005600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610279576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180610eb16028913960400191505060405180910390fd5b6005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055807f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a60405160405180910390a281600981905550505050565b60095481565b6102f6610e06565b6102fe610e06565b6103158585858461063d909392919063ffffffff16565b9150509392505050565b6103368284608001516106ed90919063ffffffff16565b61034d8184608001516106ed90919063ffffffff16565b505050565b6103698284608001516106ed90919063ffffffff16565b61038081846080015161071290919063ffffffff16565b505050565b600030600454604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b815260140182815260200192505050604051602081830303815290604052805190602001209050600454836060018181525050836005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550807fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af960405160405180910390a2600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634000aea085846104bd876107b6565b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610544578082015181840152602081019050610529565b50505050905090810190601f1680156105715780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561059257600080fd5b505af11580156105a6573d6000803e3d6000fd5b505050506040513d60208110156105bc57600080fd5b8101908080519060200190929190505050610622576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180610e8e6023913960400191505060405180910390fd5b60016004600082825401925050819055508090509392505050565b610645610e06565b6106558560800151610100610982565b508385600001818152505082856020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508185604001907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681525050849050949350505050565b6106fa82600383516109d6565b61070d8183610b1b90919063ffffffff16565b505050565b7fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000811215610749576107448282610b3d565b6107b2565b67ffffffffffffffff811315610768576107638282610bab565b6107b1565b600081126107815761077c826000836109d6565b6107b0565b6107af826001837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff036109d6565b5b5b5b5050565b6060634042994660e01b60008084600001518560200151866040015187606001516001896080015160000151604051602401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156108e55780820151818401526020810190506108ca565b50505050905090810190601f1680156109125780820380516001836020036101000a031916815260200191505b509950505050505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050919050565b61098a610e73565b60006020838161099657fe5b06146109af57602082816109a657fe5b06602003820191505b81836020018181525050604051808452600081528281016020016040525082905092915050565b60178111610a03576109fd8160058460ff16901b60ff161784610bf790919063ffffffff16565b50610b16565b60ff8111610a4557610a28601860058460ff16901b1784610bf790919063ffffffff16565b50610a3f81600185610c179092919063ffffffff16565b50610b15565b61ffff8111610a8857610a6b601960058460ff16901b1784610bf790919063ffffffff16565b50610a8281600285610c179092919063ffffffff16565b50610b14565b63ffffffff8111610acd57610ab0601a60058460ff16901b1784610bf790919063ffffffff16565b50610ac781600485610c179092919063ffffffff16565b50610b13565b67ffffffffffffffff8111610b1257610af9601b60058460ff16901b1784610bf790919063ffffffff16565b50610b1081600885610c179092919063ffffffff16565b505b5b5b5b5b505050565b610b23610e73565b610b3583846000015151848551610c39565b905092915050565b610b5b60036005600660ff16901b1783610bf790919063ffffffff16565b50610ba782827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0360405160200180828152602001915050604051602081830303815290604052610cf2565b5050565b610bc960026005600660ff16901b1783610bf790919063ffffffff16565b50610bf3828260405160200180828152602001915050604051602081830303815290604052610cf2565b5050565b610bff610e73565b610c0f8384600001515184610d17565b905092915050565b610c1f610e73565b610c30848560000151518585610d65565b90509392505050565b610c41610e73565b8251821115610c4f57600080fd5b84602001518285011115610c7a57610c79856002610c738860200151888701610dc6565b02610de2565b5b600080865180518760208301019350808887011115610c995787860182525b60208701925050505b60208410610cc55780518252602082019150602081019050602084039350610ca2565b60006001856020036101000a03905080198251168184511681811785525050879350505050949350505050565b610cff82600283516109d6565b610d128183610b1b90919063ffffffff16565b505050565b610d1f610e73565b83602001518310610d3c57610d3b846002866020015102610de2565b5b8351805160208583010184815381861415610d58576001820183525b5050508390509392505050565b610d6d610e73565b84602001518483011115610d8b57610d8a85600286850102610de2565b5b60006001836101000a0390508551838682010185831982511617815281518588011115610db85784870182525b505085915050949350505050565b600081831115610dd857829050610ddc565b8190505b92915050565b606082600001519050610df58383610982565b50610e008382610b1b565b50505050565b6040518060a0016040528060008019168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200160008152602001610e6d610e73565b81525090565b60405180604001604052806060815260200160008152509056fe756e61626c6520746f207472616e73666572416e6443616c6c20746f206f7261636c65536f75726365206d75737420626520746865206f7261636c65206f66207468652072657175657374a2646970667358221220431694313021ade4e09d883a642fb486edb88e93121e4180a858dac664614c3e64736f6c63430006070033", | |
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x1 PUSH1 0x4 SSTORE CALLVALUE DUP1 ISZERO PUSH2 0x15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x24 PUSH2 0xB4 PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST PUSH20 0x2F90A6D021DB21E1B2A077C5A37B3C7E75D15B7E PUSH1 0x6 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH32 0x3866346565646131613837323430373761303536306565383465623030366234 PUSH1 0x7 DUP2 SWAP1 SSTORE POP PUSH8 0xDE0B6B3A7640000 PUSH1 0x8 DUP2 SWAP1 SSTORE POP PUSH2 0x19D JUMP JUMPDEST PUSH2 0x157 PUSH20 0xC89BD4E1632D3A43CB03AAAD5262CBE4038BC571 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x38CC4831 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x111 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x125 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x13B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x159 PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST JUMP JUMPDEST DUP1 PUSH1 0x2 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH2 0xF0E DUP1 PUSH2 0x1AC PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1604F9EA EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0x4357855E EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0x9D1B464A EQ PUSH2 0x88 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0xA6 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x86 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x66 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1C1 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x90 PUSH2 0x2E8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xAE PUSH2 0xE06 JUMP JUMPDEST PUSH2 0xC2 PUSH1 0x7 SLOAD ADDRESS PUSH4 0x4357855E PUSH1 0xE0 SHL PUSH2 0x2EE JUMP JUMPDEST SWAP1 POP PUSH2 0x143 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x696E646578000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xC DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x444546495F4B5842545553440000000000000000000000000000000000000000 DUP2 MSTORE POP DUP4 PUSH2 0x31F SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x18E PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x74696D6573000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x64 DUP4 PUSH2 0x352 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x1BD PUSH1 0x6 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0x8 SLOAD PUSH2 0x385 JUMP JUMPDEST POP POP JUMP JUMPDEST DUP2 PUSH1 0x5 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x279 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xEB1 PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x5 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE DUP1 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP2 PUSH1 0x9 DUP2 SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x9 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x2F6 PUSH2 0xE06 JUMP JUMPDEST PUSH2 0x2FE PUSH2 0xE06 JUMP JUMPDEST PUSH2 0x315 DUP6 DUP6 DUP6 DUP5 PUSH2 0x63D SWAP1 SWAP4 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x336 DUP3 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x6ED SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x34D DUP2 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x6ED SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x369 DUP3 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x6ED SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x380 DUP2 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x712 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 SHL DUP2 MSTORE PUSH1 0x14 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x4 SLOAD DUP4 PUSH1 0x60 ADD DUP2 DUP2 MSTORE POP POP DUP4 PUSH1 0x5 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP1 PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0x4BD DUP8 PUSH2 0x7B6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x544 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x529 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x571 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x592 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x5A6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x622 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xE8E PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x4 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP1 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x645 PUSH2 0xE06 JUMP JUMPDEST PUSH2 0x655 DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0x982 JUMP JUMPDEST POP DUP4 DUP6 PUSH1 0x0 ADD DUP2 DUP2 MSTORE POP POP DUP3 DUP6 PUSH1 0x20 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP DUP2 DUP6 PUSH1 0x40 ADD SWAP1 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 DUP2 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE POP POP DUP5 SWAP1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x6FA DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0x9D6 JUMP JUMPDEST PUSH2 0x70D DUP2 DUP4 PUSH2 0xB1B SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 DUP2 SLT ISZERO PUSH2 0x749 JUMPI PUSH2 0x744 DUP3 DUP3 PUSH2 0xB3D JUMP JUMPDEST PUSH2 0x7B2 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 SGT ISZERO PUSH2 0x768 JUMPI PUSH2 0x763 DUP3 DUP3 PUSH2 0xBAB JUMP JUMPDEST PUSH2 0x7B1 JUMP JUMPDEST PUSH1 0x0 DUP2 SLT PUSH2 0x781 JUMPI PUSH2 0x77C DUP3 PUSH1 0x0 DUP4 PUSH2 0x9D6 JUMP JUMPDEST PUSH2 0x7B0 JUMP JUMPDEST PUSH2 0x7AF DUP3 PUSH1 0x1 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SUB PUSH2 0x9D6 JUMP JUMPDEST JUMPDEST JUMPDEST JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x40429946 PUSH1 0xE0 SHL PUSH1 0x0 DUP1 DUP5 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP8 PUSH1 0x60 ADD MLOAD PUSH1 0x1 DUP10 PUSH1 0x80 ADD MLOAD PUSH1 0x0 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD DUP1 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 DUP2 MSTORE PUSH1 0x20 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x8E5 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x8CA JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x912 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x98A PUSH2 0xE73 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP4 DUP2 PUSH2 0x996 JUMPI INVALID JUMPDEST MOD EQ PUSH2 0x9AF JUMPI PUSH1 0x20 DUP3 DUP2 PUSH2 0x9A6 JUMPI INVALID JUMPDEST MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST DUP2 DUP4 PUSH1 0x20 ADD DUP2 DUP2 MSTORE POP POP PUSH1 0x40 MLOAD DUP1 DUP5 MSTORE PUSH1 0x0 DUP2 MSTORE DUP3 DUP2 ADD PUSH1 0x20 ADD PUSH1 0x40 MSTORE POP DUP3 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0xA03 JUMPI PUSH2 0x9FD DUP2 PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL PUSH1 0xFF AND OR DUP5 PUSH2 0xBF7 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xB16 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0xA45 JUMPI PUSH2 0xA28 PUSH1 0x18 PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0xBF7 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xA3F DUP2 PUSH1 0x1 DUP6 PUSH2 0xC17 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xB15 JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0xA88 JUMPI PUSH2 0xA6B PUSH1 0x19 PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0xBF7 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xA82 DUP2 PUSH1 0x2 DUP6 PUSH2 0xC17 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xB14 JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0xACD JUMPI PUSH2 0xAB0 PUSH1 0x1A PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0xBF7 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xAC7 DUP2 PUSH1 0x4 DUP6 PUSH2 0xC17 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xB13 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xB12 JUMPI PUSH2 0xAF9 PUSH1 0x1B PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0xBF7 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xB10 DUP2 PUSH1 0x8 DUP6 PUSH2 0xC17 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP JUMPDEST JUMPDEST JUMPDEST JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xB23 PUSH2 0xE73 JUMP JUMPDEST PUSH2 0xB35 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0xC39 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xB5B PUSH1 0x3 PUSH1 0x5 PUSH1 0x6 PUSH1 0xFF AND SWAP1 SHL OR DUP4 PUSH2 0xBF7 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xBA7 DUP3 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SUB PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0xCF2 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0xBC9 PUSH1 0x2 PUSH1 0x5 PUSH1 0x6 PUSH1 0xFF AND SWAP1 SHL OR DUP4 PUSH2 0xBF7 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xBF3 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0xCF2 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0xBFF PUSH2 0xE73 JUMP JUMPDEST PUSH2 0xC0F DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0xD17 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xC1F PUSH2 0xE73 JUMP JUMPDEST PUSH2 0xC30 DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0xD65 JUMP JUMPDEST SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xC41 PUSH2 0xE73 JUMP JUMPDEST DUP3 MLOAD DUP3 GT ISZERO PUSH2 0xC4F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP3 DUP6 ADD GT ISZERO PUSH2 0xC7A JUMPI PUSH2 0xC79 DUP6 PUSH1 0x2 PUSH2 0xC73 DUP9 PUSH1 0x20 ADD MLOAD DUP9 DUP8 ADD PUSH2 0xDC6 JUMP JUMPDEST MUL PUSH2 0xDE2 JUMP JUMPDEST JUMPDEST PUSH1 0x0 DUP1 DUP7 MLOAD DUP1 MLOAD DUP8 PUSH1 0x20 DUP4 ADD ADD SWAP4 POP DUP1 DUP9 DUP8 ADD GT ISZERO PUSH2 0xC99 JUMPI DUP8 DUP7 ADD DUP3 MSTORE JUMPDEST PUSH1 0x20 DUP8 ADD SWAP3 POP POP POP JUMPDEST PUSH1 0x20 DUP5 LT PUSH2 0xCC5 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP5 SUB SWAP4 POP PUSH2 0xCA2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP6 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB SWAP1 POP DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP2 DUP2 OR DUP6 MSTORE POP POP DUP8 SWAP4 POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xCFF DUP3 PUSH1 0x2 DUP4 MLOAD PUSH2 0x9D6 JUMP JUMPDEST PUSH2 0xD12 DUP2 DUP4 PUSH2 0xB1B SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xD1F PUSH2 0xE73 JUMP JUMPDEST DUP4 PUSH1 0x20 ADD MLOAD DUP4 LT PUSH2 0xD3C JUMPI PUSH2 0xD3B DUP5 PUSH1 0x2 DUP7 PUSH1 0x20 ADD MLOAD MUL PUSH2 0xDE2 JUMP JUMPDEST JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0xD58 JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP POP POP DUP4 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xD6D PUSH2 0xE73 JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP5 DUP4 ADD GT ISZERO PUSH2 0xD8B JUMPI PUSH2 0xD8A DUP6 PUSH1 0x2 DUP7 DUP6 ADD MUL PUSH2 0xDE2 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0xDB8 JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP POP DUP6 SWAP2 POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0xDD8 JUMPI DUP3 SWAP1 POP PUSH2 0xDDC JUMP JUMPDEST DUP2 SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 PUSH1 0x0 ADD MLOAD SWAP1 POP PUSH2 0xDF5 DUP4 DUP4 PUSH2 0x982 JUMP JUMPDEST POP PUSH2 0xE00 DUP4 DUP3 PUSH2 0xB1B JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE6D PUSH2 0xE73 JUMP JUMPDEST DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP INVALID PUSH22 0x6E61626C6520746F207472616E73666572416E644361 PUSH13 0x6C20746F206F7261636C65536F PUSH22 0x726365206D75737420626520746865206F7261636C65 KECCAK256 PUSH16 0x66207468652072657175657374A26469 PUSH17 0x667358221220431694313021ADE4E09D88 GASPRICE PUSH5 0x2FB486EDB8 DUP15 SWAP4 SLT 0x1E COINBASE DUP1 0xA8 PC 0xDA 0xC6 PUSH5 0x614C3E6473 PUSH16 0x6C634300060700330000000000000000 ", | |
"sourceMap": "235:993:0:-:0;;;1163:1:2;1132:32;;580:214:0;5:9:-1;2:2;;;27:1;24;17:12;2:2;580:214:0;611:25;:23;;;:25;;:::i;:::-;655:42;646:6;;:51;;;;;;;;;;;;;;;;;;707:42;:5;:42;;;;765:12;759:3;:18;;;;235:993;;5051:123:2;5101:68;951:42;5119:47;;;:49;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;5119:49:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5119:49:2;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;5119:49:2;;;;;;;;;;;;;;;;5101:17;;;:68;;:::i;:::-;5051:123::o;4834:94::-;4917:5;4891:4;;:32;;;;;;;;;;;;;;;;;;4834:94;:::o;235:993:0:-;;;;;;;" | |
}, | |
"deployedBytecode": { | |
"immutableReferences": {}, | |
"linkReferences": {}, | |
"object": "608060405234801561001057600080fd5b50600436106100415760003560e01c80631604f9ea146100465780634357855e146100505780639d1b464a14610088575b600080fd5b61004e6100a6565b005b6100866004803603604081101561006657600080fd5b8101908080359060200190929190803590602001909291905050506101c1565b005b6100906102e8565b6040518082815260200191505060405180910390f35b6100ae610e06565b6100c260075430634357855e60e01b6102ee565b90506101436040518060400160405280600581526020017f696e6465780000000000000000000000000000000000000000000000000000008152506040518060400160405280600c81526020017f444546495f4b58425455534400000000000000000000000000000000000000008152508361031f9092919063ffffffff16565b61018e6040518060400160405280600581526020017f74696d65730000000000000000000000000000000000000000000000000000008152506064836103529092919063ffffffff16565b6101bd600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600854610385565b5050565b816005600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610279576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180610eb16028913960400191505060405180910390fd5b6005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055807f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a60405160405180910390a281600981905550505050565b60095481565b6102f6610e06565b6102fe610e06565b6103158585858461063d909392919063ffffffff16565b9150509392505050565b6103368284608001516106ed90919063ffffffff16565b61034d8184608001516106ed90919063ffffffff16565b505050565b6103698284608001516106ed90919063ffffffff16565b61038081846080015161071290919063ffffffff16565b505050565b600030600454604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b815260140182815260200192505050604051602081830303815290604052805190602001209050600454836060018181525050836005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550807fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af960405160405180910390a2600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634000aea085846104bd876107b6565b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610544578082015181840152602081019050610529565b50505050905090810190601f1680156105715780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561059257600080fd5b505af11580156105a6573d6000803e3d6000fd5b505050506040513d60208110156105bc57600080fd5b8101908080519060200190929190505050610622576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180610e8e6023913960400191505060405180910390fd5b60016004600082825401925050819055508090509392505050565b610645610e06565b6106558560800151610100610982565b508385600001818152505082856020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508185604001907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681525050849050949350505050565b6106fa82600383516109d6565b61070d8183610b1b90919063ffffffff16565b505050565b7fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000811215610749576107448282610b3d565b6107b2565b67ffffffffffffffff811315610768576107638282610bab565b6107b1565b600081126107815761077c826000836109d6565b6107b0565b6107af826001837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff036109d6565b5b5b5b5050565b6060634042994660e01b60008084600001518560200151866040015187606001516001896080015160000151604051602401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156108e55780820151818401526020810190506108ca565b50505050905090810190601f1680156109125780820380516001836020036101000a031916815260200191505b509950505050505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050919050565b61098a610e73565b60006020838161099657fe5b06146109af57602082816109a657fe5b06602003820191505b81836020018181525050604051808452600081528281016020016040525082905092915050565b60178111610a03576109fd8160058460ff16901b60ff161784610bf790919063ffffffff16565b50610b16565b60ff8111610a4557610a28601860058460ff16901b1784610bf790919063ffffffff16565b50610a3f81600185610c179092919063ffffffff16565b50610b15565b61ffff8111610a8857610a6b601960058460ff16901b1784610bf790919063ffffffff16565b50610a8281600285610c179092919063ffffffff16565b50610b14565b63ffffffff8111610acd57610ab0601a60058460ff16901b1784610bf790919063ffffffff16565b50610ac781600485610c179092919063ffffffff16565b50610b13565b67ffffffffffffffff8111610b1257610af9601b60058460ff16901b1784610bf790919063ffffffff16565b50610b1081600885610c179092919063ffffffff16565b505b5b5b5b5b505050565b610b23610e73565b610b3583846000015151848551610c39565b905092915050565b610b5b60036005600660ff16901b1783610bf790919063ffffffff16565b50610ba782827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0360405160200180828152602001915050604051602081830303815290604052610cf2565b5050565b610bc960026005600660ff16901b1783610bf790919063ffffffff16565b50610bf3828260405160200180828152602001915050604051602081830303815290604052610cf2565b5050565b610bff610e73565b610c0f8384600001515184610d17565b905092915050565b610c1f610e73565b610c30848560000151518585610d65565b90509392505050565b610c41610e73565b8251821115610c4f57600080fd5b84602001518285011115610c7a57610c79856002610c738860200151888701610dc6565b02610de2565b5b600080865180518760208301019350808887011115610c995787860182525b60208701925050505b60208410610cc55780518252602082019150602081019050602084039350610ca2565b60006001856020036101000a03905080198251168184511681811785525050879350505050949350505050565b610cff82600283516109d6565b610d128183610b1b90919063ffffffff16565b505050565b610d1f610e73565b83602001518310610d3c57610d3b846002866020015102610de2565b5b8351805160208583010184815381861415610d58576001820183525b5050508390509392505050565b610d6d610e73565b84602001518483011115610d8b57610d8a85600286850102610de2565b5b60006001836101000a0390508551838682010185831982511617815281518588011115610db85784870182525b505085915050949350505050565b600081831115610dd857829050610ddc565b8190505b92915050565b606082600001519050610df58383610982565b50610e008382610b1b565b50505050565b6040518060a0016040528060008019168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200160008152602001610e6d610e73565b81525090565b60405180604001604052806060815260200160008152509056fe756e61626c6520746f207472616e73666572416e6443616c6c20746f206f7261636c65536f75726365206d75737420626520746865206f7261636c65206f66207468652072657175657374a2646970667358221220431694313021ade4e09d883a642fb486edb88e93121e4180a858dac664614c3e64736f6c63430006070033", | |
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x1604F9EA EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0x4357855E EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0x9D1B464A EQ PUSH2 0x88 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0xA6 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x86 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x66 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x1C1 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x90 PUSH2 0x2E8 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xAE PUSH2 0xE06 JUMP JUMPDEST PUSH2 0xC2 PUSH1 0x7 SLOAD ADDRESS PUSH4 0x4357855E PUSH1 0xE0 SHL PUSH2 0x2EE JUMP JUMPDEST SWAP1 POP PUSH2 0x143 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x696E646578000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0xC DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x444546495F4B5842545553440000000000000000000000000000000000000000 DUP2 MSTORE POP DUP4 PUSH2 0x31F SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x18E PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x74696D6573000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x64 DUP4 PUSH2 0x352 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x1BD PUSH1 0x6 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0x8 SLOAD PUSH2 0x385 JUMP JUMPDEST POP POP JUMP JUMPDEST DUP2 PUSH1 0x5 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x279 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xEB1 PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x5 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE DUP1 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP2 PUSH1 0x9 DUP2 SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH1 0x9 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x2F6 PUSH2 0xE06 JUMP JUMPDEST PUSH2 0x2FE PUSH2 0xE06 JUMP JUMPDEST PUSH2 0x315 DUP6 DUP6 DUP6 DUP5 PUSH2 0x63D SWAP1 SWAP4 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x336 DUP3 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x6ED SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x34D DUP2 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x6ED SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x369 DUP3 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x6ED SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x380 DUP2 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x712 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 SHL DUP2 MSTORE PUSH1 0x14 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x4 SLOAD DUP4 PUSH1 0x60 ADD DUP2 DUP2 MSTORE POP POP DUP4 PUSH1 0x5 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP1 PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0x4BD DUP8 PUSH2 0x7B6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x544 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x529 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x571 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x592 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x5A6 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x5BC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x622 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xE8E PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x4 PUSH1 0x0 DUP3 DUP3 SLOAD ADD SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP1 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x645 PUSH2 0xE06 JUMP JUMPDEST PUSH2 0x655 DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0x982 JUMP JUMPDEST POP DUP4 DUP6 PUSH1 0x0 ADD DUP2 DUP2 MSTORE POP POP DUP3 DUP6 PUSH1 0x20 ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP DUP2 DUP6 PUSH1 0x40 ADD SWAP1 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND SWAP1 DUP2 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE POP POP DUP5 SWAP1 POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0x6FA DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0x9D6 JUMP JUMPDEST PUSH2 0x70D DUP2 DUP4 PUSH2 0xB1B SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 DUP2 SLT ISZERO PUSH2 0x749 JUMPI PUSH2 0x744 DUP3 DUP3 PUSH2 0xB3D JUMP JUMPDEST PUSH2 0x7B2 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 SGT ISZERO PUSH2 0x768 JUMPI PUSH2 0x763 DUP3 DUP3 PUSH2 0xBAB JUMP JUMPDEST PUSH2 0x7B1 JUMP JUMPDEST PUSH1 0x0 DUP2 SLT PUSH2 0x781 JUMPI PUSH2 0x77C DUP3 PUSH1 0x0 DUP4 PUSH2 0x9D6 JUMP JUMPDEST PUSH2 0x7B0 JUMP JUMPDEST PUSH2 0x7AF DUP3 PUSH1 0x1 DUP4 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SUB PUSH2 0x9D6 JUMP JUMPDEST JUMPDEST JUMPDEST JUMPDEST POP POP JUMP JUMPDEST PUSH1 0x60 PUSH4 0x40429946 PUSH1 0xE0 SHL PUSH1 0x0 DUP1 DUP5 PUSH1 0x0 ADD MLOAD DUP6 PUSH1 0x20 ADD MLOAD DUP7 PUSH1 0x40 ADD MLOAD DUP8 PUSH1 0x60 ADD MLOAD PUSH1 0x1 DUP10 PUSH1 0x80 ADD MLOAD PUSH1 0x0 ADD MLOAD PUSH1 0x40 MLOAD PUSH1 0x24 ADD DUP1 DUP10 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP9 DUP2 MSTORE PUSH1 0x20 ADD DUP8 DUP2 MSTORE PUSH1 0x20 ADD DUP7 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP6 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x8E5 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x8CA JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x912 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP10 POP POP POP POP POP POP POP POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE SWAP1 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH1 0x20 DUP3 ADD DUP1 MLOAD PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP4 DUP2 DUP4 AND OR DUP4 MSTORE POP POP POP POP SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x98A PUSH2 0xE73 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP4 DUP2 PUSH2 0x996 JUMPI INVALID JUMPDEST MOD EQ PUSH2 0x9AF JUMPI PUSH1 0x20 DUP3 DUP2 PUSH2 0x9A6 JUMPI INVALID JUMPDEST MOD PUSH1 0x20 SUB DUP3 ADD SWAP2 POP JUMPDEST DUP2 DUP4 PUSH1 0x20 ADD DUP2 DUP2 MSTORE POP POP PUSH1 0x40 MLOAD DUP1 DUP5 MSTORE PUSH1 0x0 DUP2 MSTORE DUP3 DUP2 ADD PUSH1 0x20 ADD PUSH1 0x40 MSTORE POP DUP3 SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x17 DUP2 GT PUSH2 0xA03 JUMPI PUSH2 0x9FD DUP2 PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL PUSH1 0xFF AND OR DUP5 PUSH2 0xBF7 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xB16 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0xA45 JUMPI PUSH2 0xA28 PUSH1 0x18 PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0xBF7 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xA3F DUP2 PUSH1 0x1 DUP6 PUSH2 0xC17 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xB15 JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0xA88 JUMPI PUSH2 0xA6B PUSH1 0x19 PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0xBF7 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xA82 DUP2 PUSH1 0x2 DUP6 PUSH2 0xC17 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xB14 JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0xACD JUMPI PUSH2 0xAB0 PUSH1 0x1A PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0xBF7 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xAC7 DUP2 PUSH1 0x4 DUP6 PUSH2 0xC17 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xB13 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0xB12 JUMPI PUSH2 0xAF9 PUSH1 0x1B PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0xBF7 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xB10 DUP2 PUSH1 0x8 DUP6 PUSH2 0xC17 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP JUMPDEST JUMPDEST JUMPDEST JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xB23 PUSH2 0xE73 JUMP JUMPDEST PUSH2 0xB35 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0xC39 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xB5B PUSH1 0x3 PUSH1 0x5 PUSH1 0x6 PUSH1 0xFF AND SWAP1 SHL OR DUP4 PUSH2 0xBF7 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xBA7 DUP3 DUP3 PUSH32 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SUB PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0xCF2 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0xBC9 PUSH1 0x2 PUSH1 0x5 PUSH1 0x6 PUSH1 0xFF AND SWAP1 SHL OR DUP4 PUSH2 0xBF7 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0xBF3 DUP3 DUP3 PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE PUSH2 0xCF2 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0xBFF PUSH2 0xE73 JUMP JUMPDEST PUSH2 0xC0F DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0xD17 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xC1F PUSH2 0xE73 JUMP JUMPDEST PUSH2 0xC30 DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0xD65 JUMP JUMPDEST SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xC41 PUSH2 0xE73 JUMP JUMPDEST DUP3 MLOAD DUP3 GT ISZERO PUSH2 0xC4F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP3 DUP6 ADD GT ISZERO PUSH2 0xC7A JUMPI PUSH2 0xC79 DUP6 PUSH1 0x2 PUSH2 0xC73 DUP9 PUSH1 0x20 ADD MLOAD DUP9 DUP8 ADD PUSH2 0xDC6 JUMP JUMPDEST MUL PUSH2 0xDE2 JUMP JUMPDEST JUMPDEST PUSH1 0x0 DUP1 DUP7 MLOAD DUP1 MLOAD DUP8 PUSH1 0x20 DUP4 ADD ADD SWAP4 POP DUP1 DUP9 DUP8 ADD GT ISZERO PUSH2 0xC99 JUMPI DUP8 DUP7 ADD DUP3 MSTORE JUMPDEST PUSH1 0x20 DUP8 ADD SWAP3 POP POP POP JUMPDEST PUSH1 0x20 DUP5 LT PUSH2 0xCC5 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP5 SUB SWAP4 POP PUSH2 0xCA2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP6 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB SWAP1 POP DUP1 NOT DUP3 MLOAD AND DUP2 DUP5 MLOAD AND DUP2 DUP2 OR DUP6 MSTORE POP POP DUP8 SWAP4 POP POP POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH2 0xCFF DUP3 PUSH1 0x2 DUP4 MLOAD PUSH2 0x9D6 JUMP JUMPDEST PUSH2 0xD12 DUP2 DUP4 PUSH2 0xB1B SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0xD1F PUSH2 0xE73 JUMP JUMPDEST DUP4 PUSH1 0x20 ADD MLOAD DUP4 LT PUSH2 0xD3C JUMPI PUSH2 0xD3B DUP5 PUSH1 0x2 DUP7 PUSH1 0x20 ADD MLOAD MUL PUSH2 0xDE2 JUMP JUMPDEST JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0xD58 JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP POP POP DUP4 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xD6D PUSH2 0xE73 JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP5 DUP4 ADD GT ISZERO PUSH2 0xD8B JUMPI PUSH2 0xD8A DUP6 PUSH1 0x2 DUP7 DUP6 ADD MUL PUSH2 0xDE2 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH1 0x1 DUP4 PUSH2 0x100 EXP SUB SWAP1 POP DUP6 MLOAD DUP4 DUP7 DUP3 ADD ADD DUP6 DUP4 NOT DUP3 MLOAD AND OR DUP2 MSTORE DUP2 MLOAD DUP6 DUP9 ADD GT ISZERO PUSH2 0xDB8 JUMPI DUP5 DUP8 ADD DUP3 MSTORE JUMPDEST POP POP DUP6 SWAP2 POP POP SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 DUP4 GT ISZERO PUSH2 0xDD8 JUMPI DUP3 SWAP1 POP PUSH2 0xDDC JUMP JUMPDEST DUP2 SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 PUSH1 0x0 ADD MLOAD SWAP1 POP PUSH2 0xDF5 DUP4 DUP4 PUSH2 0x982 JUMP JUMPDEST POP PUSH2 0xE00 DUP4 DUP3 PUSH2 0xB1B JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0xA0 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x0 DUP1 NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 PUSH28 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE PUSH1 0x20 ADD PUSH2 0xE6D PUSH2 0xE73 JUMP JUMPDEST DUP2 MSTORE POP SWAP1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x60 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 DUP2 MSTORE POP SWAP1 JUMP INVALID PUSH22 0x6E61626C6520746F207472616E73666572416E644361 PUSH13 0x6C20746F206F7261636C65536F PUSH22 0x726365206D75737420626520746865206F7261636C65 KECCAK256 PUSH16 0x66207468652072657175657374A26469 PUSH17 0x667358221220431694313021ADE4E09D88 GASPRICE PUSH5 0x2FB486EDB8 DUP15 SWAP4 SLT 0x1E COINBASE DUP1 0xA8 PC 0xDA 0xC6 PUSH5 0x614C3E6473 PUSH16 0x6C634300060700330000000000000000 ", | |
"sourceMap": "235:993:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;235:993:0;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;804:263:0;;;:::i;:::-;;1077:149;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;1077:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;374:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;804:263;843:28;;:::i;:::-;874:66;896:5;;911:4;918:21;;;874;:66::i;:::-;843:97;;948:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:3;:7;;:32;;;;;:::i;:::-;988:24;;;;;;;;;;;;;;;;;;1008:3;988;:10;;:24;;;;;:::i;:::-;1020:40;1043:6;;;;;;;;;;;1051:3;1056;;1020:22;:40::i;:::-;;804:263;:::o;1077:149::-;1172:10;8743:15:2;:27;8759:10;8743:27;;;;;;;;;;;;;;;;;;;;;8729:41;;:10;:41;;;8721:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8840:15;:27;8856:10;8840:27;;;;;;;;;;;;8833:34;;;;;;;;;;;8897:10;8878:30;;;;;;;;;;1213:6:0::1;1198:12;:21;;;;1077:149:::0;;;:::o;374:27::-;;;;:::o;1767:295:2:-;1915:24;;:::i;:::-;1947:28;;:::i;:::-;1988:69;2003:7;2012:16;2030:26;1988:3;:14;;:69;;;;;;:::i;:::-;1981:76;;;1767:295;;;;;:::o;1988:169:1:-;2090:27;2112:4;2090;:8;;;:21;;:27;;;;:::i;:::-;2123:29;2145:6;2123:4;:8;;;:21;;:29;;;;:::i;:::-;1988:169;;;:::o;2741:162::-;2839:27;2861:4;2839;:8;;;:21;;:27;;;;:::i;:::-;2872:26;2891:6;2872:4;:8;;;:18;;:26;;;;:::i;:::-;2741:162;;;:::o;3072:488:2:-;3196:17;3262:4;3268:12;;3245:36;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3245:36:2;;;3235:47;;;;;;3223:59;;3301:12;;3288:4;:10;;:25;;;;;3348:7;3319:15;:26;3335:9;3319:26;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;3385:9;3366:29;;;;;;;;;;3409:4;;;;;;;;;;;:20;;;3430:7;3439:8;3449:19;3463:4;3449:13;:19::i;:::-;3409:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;3409:60:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3409:60:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3409:60:2;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;3409:60:2;;;;;;;;;;;;;;;;3401:108;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3531:1;3515:12;;:17;;;;;;;;;;;3546:9;3539:16;;3072:488;;;;;:::o;998:365:1:-;1147:24;;:::i;:::-;1179:49;1200:4;:8;;;365:3;1179:20;:49::i;:::-;;1244:3;1234:4;:7;;:13;;;;;1276:16;1253:4;:20;;:39;;;;;;;;;;;1324:17;1298:4;:23;;:43;;;;;;;;;;;;;1354:4;1347:11;;998:365;;;;;;:::o;2841:198:8:-;2943:55;2954:3;404:1;2984:5;2978:19;2943:10;:55::i;:::-;3008:24;3025:5;3008:3;:10;;:24;;;;:::i;:::-;;2841:198;;:::o;1750:448::-;1850:20;1842:5;:28;1839:353;;;1886:30;1905:3;1910:5;1886:18;:30::i;:::-;1839:353;;;1944:18;1936:5;:26;1933:259;;;1978:24;1991:3;1996:5;1978:12;:24::i;:::-;1933:259;;;2031:1;2022:5;:10;2019:173;;2048:44;2059:3;249:1;2085:5;2048:10;:44::i;:::-;2019:173;;;2123:58;2134:3;305:1;2174:5;2169:2;:10;2123;:58::i;:::-;2019:173;1933:259;1839:353;1750:448;;:::o;7564:527:2:-;7652:12;7711:29;;;719:1;663;7961:4;:7;;;7976:4;:20;;;8004:4;:23;;;8035:4;:10;;;765:1;8073:4;:8;;;:12;;;7681:405;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;7681:405:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;7681:405:2;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;7681:405:2;7674:412;;7564:527;;;:::o;982:395:7:-;1052:13;;:::i;:::-;1094:1;1088:2;1077:8;:13;;;;;;:18;1073:71;;1134:2;1123:8;:13;;;;;;1117:2;:20;1105:32;;;;1073:71;1206:8;1191:3;:12;;:23;;;;;1254:4;1248:11;1278:3;1273;1266:16;1301:1;1296:3;1289:14;1340:8;1335:3;1331:18;1327:2;1323:27;1317:4;1310:41;1229:128;1369:3;1362:10;;982:395;;;;:::o;717:724:8:-;832:2;823:5;:11;820:615;;850:44;887:5;882:1;873:5;:10;;;;872:20;;;850:3;:15;;:44;;;;:::i;:::-;;820:615;;;923:4;914:5;:13;911:524;;943:41;980:2;975:1;966:5;:10;;;;965:17;943:3;:15;;:41;;;;:::i;:::-;;998:23;1012:5;1019:1;998:3;:13;;:23;;;;;:::i;:::-;;911:524;;;1050:6;1041:5;:15;1038:397;;1072:41;1109:2;1104:1;1095:5;:10;;;;1094:17;1072:3;:15;;:41;;;;:::i;:::-;;1127:23;1141:5;1148:1;1127:3;:13;;:23;;;;;:::i;:::-;;1038:397;;;1179:10;1170:5;:19;1167:268;;1205:41;1242:2;1237:1;1228:5;:10;;;;1227:17;1205:3;:15;;:41;;;;:::i;:::-;;1260:23;1274:5;1281:1;1260:3;:13;;:23;;;;;:::i;:::-;;1167:268;;;1312:18;1303:5;:27;1300:135;;1346:41;1383:2;1378:1;1369:5;:10;;;;1368:17;1346:3;:15;;:41;;;;:::i;:::-;;1401:23;1415:5;1422:1;1401:3;:13;;:23;;;;;:::i;:::-;;1300:135;1167:268;1038:397;911:524;820:615;717:724;;;:::o;4536:155:7:-;4613:13;;:::i;:::-;4641:45;4647:3;4652;:7;;;:14;4668:4;4674;:11;4641:5;:45::i;:::-;4634:52;;4536:155;;;;:::o;2606:229:8:-;2702:72;709:1;2743;547;2725:19;;;;2724:48;2702:3;:15;;:72;;;;:::i;:::-;;2782:46;2794:3;2820:5;2815:2;:10;2799:28;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2799:28:8;;;2782:11;:46::i;:::-;2606:229;;:::o;2391:209::-;2481:63;652:1;2522;547;2504:19;;;;2503:39;2481:3;:15;;:63;;;;:::i;:::-;;2552:41;2564:3;2585:5;2569:23;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2569:23:8;;;2552:11;:41::i;:::-;2391:209;;:::o;5851:144:7:-;5925:13;;:::i;:::-;5953:37;5964:3;5969;:7;;;:14;5985:4;5953:10;:37::i;:::-;5946:44;;5851:144;;;;:::o;9543:154::-;9624:13;;:::i;:::-;9652:40;9661:3;9666;:7;;;:14;9682:4;9688:3;9652:8;:40::i;:::-;9645:47;;9543:154;;;;;:::o;2691:1140::-;2786:13;;:::i;:::-;2822:4;:11;2815:3;:18;;2807:27;;12:1:-1;9;2:12;2807:27:7;2857:3;:12;;;2851:3;2845;:9;:24;2841:90;;;2879:45;2886:3;2922:1;2891:28;2895:3;:12;;;2915:3;2909;:9;2891:3;:28::i;:::-;:32;2879:6;:45::i;:::-;2841:90;2937:9;2952:8;3046:3;3040:10;3117:6;3111:13;3233:3;3228:2;3220:6;3216:15;3212:25;3204:33;;3317:6;3311:3;3306;3302:13;3299:25;3296:2;;;3359:3;3354;3350:13;3342:6;3335:29;3296:2;3396;3390:4;3386:13;3379:20;;2975:430;;3457:129;3471:2;3464:3;:9;3457:129;;3532:3;3526:10;3520:4;3513:24;3560:2;3552:10;;;;3577:2;3570:9;;;;3482:2;3475:9;;;;3457:129;;;3620:9;3652:1;3645:3;3640:2;:8;3632:3;:17;:21;3620:33;;3711:4;3707:9;3701:3;3695:10;3691:26;3757:4;3750;3744:11;3740:22;3795:7;3785:8;3782:21;3776:4;3769:35;3668:142;;3823:3;3816:10;;;;;2691:1140;;;;;;:::o;2204:181:8:-;2304:47;2315:3;354:1;2338:5;:12;2304:10;:47::i;:::-;2361:17;2372:5;2361:3;:10;;:17;;;;:::i;:::-;;2204:181;;:::o;4985:619:7:-;5068:13;;:::i;:::-;5100:3;:12;;;5093:3;:19;5089:69;;5122:29;5129:3;5149:1;5134:3;:12;;;:16;5122:6;:29::i;:::-;5089:69;5244:3;5238:10;5315:6;5309:13;5427:2;5421:3;5413:6;5409:16;5405:25;5451:4;5445;5437:19;5522:6;5517:3;5514:15;5511:2;;;5567:1;5559:6;5555:14;5547:6;5540:30;5511:2;5173:411;;;5596:3;5589:10;;4985:619;;;;;:::o;8650:642::-;8739:13;;:::i;:::-;8776:3;:12;;;8770:3;8764;:9;:24;8760:73;;;8798:28;8805:3;8824:1;8817:3;8811;:9;8810:15;8798:6;:28::i;:::-;8760:73;8839:9;8864:1;8858:3;8851;:10;:14;8839:26;;8951:3;8945:10;9066:3;9060;9052:6;9048:16;9044:26;9122:4;9114;9110:9;9103:4;9097:11;9093:27;9090:37;9084:4;9077:51;9210:6;9204:13;9198:3;9193;9189:13;9186:32;9183:2;;;9253:3;9248;9244:13;9236:6;9229:29;9183:2;8880:392;;9284:3;9277:10;;;8650:642;;;;;;:::o;1929:114::-;1979:4;1999:1;1995;:5;1991:34;;;2017:1;2010:8;;;;1991:34;2037:1;2030:8;;1929:114;;;;;:::o;1772:153::-;1841:19;1863:3;:7;;;1841:29;;1876:19;1881:3;1886:8;1876:4;:19::i;:::-;;1901;1908:3;1913:6;1901;:19::i;:::-;;1772:153;;;:::o;235:993:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o" | |
}, | |
"gasEstimates": { | |
"creation": { | |
"codeDepositCost": "770800", | |
"executionCost": "infinite", | |
"totalCost": "infinite" | |
}, | |
"external": { | |
"currentPrice()": "1027", | |
"fulfill(bytes32,uint256)": "infinite", | |
"requestPrice()": "infinite" | |
} | |
}, | |
"methodIdentifiers": { | |
"currentPrice()": "9d1b464a", | |
"fulfill(bytes32,uint256)": "4357855e", | |
"requestPrice()": "1604f9ea" | |
} | |
}, | |
"abi": [ | |
{ | |
"inputs": [], | |
"stateMutability": "nonpayable", | |
"type": "constructor" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": true, | |
"internalType": "bytes32", | |
"name": "id", | |
"type": "bytes32" | |
} | |
], | |
"name": "ChainlinkCancelled", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": true, | |
"internalType": "bytes32", | |
"name": "id", | |
"type": "bytes32" | |
} | |
], | |
"name": "ChainlinkFulfilled", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": true, | |
"internalType": "bytes32", | |
"name": "id", | |
"type": "bytes32" | |
} | |
], | |
"name": "ChainlinkRequested", | |
"type": "event" | |
}, | |
{ | |
"inputs": [], | |
"name": "currentPrice", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "bytes32", | |
"name": "_requestId", | |
"type": "bytes32" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "_price", | |
"type": "uint256" | |
} | |
], | |
"name": "fulfill", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "requestPrice", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
} | |
] | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"compiler": { | |
"version": "0.6.7+commit.b8d736ae" | |
}, | |
"language": "Solidity", | |
"output": { | |
"abi": [ | |
{ | |
"inputs": [], | |
"stateMutability": "nonpayable", | |
"type": "constructor" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": true, | |
"internalType": "bytes32", | |
"name": "id", | |
"type": "bytes32" | |
} | |
], | |
"name": "ChainlinkCancelled", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": true, | |
"internalType": "bytes32", | |
"name": "id", | |
"type": "bytes32" | |
} | |
], | |
"name": "ChainlinkFulfilled", | |
"type": "event" | |
}, | |
{ | |
"anonymous": false, | |
"inputs": [ | |
{ | |
"indexed": true, | |
"internalType": "bytes32", | |
"name": "id", | |
"type": "bytes32" | |
} | |
], | |
"name": "ChainlinkRequested", | |
"type": "event" | |
}, | |
{ | |
"inputs": [], | |
"name": "currentPrice", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "bytes32", | |
"name": "_requestId", | |
"type": "bytes32" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "_price", | |
"type": "uint256" | |
} | |
], | |
"name": "fulfill", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "requestPrice", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
} | |
], | |
"devdoc": { | |
"methods": {} | |
}, | |
"userdoc": { | |
"methods": { | |
"constructor": "Network: Kovan Chainlink - 0x2f90A6D021db21e1B2A077c5a37B3C7E75D15b7e Kraken - 8f4eeda1a8724077a0560ee84eb006b4 Fee: 1 LINK" | |
}, | |
"notice": "DO NOT USE IN PRODUCTION!! THIS IS EXAMPLE CONTRACT FOR THE KOVAN TESTNET" | |
} | |
}, | |
"settings": { | |
"compilationTarget": { | |
"902e40cbf5d0a2f583ce2ceb0b9c7749/KrakenConsumer.sol": "KrakenConsumer" | |
}, | |
"evmVersion": "istanbul", | |
"libraries": {}, | |
"metadata": { | |
"bytecodeHash": "ipfs" | |
}, | |
"optimizer": { | |
"enabled": false, | |
"runs": 200 | |
}, | |
"remappings": [] | |
}, | |
"sources": { | |
"902e40cbf5d0a2f583ce2ceb0b9c7749/KrakenConsumer.sol": { | |
"keccak256": "0x67e1cc1e1bdcfd8f6a4da464e05da21d948d3602c90a902f658276319630cca0", | |
"urls": [ | |
"bzz-raw://8726ff7afa88c229c8920d106572028bd76dd87b917c0a7953ab737681b8f2c0", | |
"dweb:/ipfs/QmPuHVjxxjUxMKmKJmdgfXuSsGHMtRq22Nsbido1t9gqEF" | |
] | |
}, | |
"https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/Chainlink.sol": { | |
"keccak256": "0x7bef34fd97f611103c6113025e3d6af755f326069767e72266698f64258e62b6", | |
"urls": [ | |
"bzz-raw://82125916319b872093aa8599d2c00bd07d363386a74a4d0268c6edf25c366f82", | |
"dweb:/ipfs/QmXTnVy1XEw387NduvHHFQNmnzYTwFUhVz95kRvRrcwdHd" | |
] | |
}, | |
"https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/ChainlinkClient.sol": { | |
"keccak256": "0x9f8883b8b5b76bba151e5f30d4c353b8a3f15ee3d97117deee4cccd91fe8640f", | |
"urls": [ | |
"bzz-raw://ee9b132779ac24df4f8a5e45dfc256acc70eb5e43f715de36593e488f20a44ff", | |
"dweb:/ipfs/QmagJ1htVpP2ZYLAdHEpSEMx1Xd3csbUHAhLctryVDsNFg" | |
] | |
}, | |
"https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/interfaces/ChainlinkRequestInterface.sol": { | |
"keccak256": "0xe513c0f60edf13da7d82625489cf2008c7b66170f3b1ed1606b84c73f95b17ad", | |
"urls": [ | |
"bzz-raw://78e083ef252b80bb63a5aa126bc7283cd9b88767dfdf0190d46802bc32756ecf", | |
"dweb:/ipfs/QmdTyEQwX5ecoXR1rBh8DLDJpCYVDM85JjjR2sEJdE9wAA" | |
] | |
}, | |
"https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/interfaces/ENSInterface.sol": { | |
"keccak256": "0xdef864af6e516477773ea246b73531b1836de5bea4ac1cfd8be6e7f4b3f3c3fd", | |
"urls": [ | |
"bzz-raw://ad3346f5a393cd62d8de678a77d8dc323d8f9e21f0aaa504d0d0b990c8b61477", | |
"dweb:/ipfs/QmQ2n8329Fzb7Zbzk5wqYvAfKJ9QPwTdCUmm9zUqhL67a1" | |
] | |
}, | |
"https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/interfaces/LinkTokenInterface.sol": { | |
"keccak256": "0xe245a7be950c94d87bb775ae9ee9fbd693fbe2987778e6ce0b04605ea44b7b68", | |
"urls": [ | |
"bzz-raw://bd2c3165d949fc66fe407b96eb3dc2092c7e800f4c073b411bf7b96de3e156c9", | |
"dweb:/ipfs/QmcfJhR1Np4GsLWnww2Duqks2wEzYk8VDTvCAYy7MisG1r" | |
] | |
}, | |
"https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/interfaces/PointerInterface.sol": { | |
"keccak256": "0x08aed19c3bef1ae2d90fc0d9d28a497fd7f312991ed08fedfe545de6b9a476e4", | |
"urls": [ | |
"bzz-raw://b2e7b4acfbd4cfbd4c3e266011955954ec0f5a2323647e81b936c66cb35e1b5e", | |
"dweb:/ipfs/QmXVrpdo76r2WhxE7gJPj3dGycZYKKvK39VNVaB7HyhAbT" | |
] | |
}, | |
"https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/vendor/BufferChainlink.sol": { | |
"keccak256": "0x14f13139229a2fef8f705f29f91de0bc81bcd5070ec75b4bd3fd82c1536ca685", | |
"urls": [ | |
"bzz-raw://9a403d7f17b316c7b8837a25df0563de2a1c3121b7cd43473abce8ce6742bd29", | |
"dweb:/ipfs/QmWZYi4xJGjPt1pEM7mS7XsA1eF2zpcxiiuGHuiTndXHo7" | |
] | |
}, | |
"https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/vendor/CBORChainlink.sol": { | |
"keccak256": "0xd4e84a8ade1a2dba213842fea48ca1c7ea5d0eb4105b06c603966b955834e105", | |
"urls": [ | |
"bzz-raw://1d5dde29effbd8bc604215034a01c0f00957b666a016b9e5e478e01c789f1b1b", | |
"dweb:/ipfs/QmTepdEiHcoxDKmodo5zqaZNc68r1zrdEhb3PAaGG4dhv8" | |
] | |
}, | |
"https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/vendor/ENSResolver.sol": { | |
"keccak256": "0xfd992937d215ad669f69e91fefbe62cad8973ae329b4e810ca9b26a1ae0b6bb7", | |
"urls": [ | |
"bzz-raw://afb189e69fb705795bf41dea9ff20bab191164fc4876803168372f9bf1a1a0f1", | |
"dweb:/ipfs/QmUBbNkFiJh9BrPepNVYMpxnEk1a5xqun8VT6Zb2jC3FtV" | |
] | |
} | |
}, | |
"version": 1 | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.6.0; | |
import "https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/ChainlinkClient.sol"; | |
/** | |
* DO NOT USE IN PRODUCTION!! | |
* THIS IS EXAMPLE CONTRACT FOR THE KOVAN TESTNET | |
*/ | |
contract KrakenConsumer is ChainlinkClient { | |
address private oracle; | |
bytes32 private jobId; | |
uint256 private fee; | |
uint256 public currentPrice; | |
/** | |
* Network: Kovan | |
* Chainlink - 0x2f90A6D021db21e1B2A077c5a37B3C7E75D15b7e | |
* Kraken - 8f4eeda1a8724077a0560ee84eb006b4 | |
* Fee: 1 LINK | |
*/ | |
constructor() public { | |
setPublicChainlinkToken(); | |
oracle = 0x2f90A6D021db21e1B2A077c5a37B3C7E75D15b7e; | |
jobId = "8f4eeda1a8724077a0560ee84eb006b4"; | |
fee = 1 * 10 ** 18; // 1 LINK | |
} | |
function requestPrice() public { | |
Chainlink.Request memory req = buildChainlinkRequest(jobId, address(this), this.fulfill.selector); | |
req.add("index", "DEFI_KXBTUSD"); | |
req.addInt("times", 100); | |
sendChainlinkRequestTo(oracle, req, fee); | |
} | |
function fulfill(bytes32 _requestId, uint256 _price) public | |
recordChainlinkFulfillment(_requestId) | |
{ | |
currentPrice = _price; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"deploy": { | |
"VM:-": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"main:1": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"ropsten:3": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"rinkeby:4": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"kovan:42": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"görli:5": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
}, | |
"Custom": { | |
"linkReferences": {}, | |
"autoDeployLib": true | |
} | |
}, | |
"data": { | |
"bytecode": { | |
"linkReferences": {}, | |
"object": "608060405260016004553480156200001657600080fd5b50604051620016da380380620016da833981810160405260208110156200003c57600080fd5b810190808051906020019092919050505060006200005f6200011c60201b60201c565b905080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506200010e6200012460201b60201c565b806007819055505062000212565b600033905090565b620001cc73c89bd4e1632d3a43cb03aaad5262cbe4038bc57173ffffffffffffffffffffffffffffffffffffffff166338cc48316040518163ffffffff1660e01b815260040160206040518083038186803b1580156200018357600080fd5b505afa15801562000198573d6000803e3d6000fd5b505050506040513d6020811015620001af57600080fd5b8101908080519060200190929190505050620001ce60201b60201c565b565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6114b880620002226000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80634357855e1461006757806362476e091461009f578063715018a6146101845780638da5cb5b1461018e5780639d1b464a146101d8578063f2fde38b146101f6575b600080fd5b61009d6004803603604081101561007d57600080fd5b81019080803590602001909291908035906020019092919050505061023a565b005b610182600480360360608110156100b557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156100fc57600080fd5b82018360208201111561010e57600080fd5b8035906020019184600183028401116401000000008311171561013057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610361565b005b61018c6104d5565b005b610196610645565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101e061066f565b6040518082815260200191505060405180910390f35b6102386004803603602081101561020c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610675565b005b816005600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061145b6028913960400191505060405180910390fd5b6005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055807f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a60405160405180910390a281600881905550505050565b61036961086a565b73ffffffffffffffffffffffffffffffffffffffff16610387610645565b73ffffffffffffffffffffffffffffffffffffffff1614610410576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b61041861138a565b61042a8330634357855e60e01b610872565b90506104766040518060400160405280600581526020017f696e64657800000000000000000000000000000000000000000000000000000081525083836108a39092919063ffffffff16565b6104c16040518060400160405280600581526020017f74696d65730000000000000000000000000000000000000000000000000000008152506064836108d69092919063ffffffff16565b6104ce8482600754610909565b5050505050565b6104dd61086a565b73ffffffffffffffffffffffffffffffffffffffff166104fb610645565b73ffffffffffffffffffffffffffffffffffffffff1614610584576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60085481565b61067d61086a565b73ffffffffffffffffffffffffffffffffffffffff1661069b610645565b73ffffffffffffffffffffffffffffffffffffffff1614610724576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156107aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806114126026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b61087a61138a565b61088261138a565b61089985858584610bc1909392919063ffffffff16565b9150509392505050565b6108ba828460800151610c7190919063ffffffff16565b6108d1818460800151610c7190919063ffffffff16565b505050565b6108ed828460800151610c7190919063ffffffff16565b610904818460800151610c9690919063ffffffff16565b505050565b600030600454604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660601b815260140182815260200192505050604051602081830303815290604052805190602001209050600454836060018181525050836005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550807fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af960405160405180910390a2600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634000aea08584610a4187610d3a565b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610ac8578082015181840152602081019050610aad565b50505050905090810190601f168015610af55780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610b1657600080fd5b505af1158015610b2a573d6000803e3d6000fd5b505050506040513d6020811015610b4057600080fd5b8101908080519060200190929190505050610ba6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806114386023913960400191505060405180910390fd5b60016004600082825401925050819055508090509392505050565b610bc961138a565b610bd98560800151610100610f06565b508385600001818152505082856020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508185604001907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681525050849050949350505050565b610c7e8260038351610f5a565b610c91818361109f90919063ffffffff16565b505050565b7fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000811215610ccd57610cc882826110c1565b610d36565b67ffffffffffffffff811315610cec57610ce7828261112f565b610d35565b60008112610d0557610d0082600083610f5a565b610d34565b610d33826001837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03610f5a565b5b5b5b5050565b6060634042994660e01b60008084600001518560200151866040015187606001516001896080015160000151604051602401808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610e69578082015181840152602081019050610e4e565b50505050905090810190601f168015610e965780820380516001836020036101000a031916815260200191505b509950505050505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050919050565b610f0e6113f7565b600060208381610f1a57fe5b0614610f335760208281610f2a57fe5b06602003820191505b81836020018181525050604051808452600081528281016020016040525082905092915050565b60178111610f8757610f818160058460ff16901b60ff16178461117b90919063ffffffff16565b5061109a565b60ff8111610fc957610fac601860058460ff16901b178461117b90919063ffffffff16565b50610fc38160018561119b9092919063ffffffff16565b50611099565b61ffff811161100c57610fef601960058460ff16901b178461117b90919063ffffffff16565b506110068160028561119b9092919063ffffffff16565b50611098565b63ffffffff811161105157611034601a60058460ff16901b178461117b90919063ffffffff16565b5061104b8160048561119b9092919063ffffffff16565b50611097565b67ffffffffffffffff81116110965761107d601b60058460ff16901b178461117b90919063ffffffff16565b506110948160088561119b9092919063ffffffff16565b505b5b5b5b5b505050565b6110a76113f7565b6110b9838460000151518485516111bd565b905092915050565b6110df60036005600660ff16901b178361117b90919063ffffffff16565b5061112b82827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0360405160200180828152602001915050604051602081830303815290604052611276565b5050565b61114d60026005600660ff16901b178361117b90919063ffffffff16565b50611177828260405160200180828152602001915050604051602081830303815290604052611276565b5050565b6111836113f7565b611193838460000151518461129b565b905092915050565b6111a36113f7565b6111b48485600001515185856112e9565b90509392505050565b6111c56113f7565b82518211156111d357600080fd5b846020015182850111156111fe576111fd8560026111f7886020015188870161134a565b02611366565b5b60008086518051876020830101935080888701111561121d5787860182525b60208701925050505b602084106112495780518252602082019150602081019050602084039350611226565b60006001856020036101000a03905080198251168184511681811785525050879350505050949350505050565b6112838260028351610f5a565b611296818361109f90919063ffffffff16565b505050565b6112a36113f7565b836020015183106112c0576112bf846002866020015102611366565b5b83518051602085830101848153818614156112dc576001820183525b5050508390509392505050565b6112f16113f7565b8460200151848301111561130f5761130e85600286850102611366565b5b60006001836101000a039050855183868201018583198251161781528151858801111561133c5784870182525b505085915050949350505050565b60008183111561135c57829050611360565b8190505b92915050565b6060826000015190506113798383610f06565b50611384838261109f565b50505050565b6040518060a0016040528060008019168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600081526020016113f16113f7565b81525090565b60405180604001604052806060815260200160008152509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373756e61626c6520746f207472616e73666572416e6443616c6c20746f206f7261636c65536f75726365206d75737420626520746865206f7261636c65206f66207468652072657175657374a2646970667358221220a3cc32733a90f49a0cb97d5887171c908ab002fbf810c22fe75dea382fa83e7f64736f6c63430006070033", | |
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x1 PUSH1 0x4 SSTORE CALLVALUE DUP1 ISZERO PUSH3 0x16 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH3 0x16DA CODESIZE SUB DUP1 PUSH3 0x16DA DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE PUSH1 0x20 DUP2 LT ISZERO PUSH3 0x3C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH1 0x0 PUSH3 0x5F PUSH3 0x11C PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST SWAP1 POP DUP1 PUSH1 0x6 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP PUSH3 0x10E PUSH3 0x124 PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST DUP1 PUSH1 0x7 DUP2 SWAP1 SSTORE POP POP PUSH3 0x212 JUMP JUMPDEST PUSH1 0x0 CALLER SWAP1 POP SWAP1 JUMP JUMPDEST PUSH3 0x1CC PUSH20 0xC89BD4E1632D3A43CB03AAAD5262CBE4038BC571 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x38CC4831 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH3 0x183 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH3 0x198 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x20 DUP2 LT ISZERO PUSH3 0x1AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH3 0x1CE PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST JUMP JUMPDEST DUP1 PUSH1 0x2 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH2 0x14B8 DUP1 PUSH3 0x222 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x62 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x4357855E EQ PUSH2 0x67 JUMPI DUP1 PUSH4 0x62476E09 EQ PUSH2 0x9F JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x184 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x18E JUMPI DUP1 PUSH4 0x9D1B464A EQ PUSH2 0x1D8 JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x1F6 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x9D PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x7D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x23A JUMP JUMPDEST STOP JUMPDEST PUSH2 0x182 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x60 DUP2 LT ISZERO PUSH2 0xB5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xFC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x10E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP2 DUP5 PUSH1 0x1 DUP4 MUL DUP5 ADD GT PUSH5 0x100000000 DUP4 GT OR ISZERO PUSH2 0x130 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP2 SWAP1 DUP1 DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP4 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP4 DUP1 DUP3 DUP5 CALLDATACOPY PUSH1 0x0 DUP2 DUP5 ADD MSTORE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND SWAP1 POP DUP1 DUP4 ADD SWAP3 POP POP POP POP POP POP POP SWAP2 SWAP3 SWAP2 SWAP3 SWAP1 POP POP POP PUSH2 0x361 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x18C PUSH2 0x4D5 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x196 PUSH2 0x645 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x1E0 PUSH2 0x66F JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x238 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x20C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x675 JUMP JUMPDEST STOP JUMPDEST DUP2 PUSH1 0x5 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x2F2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x28 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x145B PUSH1 0x28 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x5 PUSH1 0x0 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE DUP1 PUSH32 0x7CC135E0CEBB02C3480AE5D74D377283180A2601F8F644EDF7987B009316C63A PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP2 PUSH1 0x8 DUP2 SWAP1 SSTORE POP POP POP POP JUMP JUMPDEST PUSH2 0x369 PUSH2 0x86A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x387 PUSH2 0x645 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x410 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x418 PUSH2 0x138A JUMP JUMPDEST PUSH2 0x42A DUP4 ADDRESS PUSH4 0x4357855E PUSH1 0xE0 SHL PUSH2 0x872 JUMP JUMPDEST SWAP1 POP PUSH2 0x476 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x696E646578000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP4 DUP4 PUSH2 0x8A3 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x4C1 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x74696D6573000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP PUSH1 0x64 DUP4 PUSH2 0x8D6 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x4CE DUP5 DUP3 PUSH1 0x7 SLOAD PUSH2 0x909 JUMP JUMPDEST POP POP POP POP POP JUMP JUMPDEST PUSH2 0x4DD PUSH2 0x86A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x4FB PUSH2 0x645 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x584 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x6 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 PUSH1 0x0 PUSH1 0x6 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x6 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x8 SLOAD DUP2 JUMP JUMPDEST PUSH2 0x67D PUSH2 0x86A JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x69B PUSH2 0x645 JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x724 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x7AA JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x26 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x1412 PUSH1 0x26 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x6 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 DUP1 PUSH1 0x6 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x0 CALLER SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0x87A PUSH2 0x138A JUMP JUMPDEST PUSH2 0x882 PUSH2 0x138A JUMP JUMPDEST PUSH2 0x899 DUP6 DUP6 DUP6 DUP5 PUSH2 0xBC1 SWAP1 SWAP4 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x8BA DUP3 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0xC71 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x8D1 DUP2 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0xC71 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x8ED DUP3 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0xC71 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x904 DUP2 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0xC96 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x0 ADDRESS PUSH1 0x4 SLOAD PUSH1 0x40 MLOAD PUSH1 0x20 ADD DUP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 SHL DUP2 MSTORE PUSH1 0x14 ADD DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP3 POP POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 DUP4 SUB SUB DUP2 MSTORE SWAP1 PUSH1 0x40 MSTORE DUP1 MLOAD SWAP1 PUSH1 0x20 ADD KECCAK256 SWAP1 POP PUSH1 0x4 SLOAD DUP4 PUSH1 0x60 ADD DUP2 DUP2 MSTORE POP POP DUP4 PUSH1 0x5 PUSH1 0x0 DUP4 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP DUP1 PUSH32 0xB5E6E01E79F91267DC17B4E6314D5D4D03593D2CEEE0FBB452B750BD70EA5AF9 PUSH1 0x40 MLOAD PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 PUSH1 0x2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 DUP6 DUP5 PUSH2 0xA41 DUP8 PUSH2 0xD3A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP5 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP4 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0xAC8 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xAAD JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xAF5 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP5 POP POP POP POP POP PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xB16 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xB2A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUS |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.6.7; | |
import "https://raw.githubusercontent.com/smartcontractkit/chainlink/master/evm-contracts/src/v0.6/ChainlinkClient.sol"; | |
import "https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/solc-0.6/contracts/access/Ownable.sol"; | |
contract KrakenChainlink is ChainlinkClient, Ownable { | |
uint256 oraclePayment; | |
uint256 public currentPrice; | |
/** | |
* Network: Kovan | |
* Oracle: | |
* Name: ... | |
* Listing URL: ... | |
* Address: 0x2f90A6D021db21e1B2A077c5a37B3C7E75D15b7e | |
* Job: | |
* Name: Kraken Rates | |
* Listing URL: ... | |
* ID: 8f4eeda1a8724077a0560ee84eb006b4 | |
* Fee: 1 LINK | |
*/ | |
constructor(uint256 _oraclePayment) public { | |
setPublicChainlinkToken(); | |
oraclePayment = _oraclePayment; | |
} | |
function requestPrice | |
( | |
address _oracle, | |
bytes32 _jobId, | |
string memory _index | |
) | |
// "0x2f90A6D021db21e1B2A077c5a37B3C7E75D15b7e","8f4eeda1a8724077a0560ee84eb006b4","DEFI_KXBTUSD" | |
public | |
onlyOwner | |
{ | |
Chainlink.Request memory req = buildChainlinkRequest(_jobId, address(this), this.fulfill.selector); | |
req.add("index", _index); | |
req.addInt("times", 100); | |
sendChainlinkRequestTo(_oracle, req, oraclePayment); | |
} | |
function fulfill(bytes32 _requestId, uint256 _price) | |
public | |
recordChainlinkFulfillment(_requestId) | |
{ | |
currentPrice = _price; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment