Created
August 25, 2021 07:07
-
-
Save onahprosper/84a74bf4d5f08186140027b98d1a8a56 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
{ | |
"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": "60566023600b82828239805160001a607314601657fe5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122022d85415d3f3b996e5632c4a0031465ce2e4d6d40e64a2ae6b0727739b21551c64736f6c63430006060033", | |
"opcodes": "PUSH1 0x56 PUSH1 0x23 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH1 0x16 JUMPI INVALID JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x22 0xD8 SLOAD ISZERO 0xD3 RETURN 0xB9 SWAP7 0xE5 PUSH4 0x2C4A0031 CHAINID 0x5C 0xE2 0xE4 0xD6 0xD4 0xE PUSH5 0xA2AE6B0727 PUSH20 0x9B21551C64736F6C634300060600330000000000 ", | |
"sourceMap": "297:3506:0:-:0;;132:2:-1;166:7;155:9;146:7;137:37;255:7;249:14;246:1;241:23;235:4;232:33;222:2;;269:9;222:2;293:9;290:1;283:20;323:4;314:7;306:22;347:7;338;331:24" | |
}, | |
"deployedBytecode": { | |
"immutableReferences": {}, | |
"linkReferences": {}, | |
"object": "73000000000000000000000000000000000000000030146080604052600080fdfea264697066735822122022d85415d3f3b996e5632c4a0031465ce2e4d6d40e64a2ae6b0727739b21551c64736f6c63430006060033", | |
"opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x22 0xD8 SLOAD ISZERO 0xD3 RETURN 0xB9 SWAP7 0xE5 PUSH4 0x2C4A0031 CHAINID 0x5C 0xE2 0xE4 0xD6 0xD4 0xE PUSH5 0xA2AE6B0727 PUSH20 0x9B21551C64736F6C634300060600330000000000 ", | |
"sourceMap": "297:3506:0:-:0;;;;;;12:1:-1;9;2:12" | |
}, | |
"gasEstimates": { | |
"creation": { | |
"codeDepositCost": "17200", | |
"executionCost": "97", | |
"totalCost": "17297" | |
}, | |
"internal": { | |
"add(struct Chainlink.Request memory,string memory,string memory)": "infinite", | |
"addBytes(struct Chainlink.Request memory,string memory,bytes memory)": "infinite", | |
"addInt(struct Chainlink.Request memory,string memory,int256)": "infinite", | |
"addStringArray(struct Chainlink.Request memory,string memory,string memory[] memory)": "infinite", | |
"addUint(struct Chainlink.Request memory,string memory,uint256)": "infinite", | |
"initialize(struct Chainlink.Request memory,bytes32,address,bytes4)": "infinite", | |
"setBuffer(struct Chainlink.Request memory,bytes memory)": "infinite" | |
} | |
}, | |
"methodIdentifiers": {} | |
}, | |
"abi": [] | |
} |
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": [], | |
"devdoc": { | |
"details": "Uses imported CBOR library for encoding to buffer", | |
"methods": {}, | |
"title": "Library for common Chainlink functions" | |
}, | |
"userdoc": { | |
"methods": {} | |
} | |
}, | |
"settings": { | |
"compilationTarget": { | |
".deps/github/smartcontractkit/chainlink/contracts/src/v0.6/Chainlink.sol": "Chainlink" | |
}, | |
"evmVersion": "istanbul", | |
"libraries": {}, | |
"metadata": { | |
"bytecodeHash": "ipfs" | |
}, | |
"optimizer": { | |
"enabled": false, | |
"runs": 200 | |
}, | |
"remappings": [] | |
}, | |
"sources": { | |
".deps/github/smartcontractkit/chainlink/contracts/src/v0.6/Chainlink.sol": { | |
"keccak256": "0x7bef34fd97f611103c6113025e3d6af755f326069767e72266698f64258e62b6", | |
"urls": [ | |
"bzz-raw://82125916319b872093aa8599d2c00bd07d363386a74a4d0268c6edf25c366f82", | |
"dweb:/ipfs/QmXTnVy1XEw387NduvHHFQNmnzYTwFUhVz95kRvRrcwdHd" | |
] | |
}, | |
".deps/github/smartcontractkit/chainlink/contracts/src/v0.6/vendor/BufferChainlink.sol": { | |
"keccak256": "0x14f13139229a2fef8f705f29f91de0bc81bcd5070ec75b4bd3fd82c1536ca685", | |
"urls": [ | |
"bzz-raw://9a403d7f17b316c7b8837a25df0563de2a1c3121b7cd43473abce8ce6742bd29", | |
"dweb:/ipfs/QmWZYi4xJGjPt1pEM7mS7XsA1eF2zpcxiiuGHuiTndXHo7" | |
] | |
}, | |
".deps/github/smartcontractkit/chainlink/contracts/src/v0.6/vendor/CBORChainlink.sol": { | |
"keccak256": "0xe7c6e4290ac2a41a138e6bd89d89a2779f66847a5ee6fb5a6f2a3386e5ce589d", | |
"urls": [ | |
"bzz-raw://1eb0e7821c4963b125b47c93e31cd6e073d2b87550651054fc526e63915d92ab", | |
"dweb:/ipfs/QmVJq2sNTzX4Hfyway8JiY4RoQw4vQRSbzJWbsC7JsiyUs" | |
] | |
} | |
}, | |
"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
// 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; | |
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.8.0; | |
import "./Chainlink.sol"; | |
import "./interfaces/ENSInterface.sol"; | |
import "./interfaces/LinkTokenInterface.sol"; | |
import "./interfaces/OperatorInterface.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 ORACLE_ARGS_VERSION = 1; | |
uint256 constant private OPERATOR_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; | |
OperatorInterface 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 | |
) | |
{ | |
return rawRequest(oracleAddress, req, payment, ORACLE_ARGS_VERSION, oracle.oracleRequest.selector); | |
} | |
/** | |
* @notice Creates a Chainlink request to the stored oracle address | |
* @dev This function supports multi-word response | |
* @dev Calls `requestOracleDataFrom` 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 requestOracleData( | |
Chainlink.Request memory req, | |
uint256 payment | |
) | |
internal | |
returns ( | |
bytes32 | |
) | |
{ | |
return requestOracleDataFrom(address(oracle), req, payment); | |
} | |
/** | |
* @notice Creates a Chainlink request to the specified oracle address | |
* @dev This function supports multi-word response | |
* @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 requestOracleDataFrom( | |
address oracleAddress, | |
Chainlink.Request memory req, | |
uint256 payment | |
) | |
internal | |
returns ( | |
bytes32 requestId | |
) | |
{ | |
return rawRequest(oracleAddress, req, payment, OPERATOR_ARGS_VERSION, oracle.requestOracleData.selector); | |
} | |
/** | |
* @notice Make a request to an oracle | |
* @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 | |
* @param argsVersion The version of data support (single word, multi word) | |
* @return requestId The request ID | |
*/ | |
function rawRequest( | |
address oracleAddress, | |
Chainlink.Request memory req, | |
uint256 payment, | |
uint256 argsVersion, | |
bytes4 funcSelector | |
) | |
private | |
returns ( | |
bytes32 requestId | |
) | |
{ | |
requestId = keccak256(abi.encodePacked(this, requestCount)); | |
req.nonce = requestCount; | |
pendingRequests[requestId] = oracleAddress; | |
emit ChainlinkRequested(requestId); | |
bytes memory encodedData = abi.encodeWithSelector( | |
funcSelector, | |
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, | |
argsVersion, | |
req.buf.buf); | |
require(link.transferAndCall(oracleAddress, payment, encodedData), "unable to transferAndCall to oracle"); | |
requestCount += 1; | |
} | |
/** | |
* @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 | |
{ | |
OperatorInterface requested = OperatorInterface(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 = OperatorInterface(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 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
{ | |
"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": "", | |
"opcodes": "", | |
"sourceMap": "" | |
}, | |
"deployedBytecode": { | |
"immutableReferences": {}, | |
"linkReferences": {}, | |
"object": "", | |
"opcodes": "", | |
"sourceMap": "" | |
}, | |
"gasEstimates": null, | |
"methodIdentifiers": { | |
"rawFulfillRandomness(bytes32,uint256)": "94985ddd" | |
} | |
}, | |
"abi": [ | |
{ | |
"inputs": [ | |
{ | |
"internalType": "address", | |
"name": "_vrfCoordinator", | |
"type": "address" | |
}, | |
{ | |
"internalType": "address", | |
"name": "_link", | |
"type": "address" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "constructor" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "bytes32", | |
"name": "requestId", | |
"type": "bytes32" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "randomness", | |
"type": "uint256" | |
} | |
], | |
"name": "rawFulfillRandomness", | |
"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": [ | |
{ | |
"internalType": "address", | |
"name": "_vrfCoordinator", | |
"type": "address" | |
}, | |
{ | |
"internalType": "address", | |
"name": "_link", | |
"type": "address" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "constructor" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "bytes32", | |
"name": "requestId", | |
"type": "bytes32" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "randomness", | |
"type": "uint256" | |
} | |
], | |
"name": "rawFulfillRandomness", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
} | |
], | |
"devdoc": { | |
"details": "PURPOSEReggie the Random Oracle (not his real job) wants to provide randomnessto Vera the verifier in such a way that Vera can be sure he's notmaking his output up to suit himself. Reggie provides Vera a public keyto which he knows the secret key. Each time Vera provides a seed toReggie, he gives back a value which is computed completelydeterministically from the seed and the secret key.Reggie provides a proof by which Vera can verify that the output wascorrectly computed once Reggie tells it to her, but without that proof,the output is indistinguishable to her from a uniform random samplefrom the output space.The purpose of this contract is to make it easy for unrelated contractsto talk to Vera the verifier about the work Reggie is doing, to providesimple access to a verifiable source of randomness. *****************************************************************************USAGECalling contracts must inherit from VRFConsumerBase, and caninitialize VRFConsumerBase's attributes in their constructor asshown:contract VRFConsumer {constuctor(<other arguments>, address _vrfCoordinator, address _link)VRFConsumerBase(_vrfCoordinator, _link) public {<initialization with other arguments goes here>}}The oracle will have given you an ID for the VRF keypair they havecommitted to (let's call it keyHash), and have told you the minimum LINKprice for VRF service. Make sure your contract has sufficient LINK, andcall requestRandomness(keyHash, fee, seed), where seed is the input youwant to generate randomness from.Once the VRFCoordinator has received and validated the oracle's responseto your request, it will call your contract's fulfillRandomness method.The randomness argument to fulfillRandomness is the actual random valuegenerated from your seed.The requestId argument is generated from the keyHash and the seed bymakeRequestId(keyHash, seed). If your contract could have concurrentrequests open, you can use the requestId to track which seed isassociated with which randomness. See VRFRequestIDBase.sol for moredetails. (See \"SECURITY CONSIDERATIONS\" for principles to keep in mind,if your contract could have multiple requests in flight simultaneously.)Colliding `requestId`s are cryptographically impossible as long as seedsdiffer. (Which is critical to making unpredictable randomness! See thenext section.) * *****************************************************************************SECURITY CONSIDERATIONSA method with the ability to call your fulfillRandomness method directlycould spoof a VRF response with any random value, so it's critical thatit cannot be directly called by anything other than this base contract(specifically, by the VRFConsumerBase.rawFulfillRandomness method).For your users to trust that your contract's random behavior is freefrom malicious interference, it's best if you can write it so that allbehaviors implied by a VRF response are executed *during* yourfulfillRandomness method. If your contract must store the response (oranything derived from it) and use it later, you must ensure that anyuser-significant behavior which depends on that stored value cannot bemanipulated by a subsequent VRF request.Similarly, both miners and the VRF oracle itself have some influenceover the order in which VRF responses appear on the blockchain, so ifyour contract could have multiple VRF requests in flight simultaneously,you must ensure that the order in which the VRF responses arrive cannotbe used to manipulate your contract's user-significant behavior.Since the ultimate input to the VRF is mixed with the block hash of theblock in which the request is made, user-provided seeds have no impacton its economic security properties. They are only included for APIcompatability with previous versions of this contract.Since the block hash of the block which contains the requestRandomnesscall is mixed into the input to the VRF *last*, a sufficiently powerfulminer could, in principle, fork the blockchain to evict the blockcontaining the request, forcing the request to be included in adifferent block with a different hash, and therefore a different inputto the VRF. However, such an attack would incur a substantial economiccost. This cost scales with the number of blocks the VRF oracle waitsuntil it calls responds to a request.", | |
"methods": { | |
"constructor": { | |
"details": "https://docs.chain.link/docs/link-token-contracts", | |
"params": { | |
"_link": "address of LINK token contract", | |
"_vrfCoordinator": "address of VRFCoordinator contract" | |
} | |
} | |
} | |
}, | |
"userdoc": { | |
"methods": {}, | |
"notice": "****************************************************************************Interface for contracts using VRF randomness *****************************************************************************" | |
} | |
}, | |
"settings": { | |
"compilationTarget": { | |
".deps/npm/@chainlink/contracts/src/v0.6/VRFConsumerBase.sol": "VRFConsumerBase" | |
}, | |
"evmVersion": "istanbul", | |
"libraries": {}, | |
"metadata": { | |
"bytecodeHash": "ipfs" | |
}, | |
"optimizer": { | |
"enabled": false, | |
"runs": 200 | |
}, | |
"remappings": [] | |
}, | |
"sources": { | |
".deps/npm/@chainlink/contracts/src/v0.6/VRFConsumerBase.sol": { | |
"keccak256": "0x0631170c6f92cfe43a3305379788214a60175d2aa9b4c6716f0c66515e878129", | |
"urls": [ | |
"bzz-raw://86f11fdc9eaa2819cc2405d8137fd6c3338526c8ebc4cb140775b2d4e5500160", | |
"dweb:/ipfs/QmUerSsz6Rfiw83SnJbxerEZsL6C8cv3krfcAxnverKtfk" | |
] | |
}, | |
".deps/npm/@chainlink/contracts/src/v0.6/VRFRequestIDBase.sol": { | |
"keccak256": "0x0c3bd40c63dac8398a979b1228c8ecb1c269c157dd16f2dce2086d2270b65b22", | |
"urls": [ | |
"bzz-raw://ed9db87be9dfb0f763a556d8d80356b08282b8ea48484838cdf470a5c3cd15d5", | |
"dweb:/ipfs/QmPLhwDAS3TPDiEQmTyqXnWBqwEMBSbXtjEiQDSGejoiPt" | |
] | |
}, | |
".deps/npm/@chainlink/contracts/src/v0.6/interfaces/LinkTokenInterface.sol": { | |
"keccak256": "0xe245a7be950c94d87bb775ae9ee9fbd693fbe2987778e6ce0b04605ea44b7b68", | |
"urls": [ | |
"bzz-raw://bd2c3165d949fc66fe407b96eb3dc2092c7e800f4c073b411bf7b96de3e156c9", | |
"dweb:/ipfs/QmcfJhR1Np4GsLWnww2Duqks2wEzYk8VDTvCAYy7MisG1r" | |
] | |
}, | |
".deps/npm/@chainlink/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
{ | |
"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": "6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220f94bf84e1f80d06a08cc4f53ef8bca02e05f9353f08ba07be58076bb6ce1f38264736f6c63430006060033", | |
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3F DUP1 PUSH1 0x1D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF9 0x4B 0xF8 0x4E 0x1F DUP1 0xD0 PUSH11 0x8CC4F53EF8BCA02E05F93 MSTORE8 CREATE DUP12 LOG0 PUSH28 0xE58076BB6CE1F38264736F6C63430006060033000000000000000000 ", | |
"sourceMap": "57:1524:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;57:1524:0;;;;;;;" | |
}, | |
"deployedBytecode": { | |
"immutableReferences": {}, | |
"linkReferences": {}, | |
"object": "6080604052600080fdfea2646970667358221220f94bf84e1f80d06a08cc4f53ef8bca02e05f9353f08ba07be58076bb6ce1f38264736f6c63430006060033", | |
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF9 0x4B 0xF8 0x4E 0x1F DUP1 0xD0 PUSH11 0x8CC4F53EF8BCA02E05F93 MSTORE8 CREATE DUP12 LOG0 PUSH28 0xE58076BB6CE1F38264736F6C63430006060033000000000000000000 ", | |
"sourceMap": "57:1524:0:-:0;;;12:1:-1;9;2:12" | |
}, | |
"gasEstimates": { | |
"creation": { | |
"codeDepositCost": "12600", | |
"executionCost": "66", | |
"totalCost": "12666" | |
}, | |
"internal": { | |
"makeRequestId(bytes32,uint256)": "infinite", | |
"makeVRFInputSeed(bytes32,uint256,address,uint256)": "infinite" | |
} | |
}, | |
"methodIdentifiers": {} | |
}, | |
"abi": [] | |
} |
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": [], | |
"devdoc": { | |
"methods": {} | |
}, | |
"userdoc": { | |
"methods": {} | |
} | |
}, | |
"settings": { | |
"compilationTarget": { | |
".deps/npm/@chainlink/contracts/src/v0.6/VRFRequestIDBase.sol": "VRFRequestIDBase" | |
}, | |
"evmVersion": "istanbul", | |
"libraries": {}, | |
"metadata": { | |
"bytecodeHash": "ipfs" | |
}, | |
"optimizer": { | |
"enabled": false, | |
"runs": 200 | |
}, | |
"remappings": [] | |
}, | |
"sources": { | |
".deps/npm/@chainlink/contracts/src/v0.6/VRFRequestIDBase.sol": { | |
"keccak256": "0x0c3bd40c63dac8398a979b1228c8ecb1c269c157dd16f2dce2086d2270b65b22", | |
"urls": [ | |
"bzz-raw://ed9db87be9dfb0f763a556d8d80356b08282b8ea48484838cdf470a5c3cd15d5", | |
"dweb:/ipfs/QmPLhwDAS3TPDiEQmTyqXnWBqwEMBSbXtjEiQDSGejoiPt" | |
] | |
} | |
}, | |
"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
// 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 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; | |
/** | |
* @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; | |
/** | |
* @dev In order to keep backwards compatibility we have kept the user | |
* seed field around. We remove the use of it because given that the blockhash | |
* enters later, it overrides whatever randomness the used seed provides. | |
* Given that it adds no security, and can easily lead to misunderstandings, | |
* we have removed it from usage and can now provide a simpler API. | |
*/ | |
uint256 constant private USER_SEED_PLACEHOLDER = 0; | |
/** | |
* @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 | |
* | |
* @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) | |
internal returns (bytes32 requestId) | |
{ | |
LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, USER_SEED_PLACEHOLDER)); | |
// 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, USER_SEED_PLACEHOLDER, 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
/** This example code is designed to quickly deploy an example contract using Remix. | |
* If you have never used Remix, try our example walkthrough: https://docs.chain.link/docs/example-walkthrough | |
* You will need testnet ETH and LINK. | |
* - Kovan ETH faucet: https://faucet.kovan.network/ | |
* - Kovan LINK faucet: https://kovan.chain.link/ | |
*/ | |
// SPDX-License-Identifier: MIT | |
pragma solidity ^0.6.0; | |
// import "https://raw.githubusercontent.com/smartcontractkit/chainlink/develop/evm-contracts/src/v0.6/ChainlinkClient.sol"; | |
import "https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/ChainlinkClient.sol"; | |
interface IERC20 { | |
function balanceOf(address owner) external view returns (uint); | |
function transfer(address to, uint value) external returns (bool); | |
function transferFrom(address from, address to, uint value) external returns (bool); | |
} | |
abstract contract Context { | |
function _msgSender() internal view virtual returns (address) { | |
return msg.sender; | |
} | |
function _msgData() internal view virtual returns (bytes calldata) { | |
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 | |
return msg.data; | |
} | |
} | |
interface ISmartSwapRouter02 { | |
function factory() external pure returns (address); | |
function WETH() external pure returns (address); | |
function addLiquidity( | |
address tokenA, | |
address tokenB, | |
uint amountADesired, | |
uint amountBDesired, | |
uint amountAMin, | |
uint amountBMin, | |
address to, | |
uint deadline | |
) external returns (uint amountA, uint amountB, uint liquidity); | |
function addLiquidityETH( | |
address token, | |
uint amountTokenDesired, | |
uint amountTokenMin, | |
uint amountETHMin, | |
address to, | |
uint deadline | |
) external payable returns (uint amountToken, uint amountETH, uint liquidity); | |
function removeLiquidity( | |
address tokenA, | |
address tokenB, | |
uint liquidity, | |
uint amountAMin, | |
uint amountBMin, | |
address to, | |
uint deadline | |
) external returns (uint amountA, uint amountB); | |
function removeLiquidityETH( | |
address token, | |
uint liquidity, | |
uint amountTokenMin, | |
uint amountETHMin, | |
address to, | |
uint deadline | |
) external returns (uint amountToken, uint amountETH); | |
function removeLiquidityWithPermit( | |
address tokenA, | |
address tokenB, | |
uint liquidity, | |
uint amountAMin, | |
uint amountBMin, | |
address to, | |
uint deadline, | |
bool approveMax, uint8 v, bytes32 r, bytes32 s | |
) external returns (uint amountA, uint amountB); | |
function removeLiquidityETHWithPermit( | |
address token, | |
uint liquidity, | |
uint amountTokenMin, | |
uint amountETHMin, | |
address to, | |
uint deadline, | |
bool approveMax, uint8 v, bytes32 r, bytes32 s | |
) external returns (uint amountToken, uint amountETH); | |
function swapExactTokensForTokens( | |
uint amountIn, | |
uint amountOutMin, | |
address[] calldata path, | |
address to, | |
uint deadline | |
) external returns (uint[] memory amounts); | |
function swapTokensForExactTokens( | |
uint amountOut, | |
uint amountInMax, | |
address[] calldata path, | |
address to, | |
uint deadline | |
) external returns (uint[] memory amounts); | |
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) | |
external | |
payable | |
returns (uint[] memory amounts); | |
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) | |
external | |
returns (uint[] memory amounts); | |
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) | |
external | |
returns (uint[] memory amounts); | |
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) | |
external | |
payable | |
returns (uint[] memory amounts); | |
function removeLiquidityETHSupportingFeeOnTransferTokens( | |
address token, | |
uint liquidity, | |
uint amountTokenMin, | |
uint amountETHMin, | |
address to, | |
uint deadline | |
) external returns (uint amountETH); | |
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( | |
address token, | |
uint liquidity, | |
uint amountTokenMin, | |
uint amountETHMin, | |
address to, | |
uint deadline, | |
bool approveMax, uint8 v, bytes32 r, bytes32 s | |
) external returns (uint amountETH); | |
function swapExactTokensForTokensSupportingFeeOnTransferTokens( | |
uint amountIn, | |
uint amountOutMin, | |
address[] calldata path, | |
address to, | |
uint deadline | |
) external; | |
function swapExactETHForTokensSupportingFeeOnTransferTokens( | |
uint amountOutMin, | |
address[] calldata path, | |
address to, | |
uint deadline | |
) external payable; | |
function swapExactTokensForETHSupportingFeeOnTransferTokens( | |
uint amountIn, | |
uint amountOutMin, | |
address[] calldata path, | |
address to, | |
uint deadline | |
) external; | |
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); | |
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); | |
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); | |
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); | |
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); | |
} | |
contract AlarmClockSample is ChainlinkClient, Context { | |
IERC20 token; | |
ISmartSwapRouter02 smartSwap; | |
bool public alarmDone; | |
uint256 public number; | |
address owner; | |
address _reciver; | |
address private oracle; | |
bytes32 private jobId; | |
uint256 private fee; | |
struct userData { | |
uint amountIn; | |
uint amountOutMin; | |
address[] path; | |
uint expectedTime; | |
address to; | |
} | |
mapping(address => userData) public Data; | |
mapping(uint => mapping(address => userData)) getUserData; | |
/** | |
* Network: Kovan | |
* Oracle: Chainlink - 0xAA1DC356dc4B18f30C347798FD5379F3D77ABC5b | |
* Job ID: Chainlink - 982105d690504c5d9ce374d040c08654 | |
* Fee: 0.1 LINK | |
*/ | |
constructor() public { | |
smartSwap = ISmartSwapRouter02(0x00749e00Af4359Df5e8C156aF6dfbDf30dD53F44); | |
/* | |
setPublicChainlinkToken(); | |
oracle = 0xF405B99ACa8578B9eb989ee2b69D518aaDb90c1F; | |
jobId = "a13ad0518c9d4ffdbdbd5bf745aefe02"; | |
*/ | |
setChainlinkToken(0x84b9B910527Ad5C03A9Ca831909E21e236EA7b06); | |
oracle = 0x46cC5EbBe7DA04b45C0e40c061eD2beD20ca7755; | |
jobId = "842e5f3cbcd34f76bf416d92b47ed416"; | |
fee = 0.1 * 10 ** 18; // 0.1 LINK | |
number = 5; | |
alarmDone = false; | |
owner = msg.sender; | |
token = IERC20(0x9f0227A21987c1fFab1785BA3eBa60578eC1501B); | |
_reciver = 0xC972e9F6dA0C31cD50957F3244a9F822551e0616; | |
} | |
/** | |
* Create a Chainlink request to start an alarm and after | |
* the time in seconds is up, return throught the fulfillAlarm | |
* function | |
*/ | |
function requestAlarmClock(uint256 durationInSeconds) public returns (bytes32 requestId) | |
{ | |
Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfillAlarm.selector); | |
// This will return in 90 seconds | |
request.addUint("until", block.timestamp + durationInSeconds); | |
return sendChainlinkRequestTo(oracle, request, fee); | |
} | |
function setPeriodToswapETHForTokens(uint256 _amountIn, uint _timeOf) payable external returns (bytes32 requestId){ | |
userData storage _userData = Data[_msgSender()]; | |
address[] memory path = new address[](2); | |
path[0] = smartSwap.WETH(); | |
path[1] = address(token); | |
_userData.path = [path[0], path[1]]; | |
_userData.amountIn = _amountIn; | |
_userData.expectedTime = block.timestamp + (_timeOf); | |
_userData.to = _msgSender(); | |
Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfillAlarm.selector); | |
// This will return in 90 seconds | |
request.addUint("until", block.timestamp + _timeOf); | |
return sendChainlinkRequestTo(oracle, request, fee); | |
// token.transferFrom(_msgSender(), address(this), eventsCharges); | |
} | |
function fulfillAlarm(bytes32 _requestId, uint256 _volume) public recordChainlinkFulfillment(_requestId) { | |
userData storage userCall = Data[0x2289Bc372bc6a46DD3eBC070FC5B7b7A49597A4E]; | |
smartSwap.swapExactETHForTokens{value: userCall.amountIn}( | |
1, | |
userCall.path, | |
address(userCall.to), | |
block.timestamp + 360 | |
); | |
} | |
function withdrawETH() public { | |
payable(_msgSender()).transfer(address(this).balance); | |
} | |
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": "6080604052600160045534801561001557600080fd5b5072749e00af4359df5e8c156af6dfbdf30dd53f44600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061008d7384b9b910527ad5c03a9ca831909e21e236ea7b0661022b60201b60201c565b7346cc5ebbe7da04b45c0e40c061ed2bed20ca7755600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f3834326535663363626364333466373662663431366439326234376564343136600c8190555067016345785d8a0000600d8190555060056008819055506000600760146101000a81548160ff02191690831515021790555033600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550739f0227a21987c1ffab1785ba3eba60578ec1501b600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073c972e9f6da0c31cd50957f3244a9f822551e0616600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061026f565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6117c28061027e6000396000f3fe60806040526004361061007b5760003560e01c80638dc654a21161004e5780638dc654a214610169578063ab73c39114610180578063ca8ca80a14610210578063e086e5ec1461025f5761007b565b806301e13b511461008057806311503e08146100c55780636d97c828146101115780638381f58a1461013e575b600080fd5b34801561008c57600080fd5b506100c3600480360360408110156100a357600080fd5b810190808035906020019092919080359060200190929190505050610276565b005b6100fb600480360360408110156100db57600080fd5b81019080803590602001909291908035906020019092919050505061060c565b6040518082815260200191505060405180910390f35b34801561011d57600080fd5b506101266109a1565b60405180821515815260200191505060405180910390f35b34801561014a57600080fd5b506101536109b4565b6040518082815260200191505060405180910390f35b34801561017557600080fd5b5061017e6109ba565b005b34801561018c57600080fd5b506101cf600480360360208110156101a357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b88565b604051808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390f35b34801561021c57600080fd5b506102496004803603602081101561023357600080fd5b8101908080359060200190929190505050610bd8565b6040518082815260200191505060405180910390f35b34801561026b57600080fd5b50610274610c7b565b005b816005600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461032e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806117656028913960400191505060405180910390fd5b6005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055807f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a60405160405180910390a26000600e6000732289bc372bc6a46dd3ebc070fc5b7b7a49597a4e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ff36ab582600001546001846002018560040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661016842016040518663ffffffff1660e01b815260040180858152602001806020018473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818154815260200191508054801561050d57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116104c3575b5050955050505050506000604051808303818588803b15801561052f57600080fd5b505af1158015610543573d6000803e3d6000fd5b50505050506040513d6000823e3d601f19601f82011682018060405250602081101561056e57600080fd5b810190808051604051939291908464010000000082111561058e57600080fd5b838201915060208201858111156105a457600080fd5b82518660208202830111640100000000821117156105c157600080fd5b8083526020830192505050908051906020019060200280838360005b838110156105f85780820151818401526020810190506105dd565b505050509050016040525050505050505050565b600080600e600061061b610ccb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506060600267ffffffffffffffff8111801561067157600080fd5b506040519080825280602002602001820160405280156106a05781602001602082028036833780820191505090505b509050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561070b57600080fd5b505afa15801561071f573d6000803e3d6000fd5b505050506040513d602081101561073557600080fd5b81019080805190602001909291905050508160008151811061075357fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001815181106107bd57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060405180604001604052808260008151811061080f57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260018151811061085557fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152508260020190600261089e9291906115f5565b5084826000018190555083420182600301819055506108bb610ccb565b8260040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061090561167f565b610919600c54306301e13b5160e01b610cd3565b90506109676040518060400160405280600581526020017f756e74696c00000000000000000000000000000000000000000000000000000081525086420183610d049092919063ffffffff16565b610996600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600d54610d37565b935050505092915050565b600760149054906101000a900460ff1681565b60085481565b60006109c4610fc0565b90508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610a4a57600080fd5b505afa158015610a5e573d6000803e3d6000fd5b505050506040513d6020811015610a7457600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610ad857600080fd5b505af1158015610aec573d6000803e3d6000fd5b505050506040513d6020811015610b0257600080fd5b8101908080519060200190929190505050610b85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f556e61626c6520746f207472616e73666572000000000000000000000000000081525060200191505060405180910390fd5b50565b600e6020528060005260406000206000915090508060000154908060010154908060030154908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905084565b6000610be261167f565b610bf6600c54306301e13b5160e01b610cd3565b9050610c446040518060400160405280600581526020017f756e74696c00000000000000000000000000000000000000000000000000000081525084420183610d049092919063ffffffff16565b610c73600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600d54610d37565b915050919050565b610c83610ccb565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610cc8573d6000803e3d6000fd5b50565b600033905090565b610cdb61167f565b610ce361167f565b610cfa85858584610fea909392919063ffffffff16565b9150509392505050565b610d1b82846080015161109a90919063ffffffff16565b610d328184608001516110bf90919063ffffffff16565b505050565b600030600454604051602001808373ffffffffffffffffffffffffffffffffffffffff1660601b815260140182815260200192505050604051602081830303815290604052805190602001209050600454836060018181525050836005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550807fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af960405160405180910390a2600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634000aea08584610e59876110cf565b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610eca578082015181840152602081019050610eaf565b50505050905090810190601f168015610ef75780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610f1857600080fd5b505af1158015610f2c573d6000803e3d6000fd5b505050506040513d6020811015610f4257600080fd5b8101908080519060200190929190505050610fa8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806117426023913960400191505060405180910390fd5b60016004600082825401925050819055509392505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610ff261167f565b6110028560800151610100611250565b508385600001818152505082856020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508185604001907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681525050849050949350505050565b6110a782600383516112a4565b6110ba81836113e990919063ffffffff16565b505050565b6110cb826000836112a4565b5050565b6060634042994660e01b60008084600001518560200151866040015187606001516001896080015160000151604051602401808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff168152602001857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156111b3578082015181840152602081019050611198565b50505050905090810190601f1680156111e05780820380516001836020036101000a031916815260200191505b509950505050505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050919050565b6112586116ec565b60006020838161126457fe5b061461127d576020828161127457fe5b06602003820191505b81836020018181525050604051808452600081528281016020016040525082905092915050565b601781116112d1576112cb8160058460ff16901b60ff16178461140b90919063ffffffff16565b506113e4565b60ff8111611313576112f6601860058460ff16901b178461140b90919063ffffffff16565b5061130d8160018561142b9092919063ffffffff16565b506113e3565b61ffff811161135657611339601960058460ff16901b178461140b90919063ffffffff16565b506113508160028561142b9092919063ffffffff16565b506113e2565b63ffffffff811161139b5761137e601a60058460ff16901b178461140b90919063ffffffff16565b506113958160048561142b9092919063ffffffff16565b506113e1565b67ffffffffffffffff81116113e0576113c7601b60058460ff16901b178461140b90919063ffffffff16565b506113de8160088561142b9092919063ffffffff16565b505b5b5b5b5b505050565b6113f16116ec565b6114038384600001515184855161144d565b905092915050565b6114136116ec565b6114238384600001515184611506565b905092915050565b6114336116ec565b611444848560000151518585611554565b90509392505050565b6114556116ec565b825182111561146357600080fd5b8460200151828501111561148e5761148d85600261148788602001518887016115b5565b026115d1565b5b6000808651805187602083010193508088870111156114ad5787860182525b60208701925050505b602084106114d957805182526020820191506020810190506020840393506114b6565b60006001856020036101000a03905080198251168184511681811785525050879350505050949350505050565b61150e6116ec565b8360200151831061152b5761152a8460028660200151026115d1565b5b8351805160208583010184815381861415611547576001820183525b5050508390509392505050565b61155c6116ec565b8460200151848301111561157a57611579856002868501026115d1565b5b60006001836101000a03905085518386820101858319825116178152815185880111156115a75784870182525b505085915050949350505050565b6000818311156115c7578290506115cb565b8190505b92915050565b6060826000015190506115e48383611250565b506115ef83826113e9565b50505050565b82805482825590600052602060002090810192821561166e579160200282015b8281111561166d5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190611615565b5b50905061167b9190611706565b5090565b6040518060a0016040528060008019168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600081526020016116e66116ec565b81525090565b604051806040016040528060608152602001600081525090565b5b8082111561173d57600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101611707565b509056fe756e61626c6520746f207472616e73666572416e6443616c6c20746f206f7261636c65536f75726365206d75737420626520746865206f7261636c65206f66207468652072657175657374a2646970667358221220d5e540adb8261d64e28abbde9d31cee513b8b805d83d93e71db9d3eb3386169a64736f6c634300060c0033", | |
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x1 PUSH1 0x4 SSTORE CALLVALUE DUP1 ISZERO PUSH2 0x15 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH19 0x749E00AF4359DF5E8C156AF6DFBDF30DD53F44 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 PUSH2 0x8D PUSH20 0x84B9B910527AD5C03A9CA831909E21E236EA7B06 PUSH2 0x22B PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST PUSH20 0x46CC5EBBE7DA04B45C0E40C061ED2BED20CA7755 PUSH1 0xB PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH32 0x3834326535663363626364333466373662663431366439326234376564343136 PUSH1 0xC DUP2 SWAP1 SSTORE POP PUSH8 0x16345785D8A0000 PUSH1 0xD DUP2 SWAP1 SSTORE POP PUSH1 0x5 PUSH1 0x8 DUP2 SWAP1 SSTORE POP PUSH1 0x0 PUSH1 0x7 PUSH1 0x14 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH1 0xFF MUL NOT AND SWAP1 DUP4 ISZERO ISZERO MUL OR SWAP1 SSTORE POP CALLER PUSH1 0x9 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH20 0x9F0227A21987C1FFAB1785BA3EBA60578EC1501B 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 PUSH20 0xC972E9F6DA0C31CD50957F3244A9F822551E0616 PUSH1 0xA PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x26F 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 0x17C2 DUP1 PUSH2 0x27E PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x7B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8DC654A2 GT PUSH2 0x4E JUMPI DUP1 PUSH4 0x8DC654A2 EQ PUSH2 0x169 JUMPI DUP1 PUSH4 0xAB73C391 EQ PUSH2 0x180 JUMPI DUP1 PUSH4 0xCA8CA80A EQ PUSH2 0x210 JUMPI DUP1 PUSH4 0xE086E5EC EQ PUSH2 0x25F JUMPI PUSH2 0x7B JUMP JUMPDEST DUP1 PUSH4 0x1E13B51 EQ PUSH2 0x80 JUMPI DUP1 PUSH4 0x11503E08 EQ PUSH2 0xC5 JUMPI DUP1 PUSH4 0x6D97C828 EQ PUSH2 0x111 JUMPI DUP1 PUSH4 0x8381F58A EQ PUSH2 0x13E JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xA3 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 0x276 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xFB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xDB 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 0x60C 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 0x11D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x126 PUSH2 0x9A1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x153 PUSH2 0x9B4 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 0x175 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17E PUSH2 0x9BA JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x18C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1CF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1A3 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 0xB88 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x21C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x249 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x233 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xBD8 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 0x26B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH2 0xC7B 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 0x32E 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 0x1765 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 PUSH1 0x0 PUSH1 0xE PUSH1 0x0 PUSH20 0x2289BC372BC6A46DD3EBC070FC5B7B7A49597A4E PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP PUSH1 0x7 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x7FF36AB5 DUP3 PUSH1 0x0 ADD SLOAD PUSH1 0x1 DUP5 PUSH1 0x2 ADD DUP6 PUSH1 0x4 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x168 TIMESTAMP ADD PUSH1 0x40 MLOAD DUP7 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP6 DUP2 DUP2 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 SLOAD DUP1 ISZERO PUSH2 0x50D JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x4C3 JUMPI JUMPDEST POP POP SWAP6 POP POP POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x52F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x543 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x56E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD PUSH1 0x40 MLOAD SWAP4 SWAP3 SWAP2 SWAP1 DUP5 PUSH5 0x100000000 DUP3 GT ISZERO PUSH2 0x58E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP3 ADD DUP6 DUP2 GT ISZERO PUSH2 0x5A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD DUP7 PUSH1 0x20 DUP3 MUL DUP4 ADD GT PUSH5 0x100000000 DUP3 GT OR ISZERO PUSH2 0x5C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP3 POP POP POP SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5F8 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x5DD JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD PUSH1 0x40 MSTORE POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0xE PUSH1 0x0 PUSH2 0x61B PUSH2 0xCCB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP PUSH1 0x60 PUSH1 0x2 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x671 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x6A0 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x7 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xAD5C4648 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 0x70B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x71F 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 0x735 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x753 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP PUSH1 0x6 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x7BD JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 DUP3 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x80F JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x855 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP DUP3 PUSH1 0x2 ADD SWAP1 PUSH1 0x2 PUSH2 0x89E SWAP3 SWAP2 SWAP1 PUSH2 0x15F5 JUMP JUMPDEST POP DUP5 DUP3 PUSH1 0x0 ADD DUP2 SWAP1 SSTORE POP DUP4 TIMESTAMP ADD DUP3 PUSH1 0x3 ADD DUP2 SWAP1 SSTORE POP PUSH2 0x8BB PUSH2 0xCCB JUMP JUMPDEST DUP3 PUSH1 0x4 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x905 PUSH2 0x167F JUMP JUMPDEST PUSH2 0x919 PUSH1 0xC SLOAD ADDRESS PUSH4 0x1E13B51 PUSH1 0xE0 SHL PUSH2 0xCD3 JUMP JUMPDEST SWAP1 POP PUSH2 0x967 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x756E74696C000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP7 TIMESTAMP ADD DUP4 PUSH2 0xD04 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x996 PUSH1 0xB PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0xD SLOAD PUSH2 0xD37 JUMP JUMPDEST SWAP4 POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x14 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x8 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9C4 PUSH2 0xFC0 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 0xA4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xA5E 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 0xA74 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 0xAD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xAEC 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 0xB02 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xB85 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 0xE PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP DUP1 PUSH1 0x0 ADD SLOAD SWAP1 DUP1 PUSH1 0x1 ADD SLOAD SWAP1 DUP1 PUSH1 0x3 ADD SLOAD SWAP1 DUP1 PUSH1 0x4 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBE2 PUSH2 0x167F JUMP JUMPDEST PUSH2 0xBF6 PUSH1 0xC SLOAD ADDRESS PUSH4 0x1E13B51 PUSH1 0xE0 SHL PUSH2 0xCD3 JUMP JUMPDEST SWAP1 POP PUSH2 0xC44 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x756E74696C000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP5 TIMESTAMP ADD DUP4 PUSH2 0xD04 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0xC73 PUSH1 0xB PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0xD SLOAD PUSH2 0xD37 JUMP JUMPDEST SWAP2 POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xC83 PUSH2 0xCCB JUMP JUMPDEST 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 0xCC8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 CALLER SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0xCDB PUSH2 0x167F JUMP JUMPDEST PUSH2 0xCE3 PUSH2 0x167F JUMP JUMPDEST PUSH2 0xCFA DUP6 DUP6 DUP6 DUP5 PUSH2 0xFEA SWAP1 SWAP4 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xD1B DUP3 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x109A SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0xD32 DUP2 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x10BF 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 0xE59 DUP8 PUSH2 0x10CF 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 0xECA JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xEAF JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xEF7 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 0xF18 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF2C 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 0xF42 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xFA8 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 0x1742 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 0xFF2 PUSH2 0x167F JUMP JUMPDEST PUSH2 0x1002 DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0x1250 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 0x10A7 DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0x12A4 JUMP JUMPDEST PUSH2 0x10BA DUP2 DUP4 PUSH2 0x13E9 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x10CB DUP3 PUSH1 0x0 DUP4 PUSH2 0x12A4 JUMP 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 0x11B3 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x1198 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x11E0 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 0x1258 PUSH2 0x16EC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP4 DUP2 PUSH2 0x1264 JUMPI INVALID JUMPDEST MOD EQ PUSH2 0x127D JUMPI PUSH1 0x20 DUP3 DUP2 PUSH2 0x1274 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 0x12D1 JUMPI PUSH2 0x12CB DUP2 PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL PUSH1 0xFF AND OR DUP5 PUSH2 0x140B SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0x13E4 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0x1313 JUMPI PUSH2 0x12F6 PUSH1 0x18 PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0x140B SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0x130D DUP2 PUSH1 0x1 DUP6 PUSH2 0x142B SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0x13E3 JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0x1356 JUMPI PUSH2 0x1339 PUSH1 0x19 PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0x140B SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0x1350 DUP2 PUSH1 0x2 DUP6 PUSH2 0x142B SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0x13E2 JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0x139B JUMPI PUSH2 0x137E PUSH1 0x1A PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0x140B SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0x1395 DUP2 PUSH1 0x4 DUP6 PUSH2 0x142B SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0x13E1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x13E0 JUMPI PUSH2 0x13C7 PUSH1 0x1B PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0x140B SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0x13DE DUP2 PUSH1 0x8 DUP6 PUSH2 0x142B SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP JUMPDEST JUMPDEST JUMPDEST JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x13F1 PUSH2 0x16EC JUMP JUMPDEST PUSH2 0x1403 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0x144D JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1413 PUSH2 0x16EC JUMP JUMPDEST PUSH2 0x1423 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0x1506 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1433 PUSH2 0x16EC JUMP JUMPDEST PUSH2 0x1444 DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0x1554 JUMP JUMPDEST SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1455 PUSH2 0x16EC JUMP JUMPDEST DUP3 MLOAD DUP3 GT ISZERO PUSH2 0x1463 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP3 DUP6 ADD GT ISZERO PUSH2 0x148E JUMPI PUSH2 0x148D DUP6 PUSH1 0x2 PUSH2 0x1487 DUP9 PUSH1 0x20 ADD MLOAD DUP9 DUP8 ADD PUSH2 0x15B5 JUMP JUMPDEST MUL PUSH2 0x15D1 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 0x14AD JUMPI DUP8 DUP7 ADD DUP3 MSTORE JUMPDEST PUSH1 0x20 DUP8 ADD SWAP3 POP POP POP JUMPDEST PUSH1 0x20 DUP5 LT PUSH2 0x14D9 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP5 SUB SWAP4 POP PUSH2 0x14B6 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 0x150E PUSH2 0x16EC JUMP JUMPDEST DUP4 PUSH1 0x20 ADD MLOAD DUP4 LT PUSH2 0x152B JUMPI PUSH2 0x152A DUP5 PUSH1 0x2 DUP7 PUSH1 0x20 ADD MLOAD MUL PUSH2 0x15D1 JUMP JUMPDEST JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0x1547 JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP POP POP DUP4 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x155C PUSH2 0x16EC JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP5 DUP4 ADD GT ISZERO PUSH2 0x157A JUMPI PUSH2 0x1579 DUP6 PUSH1 0x2 DUP7 DUP6 ADD MUL PUSH2 0x15D1 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 0x15A7 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 0x15C7 JUMPI DUP3 SWAP1 POP PUSH2 0x15CB JUMP JUMPDEST DUP2 SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 PUSH1 0x0 ADD MLOAD SWAP1 POP PUSH2 0x15E4 DUP4 DUP4 PUSH2 0x1250 JUMP JUMPDEST POP PUSH2 0x15EF DUP4 DUP3 PUSH2 0x13E9 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x166E JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x166D JUMPI DUP3 MLOAD DUP3 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x1615 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x167B SWAP2 SWAP1 PUSH2 0x1706 JUMP JUMPDEST POP SWAP1 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 0x16E6 PUSH2 0x16EC 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 JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x173D JUMPI PUSH1 0x0 DUP2 DUP2 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0x1707 JUMP JUMPDEST POP SWAP1 JUMP INVALID PUSH22 0x6E61626C6520746F207472616E73666572416E644361 PUSH13 0x6C20746F206F7261636C65536F PUSH22 0x726365206D75737420626520746865206F7261636C65 KECCAK256 PUSH16 0x66207468652072657175657374A26469 PUSH17 0x667358221220D5E540ADB8261D64E28ABB 0xDE SWAP14 BALANCE 0xCE 0xE5 SGT 0xB8 0xB8 SDIV 0xD8 RETURNDATASIZE SWAP4 0xE7 SAR 0xB9 0xD3 0xEB CALLER DUP7 AND SWAP11 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ", | |
"sourceMap": "5943:3767:0:-:0;;;1163:1:2;1132:32;;6712:759:0;;;;;;;;;;6783:42;6752:9;;:74;;;;;;;;;;;;;;;;;;7024:61;7042:42;7024:17;;;:61;;:::i;:::-;7104:42;7095:6;;:51;;;;;;;;;;;;;;;;;;7156:42;:5;:42;;;;7223:14;7217:3;:20;;;;7268:1;7259:6;:10;;;;7291:5;7279:9;;:17;;;;;;;;;;;;;;;;;;7323:10;7315:5;;:18;;;;;;;;;;;;;;;;;;7358:42;7343:5;;:58;;;;;;;;;;;;;;;;;;7422:42;7411:8;;:53;;;;;;;;;;;;;;;;;;5943:3767;;4834:94:2;4917:5;4891:4;;:32;;;;;;;;;;;;;;;;;;4834:94;:::o;5943:3767:0:-;;;;;;;" | |
}, | |
"deployedBytecode": { | |
"immutableReferences": {}, | |
"linkReferences": {}, | |
"object": "60806040526004361061007b5760003560e01c80638dc654a21161004e5780638dc654a214610169578063ab73c39114610180578063ca8ca80a14610210578063e086e5ec1461025f5761007b565b806301e13b511461008057806311503e08146100c55780636d97c828146101115780638381f58a1461013e575b600080fd5b34801561008c57600080fd5b506100c3600480360360408110156100a357600080fd5b810190808035906020019092919080359060200190929190505050610276565b005b6100fb600480360360408110156100db57600080fd5b81019080803590602001909291908035906020019092919050505061060c565b6040518082815260200191505060405180910390f35b34801561011d57600080fd5b506101266109a1565b60405180821515815260200191505060405180910390f35b34801561014a57600080fd5b506101536109b4565b6040518082815260200191505060405180910390f35b34801561017557600080fd5b5061017e6109ba565b005b34801561018c57600080fd5b506101cf600480360360208110156101a357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b88565b604051808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390f35b34801561021c57600080fd5b506102496004803603602081101561023357600080fd5b8101908080359060200190929190505050610bd8565b6040518082815260200191505060405180910390f35b34801561026b57600080fd5b50610274610c7b565b005b816005600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461032e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806117656028913960400191505060405180910390fd5b6005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055807f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a60405160405180910390a26000600e6000732289bc372bc6a46dd3ebc070fc5b7b7a49597a4e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ff36ab582600001546001846002018560040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661016842016040518663ffffffff1660e01b815260040180858152602001806020018473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818154815260200191508054801561050d57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116104c3575b5050955050505050506000604051808303818588803b15801561052f57600080fd5b505af1158015610543573d6000803e3d6000fd5b50505050506040513d6000823e3d601f19601f82011682018060405250602081101561056e57600080fd5b810190808051604051939291908464010000000082111561058e57600080fd5b838201915060208201858111156105a457600080fd5b82518660208202830111640100000000821117156105c157600080fd5b8083526020830192505050908051906020019060200280838360005b838110156105f85780820151818401526020810190506105dd565b505050509050016040525050505050505050565b600080600e600061061b610ccb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506060600267ffffffffffffffff8111801561067157600080fd5b506040519080825280602002602001820160405280156106a05781602001602082028036833780820191505090505b509050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561070b57600080fd5b505afa15801561071f573d6000803e3d6000fd5b505050506040513d602081101561073557600080fd5b81019080805190602001909291905050508160008151811061075357fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816001815181106107bd57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060405180604001604052808260008151811061080f57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260018151811061085557fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152508260020190600261089e9291906115f5565b5084826000018190555083420182600301819055506108bb610ccb565b8260040160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061090561167f565b610919600c54306301e13b5160e01b610cd3565b90506109676040518060400160405280600581526020017f756e74696c00000000000000000000000000000000000000000000000000000081525086420183610d049092919063ffffffff16565b610996600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600d54610d37565b935050505092915050565b600760149054906101000a900460ff1681565b60085481565b60006109c4610fc0565b90508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb338373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610a4a57600080fd5b505afa158015610a5e573d6000803e3d6000fd5b505050506040513d6020811015610a7457600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610ad857600080fd5b505af1158015610aec573d6000803e3d6000fd5b505050506040513d6020811015610b0257600080fd5b8101908080519060200190929190505050610b85576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f556e61626c6520746f207472616e73666572000000000000000000000000000081525060200191505060405180910390fd5b50565b600e6020528060005260406000206000915090508060000154908060010154908060030154908060040160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905084565b6000610be261167f565b610bf6600c54306301e13b5160e01b610cd3565b9050610c446040518060400160405280600581526020017f756e74696c00000000000000000000000000000000000000000000000000000081525084420183610d049092919063ffffffff16565b610c73600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682600d54610d37565b915050919050565b610c83610ccb565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610cc8573d6000803e3d6000fd5b50565b600033905090565b610cdb61167f565b610ce361167f565b610cfa85858584610fea909392919063ffffffff16565b9150509392505050565b610d1b82846080015161109a90919063ffffffff16565b610d328184608001516110bf90919063ffffffff16565b505050565b600030600454604051602001808373ffffffffffffffffffffffffffffffffffffffff1660601b815260140182815260200192505050604051602081830303815290604052805190602001209050600454836060018181525050836005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550807fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af960405160405180910390a2600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634000aea08584610e59876110cf565b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610eca578082015181840152602081019050610eaf565b50505050905090810190601f168015610ef75780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b158015610f1857600080fd5b505af1158015610f2c573d6000803e3d6000fd5b505050506040513d6020811015610f4257600080fd5b8101908080519060200190929190505050610fa8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806117426023913960400191505060405180910390fd5b60016004600082825401925050819055509392505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610ff261167f565b6110028560800151610100611250565b508385600001818152505082856020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508185604001907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681525050849050949350505050565b6110a782600383516112a4565b6110ba81836113e990919063ffffffff16565b505050565b6110cb826000836112a4565b5050565b6060634042994660e01b60008084600001518560200151866040015187606001516001896080015160000151604051602401808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020018781526020018673ffffffffffffffffffffffffffffffffffffffff168152602001857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156111b3578082015181840152602081019050611198565b50505050905090810190601f1680156111e05780820380516001836020036101000a031916815260200191505b509950505050505050505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050919050565b6112586116ec565b60006020838161126457fe5b061461127d576020828161127457fe5b06602003820191505b81836020018181525050604051808452600081528281016020016040525082905092915050565b601781116112d1576112cb8160058460ff16901b60ff16178461140b90919063ffffffff16565b506113e4565b60ff8111611313576112f6601860058460ff16901b178461140b90919063ffffffff16565b5061130d8160018561142b9092919063ffffffff16565b506113e3565b61ffff811161135657611339601960058460ff16901b178461140b90919063ffffffff16565b506113508160028561142b9092919063ffffffff16565b506113e2565b63ffffffff811161139b5761137e601a60058460ff16901b178461140b90919063ffffffff16565b506113958160048561142b9092919063ffffffff16565b506113e1565b67ffffffffffffffff81116113e0576113c7601b60058460ff16901b178461140b90919063ffffffff16565b506113de8160088561142b9092919063ffffffff16565b505b5b5b5b5b505050565b6113f16116ec565b6114038384600001515184855161144d565b905092915050565b6114136116ec565b6114238384600001515184611506565b905092915050565b6114336116ec565b611444848560000151518585611554565b90509392505050565b6114556116ec565b825182111561146357600080fd5b8460200151828501111561148e5761148d85600261148788602001518887016115b5565b026115d1565b5b6000808651805187602083010193508088870111156114ad5787860182525b60208701925050505b602084106114d957805182526020820191506020810190506020840393506114b6565b60006001856020036101000a03905080198251168184511681811785525050879350505050949350505050565b61150e6116ec565b8360200151831061152b5761152a8460028660200151026115d1565b5b8351805160208583010184815381861415611547576001820183525b5050508390509392505050565b61155c6116ec565b8460200151848301111561157a57611579856002868501026115d1565b5b60006001836101000a03905085518386820101858319825116178152815185880111156115a75784870182525b505085915050949350505050565b6000818311156115c7578290506115cb565b8190505b92915050565b6060826000015190506115e48383611250565b506115ef83826113e9565b50505050565b82805482825590600052602060002090810192821561166e579160200282015b8281111561166d5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190611615565b5b50905061167b9190611706565b5090565b6040518060a0016040528060008019168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152602001600081526020016116e66116ec565b81525090565b604051806040016040528060608152602001600081525090565b5b8082111561173d57600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101611707565b509056fe756e61626c6520746f207472616e73666572416e6443616c6c20746f206f7261636c65536f75726365206d75737420626520746865206f7261636c65206f66207468652072657175657374a2646970667358221220d5e540adb8261d64e28abbde9d31cee513b8b805d83d93e71db9d3eb3386169a64736f6c634300060c0033", | |
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x7B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x8DC654A2 GT PUSH2 0x4E JUMPI DUP1 PUSH4 0x8DC654A2 EQ PUSH2 0x169 JUMPI DUP1 PUSH4 0xAB73C391 EQ PUSH2 0x180 JUMPI DUP1 PUSH4 0xCA8CA80A EQ PUSH2 0x210 JUMPI DUP1 PUSH4 0xE086E5EC EQ PUSH2 0x25F JUMPI PUSH2 0x7B JUMP JUMPDEST DUP1 PUSH4 0x1E13B51 EQ PUSH2 0x80 JUMPI DUP1 PUSH4 0x11503E08 EQ PUSH2 0xC5 JUMPI DUP1 PUSH4 0x6D97C828 EQ PUSH2 0x111 JUMPI DUP1 PUSH4 0x8381F58A EQ PUSH2 0x13E JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x8C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xC3 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xA3 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 0x276 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xFB PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0xDB 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 0x60C 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 0x11D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x126 PUSH2 0x9A1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x14A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x153 PUSH2 0x9B4 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 0x175 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x17E PUSH2 0x9BA JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x18C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1CF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x1A3 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 0xB88 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP5 DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP5 POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x21C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x249 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x233 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xBD8 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 0x26B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x274 PUSH2 0xC7B 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 0x32E 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 0x1765 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 PUSH1 0x0 PUSH1 0xE PUSH1 0x0 PUSH20 0x2289BC372BC6A46DD3EBC070FC5B7B7A49597A4E PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP PUSH1 0x7 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x7FF36AB5 DUP3 PUSH1 0x0 ADD SLOAD PUSH1 0x1 DUP5 PUSH1 0x2 ADD DUP6 PUSH1 0x4 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x168 TIMESTAMP ADD PUSH1 0x40 MLOAD DUP7 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP4 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE DUP6 DUP2 DUP2 SLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 SLOAD DUP1 ISZERO PUSH2 0x50D JUMPI PUSH1 0x20 MUL DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 PUSH1 0x1 ADD SWAP1 DUP1 DUP4 GT PUSH2 0x4C3 JUMPI JUMPDEST POP POP SWAP6 POP POP POP POP POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x52F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x543 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x0 DUP3 RETURNDATACOPY RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x56E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD PUSH1 0x40 MLOAD SWAP4 SWAP3 SWAP2 SWAP1 DUP5 PUSH5 0x100000000 DUP3 GT ISZERO PUSH2 0x58E JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP4 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP3 ADD DUP6 DUP2 GT ISZERO PUSH2 0x5A4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 MLOAD DUP7 PUSH1 0x20 DUP3 MUL DUP4 ADD GT PUSH5 0x100000000 DUP3 GT OR ISZERO PUSH2 0x5C1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP1 DUP4 MSTORE PUSH1 0x20 DUP4 ADD SWAP3 POP POP POP SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH1 0x20 MUL DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x5F8 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x5DD JUMP JUMPDEST POP POP POP POP SWAP1 POP ADD PUSH1 0x40 MSTORE POP POP POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0xE PUSH1 0x0 PUSH2 0x61B PUSH2 0xCCB JUMP JUMPDEST PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SWAP1 POP PUSH1 0x60 PUSH1 0x2 PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT DUP1 ISZERO PUSH2 0x671 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD SWAP1 DUP1 DUP3 MSTORE DUP1 PUSH1 0x20 MUL PUSH1 0x20 ADD DUP3 ADD PUSH1 0x40 MSTORE DUP1 ISZERO PUSH2 0x6A0 JUMPI DUP2 PUSH1 0x20 ADD PUSH1 0x20 DUP3 MUL DUP1 CALLDATASIZE DUP4 CALLDATACOPY DUP1 DUP3 ADD SWAP2 POP POP SWAP1 POP JUMPDEST POP SWAP1 POP PUSH1 0x7 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xAD5C4648 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 0x70B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x71F 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 0x735 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP DUP2 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x753 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP PUSH1 0x6 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x7BD JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP POP PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 DUP3 PUSH1 0x0 DUP2 MLOAD DUP2 LT PUSH2 0x80F JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP3 PUSH1 0x1 DUP2 MLOAD DUP2 LT PUSH2 0x855 JUMPI INVALID JUMPDEST PUSH1 0x20 MUL PUSH1 0x20 ADD ADD MLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE POP DUP3 PUSH1 0x2 ADD SWAP1 PUSH1 0x2 PUSH2 0x89E SWAP3 SWAP2 SWAP1 PUSH2 0x15F5 JUMP JUMPDEST POP DUP5 DUP3 PUSH1 0x0 ADD DUP2 SWAP1 SSTORE POP DUP4 TIMESTAMP ADD DUP3 PUSH1 0x3 ADD DUP2 SWAP1 SSTORE POP PUSH2 0x8BB PUSH2 0xCCB JUMP JUMPDEST DUP3 PUSH1 0x4 ADD PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x905 PUSH2 0x167F JUMP JUMPDEST PUSH2 0x919 PUSH1 0xC SLOAD ADDRESS PUSH4 0x1E13B51 PUSH1 0xE0 SHL PUSH2 0xCD3 JUMP JUMPDEST SWAP1 POP PUSH2 0x967 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x756E74696C000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP7 TIMESTAMP ADD DUP4 PUSH2 0xD04 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0x996 PUSH1 0xB PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0xD SLOAD PUSH2 0xD37 JUMP JUMPDEST SWAP4 POP POP POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x7 PUSH1 0x14 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH1 0xFF AND DUP2 JUMP JUMPDEST PUSH1 0x8 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x9C4 PUSH2 0xFC0 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 0xA4A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xA5E 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 0xA74 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 0xAD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xAEC 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 0xB02 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xB85 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 0xE PUSH1 0x20 MSTORE DUP1 PUSH1 0x0 MSTORE PUSH1 0x40 PUSH1 0x0 KECCAK256 PUSH1 0x0 SWAP2 POP SWAP1 POP DUP1 PUSH1 0x0 ADD SLOAD SWAP1 DUP1 PUSH1 0x1 ADD SLOAD SWAP1 DUP1 PUSH1 0x3 ADD SLOAD SWAP1 DUP1 PUSH1 0x4 ADD PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP DUP5 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xBE2 PUSH2 0x167F JUMP JUMPDEST PUSH2 0xBF6 PUSH1 0xC SLOAD ADDRESS PUSH4 0x1E13B51 PUSH1 0xE0 SHL PUSH2 0xCD3 JUMP JUMPDEST SWAP1 POP PUSH2 0xC44 PUSH1 0x40 MLOAD DUP1 PUSH1 0x40 ADD PUSH1 0x40 MSTORE DUP1 PUSH1 0x5 DUP2 MSTORE PUSH1 0x20 ADD PUSH32 0x756E74696C000000000000000000000000000000000000000000000000000000 DUP2 MSTORE POP DUP5 TIMESTAMP ADD DUP4 PUSH2 0xD04 SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0xC73 PUSH1 0xB PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP3 PUSH1 0xD SLOAD PUSH2 0xD37 JUMP JUMPDEST SWAP2 POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xC83 PUSH2 0xCCB JUMP JUMPDEST 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 0xCC8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 CALLER SWAP1 POP SWAP1 JUMP JUMPDEST PUSH2 0xCDB PUSH2 0x167F JUMP JUMPDEST PUSH2 0xCE3 PUSH2 0x167F JUMP JUMPDEST PUSH2 0xCFA DUP6 DUP6 DUP6 DUP5 PUSH2 0xFEA SWAP1 SWAP4 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST SWAP2 POP POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0xD1B DUP3 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x109A SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH2 0xD32 DUP2 DUP5 PUSH1 0x80 ADD MLOAD PUSH2 0x10BF 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 0xE59 DUP8 PUSH2 0x10CF 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 0xECA JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0xEAF JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0xEF7 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 0xF18 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0xF2C 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 0xF42 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xFA8 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 0x1742 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 0xFF2 PUSH2 0x167F JUMP JUMPDEST PUSH2 0x1002 DUP6 PUSH1 0x80 ADD MLOAD PUSH2 0x100 PUSH2 0x1250 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 0x10A7 DUP3 PUSH1 0x3 DUP4 MLOAD PUSH2 0x12A4 JUMP JUMPDEST PUSH2 0x10BA DUP2 DUP4 PUSH2 0x13E9 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x10CB DUP3 PUSH1 0x0 DUP4 PUSH2 0x12A4 JUMP 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 0x11B3 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x1198 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x11E0 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 0x1258 PUSH2 0x16EC JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP4 DUP2 PUSH2 0x1264 JUMPI INVALID JUMPDEST MOD EQ PUSH2 0x127D JUMPI PUSH1 0x20 DUP3 DUP2 PUSH2 0x1274 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 0x12D1 JUMPI PUSH2 0x12CB DUP2 PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL PUSH1 0xFF AND OR DUP5 PUSH2 0x140B SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0x13E4 JUMP JUMPDEST PUSH1 0xFF DUP2 GT PUSH2 0x1313 JUMPI PUSH2 0x12F6 PUSH1 0x18 PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0x140B SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0x130D DUP2 PUSH1 0x1 DUP6 PUSH2 0x142B SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0x13E3 JUMP JUMPDEST PUSH2 0xFFFF DUP2 GT PUSH2 0x1356 JUMPI PUSH2 0x1339 PUSH1 0x19 PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0x140B SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0x1350 DUP2 PUSH1 0x2 DUP6 PUSH2 0x142B SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0x13E2 JUMP JUMPDEST PUSH4 0xFFFFFFFF DUP2 GT PUSH2 0x139B JUMPI PUSH2 0x137E PUSH1 0x1A PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0x140B SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0x1395 DUP2 PUSH1 0x4 DUP6 PUSH2 0x142B SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0x13E1 JUMP JUMPDEST PUSH8 0xFFFFFFFFFFFFFFFF DUP2 GT PUSH2 0x13E0 JUMPI PUSH2 0x13C7 PUSH1 0x1B PUSH1 0x5 DUP5 PUSH1 0xFF AND SWAP1 SHL OR DUP5 PUSH2 0x140B SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP PUSH2 0x13DE DUP2 PUSH1 0x8 DUP6 PUSH2 0x142B SWAP1 SWAP3 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST POP JUMPDEST JUMPDEST JUMPDEST JUMPDEST JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x13F1 PUSH2 0x16EC JUMP JUMPDEST PUSH2 0x1403 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 DUP6 MLOAD PUSH2 0x144D JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1413 PUSH2 0x16EC JUMP JUMPDEST PUSH2 0x1423 DUP4 DUP5 PUSH1 0x0 ADD MLOAD MLOAD DUP5 PUSH2 0x1506 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1433 PUSH2 0x16EC JUMP JUMPDEST PUSH2 0x1444 DUP5 DUP6 PUSH1 0x0 ADD MLOAD MLOAD DUP6 DUP6 PUSH2 0x1554 JUMP JUMPDEST SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x1455 PUSH2 0x16EC JUMP JUMPDEST DUP3 MLOAD DUP3 GT ISZERO PUSH2 0x1463 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP3 DUP6 ADD GT ISZERO PUSH2 0x148E JUMPI PUSH2 0x148D DUP6 PUSH1 0x2 PUSH2 0x1487 DUP9 PUSH1 0x20 ADD MLOAD DUP9 DUP8 ADD PUSH2 0x15B5 JUMP JUMPDEST MUL PUSH2 0x15D1 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 0x14AD JUMPI DUP8 DUP7 ADD DUP3 MSTORE JUMPDEST PUSH1 0x20 DUP8 ADD SWAP3 POP POP POP JUMPDEST PUSH1 0x20 DUP5 LT PUSH2 0x14D9 JUMPI DUP1 MLOAD DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP2 POP PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH1 0x20 DUP5 SUB SWAP4 POP PUSH2 0x14B6 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 0x150E PUSH2 0x16EC JUMP JUMPDEST DUP4 PUSH1 0x20 ADD MLOAD DUP4 LT PUSH2 0x152B JUMPI PUSH2 0x152A DUP5 PUSH1 0x2 DUP7 PUSH1 0x20 ADD MLOAD MUL PUSH2 0x15D1 JUMP JUMPDEST JUMPDEST DUP4 MLOAD DUP1 MLOAD PUSH1 0x20 DUP6 DUP4 ADD ADD DUP5 DUP2 MSTORE8 DUP2 DUP7 EQ ISZERO PUSH2 0x1547 JUMPI PUSH1 0x1 DUP3 ADD DUP4 MSTORE JUMPDEST POP POP POP DUP4 SWAP1 POP SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH2 0x155C PUSH2 0x16EC JUMP JUMPDEST DUP5 PUSH1 0x20 ADD MLOAD DUP5 DUP4 ADD GT ISZERO PUSH2 0x157A JUMPI PUSH2 0x1579 DUP6 PUSH1 0x2 DUP7 DUP6 ADD MUL PUSH2 0x15D1 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 0x15A7 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 0x15C7 JUMPI DUP3 SWAP1 POP PUSH2 0x15CB JUMP JUMPDEST DUP2 SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x60 DUP3 PUSH1 0x0 ADD MLOAD SWAP1 POP PUSH2 0x15E4 DUP4 DUP4 PUSH2 0x1250 JUMP JUMPDEST POP PUSH2 0x15EF DUP4 DUP3 PUSH2 0x13E9 JUMP JUMPDEST POP POP POP POP JUMP JUMPDEST DUP3 DUP1 SLOAD DUP3 DUP3 SSTORE SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 DUP2 ADD SWAP3 DUP3 ISZERO PUSH2 0x166E JUMPI SWAP2 PUSH1 0x20 MUL DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x166D JUMPI DUP3 MLOAD DUP3 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x1615 JUMP JUMPDEST JUMPDEST POP SWAP1 POP PUSH2 0x167B SWAP2 SWAP1 PUSH2 0x1706 JUMP JUMPDEST POP SWAP1 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 0x16E6 PUSH2 0x16EC 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 JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x173D JUMPI PUSH1 0x0 DUP2 DUP2 PUSH2 0x100 EXP DUP2 SLOAD SWAP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 SSTORE POP PUSH1 0x1 ADD PUSH2 0x1707 JUMP JUMPDEST POP SWAP1 JUMP INVALID PUSH22 0x6E61626C6520746F207472616E73666572416E644361 PUSH13 0x6C20746F206F7261636C65536F PUSH22 0x726365206D75737420626520746865206F7261636C65 KECCAK256 PUSH16 0x66207468652072657175657374A26469 PUSH17 0x667358221220D5E540ADB8261D64E28ABB 0xDE SWAP14 BALANCE 0xCE 0xE5 SGT 0xB8 0xB8 SDIV 0xD8 RETURNDATASIZE SWAP4 0xE7 SAR 0xB9 0xD3 0xEB CALLER DUP7 AND SWAP11 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ", | |
"sourceMap": "5943:3767:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8945:412;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;8043:893;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6060:21;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;6087;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9477:231;;;;;;;;;;;;;:::i;:::-;;6409:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7642:391;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9367:100;;;;;;;;;;;;;:::i;:::-;;8945:412;9038: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;;;;;;;;;;9060:25:0::1;9088:4;:48;9093:42;9088:48;;;;;;;;;;;;;;;9060:76;;9155:9;;;;;;;;;;;:31;;;9194:8;:17;;;9226:1;9241:8;:13;;9276:8;:11;;;;;;;;;;;;9320:3;9302:15;:21;9155:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;8914:1:2;8945:412:0::0;;;:::o;8043:893::-;8140:17;8177:26;8206:4;:18;8211:12;:10;:12::i;:::-;8206:18;;;;;;;;;;;;;;;8177:47;;8234:21;8272:1;8258:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8234:40;;8303:9;;;;;;;;;;;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8293:4;8298:1;8293:7;;;;;;;;;;;;;:26;;;;;;;;;;;8347:5;;;;;;;;;;;8329:4;8334:1;8329:7;;;;;;;;;;;;;:24;;;;;;;;;;;8372:35;;;;;;;;8390:4;8395:1;8390:7;;;;;;;;;;;;;;8372:35;;;;;;;;8399:4;8404:1;8399:7;;;;;;;;;;;;;;8372:35;;;;;;;:9;:14;;:35;;;;;;;:::i;:::-;;8438:9;8417;:18;;:30;;;;8501:7;8482:15;:27;8457:9;:22;;:52;;;;8534:12;:10;:12::i;:::-;8519:9;:12;;;:27;;;;;;;;;;;;;;;;;;8566:32;;:::i;:::-;8601:71;8623:5;;8638:4;8645:26;;;8601:21;:71::i;:::-;8566:106;;8733:51;;;;;;;;;;;;;;;;;;8776:7;8758:15;:25;8733:7;:15;;:51;;;;;:::i;:::-;8801:44;8824:6;;;;;;;;;;;8832:7;8841:3;;8801:22;:44::i;:::-;8794:51;;;;;8043:893;;;;:::o;6060:21::-;;;;;;;;;;;;;:::o;6087:::-;;;;:::o;9477:231::-;9520:28;9570:23;:21;:23::i;:::-;9520:74;;9612:9;:18;;;9631:10;9643:9;:19;;;9671:4;9643:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9612:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9604:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9477:231;:::o;6409:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7642:391::-;7712:17;7746:32;;:::i;:::-;7781:71;7803:5;;7818:4;7825:26;;;7781:21;:71::i;:::-;7746:106;;7904:61;;;;;;;;;;;;;;;;;;7947:17;7929:15;:35;7904:7;:15;;:61;;;;;:::i;:::-;7982:44;8005:6;;;;;;;;;;;8013:7;8022:3;;7982:22;:44::i;:::-;7975:51;;;7642:391;;;:::o;9367:100::-;9415:12;:10;:12::i;:::-;9407:30;;:53;9438:21;9407:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9367:100::o;926:96::-;979:7;1005:10;998:17;;926:96;:::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;3112:165:1:-;3212:27;3234:4;3212;:8;;;:21;;:27;;;;:::i;:::-;3245;3265:6;3245:4;:8;;;:19;;:27;;;;:::i;:::-;3112:165;;;:::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;2793:210:8:-;2913:55;2924:3;386:1;2954:5;2948:19;2913:10;:55::i;:::-;2974:24;2991:5;2974:3;:10;;:24;;;;:::i;:::-;;2793:210;;:::o;1534:152::-;1643:38;1654:3;237:1;1675:5;1643:10;:38::i;:::-;1534:152;;:::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;685:670:8:-;822:2;813:5;:11;810:541;;834:44;871:5;866:1;857:5;:10;;;;856:20;;;834:3;:15;;:44;;;;:::i;:::-;;810:541;;;903:4;894:5;:13;891:460;;917:41;954:2;949:1;940:5;:10;;;;939:17;917:3;:15;;:41;;;;:::i;:::-;;966:23;980:5;987:1;966:3;:13;;:23;;;;;:::i;:::-;;891:460;;;1014:6;1005:5;:15;1002:349;;1030:41;1067:2;1062:1;1053:5;:10;;;;1052:17;1030:3;:15;;:41;;;;:::i;:::-;;1079:23;1093:5;1100:1;1079:3;:13;;:23;;;;;:::i;:::-;;1002:349;;;1127:10;1118:5;:19;1115:236;;1147:41;1184:2;1179:1;1170:5;:10;;;;1169:17;1147:3;:15;;:41;;;;:::i;:::-;;1196:23;1210:5;1217:1;1196:3;:13;;:23;;;;;:::i;:::-;;1115:236;;;1244:18;1235:5;:27;1232:119;;1272:41;1309:2;1304:1;1295:5;:10;;;;1294:17;1272:3;:15;;:41;;;;:::i;:::-;;1321:23;1335:5;1342:1;1321:3;:13;;:23;;;;;:::i;:::-;;1232:119;1115:236;1002:349;891:460;810:541;685:670;;;:::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;5851:144::-;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;4985:619::-;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;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o" | |
}, | |
"gasEstimates": { | |
"creation": { | |
"codeDepositCost": "1216400", | |
"executionCost": "infinite", | |
"totalCost": "infinite" | |
}, | |
"external": { | |
"Data(address)": "3743", | |
"alarmDone()": "1142", | |
"fulfillAlarm(bytes32,uint256)": "infinite", | |
"number()": "1072", | |
"requestAlarmClock(uint256)": "infinite", | |
"setPeriodToswapETHForTokens(uint256,uint256)": "infinite", | |
"withdrawETH()": "infinite", | |
"withdrawLink()": "infinite" | |
} | |
}, | |
"methodIdentifiers": { | |
"Data(address)": "ab73c391", | |
"alarmDone()": "6d97c828", | |
"fulfillAlarm(bytes32,uint256)": "01e13b51", | |
"number()": "8381f58a", | |
"requestAlarmClock(uint256)": "ca8ca80a", | |
"setPeriodToswapETHForTokens(uint256,uint256)": "11503e08", | |
"withdrawETH()": "e086e5ec", | |
"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": "address", | |
"name": "", | |
"type": "address" | |
} | |
], | |
"name": "Data", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountIn", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountOutMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "expectedTime", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "alarmDone", | |
"outputs": [ | |
{ | |
"internalType": "bool", | |
"name": "", | |
"type": "bool" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "bytes32", | |
"name": "_requestId", | |
"type": "bytes32" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "_volume", | |
"type": "uint256" | |
} | |
], | |
"name": "fulfillAlarm", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "number", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "durationInSeconds", | |
"type": "uint256" | |
} | |
], | |
"name": "requestAlarmClock", | |
"outputs": [ | |
{ | |
"internalType": "bytes32", | |
"name": "requestId", | |
"type": "bytes32" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "_amountIn", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "_timeOf", | |
"type": "uint256" | |
} | |
], | |
"name": "setPeriodToswapETHForTokens", | |
"outputs": [ | |
{ | |
"internalType": "bytes32", | |
"name": "requestId", | |
"type": "bytes32" | |
} | |
], | |
"stateMutability": "payable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "withdrawETH", | |
"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.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": "address", | |
"name": "", | |
"type": "address" | |
} | |
], | |
"name": "Data", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountIn", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountOutMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "expectedTime", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "alarmDone", | |
"outputs": [ | |
{ | |
"internalType": "bool", | |
"name": "", | |
"type": "bool" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "bytes32", | |
"name": "_requestId", | |
"type": "bytes32" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "_volume", | |
"type": "uint256" | |
} | |
], | |
"name": "fulfillAlarm", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "number", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "durationInSeconds", | |
"type": "uint256" | |
} | |
], | |
"name": "requestAlarmClock", | |
"outputs": [ | |
{ | |
"internalType": "bytes32", | |
"name": "requestId", | |
"type": "bytes32" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "_amountIn", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "_timeOf", | |
"type": "uint256" | |
} | |
], | |
"name": "setPeriodToswapETHForTokens", | |
"outputs": [ | |
{ | |
"internalType": "bytes32", | |
"name": "requestId", | |
"type": "bytes32" | |
} | |
], | |
"stateMutability": "payable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "withdrawETH", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "withdrawLink", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
} | |
], | |
"devdoc": { | |
"kind": "dev", | |
"methods": {}, | |
"version": 1 | |
}, | |
"userdoc": { | |
"kind": "user", | |
"methods": { | |
"constructor": "Network: Kovan Oracle: Chainlink - 0xAA1DC356dc4B18f30C347798FD5379F3D77ABC5b Job ID: Chainlink - 982105d690504c5d9ce374d040c08654 Fee: 0.1 LINK", | |
"requestAlarmClock(uint256)": { | |
"notice": "Create a Chainlink request to start an alarm and after the time in seconds is up, return throught the fulfillAlarm function" | |
} | |
}, | |
"version": 1 | |
} | |
}, | |
"settings": { | |
"compilationTarget": { | |
"gist-e71aab73726c5a2f99ee00c1a70cfef8/AlarmClockSample.sol": "AlarmClockSample" | |
}, | |
"evmVersion": "istanbul", | |
"libraries": {}, | |
"metadata": { | |
"bytecodeHash": "ipfs" | |
}, | |
"optimizer": { | |
"enabled": false, | |
"runs": 200 | |
}, | |
"remappings": [] | |
}, | |
"sources": { | |
"gist-e71aab73726c5a2f99ee00c1a70cfef8/AlarmClockSample.sol": { | |
"keccak256": "0x7117df9c260edabce0bc665b05bc1ec5764b56ff0d2d497a986d82b775ff3f72", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://c68e3bb84e60a914c7150824fc7f6cc0c1a81978efabba2299049622f01e8adf", | |
"dweb:/ipfs/QmTgaXVG3AWvQpZDidQvro5s4Be7ramVk12nnghJhYWS5i" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/Chainlink.sol": { | |
"keccak256": "0x7bef34fd97f611103c6113025e3d6af755f326069767e72266698f64258e62b6", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://82125916319b872093aa8599d2c00bd07d363386a74a4d0268c6edf25c366f82", | |
"dweb:/ipfs/QmXTnVy1XEw387NduvHHFQNmnzYTwFUhVz95kRvRrcwdHd" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/ChainlinkClient.sol": { | |
"keccak256": "0x9f8883b8b5b76bba151e5f30d4c353b8a3f15ee3d97117deee4cccd91fe8640f", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://ee9b132779ac24df4f8a5e45dfc256acc70eb5e43f715de36593e488f20a44ff", | |
"dweb:/ipfs/QmagJ1htVpP2ZYLAdHEpSEMx1Xd3csbUHAhLctryVDsNFg" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/interfaces/ChainlinkRequestInterface.sol": { | |
"keccak256": "0xe513c0f60edf13da7d82625489cf2008c7b66170f3b1ed1606b84c73f95b17ad", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://78e083ef252b80bb63a5aa126bc7283cd9b88767dfdf0190d46802bc32756ecf", | |
"dweb:/ipfs/QmdTyEQwX5ecoXR1rBh8DLDJpCYVDM85JjjR2sEJdE9wAA" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/interfaces/ENSInterface.sol": { | |
"keccak256": "0xdef864af6e516477773ea246b73531b1836de5bea4ac1cfd8be6e7f4b3f3c3fd", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://ad3346f5a393cd62d8de678a77d8dc323d8f9e21f0aaa504d0d0b990c8b61477", | |
"dweb:/ipfs/QmQ2n8329Fzb7Zbzk5wqYvAfKJ9QPwTdCUmm9zUqhL67a1" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/interfaces/LinkTokenInterface.sol": { | |
"keccak256": "0xe245a7be950c94d87bb775ae9ee9fbd693fbe2987778e6ce0b04605ea44b7b68", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://bd2c3165d949fc66fe407b96eb3dc2092c7e800f4c073b411bf7b96de3e156c9", | |
"dweb:/ipfs/QmcfJhR1Np4GsLWnww2Duqks2wEzYk8VDTvCAYy7MisG1r" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/interfaces/PointerInterface.sol": { | |
"keccak256": "0x08aed19c3bef1ae2d90fc0d9d28a497fd7f312991ed08fedfe545de6b9a476e4", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://b2e7b4acfbd4cfbd4c3e266011955954ec0f5a2323647e81b936c66cb35e1b5e", | |
"dweb:/ipfs/QmXVrpdo76r2WhxE7gJPj3dGycZYKKvK39VNVaB7HyhAbT" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/vendor/BufferChainlink.sol": { | |
"keccak256": "0x14f13139229a2fef8f705f29f91de0bc81bcd5070ec75b4bd3fd82c1536ca685", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://9a403d7f17b316c7b8837a25df0563de2a1c3121b7cd43473abce8ce6742bd29", | |
"dweb:/ipfs/QmWZYi4xJGjPt1pEM7mS7XsA1eF2zpcxiiuGHuiTndXHo7" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/vendor/CBORChainlink.sol": { | |
"keccak256": "0xe7c6e4290ac2a41a138e6bd89d89a2779f66847a5ee6fb5a6f2a3386e5ce589d", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://1eb0e7821c4963b125b47c93e31cd6e073d2b87550651054fc526e63915d92ab", | |
"dweb:/ipfs/QmVJq2sNTzX4Hfyway8JiY4RoQw4vQRSbzJWbsC7JsiyUs" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/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": "", | |
"opcodes": "", | |
"sourceMap": "" | |
}, | |
"deployedBytecode": { | |
"immutableReferences": {}, | |
"linkReferences": {}, | |
"object": "", | |
"opcodes": "", | |
"sourceMap": "" | |
}, | |
"gasEstimates": null, | |
"methodIdentifiers": {} | |
}, | |
"abi": [] | |
} |
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": [], | |
"devdoc": { | |
"kind": "dev", | |
"methods": {}, | |
"version": 1 | |
}, | |
"userdoc": { | |
"kind": "user", | |
"methods": {}, | |
"version": 1 | |
} | |
}, | |
"settings": { | |
"compilationTarget": { | |
"gist-e71aab73726c5a2f99ee00c1a70cfef8/AlarmClockSample.sol": "Context" | |
}, | |
"evmVersion": "istanbul", | |
"libraries": {}, | |
"metadata": { | |
"bytecodeHash": "ipfs" | |
}, | |
"optimizer": { | |
"enabled": false, | |
"runs": 200 | |
}, | |
"remappings": [] | |
}, | |
"sources": { | |
"gist-e71aab73726c5a2f99ee00c1a70cfef8/AlarmClockSample.sol": { | |
"keccak256": "0x7117df9c260edabce0bc665b05bc1ec5764b56ff0d2d497a986d82b775ff3f72", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://c68e3bb84e60a914c7150824fc7f6cc0c1a81978efabba2299049622f01e8adf", | |
"dweb:/ipfs/QmTgaXVG3AWvQpZDidQvro5s4Be7ramVk12nnghJhYWS5i" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/Chainlink.sol": { | |
"keccak256": "0x7bef34fd97f611103c6113025e3d6af755f326069767e72266698f64258e62b6", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://82125916319b872093aa8599d2c00bd07d363386a74a4d0268c6edf25c366f82", | |
"dweb:/ipfs/QmXTnVy1XEw387NduvHHFQNmnzYTwFUhVz95kRvRrcwdHd" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/ChainlinkClient.sol": { | |
"keccak256": "0x9f8883b8b5b76bba151e5f30d4c353b8a3f15ee3d97117deee4cccd91fe8640f", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://ee9b132779ac24df4f8a5e45dfc256acc70eb5e43f715de36593e488f20a44ff", | |
"dweb:/ipfs/QmagJ1htVpP2ZYLAdHEpSEMx1Xd3csbUHAhLctryVDsNFg" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/interfaces/ChainlinkRequestInterface.sol": { | |
"keccak256": "0xe513c0f60edf13da7d82625489cf2008c7b66170f3b1ed1606b84c73f95b17ad", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://78e083ef252b80bb63a5aa126bc7283cd9b88767dfdf0190d46802bc32756ecf", | |
"dweb:/ipfs/QmdTyEQwX5ecoXR1rBh8DLDJpCYVDM85JjjR2sEJdE9wAA" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/interfaces/ENSInterface.sol": { | |
"keccak256": "0xdef864af6e516477773ea246b73531b1836de5bea4ac1cfd8be6e7f4b3f3c3fd", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://ad3346f5a393cd62d8de678a77d8dc323d8f9e21f0aaa504d0d0b990c8b61477", | |
"dweb:/ipfs/QmQ2n8329Fzb7Zbzk5wqYvAfKJ9QPwTdCUmm9zUqhL67a1" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/interfaces/LinkTokenInterface.sol": { | |
"keccak256": "0xe245a7be950c94d87bb775ae9ee9fbd693fbe2987778e6ce0b04605ea44b7b68", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://bd2c3165d949fc66fe407b96eb3dc2092c7e800f4c073b411bf7b96de3e156c9", | |
"dweb:/ipfs/QmcfJhR1Np4GsLWnww2Duqks2wEzYk8VDTvCAYy7MisG1r" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/interfaces/PointerInterface.sol": { | |
"keccak256": "0x08aed19c3bef1ae2d90fc0d9d28a497fd7f312991ed08fedfe545de6b9a476e4", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://b2e7b4acfbd4cfbd4c3e266011955954ec0f5a2323647e81b936c66cb35e1b5e", | |
"dweb:/ipfs/QmXVrpdo76r2WhxE7gJPj3dGycZYKKvK39VNVaB7HyhAbT" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/vendor/BufferChainlink.sol": { | |
"keccak256": "0x14f13139229a2fef8f705f29f91de0bc81bcd5070ec75b4bd3fd82c1536ca685", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://9a403d7f17b316c7b8837a25df0563de2a1c3121b7cd43473abce8ce6742bd29", | |
"dweb:/ipfs/QmWZYi4xJGjPt1pEM7mS7XsA1eF2zpcxiiuGHuiTndXHo7" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/vendor/CBORChainlink.sol": { | |
"keccak256": "0xe7c6e4290ac2a41a138e6bd89d89a2779f66847a5ee6fb5a6f2a3386e5ce589d", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://1eb0e7821c4963b125b47c93e31cd6e073d2b87550651054fc526e63915d92ab", | |
"dweb:/ipfs/QmVJq2sNTzX4Hfyway8JiY4RoQw4vQRSbzJWbsC7JsiyUs" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/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": "60a060405234801561001057600080fd5b5060405161039c38038061039c8339818101604052602081101561003357600080fd5b8101908080519060200190929190505050806080818152505042600181905550600080819055505060805161032261007a6000398061025352806102ca52506103226000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80633f3b3b271461005c5780634585e33b1461007a57806361bc221a146100f35780636e04ff0d14610111578063947a36fb1461020c575b600080fd5b61006461022a565b6040518082815260200191505060405180910390f35b6100f16004803603602081101561009057600080fd5b81019080803590602001906401000000008111156100ad57600080fd5b8201836020820111156100bf57600080fd5b803590602001918460018302840111640100000000831117156100e157600080fd5b9091929391929390505050610230565b005b6100fb610247565b6040518082815260200191505060405180910390f35b6101886004803603602081101561012757600080fd5b810190808035906020019064010000000081111561014457600080fd5b82018360208201111561015657600080fd5b8035906020019184600183028401116401000000008311171561017857600080fd5b909192939192939050505061024d565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156101d05780820151818401526020810190506101b5565b50505050905090810190601f1680156101fd5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b6102146102c8565b6040518082815260200191505060405180910390f35b60015481565b426001819055506001600054016000819055505050565b60005481565b600060607f0000000000000000000000000000000000000000000000000000000000000000600154420311915083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090509250929050565b7f00000000000000000000000000000000000000000000000000000000000000008156fea26469706673582212202f09a7bfa7cd286295a03ff6493789ded39cad419dcfdb56d813f58c8b38a24964736f6c634300060c0033", | |
"opcodes": "PUSH1 0xA0 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x39C CODESIZE SUB DUP1 PUSH2 0x39C DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x33 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP DUP1 PUSH1 0x80 DUP2 DUP2 MSTORE POP POP TIMESTAMP PUSH1 0x1 DUP2 SWAP1 SSTORE POP PUSH1 0x0 DUP1 DUP2 SWAP1 SSTORE POP POP PUSH1 0x80 MLOAD PUSH2 0x322 PUSH2 0x7A PUSH1 0x0 CODECOPY DUP1 PUSH2 0x253 MSTORE DUP1 PUSH2 0x2CA MSTORE POP PUSH2 0x322 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 0x57 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x3F3B3B27 EQ PUSH2 0x5C JUMPI DUP1 PUSH4 0x4585E33B EQ PUSH2 0x7A JUMPI DUP1 PUSH4 0x61BC221A EQ PUSH2 0xF3 JUMPI DUP1 PUSH4 0x6E04FF0D EQ PUSH2 0x111 JUMPI DUP1 PUSH4 0x947A36FB EQ PUSH2 0x20C JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x64 PUSH2 0x22A 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 0xF1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x90 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xBF 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 0xE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP2 SWAP3 SWAP4 SWAP1 POP POP POP PUSH2 0x230 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xFB PUSH2 0x247 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 0x188 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x127 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x144 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x156 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 0x178 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP2 SWAP3 SWAP4 SWAP1 POP POP POP PUSH2 0x24D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 ISZERO ISZERO 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 0x1D0 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x1B5 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1FD 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 SWAP4 POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x214 PUSH2 0x2C8 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 0x1 SLOAD DUP2 JUMP JUMPDEST TIMESTAMP PUSH1 0x1 DUP2 SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x0 SLOAD ADD PUSH1 0x0 DUP2 SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH32 0x0 PUSH1 0x1 SLOAD TIMESTAMP SUB GT SWAP2 POP DUP4 DUP4 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 SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2F MULMOD 0xA7 0xBF 0xA7 0xCD 0x28 PUSH3 0x95A03F 0xF6 0x49 CALLDATACOPY DUP10 0xDE 0xD3 SWAP13 0xAD COINBASE SWAP14 0xCF 0xDB JUMP 0xD8 SGT CREATE2 DUP13 DUP12 CODESIZE LOG2 0x49 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ", | |
"sourceMap": "324:1118:1:-:0;;;613:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;672:14;661:25;;;;;;710:15;694:13;:31;;;;744:1;734:7;:11;;;;613:139;324:1118;;;;;;;;;" | |
}, | |
"deployedBytecode": { | |
"immutableReferences": { | |
"71": [ | |
{ | |
"length": 32, | |
"start": 595 | |
}, | |
{ | |
"length": 32, | |
"start": 714 | |
} | |
] | |
}, | |
"linkReferences": {}, | |
"object": "608060405234801561001057600080fd5b50600436106100575760003560e01c80633f3b3b271461005c5780634585e33b1461007a57806361bc221a146100f35780636e04ff0d14610111578063947a36fb1461020c575b600080fd5b61006461022a565b6040518082815260200191505060405180910390f35b6100f16004803603602081101561009057600080fd5b81019080803590602001906401000000008111156100ad57600080fd5b8201836020820111156100bf57600080fd5b803590602001918460018302840111640100000000831117156100e157600080fd5b9091929391929390505050610230565b005b6100fb610247565b6040518082815260200191505060405180910390f35b6101886004803603602081101561012757600080fd5b810190808035906020019064010000000081111561014457600080fd5b82018360208201111561015657600080fd5b8035906020019184600183028401116401000000008311171561017857600080fd5b909192939192939050505061024d565b60405180831515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156101d05780820151818401526020810190506101b5565b50505050905090810190601f1680156101fd5780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b6102146102c8565b6040518082815260200191505060405180910390f35b60015481565b426001819055506001600054016000819055505050565b60005481565b600060607f0000000000000000000000000000000000000000000000000000000000000000600154420311915083838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090509250929050565b7f00000000000000000000000000000000000000000000000000000000000000008156fea26469706673582212202f09a7bfa7cd286295a03ff6493789ded39cad419dcfdb56d813f58c8b38a24964736f6c634300060c0033", | |
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x57 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x3F3B3B27 EQ PUSH2 0x5C JUMPI DUP1 PUSH4 0x4585E33B EQ PUSH2 0x7A JUMPI DUP1 PUSH4 0x61BC221A EQ PUSH2 0xF3 JUMPI DUP1 PUSH4 0x6E04FF0D EQ PUSH2 0x111 JUMPI DUP1 PUSH4 0x947A36FB EQ PUSH2 0x20C JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x64 PUSH2 0x22A 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 0xF1 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x90 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0xAD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0xBF 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 0xE1 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP2 SWAP3 SWAP4 SWAP1 POP POP POP PUSH2 0x230 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xFB PUSH2 0x247 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 0x188 PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x20 DUP2 LT ISZERO PUSH2 0x127 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD SWAP1 PUSH1 0x20 ADD SWAP1 PUSH5 0x100000000 DUP2 GT ISZERO PUSH2 0x144 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP3 ADD DUP4 PUSH1 0x20 DUP3 ADD GT ISZERO PUSH2 0x156 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 0x178 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST SWAP1 SWAP2 SWAP3 SWAP4 SWAP2 SWAP3 SWAP4 SWAP1 POP POP POP PUSH2 0x24D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP4 ISZERO ISZERO 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 0x1D0 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x1B5 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1FD 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 SWAP4 POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x214 PUSH2 0x2C8 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 0x1 SLOAD DUP2 JUMP JUMPDEST TIMESTAMP PUSH1 0x1 DUP2 SWAP1 SSTORE POP PUSH1 0x1 PUSH1 0x0 SLOAD ADD PUSH1 0x0 DUP2 SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH32 0x0 PUSH1 0x1 SLOAD TIMESTAMP SUB GT SWAP2 POP DUP4 DUP4 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 SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x2F MULMOD 0xA7 0xBF 0xA7 0xCD 0x28 PUSH3 0x95A03F 0xF6 0x49 CALLDATACOPY DUP10 0xDE 0xD3 SWAP13 0xAD COINBASE SWAP14 0xCF 0xDB JUMP 0xD8 SGT CREATE2 DUP13 DUP12 CODESIZE LOG2 0x49 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ", | |
"sourceMap": "324:1118:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;576:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1112:323;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;421:19;;;:::i;:::-;;;;;;;;;;;;;;;;;;;759:347;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;540:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;576:25;;;;:::o;1112:323::-;1207:15;1191:13;:31;;;;1252:1;1242:7;;:11;1232:7;:21;;;;1112:323;;:::o;421:19::-;;;;:::o;759:347::-;833:17;852:24;939:8;922:13;;904:15;:31;903:44;888:59;;1090:9;;1076:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;759:347;;;;;:::o;540:30::-;;;:::o" | |
}, | |
"gasEstimates": { | |
"creation": { | |
"codeDepositCost": "160400", | |
"executionCost": "infinite", | |
"totalCost": "infinite" | |
}, | |
"external": { | |
"checkUpkeep(bytes)": "infinite", | |
"counter()": "1027", | |
"interval()": "infinite", | |
"lastTimeStamp()": "983", | |
"performUpkeep(bytes)": "41212" | |
} | |
}, | |
"methodIdentifiers": { | |
"checkUpkeep(bytes)": "6e04ff0d", | |
"counter()": "61bc221a", | |
"interval()": "947a36fb", | |
"lastTimeStamp()": "3f3b3b27", | |
"performUpkeep(bytes)": "4585e33b" | |
} | |
}, | |
"abi": [ | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "updateInterval", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "constructor" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "bytes", | |
"name": "checkData", | |
"type": "bytes" | |
} | |
], | |
"name": "checkUpkeep", | |
"outputs": [ | |
{ | |
"internalType": "bool", | |
"name": "upkeepNeeded", | |
"type": "bool" | |
}, | |
{ | |
"internalType": "bytes", | |
"name": "performData", | |
"type": "bytes" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "counter", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "interval", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "lastTimeStamp", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "bytes", | |
"name": "performData", | |
"type": "bytes" | |
} | |
], | |
"name": "performUpkeep", | |
"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": [ | |
{ | |
"internalType": "uint256", | |
"name": "updateInterval", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "constructor" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "bytes", | |
"name": "checkData", | |
"type": "bytes" | |
} | |
], | |
"name": "checkUpkeep", | |
"outputs": [ | |
{ | |
"internalType": "bool", | |
"name": "upkeepNeeded", | |
"type": "bool" | |
}, | |
{ | |
"internalType": "bytes", | |
"name": "performData", | |
"type": "bytes" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "counter", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "interval", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "lastTimeStamp", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "bytes", | |
"name": "performData", | |
"type": "bytes" | |
} | |
], | |
"name": "performUpkeep", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
} | |
], | |
"devdoc": { | |
"kind": "dev", | |
"methods": {}, | |
"version": 1 | |
}, | |
"userdoc": { | |
"kind": "user", | |
"methods": { | |
"counter()": { | |
"notice": "Public counter variable" | |
}, | |
"interval()": { | |
"notice": "Use an interval in seconds and a timestamp to slow execution of Upkeep" | |
} | |
}, | |
"version": 1 | |
} | |
}, | |
"settings": { | |
"compilationTarget": { | |
"gist-62587a7f0885c4cbdbd587ca0dc74a12/Counter.sol": "Counter" | |
}, | |
"evmVersion": "istanbul", | |
"libraries": {}, | |
"metadata": { | |
"bytecodeHash": "ipfs" | |
}, | |
"optimizer": { | |
"enabled": false, | |
"runs": 200 | |
}, | |
"remappings": [] | |
}, | |
"sources": { | |
"@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.sol": { | |
"keccak256": "0x8895ce4f46aba18ee3cdb7b1d180f79edb868225781f60993c7b2181e2ee2583", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://4472c14df5f311d7a2eff1dfa55d9b4d39a21b0a0ff905fcbbf6913551086a4c", | |
"dweb:/ipfs/QmQvwFk1SBaLMm4pmZCz7UEhfaXM8kUWu5VG71VFFuMxjF" | |
] | |
}, | |
"gist-62587a7f0885c4cbdbd587ca0dc74a12/Counter.sol": { | |
"keccak256": "0x198a7d7e1c5c3a8f63bdeae97c8b7ffa6c440f2cbce93ebb9ac115e795bc58eb", | |
"urls": [ | |
"bzz-raw://b7005a2ceda0235dea0a2194bfafbbe116012cc89296b8430f24c2e01733fb01", | |
"dweb:/ipfs/QmP4GGcJfC7dmPGbFH4StJRBGSn4djpCoBzKqU77GK4zXC" | |
] | |
} | |
}, | |
"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": "", | |
"opcodes": "", | |
"sourceMap": "" | |
}, | |
"deployedBytecode": { | |
"immutableReferences": {}, | |
"linkReferences": {}, | |
"object": "", | |
"opcodes": "", | |
"sourceMap": "" | |
}, | |
"gasEstimates": null, | |
"methodIdentifiers": { | |
"balanceOf(address)": "70a08231", | |
"transfer(address,uint256)": "a9059cbb", | |
"transferFrom(address,address,uint256)": "23b872dd" | |
} | |
}, | |
"abi": [ | |
{ | |
"inputs": [ | |
{ | |
"internalType": "address", | |
"name": "owner", | |
"type": "address" | |
} | |
], | |
"name": "balanceOf", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "value", | |
"type": "uint256" | |
} | |
], | |
"name": "transfer", | |
"outputs": [ | |
{ | |
"internalType": "bool", | |
"name": "", | |
"type": "bool" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "address", | |
"name": "from", | |
"type": "address" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "value", | |
"type": "uint256" | |
} | |
], | |
"name": "transferFrom", | |
"outputs": [ | |
{ | |
"internalType": "bool", | |
"name": "", | |
"type": "bool" | |
} | |
], | |
"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": [ | |
{ | |
"internalType": "address", | |
"name": "owner", | |
"type": "address" | |
} | |
], | |
"name": "balanceOf", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "value", | |
"type": "uint256" | |
} | |
], | |
"name": "transfer", | |
"outputs": [ | |
{ | |
"internalType": "bool", | |
"name": "", | |
"type": "bool" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "address", | |
"name": "from", | |
"type": "address" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "value", | |
"type": "uint256" | |
} | |
], | |
"name": "transferFrom", | |
"outputs": [ | |
{ | |
"internalType": "bool", | |
"name": "", | |
"type": "bool" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
} | |
], | |
"devdoc": { | |
"kind": "dev", | |
"methods": {}, | |
"version": 1 | |
}, | |
"userdoc": { | |
"kind": "user", | |
"methods": {}, | |
"version": 1 | |
} | |
}, | |
"settings": { | |
"compilationTarget": { | |
"gist-e71aab73726c5a2f99ee00c1a70cfef8/AlarmClockSample.sol": "IERC20" | |
}, | |
"evmVersion": "istanbul", | |
"libraries": {}, | |
"metadata": { | |
"bytecodeHash": "ipfs" | |
}, | |
"optimizer": { | |
"enabled": false, | |
"runs": 200 | |
}, | |
"remappings": [] | |
}, | |
"sources": { | |
"gist-e71aab73726c5a2f99ee00c1a70cfef8/AlarmClockSample.sol": { | |
"keccak256": "0x7117df9c260edabce0bc665b05bc1ec5764b56ff0d2d497a986d82b775ff3f72", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://c68e3bb84e60a914c7150824fc7f6cc0c1a81978efabba2299049622f01e8adf", | |
"dweb:/ipfs/QmTgaXVG3AWvQpZDidQvro5s4Be7ramVk12nnghJhYWS5i" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/Chainlink.sol": { | |
"keccak256": "0x7bef34fd97f611103c6113025e3d6af755f326069767e72266698f64258e62b6", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://82125916319b872093aa8599d2c00bd07d363386a74a4d0268c6edf25c366f82", | |
"dweb:/ipfs/QmXTnVy1XEw387NduvHHFQNmnzYTwFUhVz95kRvRrcwdHd" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/ChainlinkClient.sol": { | |
"keccak256": "0x9f8883b8b5b76bba151e5f30d4c353b8a3f15ee3d97117deee4cccd91fe8640f", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://ee9b132779ac24df4f8a5e45dfc256acc70eb5e43f715de36593e488f20a44ff", | |
"dweb:/ipfs/QmagJ1htVpP2ZYLAdHEpSEMx1Xd3csbUHAhLctryVDsNFg" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/interfaces/ChainlinkRequestInterface.sol": { | |
"keccak256": "0xe513c0f60edf13da7d82625489cf2008c7b66170f3b1ed1606b84c73f95b17ad", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://78e083ef252b80bb63a5aa126bc7283cd9b88767dfdf0190d46802bc32756ecf", | |
"dweb:/ipfs/QmdTyEQwX5ecoXR1rBh8DLDJpCYVDM85JjjR2sEJdE9wAA" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/interfaces/ENSInterface.sol": { | |
"keccak256": "0xdef864af6e516477773ea246b73531b1836de5bea4ac1cfd8be6e7f4b3f3c3fd", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://ad3346f5a393cd62d8de678a77d8dc323d8f9e21f0aaa504d0d0b990c8b61477", | |
"dweb:/ipfs/QmQ2n8329Fzb7Zbzk5wqYvAfKJ9QPwTdCUmm9zUqhL67a1" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/interfaces/LinkTokenInterface.sol": { | |
"keccak256": "0xe245a7be950c94d87bb775ae9ee9fbd693fbe2987778e6ce0b04605ea44b7b68", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://bd2c3165d949fc66fe407b96eb3dc2092c7e800f4c073b411bf7b96de3e156c9", | |
"dweb:/ipfs/QmcfJhR1Np4GsLWnww2Duqks2wEzYk8VDTvCAYy7MisG1r" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/interfaces/PointerInterface.sol": { | |
"keccak256": "0x08aed19c3bef1ae2d90fc0d9d28a497fd7f312991ed08fedfe545de6b9a476e4", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://b2e7b4acfbd4cfbd4c3e266011955954ec0f5a2323647e81b936c66cb35e1b5e", | |
"dweb:/ipfs/QmXVrpdo76r2WhxE7gJPj3dGycZYKKvK39VNVaB7HyhAbT" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/vendor/BufferChainlink.sol": { | |
"keccak256": "0x14f13139229a2fef8f705f29f91de0bc81bcd5070ec75b4bd3fd82c1536ca685", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://9a403d7f17b316c7b8837a25df0563de2a1c3121b7cd43473abce8ce6742bd29", | |
"dweb:/ipfs/QmWZYi4xJGjPt1pEM7mS7XsA1eF2zpcxiiuGHuiTndXHo7" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/vendor/CBORChainlink.sol": { | |
"keccak256": "0xe7c6e4290ac2a41a138e6bd89d89a2779f66847a5ee6fb5a6f2a3386e5ce589d", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://1eb0e7821c4963b125b47c93e31cd6e073d2b87550651054fc526e63915d92ab", | |
"dweb:/ipfs/QmVJq2sNTzX4Hfyway8JiY4RoQw4vQRSbzJWbsC7JsiyUs" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/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": "", | |
"opcodes": "", | |
"sourceMap": "" | |
}, | |
"deployedBytecode": { | |
"immutableReferences": {}, | |
"linkReferences": {}, | |
"object": "", | |
"opcodes": "", | |
"sourceMap": "" | |
}, | |
"gasEstimates": null, | |
"methodIdentifiers": { | |
"WETH()": "ad5c4648", | |
"addLiquidity(address,address,uint256,uint256,uint256,uint256,address,uint256)": "e8e33700", | |
"addLiquidityETH(address,uint256,uint256,uint256,address,uint256)": "f305d719", | |
"factory()": "c45a0155", | |
"getAmountIn(uint256,uint256,uint256)": "85f8c259", | |
"getAmountOut(uint256,uint256,uint256)": "054d50d4", | |
"getAmountsIn(uint256,address[])": "1f00ca74", | |
"getAmountsOut(uint256,address[])": "d06ca61f", | |
"quote(uint256,uint256,uint256)": "ad615dec", | |
"removeLiquidity(address,address,uint256,uint256,uint256,address,uint256)": "baa2abde", | |
"removeLiquidityETH(address,uint256,uint256,uint256,address,uint256)": "02751cec", | |
"removeLiquidityETHSupportingFeeOnTransferTokens(address,uint256,uint256,uint256,address,uint256)": "af2979eb", | |
"removeLiquidityETHWithPermit(address,uint256,uint256,uint256,address,uint256,bool,uint8,bytes32,bytes32)": "ded9382a", | |
"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(address,uint256,uint256,uint256,address,uint256,bool,uint8,bytes32,bytes32)": "5b0d5984", | |
"removeLiquidityWithPermit(address,address,uint256,uint256,uint256,address,uint256,bool,uint8,bytes32,bytes32)": "2195995c", | |
"swapETHForExactTokens(uint256,address[],address,uint256)": "fb3bdb41", | |
"swapExactETHForTokens(uint256,address[],address,uint256)": "7ff36ab5", | |
"swapExactETHForTokensSupportingFeeOnTransferTokens(uint256,address[],address,uint256)": "b6f9de95", | |
"swapExactTokensForETH(uint256,uint256,address[],address,uint256)": "18cbafe5", | |
"swapExactTokensForETHSupportingFeeOnTransferTokens(uint256,uint256,address[],address,uint256)": "791ac947", | |
"swapExactTokensForTokens(uint256,uint256,address[],address,uint256)": "38ed1739", | |
"swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256,uint256,address[],address,uint256)": "5c11d795", | |
"swapTokensForExactETH(uint256,uint256,address[],address,uint256)": "4a25d94a", | |
"swapTokensForExactTokens(uint256,uint256,address[],address,uint256)": "8803dbee" | |
} | |
}, | |
"abi": [ | |
{ | |
"inputs": [], | |
"name": "WETH", | |
"outputs": [ | |
{ | |
"internalType": "address", | |
"name": "", | |
"type": "address" | |
} | |
], | |
"stateMutability": "pure", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "address", | |
"name": "tokenA", | |
"type": "address" | |
}, | |
{ | |
"internalType": "address", | |
"name": "tokenB", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountADesired", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountBDesired", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountAMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountBMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "addLiquidity", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountA", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountB", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "liquidity", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "address", | |
"name": "token", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountTokenDesired", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountTokenMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountETHMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "addLiquidityETH", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountToken", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountETH", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "liquidity", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "payable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "factory", | |
"outputs": [ | |
{ | |
"internalType": "address", | |
"name": "", | |
"type": "address" | |
} | |
], | |
"stateMutability": "pure", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountOut", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "reserveIn", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "reserveOut", | |
"type": "uint256" | |
} | |
], | |
"name": "getAmountIn", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountIn", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "pure", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountIn", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "reserveIn", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "reserveOut", | |
"type": "uint256" | |
} | |
], | |
"name": "getAmountOut", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountOut", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "pure", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountOut", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address[]", | |
"name": "path", | |
"type": "address[]" | |
} | |
], | |
"name": "getAmountsIn", | |
"outputs": [ | |
{ | |
"internalType": "uint256[]", | |
"name": "amounts", | |
"type": "uint256[]" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountIn", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address[]", | |
"name": "path", | |
"type": "address[]" | |
} | |
], | |
"name": "getAmountsOut", | |
"outputs": [ | |
{ | |
"internalType": "uint256[]", | |
"name": "amounts", | |
"type": "uint256[]" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountA", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "reserveA", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "reserveB", | |
"type": "uint256" | |
} | |
], | |
"name": "quote", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountB", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "pure", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "address", | |
"name": "tokenA", | |
"type": "address" | |
}, | |
{ | |
"internalType": "address", | |
"name": "tokenB", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "liquidity", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountAMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountBMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "removeLiquidity", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountA", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountB", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "address", | |
"name": "token", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "liquidity", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountTokenMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountETHMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "removeLiquidityETH", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountToken", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountETH", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "address", | |
"name": "token", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "liquidity", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountTokenMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountETHMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "removeLiquidityETHSupportingFeeOnTransferTokens", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountETH", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "address", | |
"name": "token", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "liquidity", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountTokenMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountETHMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "bool", | |
"name": "approveMax", | |
"type": "bool" | |
}, | |
{ | |
"internalType": "uint8", | |
"name": "v", | |
"type": "uint8" | |
}, | |
{ | |
"internalType": "bytes32", | |
"name": "r", | |
"type": "bytes32" | |
}, | |
{ | |
"internalType": "bytes32", | |
"name": "s", | |
"type": "bytes32" | |
} | |
], | |
"name": "removeLiquidityETHWithPermit", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountToken", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountETH", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "address", | |
"name": "token", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "liquidity", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountTokenMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountETHMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "bool", | |
"name": "approveMax", | |
"type": "bool" | |
}, | |
{ | |
"internalType": "uint8", | |
"name": "v", | |
"type": "uint8" | |
}, | |
{ | |
"internalType": "bytes32", | |
"name": "r", | |
"type": "bytes32" | |
}, | |
{ | |
"internalType": "bytes32", | |
"name": "s", | |
"type": "bytes32" | |
} | |
], | |
"name": "removeLiquidityETHWithPermitSupportingFeeOnTransferTokens", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountETH", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "address", | |
"name": "tokenA", | |
"type": "address" | |
}, | |
{ | |
"internalType": "address", | |
"name": "tokenB", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "liquidity", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountAMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountBMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "bool", | |
"name": "approveMax", | |
"type": "bool" | |
}, | |
{ | |
"internalType": "uint8", | |
"name": "v", | |
"type": "uint8" | |
}, | |
{ | |
"internalType": "bytes32", | |
"name": "r", | |
"type": "bytes32" | |
}, | |
{ | |
"internalType": "bytes32", | |
"name": "s", | |
"type": "bytes32" | |
} | |
], | |
"name": "removeLiquidityWithPermit", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountA", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountB", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountOut", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address[]", | |
"name": "path", | |
"type": "address[]" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "swapETHForExactTokens", | |
"outputs": [ | |
{ | |
"internalType": "uint256[]", | |
"name": "amounts", | |
"type": "uint256[]" | |
} | |
], | |
"stateMutability": "payable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountOutMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address[]", | |
"name": "path", | |
"type": "address[]" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "swapExactETHForTokens", | |
"outputs": [ | |
{ | |
"internalType": "uint256[]", | |
"name": "amounts", | |
"type": "uint256[]" | |
} | |
], | |
"stateMutability": "payable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountOutMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address[]", | |
"name": "path", | |
"type": "address[]" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "swapExactETHForTokensSupportingFeeOnTransferTokens", | |
"outputs": [], | |
"stateMutability": "payable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountIn", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountOutMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address[]", | |
"name": "path", | |
"type": "address[]" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "swapExactTokensForETH", | |
"outputs": [ | |
{ | |
"internalType": "uint256[]", | |
"name": "amounts", | |
"type": "uint256[]" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountIn", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountOutMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address[]", | |
"name": "path", | |
"type": "address[]" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "swapExactTokensForETHSupportingFeeOnTransferTokens", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountIn", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountOutMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address[]", | |
"name": "path", | |
"type": "address[]" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "swapExactTokensForTokens", | |
"outputs": [ | |
{ | |
"internalType": "uint256[]", | |
"name": "amounts", | |
"type": "uint256[]" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountIn", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountOutMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address[]", | |
"name": "path", | |
"type": "address[]" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "swapExactTokensForTokensSupportingFeeOnTransferTokens", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountOut", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountInMax", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address[]", | |
"name": "path", | |
"type": "address[]" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "swapTokensForExactETH", | |
"outputs": [ | |
{ | |
"internalType": "uint256[]", | |
"name": "amounts", | |
"type": "uint256[]" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountOut", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountInMax", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address[]", | |
"name": "path", | |
"type": "address[]" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "swapTokensForExactTokens", | |
"outputs": [ | |
{ | |
"internalType": "uint256[]", | |
"name": "amounts", | |
"type": "uint256[]" | |
} | |
], | |
"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": [], | |
"name": "WETH", | |
"outputs": [ | |
{ | |
"internalType": "address", | |
"name": "", | |
"type": "address" | |
} | |
], | |
"stateMutability": "pure", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "address", | |
"name": "tokenA", | |
"type": "address" | |
}, | |
{ | |
"internalType": "address", | |
"name": "tokenB", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountADesired", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountBDesired", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountAMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountBMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "addLiquidity", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountA", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountB", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "liquidity", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "address", | |
"name": "token", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountTokenDesired", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountTokenMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountETHMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "addLiquidityETH", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountToken", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountETH", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "liquidity", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "payable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [], | |
"name": "factory", | |
"outputs": [ | |
{ | |
"internalType": "address", | |
"name": "", | |
"type": "address" | |
} | |
], | |
"stateMutability": "pure", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountOut", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "reserveIn", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "reserveOut", | |
"type": "uint256" | |
} | |
], | |
"name": "getAmountIn", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountIn", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "pure", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountIn", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "reserveIn", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "reserveOut", | |
"type": "uint256" | |
} | |
], | |
"name": "getAmountOut", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountOut", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "pure", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountOut", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address[]", | |
"name": "path", | |
"type": "address[]" | |
} | |
], | |
"name": "getAmountsIn", | |
"outputs": [ | |
{ | |
"internalType": "uint256[]", | |
"name": "amounts", | |
"type": "uint256[]" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountIn", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address[]", | |
"name": "path", | |
"type": "address[]" | |
} | |
], | |
"name": "getAmountsOut", | |
"outputs": [ | |
{ | |
"internalType": "uint256[]", | |
"name": "amounts", | |
"type": "uint256[]" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountA", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "reserveA", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "reserveB", | |
"type": "uint256" | |
} | |
], | |
"name": "quote", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountB", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "pure", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "address", | |
"name": "tokenA", | |
"type": "address" | |
}, | |
{ | |
"internalType": "address", | |
"name": "tokenB", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "liquidity", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountAMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountBMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "removeLiquidity", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountA", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountB", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "address", | |
"name": "token", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "liquidity", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountTokenMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountETHMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "removeLiquidityETH", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountToken", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountETH", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "address", | |
"name": "token", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "liquidity", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountTokenMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountETHMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "removeLiquidityETHSupportingFeeOnTransferTokens", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountETH", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "address", | |
"name": "token", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "liquidity", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountTokenMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountETHMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "bool", | |
"name": "approveMax", | |
"type": "bool" | |
}, | |
{ | |
"internalType": "uint8", | |
"name": "v", | |
"type": "uint8" | |
}, | |
{ | |
"internalType": "bytes32", | |
"name": "r", | |
"type": "bytes32" | |
}, | |
{ | |
"internalType": "bytes32", | |
"name": "s", | |
"type": "bytes32" | |
} | |
], | |
"name": "removeLiquidityETHWithPermit", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountToken", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountETH", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "address", | |
"name": "token", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "liquidity", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountTokenMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountETHMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "bool", | |
"name": "approveMax", | |
"type": "bool" | |
}, | |
{ | |
"internalType": "uint8", | |
"name": "v", | |
"type": "uint8" | |
}, | |
{ | |
"internalType": "bytes32", | |
"name": "r", | |
"type": "bytes32" | |
}, | |
{ | |
"internalType": "bytes32", | |
"name": "s", | |
"type": "bytes32" | |
} | |
], | |
"name": "removeLiquidityETHWithPermitSupportingFeeOnTransferTokens", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountETH", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "address", | |
"name": "tokenA", | |
"type": "address" | |
}, | |
{ | |
"internalType": "address", | |
"name": "tokenB", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "liquidity", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountAMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountBMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "bool", | |
"name": "approveMax", | |
"type": "bool" | |
}, | |
{ | |
"internalType": "uint8", | |
"name": "v", | |
"type": "uint8" | |
}, | |
{ | |
"internalType": "bytes32", | |
"name": "r", | |
"type": "bytes32" | |
}, | |
{ | |
"internalType": "bytes32", | |
"name": "s", | |
"type": "bytes32" | |
} | |
], | |
"name": "removeLiquidityWithPermit", | |
"outputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountA", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountB", | |
"type": "uint256" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountOut", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address[]", | |
"name": "path", | |
"type": "address[]" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "swapETHForExactTokens", | |
"outputs": [ | |
{ | |
"internalType": "uint256[]", | |
"name": "amounts", | |
"type": "uint256[]" | |
} | |
], | |
"stateMutability": "payable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountOutMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address[]", | |
"name": "path", | |
"type": "address[]" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "swapExactETHForTokens", | |
"outputs": [ | |
{ | |
"internalType": "uint256[]", | |
"name": "amounts", | |
"type": "uint256[]" | |
} | |
], | |
"stateMutability": "payable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountOutMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address[]", | |
"name": "path", | |
"type": "address[]" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "swapExactETHForTokensSupportingFeeOnTransferTokens", | |
"outputs": [], | |
"stateMutability": "payable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountIn", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountOutMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address[]", | |
"name": "path", | |
"type": "address[]" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "swapExactTokensForETH", | |
"outputs": [ | |
{ | |
"internalType": "uint256[]", | |
"name": "amounts", | |
"type": "uint256[]" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountIn", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountOutMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address[]", | |
"name": "path", | |
"type": "address[]" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "swapExactTokensForETHSupportingFeeOnTransferTokens", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountIn", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountOutMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address[]", | |
"name": "path", | |
"type": "address[]" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "swapExactTokensForTokens", | |
"outputs": [ | |
{ | |
"internalType": "uint256[]", | |
"name": "amounts", | |
"type": "uint256[]" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountIn", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountOutMin", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address[]", | |
"name": "path", | |
"type": "address[]" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "swapExactTokensForTokensSupportingFeeOnTransferTokens", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountOut", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountInMax", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address[]", | |
"name": "path", | |
"type": "address[]" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "swapTokensForExactETH", | |
"outputs": [ | |
{ | |
"internalType": "uint256[]", | |
"name": "amounts", | |
"type": "uint256[]" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "uint256", | |
"name": "amountOut", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "amountInMax", | |
"type": "uint256" | |
}, | |
{ | |
"internalType": "address[]", | |
"name": "path", | |
"type": "address[]" | |
}, | |
{ | |
"internalType": "address", | |
"name": "to", | |
"type": "address" | |
}, | |
{ | |
"internalType": "uint256", | |
"name": "deadline", | |
"type": "uint256" | |
} | |
], | |
"name": "swapTokensForExactTokens", | |
"outputs": [ | |
{ | |
"internalType": "uint256[]", | |
"name": "amounts", | |
"type": "uint256[]" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
} | |
], | |
"devdoc": { | |
"kind": "dev", | |
"methods": {}, | |
"version": 1 | |
}, | |
"userdoc": { | |
"kind": "user", | |
"methods": {}, | |
"version": 1 | |
} | |
}, | |
"settings": { | |
"compilationTarget": { | |
"gist-e71aab73726c5a2f99ee00c1a70cfef8/AlarmClockSample.sol": "ISmartSwapRouter02" | |
}, | |
"evmVersion": "istanbul", | |
"libraries": {}, | |
"metadata": { | |
"bytecodeHash": "ipfs" | |
}, | |
"optimizer": { | |
"enabled": false, | |
"runs": 200 | |
}, | |
"remappings": [] | |
}, | |
"sources": { | |
"gist-e71aab73726c5a2f99ee00c1a70cfef8/AlarmClockSample.sol": { | |
"keccak256": "0x7117df9c260edabce0bc665b05bc1ec5764b56ff0d2d497a986d82b775ff3f72", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://c68e3bb84e60a914c7150824fc7f6cc0c1a81978efabba2299049622f01e8adf", | |
"dweb:/ipfs/QmTgaXVG3AWvQpZDidQvro5s4Be7ramVk12nnghJhYWS5i" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/Chainlink.sol": { | |
"keccak256": "0x7bef34fd97f611103c6113025e3d6af755f326069767e72266698f64258e62b6", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://82125916319b872093aa8599d2c00bd07d363386a74a4d0268c6edf25c366f82", | |
"dweb:/ipfs/QmXTnVy1XEw387NduvHHFQNmnzYTwFUhVz95kRvRrcwdHd" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/ChainlinkClient.sol": { | |
"keccak256": "0x9f8883b8b5b76bba151e5f30d4c353b8a3f15ee3d97117deee4cccd91fe8640f", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://ee9b132779ac24df4f8a5e45dfc256acc70eb5e43f715de36593e488f20a44ff", | |
"dweb:/ipfs/QmagJ1htVpP2ZYLAdHEpSEMx1Xd3csbUHAhLctryVDsNFg" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/interfaces/ChainlinkRequestInterface.sol": { | |
"keccak256": "0xe513c0f60edf13da7d82625489cf2008c7b66170f3b1ed1606b84c73f95b17ad", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://78e083ef252b80bb63a5aa126bc7283cd9b88767dfdf0190d46802bc32756ecf", | |
"dweb:/ipfs/QmdTyEQwX5ecoXR1rBh8DLDJpCYVDM85JjjR2sEJdE9wAA" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/interfaces/ENSInterface.sol": { | |
"keccak256": "0xdef864af6e516477773ea246b73531b1836de5bea4ac1cfd8be6e7f4b3f3c3fd", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://ad3346f5a393cd62d8de678a77d8dc323d8f9e21f0aaa504d0d0b990c8b61477", | |
"dweb:/ipfs/QmQ2n8329Fzb7Zbzk5wqYvAfKJ9QPwTdCUmm9zUqhL67a1" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/interfaces/LinkTokenInterface.sol": { | |
"keccak256": "0xe245a7be950c94d87bb775ae9ee9fbd693fbe2987778e6ce0b04605ea44b7b68", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://bd2c3165d949fc66fe407b96eb3dc2092c7e800f4c073b411bf7b96de3e156c9", | |
"dweb:/ipfs/QmcfJhR1Np4GsLWnww2Duqks2wEzYk8VDTvCAYy7MisG1r" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/interfaces/PointerInterface.sol": { | |
"keccak256": "0x08aed19c3bef1ae2d90fc0d9d28a497fd7f312991ed08fedfe545de6b9a476e4", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://b2e7b4acfbd4cfbd4c3e266011955954ec0f5a2323647e81b936c66cb35e1b5e", | |
"dweb:/ipfs/QmXVrpdo76r2WhxE7gJPj3dGycZYKKvK39VNVaB7HyhAbT" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/vendor/BufferChainlink.sol": { | |
"keccak256": "0x14f13139229a2fef8f705f29f91de0bc81bcd5070ec75b4bd3fd82c1536ca685", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://9a403d7f17b316c7b8837a25df0563de2a1c3121b7cd43473abce8ce6742bd29", | |
"dweb:/ipfs/QmWZYi4xJGjPt1pEM7mS7XsA1eF2zpcxiiuGHuiTndXHo7" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.6/vendor/CBORChainlink.sol": { | |
"keccak256": "0xe7c6e4290ac2a41a138e6bd89d89a2779f66847a5ee6fb5a6f2a3386e5ce589d", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://1eb0e7821c4963b125b47c93e31cd6e073d2b87550651054fc526e63915d92ab", | |
"dweb:/ipfs/QmVJq2sNTzX4Hfyway8JiY4RoQw4vQRSbzJWbsC7JsiyUs" | |
] | |
}, | |
"https://github.com/smartcontractkit/chainlink/blob/develop/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": "", | |
"opcodes": "", | |
"sourceMap": "" | |
}, | |
"deployedBytecode": { | |
"immutableReferences": {}, | |
"linkReferences": {}, | |
"object": "", | |
"opcodes": "", | |
"sourceMap": "" | |
}, | |
"gasEstimates": null, | |
"methodIdentifiers": { | |
"checkUpkeep(bytes)": "6e04ff0d", | |
"performUpkeep(bytes)": "4585e33b" | |
} | |
}, | |
"abi": [ | |
{ | |
"inputs": [ | |
{ | |
"internalType": "bytes", | |
"name": "checkData", | |
"type": "bytes" | |
} | |
], | |
"name": "checkUpkeep", | |
"outputs": [ | |
{ | |
"internalType": "bool", | |
"name": "upkeepNeeded", | |
"type": "bool" | |
}, | |
{ | |
"internalType": "bytes", | |
"name": "performData", | |
"type": "bytes" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "bytes", | |
"name": "performData", | |
"type": "bytes" | |
} | |
], | |
"name": "performUpkeep", | |
"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": [ | |
{ | |
"internalType": "bytes", | |
"name": "checkData", | |
"type": "bytes" | |
} | |
], | |
"name": "checkUpkeep", | |
"outputs": [ | |
{ | |
"internalType": "bool", | |
"name": "upkeepNeeded", | |
"type": "bool" | |
}, | |
{ | |
"internalType": "bytes", | |
"name": "performData", | |
"type": "bytes" | |
} | |
], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
}, | |
{ | |
"inputs": [ | |
{ | |
"internalType": "bytes", | |
"name": "performData", | |
"type": "bytes" | |
} | |
], | |
"name": "performUpkeep", | |
"outputs": [], | |
"stateMutability": "nonpayable", | |
"type": "function" | |
} | |
], | |
"devdoc": { | |
"kind": "dev", | |
"methods": {}, | |
"version": 1 | |
}, | |
"userdoc": { | |
"kind": "user", | |
"methods": {}, | |
"version": 1 | |
} | |
}, | |
"settings": { | |
"compilationTarget": { | |
"gist-62587a7f0885c4cbdbd587ca0dc74a12/Counter.sol": "KeeperCompatibleInterface" | |
}, | |
"evmVersion": "istanbul", | |
"libraries": {}, | |
"metadata": { | |
"bytecodeHash": "ipfs" | |
}, | |
"optimizer": { | |
"enabled": false, | |
"runs": 200 | |
}, | |
"remappings": [] | |
}, | |
"sources": { | |
"@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.sol": { | |
"keccak256": "0x8895ce4f46aba18ee3cdb7b1d180f79edb868225781f60993c7b2181e2ee2583", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://4472c14df5f311d7a2eff1dfa55d9b4d39a21b0a0ff905fcbbf6913551086a4c", | |
"dweb:/ipfs/QmQvwFk1SBaLMm4pmZCz7UEhfaXM8kUWu5VG71VFFuMxjF" | |
] | |
}, | |
"gist-62587a7f0885c4cbdbd587ca0dc74a12/Counter.sol": { | |
"keccak256": "0x198a7d7e1c5c3a8f63bdeae97c8b7ffa6c440f2cbce93ebb9ac115e795bc58eb", | |
"urls": [ | |
"bzz-raw://b7005a2ceda0235dea0a2194bfafbbe116012cc89296b8430f24c2e01733fb01", | |
"dweb:/ipfs/QmP4GGcJfC7dmPGbFH4StJRBGSn4djpCoBzKqU77GK4zXC" | |
] | |
} | |
}, | |
"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": "608060405234801561001057600080fd5b50739326bfa02add2366b30bacb125260af6410313316000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061016b806100746000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80638e15f47314610030575b600080fd5b61003861004e565b6040518082815260200191505060405180910390f35b60008060008060008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156100bd57600080fd5b505afa1580156100d1573d6000803e3d6000fd5b505050506040513d60a08110156100e757600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050509450945094509450945083955050505050509056fea26469706673582212205bfd3ee0ad57dcb3c3b1148c061b2a9b0a8fb1c2be9abf4bf4baf780dfd54a2464736f6c634300060c0033", | |
"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 0x16B 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 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 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xD1 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 0xE7 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 JUMPDEST REVERT RETURNDATACOPY 0xE0 0xAD JUMPI 0xDC 0xB3 0xC3 0xB1 EQ DUP13 MOD SHL 0x2A SWAP12 EXP DUP16 0xB1 0xC2 0xBE SWAP11 0xBF 0x4B DELEGATECALL 0xBA 0xF7 DUP1 0xDF 0xD5 0x4A 0x24 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ", | |
"sourceMap": "219:649:1:-:0;;;422:115;;;;;;;;;;487:42;453:9;;:77;;;;;;;;;;;;;;;;;;219:649;;;;;;" | |
}, | |
"deployedBytecode": { | |
"immutableReferences": {}, | |
"linkReferences": {}, | |
"object": "608060405234801561001057600080fd5b506004361061002b5760003560e01c80638e15f47314610030575b600080fd5b61003861004e565b6040518082815260200191505060405180910390f35b60008060008060008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b1580156100bd57600080fd5b505afa1580156100d1573d6000803e3d6000fd5b505050506040513d60a08110156100e757600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050509450945094509450945083955050505050509056fea26469706673582212205bfd3ee0ad57dcb3c3b1148c061b2a9b0a8fb1c2be9abf4bf4baf780dfd54a2464736f6c634300060c0033", | |
"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 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 0xBD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0xD1 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 0xE7 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 JUMPDEST REVERT RETURNDATACOPY 0xE0 0xAD JUMPI 0xDC 0xB3 0xC3 0xB1 EQ DUP13 MOD SHL 0x2A SWAP12 EXP DUP16 0xB1 0xC2 0xBE SWAP11 0xBF 0x4B DELEGATECALL 0xBA 0xF7 DUP1 0xDF 0xD5 0x4A 0x24 PUSH5 0x736F6C6343 STOP MOD 0xC STOP CALLER ", | |
"sourceMap": "219:649:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;591:275;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;638:3;667:14;696:9;719:14;747;775:22;810:9;;;;;;;;;;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;653:184;;;;;;;;;;854:5;847:12;;;;;;;591:275;:::o" | |
}, | |
"gasEstimates": { | |
"creation": { | |
"codeDepositCost": "72600", | |
"executionCost": "20990", | |
"totalCost": "93590" | |
}, | |
"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.12+commit.27d51765" | |
}, | |
"language": "Solidity", | |
"output": { | |
"abi": [ | |
{ | |
"inputs": [], | |
"stateMutability": "nonpayable", | |
"type": "constructor" | |
}, | |
{ | |
"inputs": [], | |
"name": "getLatestPrice", | |
"outputs": [ | |
{ | |
"internalType": "int256", | |
"name": "", | |
"type": "int256" | |
} | |
], | |
"stateMutability": "view", | |
"type": "function" | |
} | |
], | |
"devdoc": { | |
"kind": "dev", | |
"methods": {}, | |
"version": 1 | |
}, | |
"userdoc": { | |
"kind": "user", | |
"methods": { | |
"constructor": "Network: Kovan Aggregator: ETH/USD Address: 0x9326BFA02ADD2366b30bacB125260Af641031331", | |
"getLatestPrice()": { | |
"notice": "Returns the latest price" | |
} | |
}, | |
"version": 1 | |
} | |
}, | |
"settings": { | |
"compilationTarget": { | |
"gist-a90779ce7087be3379a2b5cee0ea2858/PriceConsumerV3.sol": "PriceConsumerV3" | |
}, | |
"evmVersion": "istanbul", | |
"libraries": {}, | |
"metadata": { | |
"bytecodeHash": "ipfs" | |
}, | |
"optimizer": { | |
"enabled": false, | |
"runs": 200 | |
}, | |
"remappings": [] | |
}, | |
"sources": { | |
"@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.sol": { | |
"keccak256": "0x8895ce4f46aba18ee3cdb7b1d180f79edb868225781f60993c7b2181e2ee2583", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://4472c14df5f311d7a2eff1dfa55d9b4d39a21b0a0ff905fcbbf6913551086a4c", | |
"dweb:/ipfs/QmQvwFk1SBaLMm4pmZCz7UEhfaXM8kUWu5VG71VFFuMxjF" | |
] | |
}, | |
"gist-a90779ce7087be3379a2b5cee0ea2858/PriceConsumerV3.sol": { | |
"keccak256": "0xa3d345d337af95b2ed08611bb5c34bd3e566e2551b6e0a2cca681d4f6181a302", | |
"license": "MIT", | |
"urls": [ | |
"bzz-raw://cd3bedd16d3677e675564679eee109b126c896011b3875f72a318aebf3f72d3c", | |
"dweb:/ipfs/QmXgXzZJf7D5AJkXLoTm25L51XF2UM4gnoLFtGQUPptSvF" | |
] | |
} | |
}, | |
"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": "60c060405234801561001057600080fd5b5073dd3782915140c8f3b190b5d67eac6dc5760c46e973a36085f69e2889c224210f603d836748e7dc00888173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505050507f6c3699283bda56ad74f6b855546325b68d482e983852a7a82979cc4807b641f460001b60018190555067016345785d8a000060028190555060805160601c60a05160601c6108ca61012060003980610304528061056252508060d7528061011452806103d8528061052652506108ca6000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806342619f66146100515780638dc654a21461006f57806394985ddd14610079578063dbdff2c1146100b1575b600080fd5b6100596100cf565b6040518082815260200191505060405180910390f35b6100776100d5565b005b6100af6004803603604081101561008f57600080fd5b810190808035906020019092919080359060200190929190505050610302565b005b6100b96103d1565b6040518082815260200191505060405180910390f35b60035481565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156101af57600080fd5b505afa1580156101c3573d6000803e3d6000fd5b505050506040513d60208110156101d957600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561025357600080fd5b505af1158015610267573d6000803e3d6000fd5b505050506040513d602081101561027d57600080fd5b8101908080519060200190929190505050610300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f556e61626c6520746f207472616e73666572000000000000000000000000000081525060200191505060405180910390fd5b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c0081525060200191505060405180910390fd5b6103cd8282610517565b5050565b60006002547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561047357600080fd5b505afa158015610487573d6000803e3d6000fd5b505050506040513d602081101561049d57600080fd5b810190808051906020019092919050505011610504576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061086a602b913960400191505060405180910390fd5b610512600154600254610522565b905090565b806003819055505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634000aea07f00000000000000000000000000000000000000000000000000000000000000008486600060405160200180838152602001828152602001925050506040516020818303038152906040526040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610632578082015181840152602081019050610617565b50505050905090810190601f16801561065f5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561068057600080fd5b505af1158015610694573d6000803e3d6000fd5b505050506040513d60208110156106aa57600080fd5b81019080805190602001909291905050505060006106dd846000306000808981526020019081526020016000205461072e565b90506107056001600080878152602001908152602001600020546107a890919063ffffffff16565b600080868152602001908152602001600020819055506107258482610830565b91505092915050565b600084848484604051602001808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019450505050506040516020818303038152906040528051906020012060001c9050949350505050565b600080828401905083811015610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000828260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012090509291505056fe4e6f7420656e6f756768204c494e4b202d2066696c6c20636f6e7472616374207769746820666175636574a2646970667358221220dad5b411ae1ecce7cd7ca4e1205a76e7101e8a607fab55fa202f1360f4cde69d64736f6c63430006060033", | |
"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 0x8CA PUSH2 0x120 PUSH1 0x0 CODECOPY DUP1 PUSH2 0x304 MSTORE DUP1 PUSH2 0x562 MSTORE POP DUP1 PUSH1 0xD7 MSTORE DUP1 PUSH2 0x114 MSTORE DUP1 PUSH2 0x3D8 MSTORE DUP1 PUSH2 0x526 MSTORE POP PUSH2 0x8CA 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 0xDBDFF2C1 EQ PUSH2 0xB1 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x59 PUSH2 0xCF 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 0xD5 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 0x302 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xB9 PUSH2 0x3D1 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 0x1AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C3 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 0x1D9 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 0x253 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x267 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 0x27D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x300 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 0x3C3 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 0x3CD DUP3 DUP3 PUSH2 0x517 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 0x473 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x487 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 0x49D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP GT PUSH2 0x504 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 0x86A PUSH1 0x2B SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x512 PUSH1 0x1 SLOAD PUSH1 0x2 SLOAD PUSH2 0x522 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x3 DUP2 SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 PUSH32 0x0 DUP5 DUP7 PUSH1 0x0 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 0x632 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x617 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x65F 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 0x680 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x694 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 0x6AA 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 0x6DD DUP5 PUSH1 0x0 ADDRESS PUSH1 0x0 DUP1 DUP10 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x72E JUMP JUMPDEST SWAP1 POP PUSH2 0x705 PUSH1 0x1 PUSH1 0x0 DUP1 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x7A8 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0x725 DUP5 DUP3 PUSH2 0x830 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 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 0x826 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 0x58221220DAD5B411AE1ECCE7CD7CA4E1205A76E7 LT 0x1E DUP11 PUSH1 0x7F 0xAB SSTORE STATICCALL KECCAK256 0x2F SGT PUSH1 0xF4 0xCD 0xE6 SWAP14 PUSH5 0x736F6C6343 STOP MOD MOD STOP CALLER ", | |
"sourceMap": "470:1644:4:-:0;;;973:341;5:9:-1;2:2;;;27:1;24;17:12;2:2;973:341:4;1025:42;1100;9422:15:0;9405:32;;;;;;;;;;;;9469:5;9443:32;;;;;;;;;;;;9340:140;;1199:66:4::1;1189:76;;:7;:76;;;;1281:14;1275:3;:20;;;;470:1644:::0;;;;;;;;;;;;;;;;" | |
}, | |
"deployedBytecode": { | |
"immutableReferences": { | |
"76": [ | |
{ | |
"length": 32, | |
"start": 215 | |
}, | |
{ | |
"length": 32, | |
"start": 276 | |
}, | |
{ | |
"length": 32, | |
"start": 984 | |
}, | |
{ | |
"length": 32, | |
"start": 1318 | |
} | |
], | |
"78": [ | |
{ | |
"length": 32, | |
"start": 772 | |
}, | |
{ | |
"length": 32, | |
"start": 1378 | |
} | |
] | |
}, | |
"linkReferences": {}, | |
"object": "608060405234801561001057600080fd5b506004361061004c5760003560e01c806342619f66146100515780638dc654a21461006f57806394985ddd14610079578063dbdff2c1146100b1575b600080fd5b6100596100cf565b6040518082815260200191505060405180910390f35b6100776100d5565b005b6100af6004803603604081101561008f57600080fd5b810190808035906020019092919080359060200190929190505050610302565b005b6100b96103d1565b6040518082815260200191505060405180910390f35b60035481565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156101af57600080fd5b505afa1580156101c3573d6000803e3d6000fd5b505050506040513d60208110156101d957600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561025357600080fd5b505af1158015610267573d6000803e3d6000fd5b505050506040513d602081101561027d57600080fd5b8101908080519060200190929190505050610300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f556e61626c6520746f207472616e73666572000000000000000000000000000081525060200191505060405180910390fd5b565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c0081525060200191505060405180910390fd5b6103cd8282610517565b5050565b60006002547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561047357600080fd5b505afa158015610487573d6000803e3d6000fd5b505050506040513d602081101561049d57600080fd5b810190808051906020019092919050505011610504576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061086a602b913960400191505060405180910390fd5b610512600154600254610522565b905090565b806003819055505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634000aea07f00000000000000000000000000000000000000000000000000000000000000008486600060405160200180838152602001828152602001925050506040516020818303038152906040526040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610632578082015181840152602081019050610617565b50505050905090810190601f16801561065f5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561068057600080fd5b505af1158015610694573d6000803e3d6000fd5b505050506040513d60208110156106aa57600080fd5b81019080805190602001909291905050505060006106dd846000306000808981526020019081526020016000205461072e565b90506107056001600080878152602001908152602001600020546107a890919063ffffffff16565b600080868152602001908152602001600020819055506107258482610830565b91505092915050565b600084848484604051602001808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019450505050506040516020818303038152906040528051906020012060001c9050949350505050565b600080828401905083811015610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000828260405160200180838152602001828152602001925050506040516020818303038152906040528051906020012090509291505056fe4e6f7420656e6f756768204c494e4b202d2066696c6c20636f6e7472616374207769746820666175636574a2646970667358221220dad5b411ae1ecce7cd7ca4e1205a76e7101e8a607fab55fa202f1360f4cde69d64736f6c63430006060033", | |
"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 0xDBDFF2C1 EQ PUSH2 0xB1 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x59 PUSH2 0xCF 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 0xD5 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 0x302 JUMP JUMPDEST STOP JUMPDEST PUSH2 0xB9 PUSH2 0x3D1 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 0x1AF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x1C3 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 0x1D9 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 0x253 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x267 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 0x27D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0x300 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 0x3C3 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 0x3CD DUP3 DUP3 PUSH2 0x517 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 0x473 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS STATICCALL ISZERO DUP1 ISZERO PUSH2 0x487 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 0x49D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP GT PUSH2 0x504 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 0x86A PUSH1 0x2B SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x512 PUSH1 0x1 SLOAD PUSH1 0x2 SLOAD PUSH2 0x522 JUMP JUMPDEST SWAP1 POP SWAP1 JUMP JUMPDEST DUP1 PUSH1 0x3 DUP2 SWAP1 SSTORE POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0x4000AEA0 PUSH32 0x0 DUP5 DUP7 PUSH1 0x0 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 0x632 JUMPI DUP1 DUP3 ADD MLOAD DUP2 DUP5 ADD MSTORE PUSH1 0x20 DUP2 ADD SWAP1 POP PUSH2 0x617 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x65F 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 0x680 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x694 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 0x6AA 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 0x6DD DUP5 PUSH1 0x0 ADDRESS PUSH1 0x0 DUP1 DUP10 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x72E JUMP JUMPDEST SWAP1 POP PUSH2 0x705 PUSH1 0x1 PUSH1 0x0 DUP1 DUP8 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD PUSH2 0x7A8 SWAP1 SWAP2 SWAP1 PUSH4 0xFFFFFFFF AND JUMP JUMPDEST PUSH1 0x0 DUP1 DUP7 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 DUP2 SWAP1 SSTORE POP PUSH2 0x725 DUP5 DUP3 PUSH2 0x830 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 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 0x826 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 0x58221220DAD5B411AE1ECCE7CD7CA4E1205A76E7 LT 0x1E DUP11 PUSH1 0x7F 0xAB SSTORE STATICCALL KECCAK256 0x2F SGT PUSH1 0xF4 0xCD 0xE6 SWAP14 PUSH5 0x736F6C6343 STOP MOD MOD STOP CALLER ", | |
"sourceMap": "470:1644:4:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;470:1644:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;591:27:4;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1975:137;;;:::i;:::-;;9675:207:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;9675:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1369:218:4;;;:::i;:::-;;;;;;;;;;;;;;;;;;;591:27;;;;:::o;1975:137::-;2026:4;:13;;;2040:10;2052:4;:14;;;2075:4;2052:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2052:29:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2052:29:4;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;2052:29:4;;;;;;;;;;;;;;;;2026:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2026:56:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2026:56:4;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;2026:56:4;;;;;;;;;;;;;;;;2018:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1975:137::o;9675:207:0:-;9781:14;9767:28;;:10;:28;;;9759:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9837:40;9855:9;9866:10;9837:17;:40::i;:::-;9675:207;;:::o;1369:218:4:-;1412:17;1481:3;;1449:4;:14;;;1472:4;1449:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1449:29:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1449:29:4;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;1449:29:4;;;;;;;;;;;;;;;;:35;1441:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1549:31;1567:7;;1576:3;;1549:17;:31::i;:::-;1542:38;;1369:218;:::o;1658:126::-;1767:10;1752:12;:25;;;;1658:126;;:::o;7818:1030:0:-;7899:17;7926:4;:20;;;7947:14;7963:4;7980:8;6675:1;7969:43;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;7969:43:0;;;7926:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;7926:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7926:87:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7926:87:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;7926:87:0;;;;;;;;;;;;;;;;;8244:15;8263:82;8280:8;6675:1;8321:4;8328:6;:16;8335:8;8328:16;;;;;;;;;;;;8263;:82::i;:::-;8244:101;;8775:23;8796:1;8775:6;:16;8782:8;8775:16;;;;;;;;;;;;:20;;:23;;;;:::i;:::-;8756:6;:16;8763:8;8756:16;;;;;;;;;;;:42;;;;8811:32;8825:8;8835:7;8811:13;:32::i;:::-;8804:39;;;7818:1030;;;;:::o;797:231:1:-;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:1;;;960:62;;;;;;952:71;;944:79;;797:231;;;;;;:::o;863:162:3:-;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:1:-;1500:7;1549:8;1559:13;1532:41;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1532:41:1;;;1522:52;;;;;;1515:59;;1408:171;;;;:::o" | |
}, | |
"gasEstimates": { | |
"creation": { | |
"codeDepositCost": "450000", | |
"executionCost": "infinite", | |
"totalCost": "infinite" | |
}, | |
"external": { | |
"getRandomNumber()": "infinite", | |
"randomResult()": "983", | |
"rawFulfillRandomness(bytes32,uint256)": "infinite", | |
"withdrawLink()": "infinite" | |
}, | |
"internal": { | |
"fulfillRandomness(bytes32,uint256)": "20027" | |
} | |
}, | |
"methodIdentifiers": { | |
"getRandomNumber()": "dbdff2c1", | |
"randomResult()": "42619f66", | |
"rawFulfillRandomness(bytes32,uint256)": "94985ddd", | |
"withdrawLink()": "8dc654a2" | |
} | |
}, | |
"abi": [ | |
{ | |
"inputs": [], | |
"stateMutability": "nonpayable", | |
"type": "constructor" | |
}, | |
{ | |
"inputs": [], | |
"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": [], | |
"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()": { | |
"notice": "Requests randomness " | |
}, | |
"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": { | |
"gist-81aaa1ef3897ec2812f314a3a79618d9/RandomNumberConsumer.sol": "RandomNumberConsumer" | |
}, | |
"evmVersion": "istanbul", | |
"libraries": {}, | |
"metadata": { | |
"bytecodeHash": "ipfs" | |
}, | |
"optimizer": { | |
"enabled": false, | |
"runs": 200 | |
}, | |
"remappings": [] | |
}, | |
"sources": { | |
"@chainlink/contracts/src/v0.6/VRFConsumerBase.sol": { | |
"keccak256": "0x0631170c6f92cfe43a3305379788214a60175d2aa9b4c6716f0c66515e878129", | |
"urls": [ | |
"bzz-raw://86f11fdc9eaa2819cc2405d8137fd6c3338526c8ebc4cb140775b2d4e5500160", | |
"dweb:/ipfs/QmUerSsz6Rfiw83SnJbxerEZsL6C8cv3krfcAxnverKtfk" | |
] | |
}, | |
"@chainlink/contracts/src/v0.6/VRFRequestIDBase.sol": { | |
"keccak256": "0x0c3bd40c63dac8398a979b1228c8ecb1c269c157dd16f2dce2086d2270b65b22", | |
"urls": [ | |
"bzz-raw://ed9db87be9dfb0f763a556d8d80356b08282b8ea48484838cdf470a5c3cd15d5", | |
"dweb:/ipfs/QmPLhwDAS3TPDiEQmTyqXnWBqwEMBSbXtjEiQDSGejoiPt" | |
] | |
}, | |
"@chainlink/contracts/src/v0.6/interfaces/LinkTokenInterface.sol": { | |
"keccak256": "0xe245a7be950c94d87bb775ae9ee9fbd693fbe2987778e6ce0b04605ea44b7b68", | |
"urls": [ | |
"bzz-raw://bd2c3165d949fc66fe407b96eb3dc2092c7e800f4c073b411bf7b96de3e156c9", | |
"dweb:/ipfs/QmcfJhR1Np4GsLWnww2Duqks2wEzYk8VDTvCAYy7MisG1r" | |
] | |
}, | |
"@chainlink/contracts/src/v0.6/vendor/SafeMathChainlink.sol": { | |
"keccak256": "0x105f5e9491f3d0bbdd4f1c7627eb839d69b944bfd803028a01cc083597692c1f", | |
"urls": [ | |
"bzz-raw://ec45a2748a024a947a921183d4102d5e206808588501d85ddc4f5668a009bc73", | |
"dweb:/ipfs/QmRNAMpq7LdWFnJ7wWKGbUuAcURaGSS42PMxtQ4vjrHmp9" | |
] | |
}, | |
"gist-81aaa1ef3897ec2812f314a3a79618d9/RandomNumberConsumer.sol": { | |
"keccak256": "0x812136156b0170f55f9f8b3626dd7c4e34baafdc42b5d0c54011284c9a7a1cc5", | |
"urls": [ | |
"bzz-raw://d2ba5176cd5a43633e902202a6d8661c0ccfc4fb7f1736af841ccca65f9d850b", | |
"dweb:/ipfs/QmeJuhHJPY6U2d6cmcon6KR7GKMbkjyjr5aAMN8Q3unoKu" | |
] | |
} | |
}, | |
"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.7; | |
import "@chainlink/contracts/src/v0.6/interfaces/AggregatorV3Interface.sol"; | |
interface KeeperCompatibleInterface { | |
function checkUpkeep(bytes calldata checkData) external returns (bool upkeepNeeded, bytes memory performData); | |
function performUpkeep(bytes calldata performData) external; | |
} | |
contract Counter is KeeperCompatibleInterface { | |
/** | |
* Public counter variable | |
*/ | |
uint public counter; | |
/** | |
* Use an interval in seconds and a timestamp to slow execution of Upkeep | |
*/ | |
uint public immutable interval; | |
uint public lastTimeStamp; | |
constructor(uint updateInterval) public { | |
interval = updateInterval; | |
lastTimeStamp = block.timestamp; | |
counter = 0; | |
} | |
function checkUpkeep(bytes calldata checkData) external override returns (bool upkeepNeeded, bytes memory performData) { | |
upkeepNeeded = (block.timestamp - lastTimeStamp) > interval; | |
// We don't use the checkData in this example | |
// checkData was defined when the Upkeep was registered | |
performData = checkData; | |
} | |
function performUpkeep(bytes calldata performData) external override { | |
lastTimeStamp = block.timestamp; | |
counter = counter + 1; | |
// We don't use the performData in this example | |
// performData is generated by the Keeper's call to your `checkUpkeep` function | |
performData; | |
} | |
} |
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
/** | |
* Copyright 2017-2021, bZeroX, LLC. All Rights Reserved. | |
* Licensed under the Apache License, Version 2.0. | |
*/ | |
pragma solidity 0.5.17; | |
// import "@openzeppelin-2.5.0/math/SafeMath.sol"; | |
// import "@openzeppelin-2.5.0/ownership/Ownable.sol"; | |
// import "@openzeppelin-2.5.0/token/ERC20/IERC20.sol"; | |
// import "../interfaces/IERC20Detailed.sol"; | |
// import "../core/Constants.sol"; | |
import "./IPriceFeedsExt.sol"; | |
contract PriceFeeds_BSC is IPriceFeedsExt { | |
// using SafeMath for uint256; | |
event GlobalPricingPaused( | |
address indexed sender, | |
bool isPaused | |
); | |
mapping (address => IPriceFeedsExt) public pricesFeeds; // token => pricefeed | |
mapping (address => uint256) public decimals; // decimals of supported tokens | |
bool public globalPricingPaused = false; | |
constructor() | |
public | |
{ | |
// set decimals for ether | |
decimals[address(wethToken)] = 18; | |
} | |
function queryRate( | |
address sourceToken, | |
address destToken) | |
public | |
view | |
returns (uint256 rate, uint256 precision) | |
{ | |
require(!globalPricingPaused, "pricing is paused"); | |
return _queryRate( | |
sourceToken, | |
destToken | |
); | |
} | |
function queryPrecision( | |
address sourceToken, | |
address destToken) | |
public | |
view | |
returns (uint256) | |
{ | |
return sourceToken != destToken ? | |
_getDecimalPrecision(sourceToken, destToken) : | |
WEI_PRECISION; | |
} | |
//// NOTE: This function returns 0 during a pause, rather than a revert. Ensure calling contracts handle correctly. /// | |
function queryReturn( | |
address sourceToken, | |
address destToken, | |
uint256 sourceAmount) | |
public | |
view | |
returns (uint256 destAmount) | |
{ | |
if (globalPricingPaused) { | |
return 0; | |
} | |
(uint256 rate, uint256 precision) = _queryRate( | |
sourceToken, | |
destToken | |
); | |
destAmount = sourceAmount | |
.mul(rate) | |
.div(precision); | |
} | |
function checkPriceDisagreement( | |
address sourceToken, | |
address destToken, | |
uint256 sourceAmount, | |
uint256 destAmount, | |
uint256 maxSlippage) | |
public | |
view | |
returns (uint256 sourceToDestSwapRate) | |
{ | |
require(!globalPricingPaused, "pricing is paused"); | |
(uint256 rate, uint256 precision) = _queryRate( | |
sourceToken, | |
destToken | |
); | |
rate = rate | |
.mul(WEI_PRECISION) | |
.div(precision); | |
sourceToDestSwapRate = destAmount | |
.mul(WEI_PRECISION) | |
.div(sourceAmount); | |
uint256 spreadValue = sourceToDestSwapRate > rate ? | |
sourceToDestSwapRate - rate : | |
rate - sourceToDestSwapRate; | |
if (spreadValue != 0) { | |
spreadValue = spreadValue | |
.mul(WEI_PERCENT_PRECISION) | |
.div(sourceToDestSwapRate); | |
require( | |
spreadValue <= maxSlippage, | |
"price disagreement" | |
); | |
} | |
} | |
function amountInEth( | |
address tokenAddress, | |
uint256 amount) | |
public | |
view | |
returns (uint256 ethAmount) | |
{ | |
if (tokenAddress == address(wethToken)) { | |
ethAmount = amount; | |
} else { | |
(uint toEthRate, uint256 toEthPrecision) = queryRate( | |
tokenAddress, | |
address(wethToken) | |
); | |
ethAmount = amount | |
.mul(toEthRate) | |
.div(toEthPrecision); | |
} | |
} | |
function getMaxDrawdown( | |
address loanToken, | |
address collateralToken, | |
uint256 loanAmount, | |
uint256 collateralAmount, | |
uint256 margin) | |
public | |
view | |
returns (uint256 maxDrawdown) | |
{ | |
uint256 loanToCollateralAmount; | |
if (collateralToken == loanToken) { | |
loanToCollateralAmount = loanAmount; | |
} else { | |
(uint256 rate, uint256 precision) = queryRate( | |
loanToken, | |
collateralToken | |
); | |
loanToCollateralAmount = loanAmount | |
.mul(rate) | |
.div(precision); | |
} | |
uint256 combined = loanToCollateralAmount | |
.add( | |
loanToCollateralAmount | |
.mul(margin) | |
.div(WEI_PERCENT_PRECISION) | |
); | |
maxDrawdown = collateralAmount > combined ? | |
collateralAmount - combined : | |
0; | |
} | |
function getCurrentMarginAndCollateralSize( | |
address loanToken, | |
address collateralToken, | |
uint256 loanAmount, | |
uint256 collateralAmount) | |
public | |
view | |
returns (uint256 currentMargin, uint256 collateralInEthAmount) | |
{ | |
(currentMargin,) = getCurrentMargin( | |
loanToken, | |
collateralToken, | |
loanAmount, | |
collateralAmount | |
); | |
collateralInEthAmount = amountInEth( | |
collateralToken, | |
collateralAmount | |
); | |
} | |
function getCurrentMargin( | |
address loanToken, | |
address collateralToken, | |
uint256 loanAmount, | |
uint256 collateralAmount) | |
public | |
view | |
returns (uint256 currentMargin, uint256 collateralToLoanRate) | |
{ | |
uint256 collateralToLoanAmount; | |
if (collateralToken == loanToken) { | |
collateralToLoanAmount = collateralAmount; | |
collateralToLoanRate = WEI_PRECISION; | |
} else { | |
uint256 collateralToLoanPrecision; | |
(collateralToLoanRate, collateralToLoanPrecision) = queryRate( | |
collateralToken, | |
loanToken | |
); | |
collateralToLoanRate = collateralToLoanRate | |
.mul(WEI_PRECISION) | |
.div(collateralToLoanPrecision); | |
collateralToLoanAmount = collateralAmount | |
.mul(collateralToLoanRate) | |
.div(WEI_PRECISION); | |
} | |
if (loanAmount != 0 && collateralToLoanAmount >= loanAmount) { | |
currentMargin = collateralToLoanAmount | |
.sub(loanAmount) | |
.mul(WEI_PERCENT_PRECISION) | |
.div(loanAmount); | |
} | |
} | |
function shouldLiquidate( | |
address loanToken, | |
address collateralToken, | |
uint256 loanAmount, | |
uint256 collateralAmount, | |
uint256 maintenanceMargin) | |
public | |
view | |
returns (bool) | |
{ | |
(uint256 currentMargin,) = getCurrentMargin( | |
loanToken, | |
collateralToken, | |
loanAmount, | |
collateralAmount | |
); | |
return currentMargin <= maintenanceMargin; | |
} | |
// returns per unit gas cost denominated in payToken * 1e36 | |
function getFastGasPrice( | |
address payToken) | |
external | |
view | |
returns (uint256) | |
{ | |
uint256 gasPrice = _getFastGasPrice() | |
.mul(WEI_PRECISION * WEI_PRECISION); | |
if (payToken != address(wethToken) && payToken != address(0)) { | |
require(!globalPricingPaused, "pricing is paused"); | |
(uint256 rate, uint256 precision) = _queryRate( | |
address(wethToken), | |
payToken | |
); | |
gasPrice = gasPrice | |
.mul(rate) | |
.div(precision); | |
} | |
return gasPrice; | |
} | |
/* | |
* Owner functions | |
*/ | |
function setPriceFeed( | |
address[] calldata tokens, | |
IPriceFeedsExt[] calldata feeds) | |
external | |
onlyOwner | |
{ | |
require(tokens.length == feeds.length, "count mismatch"); | |
for (uint256 i = 0; i < tokens.length; i++) { | |
pricesFeeds[tokens[i]] = feeds[i]; | |
} | |
} | |
function setDecimals( | |
IERC20Detailed[] calldata tokens) | |
external | |
onlyOwner | |
{ | |
for (uint256 i = 0; i < tokens.length; i++) { | |
decimals[address(tokens[i])] = tokens[i].decimals(); | |
} | |
} | |
function setGlobalPricingPaused( | |
bool isPaused) | |
external | |
onlyOwner | |
{ | |
globalPricingPaused = isPaused; | |
emit GlobalPricingPaused( | |
msg.sender, | |
isPaused | |
); | |
} | |
/* | |
* Internal functions | |
*/ | |
function _queryRate( | |
address sourceToken, | |
address destToken) | |
internal | |
view | |
returns (uint256 rate, uint256 precision) | |
{ | |
if (sourceToken != destToken) { | |
uint256 sourceRate = _queryRateCall(sourceToken); | |
uint256 destRate = _queryRateCall(destToken); | |
rate = sourceRate | |
.mul(WEI_PRECISION) | |
.div(destRate); | |
precision = _getDecimalPrecision(sourceToken, destToken); | |
} else { | |
rate = WEI_PRECISION; | |
precision = WEI_PRECISION; | |
} | |
} | |
function _queryRateCall( | |
address token) | |
internal | |
view | |
returns (uint256 rate) | |
{ | |
IPriceFeedsExt _Feed = pricesFeeds[token]; | |
require(address(_Feed) != address(0), "unsupported price feed"); | |
rate = uint256(_Feed.latestAnswer()); | |
require(rate != 0 && (rate >> 128) == 0, "price error"); | |
} | |
function _getDecimalPrecision( | |
address sourceToken, | |
address destToken) | |
internal | |
view | |
returns(uint256) | |
{ | |
if (sourceToken == destToken) { | |
return WEI_PRECISION; | |
} else { | |
uint256 sourceTokenDecimals = decimals[sourceToken]; | |
if (sourceTokenDecimals == 0) | |
sourceTokenDecimals = IERC20Detailed(sourceToken).decimals(); | |
uint256 destTokenDecimals = decimals[destToken]; | |
if (destTokenDecimals == 0) | |
destTokenDecimals = IERC20Detailed(destToken).decimals(); | |
if (destTokenDecimals >= sourceTokenDecimals) | |
return 10**(SafeMath.sub(18, destTokenDecimals-sourceTokenDecimals)); | |
else | |
return 10**(SafeMath.add(18, sourceTokenDecimals-destTokenDecimals)); | |
} | |
} | |
function _getFastGasPrice() | |
internal | |
view | |
returns (uint256 gasPrice) | |
{ | |
return 10e9; | |
} | |
} |
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 | |
// This example code is designed to quickly deploy an example contract using Remix. | |
pragma solidity ^0.6.7; | |
import "@chainlink/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
// SPDX-License-Identifier: MIT | |
/** This example code is designed to quickly deploy an example contract using Remix. | |
* If you have never used Remix, try our example walkthrough: https://docs.chain.link/docs/example-walkthrough | |
* You will need testnet ETH and LINK. | |
* - Kovan ETH faucet: https://faucet.kovan.network/ | |
* - Kovan LINK faucet: https://kovan.chain.link/ | |
*/ | |
pragma solidity 0.6.6; | |
import "@chainlink/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 | |
*/ | |
function getRandomNumber() public returns (bytes32 requestId) { | |
require(LINK.balanceOf(address(this)) > fee, "Not enough LINK - fill contract with faucet"); | |
return requestRandomness(keyHash, fee); | |
} | |
/** | |
* 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
/** | |
*Submitted for verification at BscScan.com on 2021-07-21 | |
*/ | |
/** | |
*Submitted for verification at BscScan.com on 2021-06-10 | |
*/ | |
/** | |
*Submitted for verification at BscScan.com on 2021-06-07 | |
*/ | |
/** | |
*Submitted for verification at BscScan.com on 2021-06-05 | |
*/ | |
/** | |
*Submitted for verification at BscScan.com on 2021-06-04 | |
*/ | |
// SPDX-License-Identifier: MIT | |
interface IERC20 { | |
function balanceOf(address owner) external view returns (uint); | |
function transfer(address to, uint value) external returns (bool); | |
function transferFrom(address from, address to, uint value) external returns (bool); | |
} | |
contract Context { | |
// Empty internal constructor, to prevent people from mistakenly deploying | |
// an instance of this contract, which should be used via inheritance. | |
constructor() internal {} | |
function _msgSender() internal view returns (address payable) { | |
return msg.sender; | |
} | |
function _msgData() internal view returns (bytes memory) { | |
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 | |
return msg.data; | |
} | |
} | |
// pragma solidity ^0.7.0; | |
library SafeMathChainlink { | |
function add( uint256 a, uint256 b) internal pure returns ( uint256 ) { | |
uint256 c = a + b; | |
require(c >= a, "SafeMath: addition overflow"); | |
return c; | |
} | |
function sub( uint256 a, uint256 b ) internal pure returns ( uint256) { | |
require(b <= a, "SafeMath: subtraction overflow"); | |
uint256 c = a - b; | |
return c; | |
} | |
function mul(uint256 a, uint256 b) internal pure returns ( | |
uint256 | |
) | |
{ | |
if (a == 0) { | |
return 0; | |
} | |
uint256 c = a * b; | |
require(c / a == b, "SafeMath: multiplication overflow"); | |
return c; | |
} | |
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; | |
} | |
function mod( | |
uint256 a, | |
uint256 b | |
) | |
internal | |
pure | |
returns ( | |
uint256 | |
) | |
{ | |
require(b != 0, "SafeMath: modulo by zero"); | |
return a % b; | |
} | |
} | |
// @dev using 0.8.0. | |
// Note: If changing this, Safe Math has to be implemented! | |
pragma solidity 0.6.12; | |
// pragma experimental ABIEncoderV2; | |
// pragma solidity >=0.7.0 <0.9.0; | |
// import "https://github.com/smartcontractkit/chainlink/blob/develop/evm-contracts/src/v0.7/dev/VRFConsumerBase.sol"; | |
contract rigelSmartBidContract is Context{ | |
using SafeMathChainlink for uint256; | |
IERC20 rigel; | |
struct biddersInfo { | |
uint256 _bidAmount; | |
uint timeOut; | |
address user; | |
} | |
struct CreateBid { | |
IERC20 token; | |
address highestBidder; | |
uint256 bidAmount; | |
uint timeOut; | |
uint256 totalBidding; | |
uint256 highestbid; | |
} | |
mapping (uint256 => mapping (address => biddersInfo)) public bidders; | |
mapping (uint256 => address[]) public projBidders; | |
mapping (address => bool) public isAdminAddress; | |
// mapping () | |
// mapping (uint256 => mapping(bytes32 => address[])) allBiddersInEachBid; | |
address public owner; | |
address private devAddress; | |
uint256 public fee; | |
uint256 public randomresult; | |
CreateBid[] public createBid; | |
uint256[] public random; | |
uint256 public numberOfRandomAddess; | |
uint256 amountToBeShare; | |
event bidding( | |
address indexed userAddress, | |
uint256 stakedAmount, | |
uint256 Time | |
); | |
event luckyWinner( | |
address indexed lWinner, | |
uint256 amount, | |
uint time | |
); | |
event oneRand( | |
address indexed oneWinner, | |
uint256 amountWin, | |
uint time | |
); | |
event claimer( | |
address indexed userAddress, | |
uint256 stakedAmount, | |
uint256 Time | |
); | |
// 0xd9145CCE52D386f254917e481eB44e9943F39138 | |
// 5000000000000000000 | |
// constructor( IERC20 bidToken, uint _bidTimeOut, uint256 _bidAmount) { | |
// uint bidTimeOut = block.timestamp + _bidTimeOut; | |
// owner = msg.sender; | |
// createBid.push(CreateBid({ | |
// token : bidToken, | |
// timeOut: bidTimeOut, | |
// bidAmount: _bidAmount, | |
// totalBidding: 0 | |
// })); | |
// } | |
// 35000000000000000000 | |
/* | |
100000000000000000 | |
rigel token: 0x9f0227A21987c1fFab1785BA3eBa60578eC1501B | |
VRF Coordinator: 0xa555fC018435bef5A13C6c6870a9d4C11DEC329C | |
LINK TOKEN: 0x84b9B910527Ad5C03A9Ca831909E21e236EA7b06 | |
KEYHASH: 0xcaf3c3727e033261d383b315559476f48034c13b18f8cafed4d871abe5049186 | |
*/ | |
// CreateBid store; | |
constructor(IERC20 bidToken) public { | |
uint bidTimeOut = block.timestamp.add(600); | |
owner = _msgSender(); | |
isAdminAddress[_msgSender()] = true; | |
address dummyAddress = 0x0000000000000000000000000000000000000000; | |
numberOfRandomAddess = 3; | |
amountToBeShare = 10E18; | |
// address[] memory path; | |
// path[0] = dummyAddress; | |
createBid.push(CreateBid({ | |
token : bidToken, | |
highestBidder: dummyAddress, | |
timeOut: bidTimeOut, | |
bidAmount: 5e18, | |
totalBidding: 0, | |
highestbid: 0 | |
// status: true | |
})); | |
} | |
// Only allow the owner to do specific tasks | |
modifier onlyOwner() { | |
require(_msgSender() == owner,"RGP: YOU ARE NOT THE OWNER."); | |
_; | |
} | |
// Only allow the dev to do specific tasks | |
modifier onlydev() { | |
require(_msgSender() == devAddress,"RGP: YOU ARE NOT THE DEV."); | |
_; | |
} | |
// only allow admin addresses to do specific | |
modifier onlyAdmin() { | |
require(isAdminAddress[_msgSender()]); | |
_; | |
} | |
function bidLength() external view returns (uint256) { | |
return createBid.length; | |
} | |
function multipleAdmin(address[] calldata _adminAddress, bool status) external onlyOwner { | |
if (status == true) { | |
for(uint256 i = 0; i < _adminAddress.length; i++) { | |
isAdminAddress[_adminAddress[i]] = status; | |
} | |
} else{ | |
for(uint256 i = 0; i < _adminAddress.length; i++) { | |
delete(isAdminAddress[_adminAddress[i]]); | |
} | |
} | |
} | |
function addBid(uint256 _bidAmount, IERC20 bidToken, uint _bidTimeOut) public onlyAdmin { | |
uint bidTimeOut = block.timestamp.add(_bidTimeOut); | |
address dummyAddress = 0x0000000000000000000000000000000000000000; | |
address[] memory path; | |
path[0] = dummyAddress; | |
createBid.push(CreateBid({ | |
token : bidToken, | |
highestBidder : 0x0000000000000000000000000000000000000000, | |
timeOut: bidTimeOut, | |
bidAmount : _bidAmount, | |
totalBidding : 0, | |
highestbid : 0 | |
// status : true | |
})); | |
} | |
function submitBid(uint256 _pid, uint256 _quantity) public returns(bytes32 _userHash){ | |
CreateBid storage bid = createBid[_pid]; | |
biddersInfo storage bidder = bidders[_pid][_msgSender()]; | |
// if (block.timestamp > bid.timeOut) { | |
// bid.status = false; | |
// } | |
if (bid.totalBidding == 0) { | |
require(_quantity >= bid.bidAmount, "BID AMOUNT MUST BE GREATER THAN 5"); | |
} | |
if (bid.totalBidding > 0) { | |
require(_quantity > bid.highestbid, "BID MUST BE GREATER THAN HIGHEST BID"); | |
require(_quantity <= (bid.highestbid.add(2E18)), "BID AMOUNT MUST BE LESS THAN OR EQUAL TO 2RGP"); | |
require(block.timestamp < bid.timeOut, "RGP: BIDDING TIME ELLAPSE"); | |
} | |
if (bidder.user == _msgSender()) { | |
UPBid(_pid, _quantity); | |
} else { | |
bid.token.transferFrom(_msgSender(), address(this), _quantity); | |
updatePool(_pid, _quantity); | |
projBidders[_pid].push(_msgSender()); | |
} | |
emit bidding(_msgSender(), _quantity, block.timestamp); | |
return _userHash; | |
} | |
/// Withdraw a bid that was overbid. | |
// function claim(uint256 _pid) public { | |
// CreateBid storage bid = createBid[_pid]; | |
// require(block.timestamp > bid.timeOut, "RGP: BIDDING IS STILL ON PROGRESS"); | |
// require(bid.highestBidder != 0x0000000000000000000000000000000000000000, "SORRY, INVALID ADDRESS"); | |
// require(bid.highestBidder != address(0), "SORRY, INVALID ADDRESS"); | |
// require(bid.highestBidder == _msgSender(), "SORRY, YOU ARE NOT THE TOP BIDDER"); | |
// uint _amount = bid.totalBidding.mul(30E18).div(100E18); | |
// bid.token.transfer(_msgSender(), _amount); | |
// bid.totalBidding = bid.totalBidding.sub(_amount); | |
// expand(); | |
// emit claimer(_msgSender(), _amount, block.timestamp); | |
// } | |
function claim() internal returns (uint256[] memory expandedValues) { | |
uint256 length = createBid.length; | |
for (uint256 pid = 0; pid < length; ++pid){ | |
CreateBid storage bid = createBid[pid]; | |
if(block.timestamp >= bid.timeOut){ | |
uint256 projLength = projBidders[pid].length; | |
for (uint256 i = projLength.sub(numberOfRandomAddess); i < projLength; i++) { | |
expandedValues[i] = projLength; | |
address wallet = projBidders[pid][expandedValues[i]]; | |
uint256 _amount = bid.totalBidding.mul(amountToBeShare).div(100E18); | |
bid.token.transfer(wallet, _amount); | |
emit luckyWinner(wallet, _amount, block.timestamp); | |
} | |
} | |
} | |
random = expandedValues; | |
return expandedValues; | |
} | |
function amountShareAmongBidders(uint256 _newAmount) public onlydev { | |
amountToBeShare = _newAmount; | |
} | |
function changeNumberOfandAddress(uint256 newNumber) public onlydev { | |
numberOfRandomAddess = newNumber; | |
} | |
function getBidTimeOut(uint256 _pid) public view returns(uint256 _timeout) { | |
CreateBid storage bid = createBid[_pid]; | |
return bid.timeOut; | |
} | |
function projID(uint256 _pid) public view returns(uint256) { | |
return projBidders[_pid].length; | |
} | |
function devClaimer(uint256 _pid) public onlydev(){ | |
CreateBid storage bid = createBid[_pid]; | |
uint256 devAmount = bid.totalBidding.mul(20E18).div(100E18); | |
bid.token.transfer(devAddress, devAmount); | |
emit claimer(_msgSender(), devAmount, block.timestamp); | |
} | |
function getTopBid(uint256 _pid) public view returns (address, uint256, uint) { | |
CreateBid storage bid = createBid[_pid]; | |
return (bid.highestBidder, bid.highestbid, bid.timeOut); | |
} | |
function totalBid(uint256 _pid) public view returns (uint256 _bidAmount) { | |
CreateBid storage bid = createBid[_pid]; | |
return (bid.totalBidding); | |
} | |
function UPBid(uint256 _pid, uint256 _quantity) internal { | |
biddersInfo storage bidder = bidders[_pid][msg.sender]; | |
CreateBid storage bid = createBid[_pid]; | |
bidder._bidAmount = bidder._bidAmount.add(_quantity); | |
bidder.timeOut = block.timestamp; | |
bidder.user = _msgSender(); | |
bid.highestbid = bidder._bidAmount.add(_quantity); | |
bid.highestBidder = _msgSender(); | |
bid.totalBidding = bid.totalBidding.add(_quantity); | |
} | |
function updatePool(uint256 _pid, uint256 _quantity) internal { | |
CreateBid storage bid = createBid[_pid]; | |
biddersInfo storage bidder = bidders[_pid][_msgSender()]; | |
bid.highestbid = _quantity; | |
bid.highestBidder = _msgSender(); | |
bid.totalBidding = bid.totalBidding.add(_quantity); | |
bidder._bidAmount = _quantity; | |
bidder.timeOut = block.timestamp; | |
bidder.user = _msgSender(); | |
} | |
function withdrawBidToken(uint256 _pid, address _to, uint256 _amount) onlyOwner external { | |
CreateBid storage bid = createBid[_pid]; | |
uint256 Balalance = bid.token.balanceOf(address(this)); | |
if (_amount > Balalance) { | |
bid.token.transfer(_to, Balalance); | |
} else { | |
bid.token.transfer(_to, _amount); | |
} | |
} | |
function withdrawBNB() external onlyOwner { | |
_msgSender().transfer(address(this).balance); | |
} | |
function setDev( address _devAddress) external onlyOwner () { | |
devAddress = _devAddress; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment