This nametag was submitted by Kleros Curate.
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Transactions Sent
Latest:
N/A
First:
N/A
Funded By
N/A
Latest 25 from a total of 1,427 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Request Rate Upd... | 12221933 | 1245 days ago | IN | 0 ETH | 0.17528803 | ||||
Request Rate Upd... | 12221893 | 1245 days ago | IN | 0 ETH | 0.19281683 | ||||
Request Rate Upd... | 12215391 | 1246 days ago | IN | 0 ETH | 0.17528803 | ||||
Request Rate Upd... | 12215347 | 1246 days ago | IN | 0 ETH | 0.17528803 | ||||
Request Rate Upd... | 12208831 | 1247 days ago | IN | 0 ETH | 0.17528803 | ||||
Request Rate Upd... | 12208773 | 1247 days ago | IN | 0 ETH | 0.17528803 | ||||
Request Rate Upd... | 12202355 | 1248 days ago | IN | 0 ETH | 0.17528803 | ||||
Request Rate Upd... | 12202309 | 1248 days ago | IN | 0 ETH | 0.17528803 | ||||
Request Rate Upd... | 12195902 | 1249 days ago | IN | 0 ETH | 0.17528803 | ||||
Request Rate Upd... | 12195862 | 1249 days ago | IN | 0 ETH | 0.17528803 | ||||
Request Rate Upd... | 12189369 | 1250 days ago | IN | 0 ETH | 0.17528803 | ||||
Request Rate Upd... | 12189318 | 1250 days ago | IN | 0 ETH | 0.17528803 | ||||
Request Rate Upd... | 12182880 | 1251 days ago | IN | 0 ETH | 0.17528803 | ||||
Request Rate Upd... | 12182839 | 1251 days ago | IN | 0 ETH | 0.17528803 | ||||
Request Rate Upd... | 12176349 | 1252 days ago | IN | 0 ETH | 0.17528803 | ||||
Request Rate Upd... | 12176320 | 1252 days ago | IN | 0 ETH | 0.17528803 | ||||
Request Rate Upd... | 12169800 | 1253 days ago | IN | 0 ETH | 0.17528803 | ||||
Request Rate Upd... | 12169757 | 1253 days ago | IN | 0 ETH | 0.19281683 | ||||
Request Rate Upd... | 12163283 | 1254 days ago | IN | 0 ETH | 0.17528803 | ||||
Request Rate Upd... | 12163238 | 1254 days ago | IN | 0 ETH | 0.21209851 | ||||
Request Rate Upd... | 12156819 | 1255 days ago | IN | 0 ETH | 0.17528803 | ||||
Request Rate Upd... | 12156777 | 1255 days ago | IN | 0 ETH | 0.17528803 | ||||
Request Rate Upd... | 12150325 | 1256 days ago | IN | 0 ETH | 0.28230312 | ||||
Request Rate Upd... | 12150278 | 1256 days ago | IN | 0 ETH | 0.21209851 | ||||
Request Rate Upd... | 12143860 | 1257 days ago | IN | 0 ETH | 0.17528803 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
12326931 | 1229 days ago | 0 ETH |
Loading...
Loading
Contract Self Destruct called at Txn Hash 0xadd450de778cf0c9f2b09080485436c81fb12e1c1dd0cf6b7900e7f5b48a532d
Contract Name:
Aggregator
Compiler Version
v0.4.24+commit.e67f0147
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-08-21 */ pragma solidity 0.4.24; /** * @dev A library for working with mutable byte buffers in Solidity. * * Byte buffers are mutable and expandable, and provide a variety of primitives * for writing to them. At any time you can fetch a bytes object containing the * current contents of the buffer. The bytes object should not be stored between * operations, as it may change due to resizing of the buffer. */ library Buffer { /** * @dev Represents a mutable buffer. Buffers have a current value (buf) and * a capacity. The capacity may be longer than the current value, in * which case it can be extended without the need to allocate more memory. */ struct buffer { bytes buf; uint capacity; } /** * @dev Initializes a buffer with an initial capacity. * @param buf The buffer to initialize. * @param capacity The number of bytes of space to allocate the buffer. * @return The buffer, for chaining. */ function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) { if (capacity % 32 != 0) { capacity += 32 - (capacity % 32); } // Allocate space for the buffer data buf.capacity = capacity; assembly { let ptr := mload(0x40) mstore(buf, ptr) mstore(ptr, 0) mstore(0x40, add(32, add(ptr, capacity))) } return buf; } /** * @dev Initializes a new buffer from an existing bytes object. * Changes to the buffer may mutate the original value. * @param b The bytes object to initialize the buffer with. * @return A new buffer. */ function fromBytes(bytes memory b) internal pure returns(buffer memory) { buffer memory buf; buf.buf = b; buf.capacity = b.length; return buf; } function resize(buffer memory buf, uint capacity) private pure { bytes memory oldbuf = buf.buf; init(buf, capacity); append(buf, oldbuf); } function max(uint a, uint b) private pure returns(uint) { if (a > b) { return a; } return b; } /** * @dev Sets buffer length to 0. * @param buf The buffer to truncate. * @return The original buffer, for chaining.. */ function truncate(buffer memory buf) internal pure returns (buffer memory) { assembly { let bufptr := mload(buf) mstore(bufptr, 0) } return buf; } /** * @dev Writes a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param off The start offset to write to. * @param data The data to append. * @param len The number of bytes to copy. * @return The original buffer, for chaining. */ function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) { require(len <= data.length); if (off + len > buf.capacity) { resize(buf, max(buf.capacity, len + off) * 2); } uint dest; uint src; assembly { // Memory address of the buffer data let bufptr := mload(buf) // Length of existing buffer data let buflen := mload(bufptr) // Start address = buffer address + offset + sizeof(buffer length) dest := add(add(bufptr, 32), off) // Update buffer length if we're extending it if gt(add(len, off), buflen) { mstore(bufptr, add(len, off)) } src := add(data, 32) } // Copy word-length chunks while possible for (; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Copy remaining bytes uint mask = 256 ** (32 - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } return buf; } /** * @dev Appends a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @param len The number of bytes to copy. * @return The original buffer, for chaining. */ function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) { return write(buf, buf.buf.length, data, len); } /** * @dev Appends a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chaining. */ function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, data, data.length); } /** * @dev Writes a byte to the buffer. Resizes if doing so would exceed the * capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write the byte at. * @param data The data to append. * @return The original buffer, for chaining. */ function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) { if (off >= buf.capacity) { resize(buf, buf.capacity * 2); } assembly { // Memory address of the buffer data let bufptr := mload(buf) // Length of existing buffer data let buflen := mload(bufptr) // Address = buffer address + sizeof(buffer length) + off let dest := add(add(bufptr, off), 32) mstore8(dest, data) // Update buffer length if we extended it if eq(off, buflen) { mstore(bufptr, add(buflen, 1)) } } return buf; } /** * @dev Appends a byte to the buffer. Resizes if doing so would exceed the * capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chaining. */ function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) { return writeUint8(buf, buf.buf.length, data); } /** * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would * exceed the capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write at. * @param data The data to append. * @param len The number of bytes to write (left-aligned). * @return The original buffer, for chaining. */ function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) { if (len + off > buf.capacity) { resize(buf, (len + off) * 2); } uint mask = 256 ** len - 1; // Right-align data data = data >> (8 * (32 - len)); assembly { // Memory address of the buffer data let bufptr := mload(buf) // Address = buffer address + sizeof(buffer length) + off + len let dest := add(add(bufptr, off), len) mstore(dest, or(and(mload(dest), not(mask)), data)) // Update buffer length if we extended it if gt(add(off, len), mload(bufptr)) { mstore(bufptr, add(off, len)) } } return buf; } /** * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the * capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write at. * @param data The data to append. * @return The original buffer, for chaining. */ function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) { return write(buf, off, bytes32(data), 20); } /** * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chhaining. */ function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, bytes32(data), 20); } /** * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chaining. */ function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, data, 32); } /** * @dev Writes an integer to the buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write at. * @param data The data to append. * @param len The number of bytes to write (right-aligned). * @return The original buffer, for chaining. */ function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) { if (len + off > buf.capacity) { resize(buf, (len + off) * 2); } uint mask = 256 ** len - 1; assembly { // Memory address of the buffer data let bufptr := mload(buf) // Address = buffer address + off + sizeof(buffer length) + len let dest := add(add(bufptr, off), len) mstore(dest, or(and(mload(dest), not(mask)), data)) // Update buffer length if we extended it if gt(add(off, len), mload(bufptr)) { mstore(bufptr, add(off, len)) } } return buf; } /** * @dev Appends a byte to the end of the buffer. Resizes if doing so would * exceed the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer. */ function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) { return writeInt(buf, buf.buf.length, data, len); } } library CBOR { using Buffer for Buffer.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_CONTENT_FREE = 7; function encodeType(Buffer.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(Buffer.buffer memory buf, uint8 major) private pure { buf.appendUint8(uint8((major << 5) | 31)); } function encodeUInt(Buffer.buffer memory buf, uint value) internal pure { encodeType(buf, MAJOR_TYPE_INT, value); } function encodeInt(Buffer.buffer memory buf, int value) internal pure { if(value >= 0) { encodeType(buf, MAJOR_TYPE_INT, uint(value)); } else { encodeType(buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - value)); } } function encodeBytes(Buffer.buffer memory buf, bytes value) internal pure { encodeType(buf, MAJOR_TYPE_BYTES, value.length); buf.append(value); } function encodeString(Buffer.buffer memory buf, string value) internal pure { encodeType(buf, MAJOR_TYPE_STRING, bytes(value).length); buf.append(bytes(value)); } function startArray(Buffer.buffer memory buf) internal pure { encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY); } function startMap(Buffer.buffer memory buf) internal pure { encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP); } function endSequence(Buffer.buffer memory buf) internal pure { encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE); } } /** * @title Library for common Chainlink functions * @dev Uses imported CBOR library for encoding to buffer */ library Chainlink { uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase using CBOR for Buffer.buffer; struct Request { bytes32 id; address callbackAddress; bytes4 callbackFunctionId; uint256 nonce; Buffer.buffer buf; } /** * @notice Initializes a Chainlink request * @dev Sets the ID, callback address, and callback function signature on the request * @param self The uninitialized request * @param _id The Job Specification ID * @param _callbackAddress The callback address * @param _callbackFunction The callback function signature * @return The initialized request */ function initialize( Request memory self, bytes32 _id, address _callbackAddress, bytes4 _callbackFunction ) internal pure returns (Chainlink.Request memory) { Buffer.init(self.buf, defaultBufferSize); self.id = _id; self.callbackAddress = _callbackAddress; self.callbackFunctionId = _callbackFunction; return self; } /** * @notice Sets the data for the buffer without encoding CBOR on-chain * @dev CBOR can be closed with curly-brackets {} or they can be left off * @param self The initialized request * @param _data The CBOR data */ function setBuffer(Request memory self, bytes _data) internal pure { Buffer.init(self.buf, _data.length); Buffer.append(self.buf, _data); } /** * @notice Adds a string value to the request with a given key name * @param self The initialized request * @param _key The name of the key * @param _value The string value to add */ function add(Request memory self, string _key, string _value) internal pure { self.buf.encodeString(_key); self.buf.encodeString(_value); } /** * @notice Adds a bytes value to the request with a given key name * @param self The initialized request * @param _key The name of the key * @param _value The bytes value to add */ function addBytes(Request memory self, string _key, bytes _value) internal pure { self.buf.encodeString(_key); self.buf.encodeBytes(_value); } /** * @notice Adds a int256 value to the request with a given key name * @param self The initialized request * @param _key The name of the key * @param _value The int256 value to add */ function addInt(Request memory self, string _key, int256 _value) internal pure { self.buf.encodeString(_key); self.buf.encodeInt(_value); } /** * @notice Adds a uint256 value to the request with a given key name * @param self The initialized request * @param _key The name of the key * @param _value The uint256 value to add */ function addUint(Request memory self, string _key, uint256 _value) internal pure { self.buf.encodeString(_key); self.buf.encodeUInt(_value); } /** * @notice Adds an array of strings to the request with a given key name * @param self The initialized request * @param _key The name of the key * @param _values The array of string values to add */ function addStringArray(Request memory self, string _key, string[] memory _values) internal pure { self.buf.encodeString(_key); self.buf.startArray(); for (uint256 i = 0; i < _values.length; i++) { self.buf.encodeString(_values[i]); } self.buf.endSequence(); } } 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); } interface LinkTokenInterface { function allowance(address owner, address spender) external returns (uint256 remaining); function approve(address spender, uint256 value) external returns (bool success); function balanceOf(address owner) external returns (uint256 balance); function decimals() external returns (uint8 decimalPlaces); function decreaseApproval(address spender, uint256 addedValue) external returns (bool success); function increaseApproval(address spender, uint256 subtractedValue) external; function name() external returns (string tokenName); function symbol() external returns (string tokenSymbol); function totalSupply() external returns (uint256 totalTokensIssued); function transfer(address to, uint256 value) external returns (bool success); function transferAndCall(address to, uint256 value, bytes data) external returns (bool success); function transferFrom(address from, address to, uint256 value) external returns (bool success); } interface ChainlinkRequestInterface { function oracleRequest( address sender, uint256 payment, bytes32 id, address callbackAddress, bytes4 callbackFunctionId, uint256 nonce, uint256 version, bytes data ) external; function cancelOracleRequest( bytes32 requestId, uint256 payment, bytes4 callbackFunctionId, uint256 expiration ) external; } interface PointerInterface { function getAddress() external view returns (address); } contract ENSResolver { function addr(bytes32 node) public view returns (address); } /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) { // Gas optimization: this is cheaper than asserting 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (_a == 0) { return 0; } c = _a * _b; assert(c / _a == _b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 _a, uint256 _b) internal pure returns (uint256) { // assert(_b > 0); // Solidity automatically throws when dividing by 0 // uint256 c = _a / _b; // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold return _a / _b; } /** * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 _a, uint256 _b) internal pure returns (uint256) { assert(_b <= _a); return _a - _b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) { c = _a + _b; assert(c >= _a); return c; } } /** * @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; using SafeMath for uint256; uint256 constant internal LINK = 10**18; uint256 constant private AMOUNT_OVERRIDE = 0; address constant private SENDER_OVERRIDE = 0x0; uint256 constant private ARGS_VERSION = 1; bytes32 constant private ENS_TOKEN_SUBNAME = keccak256("link"); bytes32 constant private ENS_ORACLE_SUBNAME = keccak256("oracle"); address constant private LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571; ENSInterface private ens; bytes32 private ensNode; LinkTokenInterface private link; ChainlinkRequestInterface private oracle; uint256 private requests = 1; mapping(bytes32 => address) private pendingRequests; event ChainlinkRequested(bytes32 indexed id); event ChainlinkFulfilled(bytes32 indexed id); event ChainlinkCancelled(bytes32 indexed id); /** * @notice Creates a request that can hold additional parameters * @param _specId The Job Specification ID that the request will be created for * @param _callbackAddress The callback address that the response will be sent to * @param _callbackFunctionSignature The callback function signature to use for the callback address * @return A Chainlink Request struct in memory */ function buildChainlinkRequest( bytes32 _specId, address _callbackAddress, bytes4 _callbackFunctionSignature ) internal pure returns (Chainlink.Request memory) { Chainlink.Request memory req; return req.initialize(_specId, _callbackAddress, _callbackFunctionSignature); } /** * @notice Creates a Chainlink request to the stored oracle address * @dev Calls `chainlinkRequestTo` with the stored oracle address * @param _req The initialized Chainlink Request * @param _payment The amount of LINK to send for the request * @return The request ID */ function sendChainlinkRequest(Chainlink.Request memory _req, uint256 _payment) internal returns (bytes32) { return sendChainlinkRequestTo(oracle, _req, _payment); } /** * @notice Creates a Chainlink request to the specified oracle address * @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to * send LINK which creates a request on the target oracle contract. * Emits ChainlinkRequested event. * @param _oracle The address of the oracle for the request * @param _req The initialized Chainlink Request * @param _payment The amount of LINK to send for the request * @return The request ID */ function sendChainlinkRequestTo(address _oracle, Chainlink.Request memory _req, uint256 _payment) internal returns (bytes32 requestId) { requestId = keccak256(abi.encodePacked(this, requests)); _req.nonce = requests; pendingRequests[requestId] = _oracle; emit ChainlinkRequested(requestId); require(link.transferAndCall(_oracle, _payment, encodeRequest(_req)), "unable to transferAndCall to oracle"); requests += 1; return requestId; } /** * @notice Allows a request to be cancelled if it has not been fulfilled * @dev Requires keeping track of the expiration value emitted from the oracle contract. * Deletes the request from the `pendingRequests` mapping. * Emits ChainlinkCancelled event. * @param _requestId The request ID * @param _payment The amount of LINK sent for the request * @param _callbackFunc The callback function specified for the request * @param _expiration The time of the expiration for the request */ function cancelChainlinkRequest( bytes32 _requestId, uint256 _payment, bytes4 _callbackFunc, uint256 _expiration ) internal { ChainlinkRequestInterface requested = ChainlinkRequestInterface(pendingRequests[_requestId]); delete pendingRequests[_requestId]; emit ChainlinkCancelled(_requestId); requested.cancelOracleRequest(_requestId, _payment, _callbackFunc, _expiration); } /** * @notice Sets the stored oracle address * @param _oracle The address of the oracle contract */ function setChainlinkOracle(address _oracle) internal { oracle = ChainlinkRequestInterface(_oracle); } /** * @notice Sets the LINK token address * @param _link The address of the LINK token contract */ function setChainlinkToken(address _link) internal { link = LinkTokenInterface(_link); } /** * @notice Sets the Chainlink token address for the public * network as given by the Pointer contract */ function setPublicChainlinkToken() internal { setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress()); } /** * @notice Retrieves the stored address of the LINK token * @return The address of the LINK token */ function chainlinkTokenAddress() internal view returns (address) { return address(link); } /** * @notice Retrieves the stored address of the oracle contract * @return The address of the oracle contract */ function chainlinkOracleAddress() internal view returns (address) { return address(oracle); } /** * @notice Allows for a request which was created on another contract to be fulfilled * on this contract * @param _oracle The address of the oracle contract that will fulfill the request * @param _requestId The request ID used for the response */ function addChainlinkExternalRequest(address _oracle, bytes32 _requestId) internal notPendingRequest(_requestId) { pendingRequests[_requestId] = _oracle; } /** * @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS * @dev Accounts for subnodes having different resolvers * @param _ens The address of the ENS contract * @param _node The ENS node hash */ function useChainlinkWithENS(address _ens, bytes32 _node) internal { ens = ENSInterface(_ens); ensNode = _node; bytes32 linkSubnode = keccak256(abi.encodePacked(ensNode, ENS_TOKEN_SUBNAME)); ENSResolver resolver = ENSResolver(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 resolver = ENSResolver(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"); _; } } interface AggregatorInterface { function latestAnswer() external view returns (int256); function latestTimestamp() external view returns (uint256); function latestRound() external view returns (uint256); function getAnswer(uint256 roundId) external view returns (int256); function getTimestamp(uint256 roundId) external view returns (uint256); event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 timestamp); event NewRound(uint256 indexed roundId, address indexed startedBy); } library SignedSafeMath { /** * @dev Adds two int256s and makes sure the result doesn't overflow. Signed * integers aren't supported by the SafeMath library, thus this method * @param _a The first number to be added * @param _a The second number to be added */ function add(int256 _a, int256 _b) internal pure returns (int256) { int256 c = _a + _b; require((_b >= 0 && c >= _a) || (_b < 0 && c < _a), "SignedSafeMath: addition overflow"); return c; } } /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address public owner; event OwnershipRenounced(address indexed previousOwner); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor() public { owner = msg.sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to relinquish control of the contract. * @notice Renouncing to ownership will leave the contract without an owner. * It will not be possible to call the functions with the `onlyOwner` * modifier anymore. */ function renounceOwnership() public onlyOwner { emit OwnershipRenounced(owner); owner = address(0); } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function transferOwnership(address _newOwner) public onlyOwner { _transferOwnership(_newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param _newOwner The address to transfer ownership to. */ function _transferOwnership(address _newOwner) internal { require(_newOwner != address(0)); emit OwnershipTransferred(owner, _newOwner); owner = _newOwner; } } /** * @title An example Chainlink contract with aggregation * @notice Requesters can use this contract as a framework for creating * requests to multiple Chainlink nodes and running aggregation * as the contract receives answers. */ contract Aggregator is AggregatorInterface, ChainlinkClient, Ownable { using SignedSafeMath for int256; struct Answer { uint128 minimumResponses; uint128 maxResponses; int256[] responses; } event ResponseReceived(int256 indexed response, uint256 indexed answerId, address indexed sender); int256 private currentAnswerValue; uint256 private updatedTimestampValue; uint256 private latestCompletedAnswer; uint128 public paymentAmount; uint128 public minimumResponses; bytes32[] public jobIds; address[] public oracles; uint256 private answerCounter = 1; mapping(address => bool) public authorizedRequesters; mapping(bytes32 => uint256) private requestAnswers; mapping(uint256 => Answer) private answers; mapping(uint256 => int256) private currentAnswers; mapping(uint256 => uint256) private updatedTimestamps; uint256 constant private MAX_ORACLE_COUNT = 45; /** * @notice Deploy with the address of the LINK token and arrays of matching * length containing the addresses of the oracles and their corresponding * Job IDs. * @dev Sets the LinkToken address for the network, addresses of the oracles, * and jobIds in storage. * @param _link The address of the LINK token * @param _paymentAmount the amount of LINK to be sent to each oracle for each request * @param _minimumResponses the minimum number of responses * before an answer will be calculated * @param _oracles An array of oracle addresses * @param _jobIds An array of Job IDs */ constructor( address _link, uint128 _paymentAmount, uint128 _minimumResponses, address[] _oracles, bytes32[] _jobIds ) public Ownable() { setChainlinkToken(_link); updateRequestDetails(_paymentAmount, _minimumResponses, _oracles, _jobIds); } /** * @notice Creates a Chainlink request for each oracle in the oracles array. * @dev This example does not include request parameters. Reference any documentation * associated with the Job IDs used to determine the required parameters per-request. */ function requestRateUpdate() external ensureAuthorizedRequester() { Chainlink.Request memory request; bytes32 requestId; uint256 oraclePayment = paymentAmount; for (uint i = 0; i < oracles.length; i++) { request = buildChainlinkRequest(jobIds[i], this, this.chainlinkCallback.selector); requestId = sendChainlinkRequestTo(oracles[i], request, oraclePayment); requestAnswers[requestId] = answerCounter; } answers[answerCounter].minimumResponses = minimumResponses; answers[answerCounter].maxResponses = uint128(oracles.length); answerCounter = answerCounter.add(1); emit NewRound(answerCounter, msg.sender); } /** * @notice Receives the answer from the Chainlink node. * @dev This function can only be called by the oracle that received the request. * @param _clRequestId The Chainlink request ID associated with the answer * @param _response The answer provided by the Chainlink node */ function chainlinkCallback(bytes32 _clRequestId, int256 _response) external { validateChainlinkCallback(_clRequestId); uint256 answerId = requestAnswers[_clRequestId]; delete requestAnswers[_clRequestId]; answers[answerId].responses.push(_response); emit ResponseReceived(_response, answerId, msg.sender); updateLatestAnswer(answerId); deleteAnswer(answerId); } /** * @notice Updates the arrays of oracles and jobIds with new values, * overwriting the old values. * @dev Arrays are validated to be equal length. * @param _paymentAmount the amount of LINK to be sent to each oracle for each request * @param _minimumResponses the minimum number of responses * before an answer will be calculated * @param _oracles An array of oracle addresses * @param _jobIds An array of Job IDs */ function updateRequestDetails( uint128 _paymentAmount, uint128 _minimumResponses, address[] _oracles, bytes32[] _jobIds ) public onlyOwner() validateAnswerRequirements(_minimumResponses, _oracles, _jobIds) { paymentAmount = _paymentAmount; minimumResponses = _minimumResponses; jobIds = _jobIds; oracles = _oracles; } /** * @notice Allows the owner of the contract to withdraw any LINK balance * available on the contract. * @dev The contract will need to have a LINK balance in order to create requests. * @param _recipient The address to receive the LINK tokens * @param _amount The amount of LINK to send from the contract */ function transferLINK(address _recipient, uint256 _amount) public onlyOwner() { LinkTokenInterface linkToken = LinkTokenInterface(chainlinkTokenAddress()); require(linkToken.transfer(_recipient, _amount), "LINK transfer failed"); } /** * @notice Called by the owner to permission other addresses to generate new * requests to oracles. * @param _requester the address whose permissions are being set * @param _allowed boolean that determines whether the requester is * permissioned or not */ function setAuthorization(address _requester, bool _allowed) external onlyOwner() { authorizedRequesters[_requester] = _allowed; } /** * @notice Cancels an outstanding Chainlink request. * The oracle contract requires the request ID and additional metadata to * validate the cancellation. Only old answers can be cancelled. * @param _requestId is the identifier for the chainlink request being cancelled * @param _payment is the amount of LINK paid to the oracle for the request * @param _expiration is the time when the request expires */ function cancelRequest( bytes32 _requestId, uint256 _payment, uint256 _expiration ) external ensureAuthorizedRequester() { uint256 answerId = requestAnswers[_requestId]; require(answerId < latestCompletedAnswer, "Cannot modify an in-progress answer"); delete requestAnswers[_requestId]; answers[answerId].responses.push(0); deleteAnswer(answerId); cancelChainlinkRequest( _requestId, _payment, this.chainlinkCallback.selector, _expiration ); } /** * @notice Called by the owner to kill the contract. This transfers all LINK * balance and ETH balance (if there is any) to the owner. */ function destroy() external onlyOwner() { LinkTokenInterface linkToken = LinkTokenInterface(chainlinkTokenAddress()); transferLINK(owner, linkToken.balanceOf(address(this))); selfdestruct(owner); } /** * @dev Performs aggregation of the answers received from the Chainlink nodes. * Assumes that at least half the oracles are honest and so can't contol the * middle of the ordered responses. * @param _answerId The answer ID associated with the group of requests */ function updateLatestAnswer(uint256 _answerId) private ensureMinResponsesReceived(_answerId) ensureOnlyLatestAnswer(_answerId) { uint256 responseLength = answers[_answerId].responses.length; uint256 middleIndex = responseLength.div(2); int256 currentAnswerTemp; if (responseLength % 2 == 0) { int256 median1 = quickselect(answers[_answerId].responses, middleIndex); int256 median2 = quickselect(answers[_answerId].responses, middleIndex.add(1)); // quickselect is 1 indexed currentAnswerTemp = median1.add(median2) / 2; // signed integers are not supported by SafeMath } else { currentAnswerTemp = quickselect(answers[_answerId].responses, middleIndex.add(1)); // quickselect is 1 indexed } currentAnswerValue = currentAnswerTemp; latestCompletedAnswer = _answerId; updatedTimestampValue = now; updatedTimestamps[_answerId] = now; currentAnswers[_answerId] = currentAnswerTemp; emit AnswerUpdated(currentAnswerTemp, _answerId, now); } /** * @notice get the most recently reported answer */ function latestAnswer() external view returns (int256) { return currentAnswers[latestCompletedAnswer]; } /** * @notice get the last updated at block timestamp */ function latestTimestamp() external view returns (uint256) { return updatedTimestamps[latestCompletedAnswer]; } /** * @notice get past rounds answers * @param _roundId the answer number to retrieve the answer for */ function getAnswer(uint256 _roundId) external view returns (int256) { return currentAnswers[_roundId]; } /** * @notice get block timestamp when an answer was last updated * @param _roundId the answer number to retrieve the updated timestamp for */ function getTimestamp(uint256 _roundId) external view returns (uint256) { return updatedTimestamps[_roundId]; } /** * @notice get the latest completed round where the answer was updated */ function latestRound() external view returns (uint256) { return latestCompletedAnswer; } /** * @dev Returns the kth value of the ordered array * See: http://www.cs.yale.edu/homes/aspnes/pinewiki/QuickSelect.html * @param _a The list of elements to pull from * @param _k The index, 1 based, of the elements you want to pull from when ordered */ function quickselect(int256[] memory _a, uint256 _k) private pure returns (int256) { int256[] memory a = _a; uint256 k = _k; uint256 aLen = a.length; int256[] memory a1 = new int256[](aLen); int256[] memory a2 = new int256[](aLen); uint256 a1Len; uint256 a2Len; int256 pivot; uint256 i; while (true) { pivot = a[aLen.div(2)]; a1Len = 0; a2Len = 0; for (i = 0; i < aLen; i++) { if (a[i] < pivot) { a1[a1Len] = a[i]; a1Len++; } else if (a[i] > pivot) { a2[a2Len] = a[i]; a2Len++; } } if (k <= a1Len) { aLen = a1Len; (a, a1) = swap(a, a1); } else if (k > (aLen.sub(a2Len))) { k = k.sub(aLen.sub(a2Len)); aLen = a2Len; (a, a2) = swap(a, a2); } else { return pivot; } } } /** * @dev Swaps the pointers to two uint256 arrays in memory * @param _a The pointer to the first in memory array * @param _b The pointer to the second in memory array */ function swap(int256[] memory _a, int256[] memory _b) private pure returns(int256[] memory, int256[] memory) { return (_b, _a); } /** * @dev Cleans up the answer record if all responses have been received. * @param _answerId The identifier of the answer to be deleted */ function deleteAnswer(uint256 _answerId) private ensureAllResponsesReceived(_answerId) { delete answers[_answerId]; } /** * @dev Prevents taking an action if the minimum number of responses has not * been received for an answer. * @param _answerId The the identifier of the answer that keeps track of the responses. */ modifier ensureMinResponsesReceived(uint256 _answerId) { if (answers[_answerId].responses.length >= answers[_answerId].minimumResponses) { _; } } /** * @dev Prevents taking an action if not all responses are received for an answer. * @param _answerId The the identifier of the answer that keeps track of the responses. */ modifier ensureAllResponsesReceived(uint256 _answerId) { if (answers[_answerId].responses.length == answers[_answerId].maxResponses) { _; } } /** * @dev Prevents taking an action if a newer answer has been recorded. * @param _answerId The current answer's identifier. * Answer IDs are in ascending order. */ modifier ensureOnlyLatestAnswer(uint256 _answerId) { if (latestCompletedAnswer <= _answerId) { _; } } /** * @dev Ensures corresponding number of oracles and jobs. * @param _oracles The list of oracles. * @param _jobIds The list of jobs. */ modifier validateAnswerRequirements( uint256 _minimumResponses, address[] _oracles, bytes32[] _jobIds ) { require(_oracles.length <= MAX_ORACLE_COUNT, "cannot have more than 45 oracles"); require(_oracles.length >= _minimumResponses, "must have at least as many oracles as responses"); require(_oracles.length == _jobIds.length, "must have exactly as many oracles as job IDs"); _; } /** * @dev Reverts if `msg.sender` is not authorized to make requests. */ modifier ensureAuthorizedRequester() { require(authorizedRequesters[msg.sender] || msg.sender == owner, "Not an authorized address for creating requests"); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[{"name":"_requestId","type":"bytes32"},{"name":"_payment","type":"uint256"},{"name":"_expiration","type":"uint256"}],"name":"cancelRequest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"authorizedRequesters","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"jobIds","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"latestAnswer","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minimumResponses","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"oracles","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_recipient","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transferLINK","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"latestRound","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_clRequestId","type":"bytes32"},{"name":"_response","type":"int256"}],"name":"chainlinkCallback","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_paymentAmount","type":"uint128"},{"name":"_minimumResponses","type":"uint128"},{"name":"_oracles","type":"address[]"},{"name":"_jobIds","type":"bytes32[]"}],"name":"updateRequestDetails","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"latestTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_roundId","type":"uint256"}],"name":"getAnswer","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_roundId","type":"uint256"}],"name":"getTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paymentAmount","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"requestRateUpdate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_requester","type":"address"},{"name":"_allowed","type":"bool"}],"name":"setAuthorization","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_link","type":"address"},{"name":"_paymentAmount","type":"uint128"},{"name":"_minimumResponses","type":"uint128"},{"name":"_oracles","type":"address[]"},{"name":"_jobIds","type":"bytes32[]"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"response","type":"int256"},{"indexed":true,"name":"answerId","type":"uint256"},{"indexed":true,"name":"sender","type":"address"}],"name":"ResponseReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"}],"name":"ChainlinkRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"}],"name":"ChainlinkFulfilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"}],"name":"ChainlinkCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"current","type":"int256"},{"indexed":true,"name":"roundId","type":"uint256"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"AnswerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"roundId","type":"uint256"},{"indexed":true,"name":"startedBy","type":"address"}],"name":"NewRound","type":"event"}]
Contract Creation Code
608060405260016004556001600d553480156200001b57600080fd5b5060405162001f6a38038062001f6a83398101604090815281516020830151918301516060840151608085015160068054600160a060020a03191633179055929491929082019101620000778564010000000062000099810204565b6200008e84848484640100000000620000bb810204565b5050505050620003ee565b60028054600160a060020a031916600160a060020a0392909216919091179055565b600654600160a060020a03163314620000d357600080fd5b826001608060020a03168282602d8251111515156200015357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f63616e6e6f742068617665206d6f7265207468616e203435206f7261636c6573604482015290519081900360640190fd5b8151831115620001ea57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f6d7573742068617665206174206c65617374206173206d616e79206f7261636c60448201527f657320617320726573706f6e7365730000000000000000000000000000000000606482015290519081900360840190fd5b80518251146200028157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f6d75737420686176652065786163746c79206173206d616e79206f7261636c6560448201527f73206173206a6f62204944730000000000000000000000000000000000000000606482015290519081900360840190fd5b600a80546001608060020a0388811670010000000000000000000000000000000002818b166001608060020a031990931692909217161790558351620002cf90600b906020870190620002ef565b508451620002e590600c90602088019062000341565b5050505050505050565b8280548282559060005260206000209081019282156200032f579160200282015b828111156200032f578251825560209092019160019091019062000310565b506200033d929150620003a7565b5090565b82805482825590600052602060002090810192821562000399579160200282015b82811115620003995782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019062000362565b506200033d929150620003c7565b620003c491905b808211156200033d5760008155600101620003ae565b90565b620003c491905b808211156200033d578054600160a060020a0319168155600101620003ce565b611b6c80620003fe6000396000f3006080604052600436106100f85763ffffffff60e060020a60003504166333bfcdd881146100fd5780633ea478aa1461011d5780634162cc881461015257806350d25bcd1461017c57806354bcd7ff146101915780635b69a7d8146101c25780635cd9b90b146101f6578063668a0f021461021a5780636a9705b41461022f578063715018a61461024a57806378a666741461025f5780638205bf6a1461030357806383197ef0146103185780638da5cb5b1461032d578063b5ab58dc14610342578063b633620c1461035a578063c35905c614610372578063daa6d55614610387578063eecea0001461039c578063f2fde38b146103c2575b600080fd5b34801561010957600080fd5b5061011b6004356024356044356103e3565b005b34801561012957600080fd5b5061013e600160a060020a0360043516610581565b604080519115158252519081900360200190f35b34801561015e57600080fd5b5061016a600435610596565b60408051918252519081900360200190f35b34801561018857600080fd5b5061016a6105b5565b34801561019d57600080fd5b506101a66105cb565b604080516001608060020a039092168252519081900360200190f35b3480156101ce57600080fd5b506101da6004356105ee565b60408051600160a060020a039092168252519081900360200190f35b34801561020257600080fd5b5061011b600160a060020a0360043516602435610616565b34801561022657600080fd5b5061016a610724565b34801561023b57600080fd5b5061011b60043560243561072a565b34801561025657600080fd5b5061011b6107ad565b34801561026b57600080fd5b50604080516020600460443581810135838102808601850190965280855261011b9583356001608060020a039081169660248035909216963696956064959294930192829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a99890198929750908201955093508392508501908490808284375094975061080e9650505050505050565b34801561030f57600080fd5b5061016a6109fe565b34801561032457600080fd5b5061011b610a13565b34801561033957600080fd5b506101da610ae3565b34801561034e57600080fd5b5061016a600435610af2565b34801561036657600080fd5b5061016a600435610b04565b34801561037e57600080fd5b506101a6610b16565b34801561039357600080fd5b5061011b610b25565b3480156103a857600080fd5b5061011b600160a060020a03600435166024351515610d1e565b3480156103ce57600080fd5b5061011b600160a060020a0360043516610d60565b336000908152600e602052604081205460ff168061040b5750600654600160a060020a031633145b1515610487576040805160e560020a62461bcd02815260206004820152602f60248201527f4e6f7420616e20617574686f72697a6564206164647265737320666f7220637260448201527f656174696e672072657175657374730000000000000000000000000000000000606482015290519081900360840190fd5b506000838152600f60205260409020546009548110610516576040805160e560020a62461bcd02815260206004820152602360248201527f43616e6e6f74206d6f6469667920616e20696e2d70726f677265737320616e7360448201527f7765720000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000848152600f602090815260408083208390558383526010825282206001908101805491820181558352908220015561054f81610d83565b61057b84847f6a9705b40000000000000000000000000000000000000000000000000000000085610de1565b50505050565b600e6020526000908152604090205460ff1681565b600b8054829081106105a457fe5b600091825260209091200154905081565b6009546000908152601160205260409020545b90565b600a5470010000000000000000000000000000000090046001608060020a031681565b600c8054829081106105fc57fe5b600091825260209091200154600160a060020a0316905081565b600654600090600160a060020a0316331461063057600080fd5b610638610ed2565b905080600160a060020a031663a9059cbb84846040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561069d57600080fd5b505af11580156106b1573d6000803e3d6000fd5b505050506040513d60208110156106c757600080fd5b5051151561071f576040805160e560020a62461bcd02815260206004820152601460248201527f4c494e4b207472616e73666572206661696c6564000000000000000000000000604482015290519081900360640190fd5b505050565b60095490565b600061073583610ee1565b506000828152600f602090815260408083208054908490558084526010835281842060019081018054918201815585529284209092018490555190913391839185917fb51168059c83c860caf5b830c5d2e64c2172c6fb2fe9f25447d9838e18d93b609190a46107a481610fbe565b61071f81610d83565b600654600160a060020a031633146107c457600080fd5b600654604051600160a060020a03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a260068054600160a060020a0319169055565b600654600160a060020a0316331461082557600080fd5b826001608060020a03168282602d82511115151561088d576040805160e560020a62461bcd02815260206004820181905260248201527f63616e6e6f742068617665206d6f7265207468616e203435206f7261636c6573604482015290519081900360640190fd5b815183111561090c576040805160e560020a62461bcd02815260206004820152602f60248201527f6d7573742068617665206174206c65617374206173206d616e79206f7261636c60448201527f657320617320726573706f6e7365730000000000000000000000000000000000606482015290519081900360840190fd5b805182511461098b576040805160e560020a62461bcd02815260206004820152602c60248201527f6d75737420686176652065786163746c79206173206d616e79206f7261636c6560448201527f73206173206a6f62204944730000000000000000000000000000000000000000606482015290519081900360840190fd5b600a80546001608060020a0388811670010000000000000000000000000000000002818b166fffffffffffffffffffffffffffffffff19909316929092171617905583516109e090600b9060208701906119e9565b5084516109f490600c906020880190611a36565b5050505050505050565b60095460009081526012602052604090205490565b600654600090600160a060020a03163314610a2d57600080fd5b610a35610ed2565b600654604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051929350610ad592600160a060020a03928316928516916370a082319160248083019260209291908290030181600087803b158015610aa457600080fd5b505af1158015610ab8573d6000803e3d6000fd5b505050506040513d6020811015610ace57600080fd5b5051610616565b600654600160a060020a0316ff5b600654600160a060020a031681565b60009081526011602052604090205490565b60009081526012602052604090205490565b600a546001608060020a031681565b610b2d611a97565b336000908152600e60205260408120548190819060ff1680610b595750600654600160a060020a031633145b1515610bd5576040805160e560020a62461bcd02815260206004820152602f60248201527f4e6f7420616e20617574686f72697a6564206164647265737320666f7220637260448201527f656174696e672072657175657374730000000000000000000000000000000000606482015290519081900360840190fd5b5050600a546001608060020a031660005b600c54811015610c6a57610c1e600b82815481101515610c0257fe5b906000526020600020015430636a9705b460e060020a02611211565b9350610c4e600c82815481101515610c3257fe5b600091825260209091200154600160a060020a0316858461123c565b600d546000828152600f60205260409020559250600101610be6565b600a54600d805460009081526010602052604080822080546fffffffffffffffffffffffffffffffff19166001608060020a0370010000000000000000000000000000000096879004811691909117909155600c548454845291909220805491831690940291161790915554610ce790600163ffffffff6114cc16565b600d8190556040513391907fc3c45d1924f55369653f407ee9f095309d1e687b2c0011b1f709042d4f457e1790600090a350505050565b600654600160a060020a03163314610d3557600080fd5b600160a060020a03919091166000908152600e60205260409020805460ff1916911515919091179055565b600654600160a060020a03163314610d7757600080fd5b610d80816114df565b50565b60008181526010602052604090208054600190910154829170010000000000000000000000000000000090046001608060020a03161415610ddd5760008281526010602052604081208181559061057b6001830182611acc565b5050565b6000848152600560205260408082208054600160a060020a031981169091559051600160a060020a039091169186917fe1fe3afa0f7f761ff0a8b89086790efd5140d2907ebd5b7ff6bfcb5e075fd4c59190a2604080517f6ee4d5530000000000000000000000000000000000000000000000000000000081526004810187905260248101869052600160e060020a031985166044820152606481018490529051600160a060020a03831691636ee4d55391608480830192600092919082900301818387803b158015610eb357600080fd5b505af1158015610ec7573d6000803e3d6000fd5b505050505050505050565b600254600160a060020a031690565b6000818152600560205260409020548190600160a060020a03163314610f77576040805160e560020a62461bcd02815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000818152600560205260408082208054600160a060020a03191690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a25050565b60008181526010602052604081208054600190910154829182918291829187916001608060020a0316116112085786806009541115156109f457600088815260106020526040902060010154965061101d87600263ffffffff61155016565b955060028706151561112f57600088815260106020908152604091829020600101805483518184028101840190945280845261108e939283018282801561108357602002820191906000526020600020905b81548152602001906001019080831161106f575b505050505087611565565b600089815260106020908152604091829020600101805483518184028101840190945280845293975061110a9390918301828280156110ec57602002820191906000526020600020905b8154815260200190600101908083116110d8575b50505050506111056001896114cc90919063ffffffff16565b611565565b9250600261111e858563ffffffff61175916565b81151561112757fe5b0594506111a3565b60008881526010602090815260409182902060010180548351818402810184019094528084526111a093928301828280156110ec57602002820191906000526020600020908154815260200190600101908083116110d85750505050506111056001896114cc90919063ffffffff16565b94505b6007859055600988905542600881905560008981526012602090815260408083208490556011825291829020889055815192835290518a9288927f0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f92918290030190a3505b50505050505050565b611219611a97565b611221611a97565b6112338186868663ffffffff61180616565b95945050505050565b6000306004546040516020018083600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401828152602001925050506040516020818303038152906040526040518082805190602001908083835b602083106112b85780518252601f199092019160209182019101611299565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912060045460608a0152600081815260059092528382208054600160a060020a031916600160a060020a038c1617905592519295508594507fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af99350919050a2600254600160a060020a0316634000aea0858461135987611843565b6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156113c65781810151838201526020016113ae565b50505050905090810190601f1680156113f35780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561141457600080fd5b505af1158015611428573d6000803e3d6000fd5b505050506040513d602081101561143e57600080fd5b505115156114bc576040805160e560020a62461bcd02815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805460010190559392505050565b818101828110156114d957fe5b92915050565b600160a060020a03811615156114f457600080fd5b600654604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360068054600160a060020a031916600160a060020a0392909216919091179055565b6000818381151561155d57fe5b049392505050565b600060606000806060806000806000808b98508a975088519650866040519080825280602002602001820160405280156115a9578160200160208202803883390190505b509550866040519080825280602002602001820160405280156115d6578160200160208202803883390190505b5094505b886115ec88600263ffffffff61155016565b815181106115f657fe5b9060200190602002015191506000935060009250600090505b868110156116cf5781898281518110151561162657fe5b90602001906020020151121561167157888181518110151561164457fe5b90602001906020020151868581518110151561165c57fe5b602090810290910101526001909301926116c7565b81898281518110151561168057fe5b9060200190602002015113156116c757888181518110151561169e57fe5b9060200190602002015185848151811015156116b657fe5b602090810290910101526001909201915b60010161160f565b8388116116ed578396506116e3898761199a565b9099509550611745565b6116fd878463ffffffff61199d16565b88111561173d57611724611717888563ffffffff61199d16565b899063ffffffff61199d16565b9750829650611733898661199a565b9099509450611745565b81995061174a565b6115da565b50505050505050505092915050565b600082820181831280159061176e5750838112155b80611783575060008312801561178357508381125b15156117ff576040805160e560020a62461bcd02815260206004820152602160248201527f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f60448201527f7700000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b9392505050565b61180e611a97565b61181e85608001516101006119af565b5050918352600160a060020a03166020830152600160e060020a031916604082015290565b8051602080830151604080850151606086810151608088015151935160006024820181815260448301829052606483018a9052600160a060020a0388166084840152600160e060020a0319861660a484015260c48301849052600160e48401819052610100610104850190815288516101248601528851969b7f40429946000000000000000000000000000000000000000000000000000000009b949a8b9a91999098909796939591949361014401918501908083838e5b838110156119135781810151838201526020016118fb565b50505050905090810190601f1680156119405780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e060020a0319909d169c909c17909b5250989950505050505050505050919050565b91565b6000828211156119a957fe5b50900390565b6119b7611aea565b60208206156119cc5760208206602003820191505b506020828101829052604080518085526000815290920101905290565b828054828255906000526020600020908101928215611a26579160200282015b82811115611a265782518255602090920191600190910190611a09565b50611a32929150611b02565b5090565b828054828255906000526020600020908101928215611a8b579160200282015b82811115611a8b5782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190611a56565b50611a32929150611b1c565b6040805160c081018252600080825260208201819052918101829052606081019190915260808101611ac7611aea565b905290565b5080546000825590600052602060002090810190610d809190611b02565b60408051808201909152606081526000602082015290565b6105c891905b80821115611a325760008155600101611b08565b6105c891905b80821115611a32578054600160a060020a0319168155600101611b225600a165627a7a723058209ea612e58916b32ca5ec46093eb15f7adfadbc2d47e305f539c7092bad66ede80029000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000000000000000000000000000075af03122f50000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000009000000000000000000000000f5a3d443fccd7ee567000e43b23b0e98d96445ce000000000000000000000000049bd8c3adc3fe7d3fc2a44541d955a537c2a48400000000000000000000000064fe692be4b42f4ac9d4617ab824e088350c11c20000000000000000000000004565300c576431e5228e8aa32642d5739cf9247d00000000000000000000000029e3b3c76e7ae0d681bf1a6bcee1c0e7d17dbaa900000000000000000000000064fd0abd4d8f5a0a7502c0078d959e57ca1207ab00000000000000000000000085aeace84a130bc1accce2a9f4f933f6765b0b9b0000000000000000000000008c85a06eb3854df0d502b2b00169dbfb8b603bf30000000000000000000000003a8b67c0d153d1f8f931e610c5c79a7ee51bde3f00000000000000000000000000000000000000000000000000000000000000099d47f16b1674497b9e25d1cd19abe1ab00000000000000000000000000000000f813a64f4ca04f87af223e7c2e6e854c00000000000000000000000000000000d1acf996b29c441f94b254379e9e003900000000000000000000000000000000ad3d5a19d0104f5c94ba544b3f16d0b30000000000000000000000000000000010dcdec4d65d42da8191feba7281f008000000000000000000000000000000009080bc5e5d7c4683a1025d928a9a82b5000000000000000000000000000000008344ff90d8994bfd9ab77da8315365060000000000000000000000000000000072dd4884ed48407d9b4b95b15c518b9500000000000000000000000000000000db4dd513d42b41a3972d78f86984d22200000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106100f85763ffffffff60e060020a60003504166333bfcdd881146100fd5780633ea478aa1461011d5780634162cc881461015257806350d25bcd1461017c57806354bcd7ff146101915780635b69a7d8146101c25780635cd9b90b146101f6578063668a0f021461021a5780636a9705b41461022f578063715018a61461024a57806378a666741461025f5780638205bf6a1461030357806383197ef0146103185780638da5cb5b1461032d578063b5ab58dc14610342578063b633620c1461035a578063c35905c614610372578063daa6d55614610387578063eecea0001461039c578063f2fde38b146103c2575b600080fd5b34801561010957600080fd5b5061011b6004356024356044356103e3565b005b34801561012957600080fd5b5061013e600160a060020a0360043516610581565b604080519115158252519081900360200190f35b34801561015e57600080fd5b5061016a600435610596565b60408051918252519081900360200190f35b34801561018857600080fd5b5061016a6105b5565b34801561019d57600080fd5b506101a66105cb565b604080516001608060020a039092168252519081900360200190f35b3480156101ce57600080fd5b506101da6004356105ee565b60408051600160a060020a039092168252519081900360200190f35b34801561020257600080fd5b5061011b600160a060020a0360043516602435610616565b34801561022657600080fd5b5061016a610724565b34801561023b57600080fd5b5061011b60043560243561072a565b34801561025657600080fd5b5061011b6107ad565b34801561026b57600080fd5b50604080516020600460443581810135838102808601850190965280855261011b9583356001608060020a039081169660248035909216963696956064959294930192829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a99890198929750908201955093508392508501908490808284375094975061080e9650505050505050565b34801561030f57600080fd5b5061016a6109fe565b34801561032457600080fd5b5061011b610a13565b34801561033957600080fd5b506101da610ae3565b34801561034e57600080fd5b5061016a600435610af2565b34801561036657600080fd5b5061016a600435610b04565b34801561037e57600080fd5b506101a6610b16565b34801561039357600080fd5b5061011b610b25565b3480156103a857600080fd5b5061011b600160a060020a03600435166024351515610d1e565b3480156103ce57600080fd5b5061011b600160a060020a0360043516610d60565b336000908152600e602052604081205460ff168061040b5750600654600160a060020a031633145b1515610487576040805160e560020a62461bcd02815260206004820152602f60248201527f4e6f7420616e20617574686f72697a6564206164647265737320666f7220637260448201527f656174696e672072657175657374730000000000000000000000000000000000606482015290519081900360840190fd5b506000838152600f60205260409020546009548110610516576040805160e560020a62461bcd02815260206004820152602360248201527f43616e6e6f74206d6f6469667920616e20696e2d70726f677265737320616e7360448201527f7765720000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000848152600f602090815260408083208390558383526010825282206001908101805491820181558352908220015561054f81610d83565b61057b84847f6a9705b40000000000000000000000000000000000000000000000000000000085610de1565b50505050565b600e6020526000908152604090205460ff1681565b600b8054829081106105a457fe5b600091825260209091200154905081565b6009546000908152601160205260409020545b90565b600a5470010000000000000000000000000000000090046001608060020a031681565b600c8054829081106105fc57fe5b600091825260209091200154600160a060020a0316905081565b600654600090600160a060020a0316331461063057600080fd5b610638610ed2565b905080600160a060020a031663a9059cbb84846040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561069d57600080fd5b505af11580156106b1573d6000803e3d6000fd5b505050506040513d60208110156106c757600080fd5b5051151561071f576040805160e560020a62461bcd02815260206004820152601460248201527f4c494e4b207472616e73666572206661696c6564000000000000000000000000604482015290519081900360640190fd5b505050565b60095490565b600061073583610ee1565b506000828152600f602090815260408083208054908490558084526010835281842060019081018054918201815585529284209092018490555190913391839185917fb51168059c83c860caf5b830c5d2e64c2172c6fb2fe9f25447d9838e18d93b609190a46107a481610fbe565b61071f81610d83565b600654600160a060020a031633146107c457600080fd5b600654604051600160a060020a03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a260068054600160a060020a0319169055565b600654600160a060020a0316331461082557600080fd5b826001608060020a03168282602d82511115151561088d576040805160e560020a62461bcd02815260206004820181905260248201527f63616e6e6f742068617665206d6f7265207468616e203435206f7261636c6573604482015290519081900360640190fd5b815183111561090c576040805160e560020a62461bcd02815260206004820152602f60248201527f6d7573742068617665206174206c65617374206173206d616e79206f7261636c60448201527f657320617320726573706f6e7365730000000000000000000000000000000000606482015290519081900360840190fd5b805182511461098b576040805160e560020a62461bcd02815260206004820152602c60248201527f6d75737420686176652065786163746c79206173206d616e79206f7261636c6560448201527f73206173206a6f62204944730000000000000000000000000000000000000000606482015290519081900360840190fd5b600a80546001608060020a0388811670010000000000000000000000000000000002818b166fffffffffffffffffffffffffffffffff19909316929092171617905583516109e090600b9060208701906119e9565b5084516109f490600c906020880190611a36565b5050505050505050565b60095460009081526012602052604090205490565b600654600090600160a060020a03163314610a2d57600080fd5b610a35610ed2565b600654604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051929350610ad592600160a060020a03928316928516916370a082319160248083019260209291908290030181600087803b158015610aa457600080fd5b505af1158015610ab8573d6000803e3d6000fd5b505050506040513d6020811015610ace57600080fd5b5051610616565b600654600160a060020a0316ff5b600654600160a060020a031681565b60009081526011602052604090205490565b60009081526012602052604090205490565b600a546001608060020a031681565b610b2d611a97565b336000908152600e60205260408120548190819060ff1680610b595750600654600160a060020a031633145b1515610bd5576040805160e560020a62461bcd02815260206004820152602f60248201527f4e6f7420616e20617574686f72697a6564206164647265737320666f7220637260448201527f656174696e672072657175657374730000000000000000000000000000000000606482015290519081900360840190fd5b5050600a546001608060020a031660005b600c54811015610c6a57610c1e600b82815481101515610c0257fe5b906000526020600020015430636a9705b460e060020a02611211565b9350610c4e600c82815481101515610c3257fe5b600091825260209091200154600160a060020a0316858461123c565b600d546000828152600f60205260409020559250600101610be6565b600a54600d805460009081526010602052604080822080546fffffffffffffffffffffffffffffffff19166001608060020a0370010000000000000000000000000000000096879004811691909117909155600c548454845291909220805491831690940291161790915554610ce790600163ffffffff6114cc16565b600d8190556040513391907fc3c45d1924f55369653f407ee9f095309d1e687b2c0011b1f709042d4f457e1790600090a350505050565b600654600160a060020a03163314610d3557600080fd5b600160a060020a03919091166000908152600e60205260409020805460ff1916911515919091179055565b600654600160a060020a03163314610d7757600080fd5b610d80816114df565b50565b60008181526010602052604090208054600190910154829170010000000000000000000000000000000090046001608060020a03161415610ddd5760008281526010602052604081208181559061057b6001830182611acc565b5050565b6000848152600560205260408082208054600160a060020a031981169091559051600160a060020a039091169186917fe1fe3afa0f7f761ff0a8b89086790efd5140d2907ebd5b7ff6bfcb5e075fd4c59190a2604080517f6ee4d5530000000000000000000000000000000000000000000000000000000081526004810187905260248101869052600160e060020a031985166044820152606481018490529051600160a060020a03831691636ee4d55391608480830192600092919082900301818387803b158015610eb357600080fd5b505af1158015610ec7573d6000803e3d6000fd5b505050505050505050565b600254600160a060020a031690565b6000818152600560205260409020548190600160a060020a03163314610f77576040805160e560020a62461bcd02815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f2072657175657374000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000818152600560205260408082208054600160a060020a03191690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a25050565b60008181526010602052604081208054600190910154829182918291829187916001608060020a0316116112085786806009541115156109f457600088815260106020526040902060010154965061101d87600263ffffffff61155016565b955060028706151561112f57600088815260106020908152604091829020600101805483518184028101840190945280845261108e939283018282801561108357602002820191906000526020600020905b81548152602001906001019080831161106f575b505050505087611565565b600089815260106020908152604091829020600101805483518184028101840190945280845293975061110a9390918301828280156110ec57602002820191906000526020600020905b8154815260200190600101908083116110d8575b50505050506111056001896114cc90919063ffffffff16565b611565565b9250600261111e858563ffffffff61175916565b81151561112757fe5b0594506111a3565b60008881526010602090815260409182902060010180548351818402810184019094528084526111a093928301828280156110ec57602002820191906000526020600020908154815260200190600101908083116110d85750505050506111056001896114cc90919063ffffffff16565b94505b6007859055600988905542600881905560008981526012602090815260408083208490556011825291829020889055815192835290518a9288927f0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f92918290030190a3505b50505050505050565b611219611a97565b611221611a97565b6112338186868663ffffffff61180616565b95945050505050565b6000306004546040516020018083600160a060020a0316600160a060020a03166c01000000000000000000000000028152601401828152602001925050506040516020818303038152906040526040518082805190602001908083835b602083106112b85780518252601f199092019160209182019101611299565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912060045460608a0152600081815260059092528382208054600160a060020a031916600160a060020a038c1617905592519295508594507fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af99350919050a2600254600160a060020a0316634000aea0858461135987611843565b6040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156113c65781810151838201526020016113ae565b50505050905090810190601f1680156113f35780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561141457600080fd5b505af1158015611428573d6000803e3d6000fd5b505050506040513d602081101561143e57600080fd5b505115156114bc576040805160e560020a62461bcd02815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6004805460010190559392505050565b818101828110156114d957fe5b92915050565b600160a060020a03811615156114f457600080fd5b600654604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360068054600160a060020a031916600160a060020a0392909216919091179055565b6000818381151561155d57fe5b049392505050565b600060606000806060806000806000808b98508a975088519650866040519080825280602002602001820160405280156115a9578160200160208202803883390190505b509550866040519080825280602002602001820160405280156115d6578160200160208202803883390190505b5094505b886115ec88600263ffffffff61155016565b815181106115f657fe5b9060200190602002015191506000935060009250600090505b868110156116cf5781898281518110151561162657fe5b90602001906020020151121561167157888181518110151561164457fe5b90602001906020020151868581518110151561165c57fe5b602090810290910101526001909301926116c7565b81898281518110151561168057fe5b9060200190602002015113156116c757888181518110151561169e57fe5b9060200190602002015185848151811015156116b657fe5b602090810290910101526001909201915b60010161160f565b8388116116ed578396506116e3898761199a565b9099509550611745565b6116fd878463ffffffff61199d16565b88111561173d57611724611717888563ffffffff61199d16565b899063ffffffff61199d16565b9750829650611733898661199a565b9099509450611745565b81995061174a565b6115da565b50505050505050505092915050565b600082820181831280159061176e5750838112155b80611783575060008312801561178357508381125b15156117ff576040805160e560020a62461bcd02815260206004820152602160248201527f5369676e6564536166654d6174683a206164646974696f6e206f766572666c6f60448201527f7700000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b9392505050565b61180e611a97565b61181e85608001516101006119af565b5050918352600160a060020a03166020830152600160e060020a031916604082015290565b8051602080830151604080850151606086810151608088015151935160006024820181815260448301829052606483018a9052600160a060020a0388166084840152600160e060020a0319861660a484015260c48301849052600160e48401819052610100610104850190815288516101248601528851969b7f40429946000000000000000000000000000000000000000000000000000000009b949a8b9a91999098909796939591949361014401918501908083838e5b838110156119135781810151838201526020016118fb565b50505050905090810190601f1680156119405780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e060020a0319909d169c909c17909b5250989950505050505050505050919050565b91565b6000828211156119a957fe5b50900390565b6119b7611aea565b60208206156119cc5760208206602003820191505b506020828101829052604080518085526000815290920101905290565b828054828255906000526020600020908101928215611a26579160200282015b82811115611a265782518255602090920191600190910190611a09565b50611a32929150611b02565b5090565b828054828255906000526020600020908101928215611a8b579160200282015b82811115611a8b5782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190611a56565b50611a32929150611b1c565b6040805160c081018252600080825260208201819052918101829052606081019190915260808101611ac7611aea565b905290565b5080546000825590600052602060002090810190610d809190611b02565b60408051808201909152606081526000602082015290565b6105c891905b80821115611a325760008155600101611b08565b6105c891905b80821115611a32578054600160a060020a0319168155600101611b225600a165627a7a723058209ea612e58916b32ca5ec46093eb15f7adfadbc2d47e305f539c7092bad66ede80029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000000000000000000000000000075af03122f50000000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000001e00000000000000000000000000000000000000000000000000000000000000009000000000000000000000000f5a3d443fccd7ee567000e43b23b0e98d96445ce000000000000000000000000049bd8c3adc3fe7d3fc2a44541d955a537c2a48400000000000000000000000064fe692be4b42f4ac9d4617ab824e088350c11c20000000000000000000000004565300c576431e5228e8aa32642d5739cf9247d00000000000000000000000029e3b3c76e7ae0d681bf1a6bcee1c0e7d17dbaa900000000000000000000000064fd0abd4d8f5a0a7502c0078d959e57ca1207ab00000000000000000000000085aeace84a130bc1accce2a9f4f933f6765b0b9b0000000000000000000000008c85a06eb3854df0d502b2b00169dbfb8b603bf30000000000000000000000003a8b67c0d153d1f8f931e610c5c79a7ee51bde3f00000000000000000000000000000000000000000000000000000000000000099d47f16b1674497b9e25d1cd19abe1ab00000000000000000000000000000000f813a64f4ca04f87af223e7c2e6e854c00000000000000000000000000000000d1acf996b29c441f94b254379e9e003900000000000000000000000000000000ad3d5a19d0104f5c94ba544b3f16d0b30000000000000000000000000000000010dcdec4d65d42da8191feba7281f008000000000000000000000000000000009080bc5e5d7c4683a1025d928a9a82b5000000000000000000000000000000008344ff90d8994bfd9ab77da8315365060000000000000000000000000000000072dd4884ed48407d9b4b95b15c518b9500000000000000000000000000000000db4dd513d42b41a3972d78f86984d22200000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _link (address): 0x514910771AF9Ca656af840dff83E8264EcF986CA
Arg [1] : _paymentAmount (uint128): 530000000000000000
Arg [2] : _minimumResponses (uint128): 5
Arg [3] : _oracles (address[]): 0xF5a3d443FccD7eE567000E43B23b0e98d96445CE,0x049Bd8C3adC3fE7d3Fc2a44541d955A537c2A484,0x64FE692be4b42F4Ac9d4617aB824E088350C11C2,0x4565300C576431e5228e8aA32642D5739CF9247d,0x29e3b3c76e7ae0d681bf1a6BceE1c0E7d17DBAA9,0x64Fd0aBd4d8F5A0A7502C0078d959E57ca1207aB,0x85aEace84a130bC1AcCcE2a9F4F933F6765b0B9B,0x8c85a06EB3854Df0d502B2b00169DBfB8B603Bf3,0x3A8B67C0d153D1F8F931E610C5C79A7Ee51BDe3F
Arg [4] : _jobIds (bytes32[]): System.Byte[],System.Byte[],System.Byte[],System.Byte[],System.Byte[],System.Byte[],System.Byte[],System.Byte[],System.Byte[]
-----Encoded View---------------
25 Constructor Arguments found :
Arg [0] : 000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca
Arg [1] : 000000000000000000000000000000000000000000000000075af03122f50000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [4] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [6] : 000000000000000000000000f5a3d443fccd7ee567000e43b23b0e98d96445ce
Arg [7] : 000000000000000000000000049bd8c3adc3fe7d3fc2a44541d955a537c2a484
Arg [8] : 00000000000000000000000064fe692be4b42f4ac9d4617ab824e088350c11c2
Arg [9] : 0000000000000000000000004565300c576431e5228e8aa32642d5739cf9247d
Arg [10] : 00000000000000000000000029e3b3c76e7ae0d681bf1a6bcee1c0e7d17dbaa9
Arg [11] : 00000000000000000000000064fd0abd4d8f5a0a7502c0078d959e57ca1207ab
Arg [12] : 00000000000000000000000085aeace84a130bc1accce2a9f4f933f6765b0b9b
Arg [13] : 0000000000000000000000008c85a06eb3854df0d502b2b00169dbfb8b603bf3
Arg [14] : 0000000000000000000000003a8b67c0d153d1f8f931e610c5c79a7ee51bde3f
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [16] : 9d47f16b1674497b9e25d1cd19abe1ab00000000000000000000000000000000
Arg [17] : f813a64f4ca04f87af223e7c2e6e854c00000000000000000000000000000000
Arg [18] : d1acf996b29c441f94b254379e9e003900000000000000000000000000000000
Arg [19] : ad3d5a19d0104f5c94ba544b3f16d0b300000000000000000000000000000000
Arg [20] : 10dcdec4d65d42da8191feba7281f00800000000000000000000000000000000
Arg [21] : 9080bc5e5d7c4683a1025d928a9a82b500000000000000000000000000000000
Arg [22] : 8344ff90d8994bfd9ab77da83153650600000000000000000000000000000000
Arg [23] : 72dd4884ed48407d9b4b95b15c518b9500000000000000000000000000000000
Arg [24] : db4dd513d42b41a3972d78f86984d22200000000000000000000000000000000
Deployed Bytecode Sourcemap
31939:13094:0:-;;;;;;;;;-1:-1:-1;;;31939:13094:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37817:544;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37817:544:0;;;;;;;;;;;32552:52;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32552:52:0;-1:-1:-1;;;;;32552:52:0;;;;;;;;;;;;;;;;;;;;;;;32455:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32455:23:0;;;;;;;;;;;;;;;;;;;;;40162:130;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40162:130:0;;;;32419:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32419:31:0;;;;;;;;-1:-1:-1;;;;;32419:31:0;;;;;;;;;;;;;;32483:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32483:24:0;;;;;;;;;-1:-1:-1;;;;;32483:24:0;;;;;;;;;;;;;;36671:257;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;36671:257:0;-1:-1:-1;;;;;36671:257:0;;;;;;;41153:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41153:96:0;;;;35070:411;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;35070:411:0;;;;;;;30985:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30985:114:0;;;;35946:381;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;35946:381:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35946:381:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35946:381:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35946:381:0;;;;-1:-1:-1;35946:381:0;-1:-1:-1;35946:381:0;;-1:-1:-1;35946:381:0;;;;;;;;;-1:-1:-1;35946:381:0;;-1:-1:-1;35946:381:0;;-1:-1:-1;;;;;;;35946:381:0;40366:137;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40366:137:0;;;;38523:228;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38523:228:0;;;;30190:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30190:20:0;;;;40628:130;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40628:130:0;;;;;40922:137;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40922:137:0;;;;;32386:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32386:28:0;;;;34069:694;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34069:694:0;;;;37220:151;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37220:151:0;-1:-1:-1;;;;;37220:151:0;;;;;;;;;31267:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31267:105:0;-1:-1:-1;;;;;31267:105:0;;;;;37817:544;44928:10;37976:16;44907:32;;;:20;:32;;;;;;;;;:55;;-1:-1:-1;44957:5:0;;-1:-1:-1;;;;;44957:5:0;44943:10;:19;44907:55;44899:115;;;;;;;-1:-1:-1;;;;;44899:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37995:26:0;;;;:14;:26;;;;;;38047:21;;38036:32;;38028:80;;;;;-1:-1:-1;;;;;38028:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38124:26;;;;:14;:26;;;;;;;;38117:33;;;38157:17;;;:7;:17;;;;:27;;;;27:10:-1;;23:18;;;45:23;;38157:35:0;;;;;;;38199:22;38165:8;38199:12;:22::i;:::-;38230:125;38261:10;38280:8;38297:31;38337:11;38230:22;:125::i;:::-;37817:544;;;;:::o;32552:52::-;;;;;;;;;;;;;;;:::o;32455:23::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32455:23:0;:::o;40162:130::-;40264:21;;40224:6;40249:37;;;:14;:37;;;;;;40162:130;;:::o;32419:31::-;;;;;;-1:-1:-1;;;;;32419:31:0;;:::o;32483:24::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32483:24:0;;-1:-1:-1;32483:24:0;:::o;36671:257::-;30693:5;;36769:28;;-1:-1:-1;;;;;30693:5:0;30679:10;:19;30671:28;;;;;;36819:23;:21;:23::i;:::-;36769:74;;36858:9;-1:-1:-1;;;;;36858:18:0;;36877:10;36889:7;36858:39;;;;;-1:-1:-1;;;36858:39:0;;;;;;;-1:-1:-1;;;;;36858:39:0;-1:-1:-1;;;;;36858:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36858:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36858:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36858:39:0;36850:72;;;;;;;-1:-1:-1;;;;;36850:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36671:257;;;:::o;41153:96::-;41222:21;;41153:96;:::o;35070:411::-;35209:16;35161:39;35187:12;35161:25;:39::i;:::-;-1:-1:-1;35228:28:0;;;;:14;:28;;;;;;;;;;35263:35;;;;35307:17;;;:7;:17;;;;;-1:-1:-1;35307:27:0;;;27:10:-1;;23:18;;;45:23;;35307:43:0;;;;;;;;;;;35362:49;35228:28;;35400:10;;35228:28;;35340:9;;35362:49;;35228:28;35362:49;35418:28;35437:8;35418:18;:28::i;:::-;35453:22;35466:8;35453:12;:22::i;30985:114::-;30693:5;;-1:-1:-1;;;;;30693:5:0;30679:10;:19;30671:28;;;;;;31062:5;;31043:25;;-1:-1:-1;;;;;31062:5:0;;;;31043:25;;31062:5;;31043:25;31075:5;:18;;-1:-1:-1;;;;;;31075:18:0;;;30985:114::o;35946:381::-;30693:5;;-1:-1:-1;;;;;30693:5:0;30679:10;:19;30671:28;;;;;;36152:17;-1:-1:-1;;;;;44341:423:0;36171:8;36181:7;32869:2;44478:8;:15;:35;;44470:80;;;;;;;-1:-1:-1;;;;;44470:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44565:15;;:36;-1:-1:-1;44565:36:0;44557:96;;;;;-1:-1:-1;;;;;44557:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44687:14;;44668:15;;:33;44660:90;;;;;-1:-1:-1;;;;;44660:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36200:13;:30;;-1:-1:-1;;;;;36237:36:0;;;;;36200:30;;;-1:-1:-1;;36200:30:0;;;;;;;36237:36;;;;36280:16;;;;:6;;:16;;;;;:::i;:::-;-1:-1:-1;36303:18:0;;;;:7;;:18;;;;;:::i;:::-;;30706:1;;;35946:381;;;;:::o;40366:137::-;40475:21;;40431:7;40457:40;;;:17;:40;;;;;;40366:137;:::o;38523:228::-;30693:5;;38583:28;;-1:-1:-1;;;;;30693:5:0;30679:10;:19;30671:28;;;;;;38633:23;:21;:23::i;:::-;38677:5;;38684:34;;;;;;38712:4;38684:34;;;;;;38583:74;;-1:-1:-1;38664:55:0;;-1:-1:-1;;;;;38677:5:0;;;;38684:19;;;;;:34;;;;;;;;;;;;;;38677:5;38684:19;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;38684:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38684:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38684:34:0;38664:12;:55::i;:::-;38739:5;;-1:-1:-1;;;;;38739:5:0;38726:19;30190:20;;;-1:-1:-1;;;;;30190:20:0;;:::o;40628:130::-;40703:6;40728:24;;;:14;:24;;;;;;;40628:130::o;40922:137::-;41000:7;41026:27;;;:17;:27;;;;;;;40922:137::o;32386:28::-;;;-1:-1:-1;;;;;32386:28:0;;:::o;34069:694::-;34155:32;;:::i;:::-;44928:10;34194:17;44907:32;;;:20;:32;;;;;;34194:17;;;;44907:32;;;:55;;-1:-1:-1;44957:5:0;;-1:-1:-1;;;;;44957:5:0;44943:10;:19;44907:55;44899:115;;;;;;;-1:-1:-1;;;;;44899:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34242:13:0;;-1:-1:-1;;;;;34242:13:0;;34264:269;34285:7;:14;34281:18;;34264:269;;;34325:71;34347:6;34354:1;34347:9;;;;;;;;;;;;;;;;;;34358:4;34364:31;-1:-1:-1;;;34364:31:0;34325:21;:71::i;:::-;34315:81;;34417:58;34440:7;34448:1;34440:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34440:10:0;34452:7;34461:13;34417:22;:58::i;:::-;34512:13;;34484:25;;;;:14;:25;;;;;:41;34405:70;-1:-1:-1;34301:3:0;;34264:269;;;34581:16;;34547:13;;;34539:22;;;;34581:16;34539:22;;;;;;:58;;-1:-1:-1;;34539:58:0;-1:-1:-1;;;;;34581:16:0;;;;;;;34539:58;;;;;;;34650:7;:14;34612:13;;34604:22;;;;;;:61;;;;;;;;;;;;;;34688:13;:20;;34539:58;34688:20;:17;:20;:::i;:::-;34672:13;:36;;;34722:35;;34746:10;;34672:36;34722:35;;;;;34069:694;;;;:::o;37220:151::-;30693:5;;-1:-1:-1;;;;;30693:5:0;30679:10;:19;30671:28;;;;;;-1:-1:-1;;;;;37322:32:0;;;;;;;;:20;:32;;;;;:43;;-1:-1:-1;;37322:43:0;;;;;;;;;;37220:151::o;31267:105::-;30693:5;;-1:-1:-1;;;;;30693:5:0;30679:10;:19;30671:28;;;;;;31337:29;31356:9;31337:18;:29::i;:::-;31267:105;:::o;42979:138::-;43810:18;;;;:7;:18;;;;;:31;;43771:28;;;;:35;43810:18;;:31;;;-1:-1:-1;;;;;43810:31:0;43771:70;43767:94;;;43093:18;;;;:7;:18;;;;;43086:25;;;43093:18;43086:25;;;;43093:18;43086:25;:::i;43767:94::-;42979:138;;:::o;23701:429::-;23863:35;23927:27;;;:15;:27;;;;;;;;-1:-1:-1;;;;;;23962:34:0;;;;;24008:30;;-1:-1:-1;;;;;23927:27:0;;;;23943:10;;24008:30;;23863:35;24008:30;24045:79;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24045:79:0;;;;;;;;;;;;;;-1:-1:-1;;;;;24045:29:0;;;;;:79;;;;;;;;;;;;;;;:29;:79;;;5:2:-1;;;;30:1;27;20:12;5:2;24045:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24045:79:0;;;;23701:429;;;;;:::o;24956:116::-;25061:4;;-1:-1:-1;;;;;25061:4:0;24956:116;:::o;28036:168::-;28469:27;;;;:15;:27;;;;;;;;-1:-1:-1;;;;;28469:27:0;28455:10;:41;28447:94;;;;;-1:-1:-1;;;;;28447:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28555:27;;;;:15;:27;;;;;;28548:34;;-1:-1:-1;;;;;;28548:34:0;;;28594:30;28571:10;;28594:30;;;28036:168;;:::o;39047:1043::-;39199:22;43448:18;;;:7;:18;;;;;:35;;;43409:28;;;:35;39199:22;;;;;;;;39139:9;;-1:-1:-1;;;;;43448:35:0;-1:-1:-1;43405:98:0;;39178:9;44144;44119:21;;:34;;44115:58;;;39224:18;;;;:7;:18;;;;;:28;;:35;;-1:-1:-1;39288:21:0;39224:35;39307:1;39288:21;:18;:21;:::i;:::-;39266:43;-1:-1:-1;39368:1:0;39351:14;:18;:23;39347:466;;;39414:18;;;;:7;:18;;;;;;;;;:28;;39402:54;;;;;;;;;;;;;;;;;;;;;;39414:28;39402:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39444:11;39402;:54::i;:::-;39494:18;;;;:7;:18;;;;;;;;;:28;;39482:61;;;;;;;;;;;;;;;;;39385:71;;-1:-1:-1;39482:61:0;;39494:28;;39482:61;;39494:28;39482:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39524:18;39540:1;39524:11;:15;;:18;;;;:::i;:::-;39482:11;:61::i;:::-;39465:78;-1:-1:-1;39623:1:0;39600:20;:7;39465:78;39600:20;:11;:20;:::i;:::-;:24;;;;;;;;39580:44;;39347:466;;;39728:18;;;;:7;:18;;;;;;;;;:28;;39716:61;;;;;;;;;;;;;;;;;;;;;;39728:28;39716:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39758:18;39774:1;39758:11;:15;;:18;;;;:::i;39716:61::-;39696:81;;39347:466;39819:18;:38;;;39864:21;:33;;;39928:3;39904:21;:27;;;-1:-1:-1;39938:28:0;;;:17;:28;;;;;;;;:34;;;39979:14;:25;;;;;;:45;;;40036:48;;;;;;;39888:9;;39840:17;;40036:48;;;;;;;;;43494:1;43405:98;39047:1043;;;;;;;:::o;21372:302::-;21524:17;;:::i;:::-;21557:28;;:::i;:::-;21599:69;:3;21614:7;21623:16;21641:26;21599:69;:14;:69;:::i;:::-;21592:76;21372:302;-1:-1:-1;;;;;21372:302:0:o;22681:488::-;22807:17;22875:4;22881:8;;22858:32;;;;;;-1:-1:-1;;;;;22858:32:0;-1:-1:-1;;;;;22858:32:0;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;22858:32:0;;;22848:43;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;22848:43:0;;;;;;;;;;;;;22911:8;;22898:10;;;:21;-1:-1:-1;22926:26:0;;;:15;:26;;;;;;:36;;-1:-1:-1;;;;;;22926:36:0;-1:-1:-1;;;;;22926:36:0;;;;;22974:29;;22848:43;;-1:-1:-1;22848:43:0;;-1:-1:-1;22974:29:0;;-1:-1:-1;;22974:29:0;-1:-1:-1;22974:29:0;23018:4;;-1:-1:-1;;;;;23018:4:0;:20;23039:7;23048:8;23058:19;23072:4;23058:13;:19::i;:::-;23018:60;;;;;-1:-1:-1;;;23018:60:0;;;;;;;-1:-1:-1;;;;;23018:60:0;-1:-1:-1;;;;;23018:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;23018:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23018:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23018:60:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23018:60:0;23010:108;;;;;;;-1:-1:-1;;;;;23010:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23125:8;:13;;23137:1;23125:13;;;22681:488;;;;;:::o;19760:132::-;19842:7;;;19863;;;;19856:15;;;;19760:132;;;;:::o;31513:175::-;-1:-1:-1;;;;;31584:23:0;;;;31576:32;;;;;;31641:5;;31620:38;;-1:-1:-1;;;;;31620:38:0;;;;31641:5;;31620:38;;31641:5;;31620:38;31665:5;:17;;-1:-1:-1;;;;;;31665:17:0;-1:-1:-1;;;;;31665:17:0;;;;;;;;;;31513:175::o;19169:288::-;19229:7;19449:2;19444;:7;;;;;;;;;19169:288;-1:-1:-1;;;19169:288:0:o;41533:932::-;41623:6;41641:17;41670:9;41691:12;41721:18;41767;41813:13;41833;41853:12;41872:9;41661:2;41641:22;;41682:2;41670:14;;41706:1;:8;41691:23;;41755:4;41742:18;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;41742:18:0;;41721:39;;41801:4;41788:18;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;41788:18:0;;41767:39;;41890:570;41920:1;41922:11;:4;41931:1;41922:11;:8;:11;:::i;:::-;41920:14;;;;;;;;;;;;;;;;41912:22;;41951:1;41943:9;;41969:1;41961:9;;41988:1;41984:5;;41979:211;41995:4;41991:1;:8;41979:211;;;42028:5;42021:1;42023;42021:4;;;;;;;;;;;;;;;;;;:12;42017:164;;;42060:1;42062;42060:4;;;;;;;;;;;;;;;;;;42048:2;42051:5;42048:9;;;;;;;;;;;;;;;;;;:16;42077:7;;;;;42017:164;;;42113:5;42106:1;42108;42106:4;;;;;;;;;;;;;;;;;;:12;42102:79;;;42145:1;42147;42145:4;;;;;;;;;;;;;;;;;;42133:2;42136:5;42133:9;;;;;;;;;;;;;;;;;;:16;42162:7;;;;;42102:79;42001:3;;41979:211;;;42202:10;;;42198:255;;42232:5;42225:12;;42258:11;42263:1;42266:2;42258:4;:11::i;:::-;42248:21;;-1:-1:-1;42248:21:0;-1:-1:-1;42198:255:0;;;42294:15;:4;42303:5;42294:15;:8;:15;:::i;:::-;42289:1;:21;42285:168;;;42327:22;42333:15;:4;42342:5;42333:15;:8;:15;:::i;:::-;42327:1;;:22;:5;:22;:::i;:::-;42323:26;;42367:5;42360:12;;42393:11;42398:1;42401:2;42393:4;:11::i;:::-;42383:21;;-1:-1:-1;42383:21:0;-1:-1:-1;42285:168:0;;;42438:5;42431:12;;;;42285:168;41890:570;;;41533:932;;;;;;;;;;;;;:::o;29739:227::-;29812:6;29841:7;;;29864;;;;;;:18;;;29880:2;29875:1;:7;;29864:18;29863:42;;;;29893:1;29888:2;:6;:16;;;;;29902:2;29898:1;:6;29888:16;29855:88;;;;;;;-1:-1:-1;;;;;29855:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29959:1;29739:227;-1:-1:-1;;;29739:227:0:o;13088:367::-;13242:17;;:::i;:::-;13275:40;13287:4;:8;;;12461:3;13275:11;:40::i;:::-;-1:-1:-1;;13322:13:0;;;-1:-1:-1;;;;;13342:39:0;:20;;;:39;-1:-1:-1;;;;;;13388:43:0;:23;;;:43;13322:13;13088:367::o;27256:542::-;27662:7;;27678:20;;;;;27707:23;;;;;27347:5;27739:10;;;;27779:8;;;;:12;27378:414;;27409:6;27378:414;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27378:414:0;;;;;;-1:-1:-1;;;;;;27378:414:0;;;;;;;;;;;;27409:6;27378:414;;;;;;27409:6;27378:414;;;;;;;;;;;;;;27347:5;;27409:29;;:6;;;;27662:7;;27678:20;;27707:23;;27739:10;27409:6;;27779:12;;27378:414;;;;;;;;;;27409:6;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27378:414:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27378:414:0;;;-1:-1:-1;;26:21;;;22:32;6:49;;27378:414:0;;;49:4:-1;25:18;;61:17;;27378:414:0;182:15:-1;-1:-1;;;;;;27378:414:0;;;179:29:-1;;;;160:49;;;-1:-1;27378:414:0;;-1:-1:-1;;;;;;;;;;27256:542:0;;;:::o;42662:155::-;42804:2;42662:155::o;19574:119::-;19634:7;19657:8;;;;19650:16;;;;-1:-1:-1;19680:7:0;;;19574:119::o;968:408::-;1038:6;;:::i;:::-;1075:2;1064:8;:13;:18;1060:73;;1122:2;1111:8;:13;1105:2;:20;1093:32;;;;1060:73;-1:-1:-1;1182:12:0;;;;:23;;;1247:4;1241:11;;1260:16;;;-1:-1:-1;1284:14:0;;1327:18;;;1319:27;1306:41;;1182:12;968:408::o;31939:13094::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31939:13094:0;;;-1:-1:-1;31939:13094:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31939:13094:0;-1:-1:-1;;;;;31939:13094:0;;;;;;;;;;;-1:-1:-1;31939:13094:0;;;;;;;-1:-1:-1;31939:13094:0;;;-1:-1:-1;31939:13094:0;:::i;:::-;;;;;;;;;-1:-1:-1;31939:13094:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;31939:13094:0;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31939:13094:0;;;;;;
Swarm Source
bzzr://9ea612e58916b32ca5ec46093eb15f7adfadbc2d47e305f539c7092bad66ede8
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.