Source Code
Latest 1 from a total of 1 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Nominate New Own... | 15353475 | 1316 days ago | IN | 0 ETH | 0.0017543 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
CPITrackerOracle
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-08-16
*/
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.8.0;
// Sources flattened with hardhat v2.10.1 https://hardhat.org
// File @openzeppelin/contracts/utils/Strings.sol@v4.7.2
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}
// File @chainlink/contracts/src/v0.8/vendor/BufferChainlink.sol@v0.4.2
/**
* @dev A library for working with mutable byte buffers in Solidity.
*
* Byte buffers are mutable and expandable, and provide a variety of primitives
* for writing to them. At any time you can fetch a bytes object containing the
* current contents of the buffer. The bytes object should not be stored between
* operations, as it may change due to resizing of the buffer.
*/
library BufferChainlink {
/**
* @dev Represents a mutable buffer. Buffers have a current value (buf) and
* a capacity. The capacity may be longer than the current value, in
* which case it can be extended without the need to allocate more memory.
*/
struct buffer {
bytes buf;
uint256 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, uint256 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, uint256 capacity) private pure {
bytes memory oldbuf = buf.buf;
init(buf, capacity);
append(buf, oldbuf);
}
function max(uint256 a, uint256 b) private pure returns (uint256) {
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,
uint256 off,
bytes memory data,
uint256 len
) internal pure returns (buffer memory) {
require(len <= data.length);
if (off + len > buf.capacity) {
resize(buf, max(buf.capacity, len + off) * 2);
}
uint256 dest;
uint256 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
unchecked {
uint256 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,
uint256 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,
uint256 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,
uint256 off,
bytes32 data,
uint256 len
) private pure returns (buffer memory) {
if (len + off > buf.capacity) {
resize(buf, (len + off) * 2);
}
unchecked {
uint256 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,
uint256 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,
uint256 off,
uint256 data,
uint256 len
) private pure returns (buffer memory) {
if (len + off > buf.capacity) {
resize(buf, (len + off) * 2);
}
uint256 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,
uint256 data,
uint256 len
) internal pure returns (buffer memory) {
return writeInt(buf, buf.buf.length, data, len);
}
}
// File @chainlink/contracts/src/v0.8/vendor/CBORChainlink.sol@v0.4.2
library CBORChainlink {
using BufferChainlink for BufferChainlink.buffer;
uint8 private constant MAJOR_TYPE_INT = 0;
uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;
uint8 private constant MAJOR_TYPE_BYTES = 2;
uint8 private constant MAJOR_TYPE_STRING = 3;
uint8 private constant MAJOR_TYPE_ARRAY = 4;
uint8 private constant MAJOR_TYPE_MAP = 5;
uint8 private constant MAJOR_TYPE_TAG = 6;
uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;
uint8 private constant TAG_TYPE_BIGNUM = 2;
uint8 private constant TAG_TYPE_NEGATIVE_BIGNUM = 3;
function encodeFixedNumeric(BufferChainlink.buffer memory buf, uint8 major, uint64 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 {
buf.appendUint8(uint8((major << 5) | 27));
buf.appendInt(value, 8);
}
}
function encodeIndefiniteLengthType(BufferChainlink.buffer memory buf, uint8 major) private pure {
buf.appendUint8(uint8((major << 5) | 31));
}
function encodeUInt(BufferChainlink.buffer memory buf, uint value) internal pure {
if(value > 0xFFFFFFFFFFFFFFFF) {
encodeBigNum(buf, value);
} else {
encodeFixedNumeric(buf, MAJOR_TYPE_INT, uint64(value));
}
}
function encodeInt(BufferChainlink.buffer memory buf, int value) internal pure {
if(value < -0x10000000000000000) {
encodeSignedBigNum(buf, value);
} else if(value > 0xFFFFFFFFFFFFFFFF) {
encodeBigNum(buf, uint(value));
} else if(value >= 0) {
encodeFixedNumeric(buf, MAJOR_TYPE_INT, uint64(uint256(value)));
} else {
encodeFixedNumeric(buf, MAJOR_TYPE_NEGATIVE_INT, uint64(uint256(-1 - value)));
}
}
function encodeBytes(BufferChainlink.buffer memory buf, bytes memory value) internal pure {
encodeFixedNumeric(buf, MAJOR_TYPE_BYTES, uint64(value.length));
buf.append(value);
}
function encodeBigNum(BufferChainlink.buffer memory buf, uint value) internal pure {
buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));
encodeBytes(buf, abi.encode(value));
}
function encodeSignedBigNum(BufferChainlink.buffer memory buf, int input) internal pure {
buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_NEGATIVE_BIGNUM));
encodeBytes(buf, abi.encode(uint256(-1 - input)));
}
function encodeString(BufferChainlink.buffer memory buf, string memory value) internal pure {
encodeFixedNumeric(buf, MAJOR_TYPE_STRING, uint64(bytes(value).length));
buf.append(bytes(value));
}
function startArray(BufferChainlink.buffer memory buf) internal pure {
encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);
}
function startMap(BufferChainlink.buffer memory buf) internal pure {
encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);
}
function endSequence(BufferChainlink.buffer memory buf) internal pure {
encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);
}
}
// File @chainlink/contracts/src/v0.8/Chainlink.sol@v0.4.2
/**
* @title Library for common Chainlink functions
* @dev Uses imported CBOR library for encoding to buffer
*/
library Chainlink {
uint256 internal constant defaultBufferSize = 256; // solhint-disable-line const-name-snakecase
using CBORChainlink for BufferChainlink.buffer;
struct Request {
bytes32 id;
address callbackAddress;
bytes4 callbackFunctionId;
uint256 nonce;
BufferChainlink.buffer buf;
}
/**
* @notice Initializes a Chainlink request
* @dev Sets the ID, callback address, and callback function signature on the request
* @param self The uninitialized request
* @param jobId The Job Specification ID
* @param callbackAddr The callback address
* @param callbackFunc The callback function signature
* @return The initialized request
*/
function initialize(
Request memory self,
bytes32 jobId,
address callbackAddr,
bytes4 callbackFunc
) internal pure returns (Chainlink.Request memory) {
BufferChainlink.init(self.buf, defaultBufferSize);
self.id = jobId;
self.callbackAddress = callbackAddr;
self.callbackFunctionId = callbackFunc;
return self;
}
/**
* @notice Sets the data for the buffer without encoding CBOR on-chain
* @dev CBOR can be closed with curly-brackets {} or they can be left off
* @param self The initialized request
* @param data The CBOR data
*/
function setBuffer(Request memory self, bytes memory data) internal pure {
BufferChainlink.init(self.buf, data.length);
BufferChainlink.append(self.buf, data);
}
/**
* @notice Adds a string value to the request with a given key name
* @param self The initialized request
* @param key The name of the key
* @param value The string value to add
*/
function add(
Request memory self,
string memory key,
string memory value
) internal pure {
self.buf.encodeString(key);
self.buf.encodeString(value);
}
/**
* @notice Adds a bytes value to the request with a given key name
* @param self The initialized request
* @param key The name of the key
* @param value The bytes value to add
*/
function addBytes(
Request memory self,
string memory key,
bytes memory value
) internal pure {
self.buf.encodeString(key);
self.buf.encodeBytes(value);
}
/**
* @notice Adds a int256 value to the request with a given key name
* @param self The initialized request
* @param key The name of the key
* @param value The int256 value to add
*/
function addInt(
Request memory self,
string memory key,
int256 value
) internal pure {
self.buf.encodeString(key);
self.buf.encodeInt(value);
}
/**
* @notice Adds a uint256 value to the request with a given key name
* @param self The initialized request
* @param key The name of the key
* @param value The uint256 value to add
*/
function addUint(
Request memory self,
string memory key,
uint256 value
) internal pure {
self.buf.encodeString(key);
self.buf.encodeUInt(value);
}
/**
* @notice Adds an array of strings to the request with a given key name
* @param self The initialized request
* @param key The name of the key
* @param values The array of string values to add
*/
function addStringArray(
Request memory self,
string memory key,
string[] memory values
) internal pure {
self.buf.encodeString(key);
self.buf.startArray();
for (uint256 i = 0; i < values.length; i++) {
self.buf.encodeString(values[i]);
}
self.buf.endSequence();
}
}
// File @chainlink/contracts/src/v0.8/interfaces/ENSInterface.sol@v0.4.2
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);
}
// File @chainlink/contracts/src/v0.8/interfaces/LinkTokenInterface.sol@v0.4.2
interface LinkTokenInterface {
function allowance(address owner, address spender) external view returns (uint256 remaining);
function approve(address spender, uint256 value) external returns (bool success);
function balanceOf(address owner) external view returns (uint256 balance);
function decimals() external view returns (uint8 decimalPlaces);
function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);
function increaseApproval(address spender, uint256 subtractedValue) external;
function name() external view returns (string memory tokenName);
function symbol() external view returns (string memory tokenSymbol);
function totalSupply() external view returns (uint256 totalTokensIssued);
function transfer(address to, uint256 value) external returns (bool success);
function transferAndCall(
address to,
uint256 value,
bytes calldata data
) external returns (bool success);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool success);
}
// File @chainlink/contracts/src/v0.8/interfaces/ChainlinkRequestInterface.sol@v0.4.2
interface ChainlinkRequestInterface {
function oracleRequest(
address sender,
uint256 requestPrice,
bytes32 serviceAgreementID,
address callbackAddress,
bytes4 callbackFunctionId,
uint256 nonce,
uint256 dataVersion,
bytes calldata data
) external;
function cancelOracleRequest(
bytes32 requestId,
uint256 payment,
bytes4 callbackFunctionId,
uint256 expiration
) external;
}
// File @chainlink/contracts/src/v0.8/interfaces/OracleInterface.sol@v0.4.2
interface OracleInterface {
function fulfillOracleRequest(
bytes32 requestId,
uint256 payment,
address callbackAddress,
bytes4 callbackFunctionId,
uint256 expiration,
bytes32 data
) external returns (bool);
function isAuthorizedSender(address node) external view returns (bool);
function withdraw(address recipient, uint256 amount) external;
function withdrawable() external view returns (uint256);
}
// File @chainlink/contracts/src/v0.8/interfaces/OperatorInterface.sol@v0.4.2
interface OperatorInterface is OracleInterface, ChainlinkRequestInterface {
function operatorRequest(
address sender,
uint256 payment,
bytes32 specId,
bytes4 callbackFunctionId,
uint256 nonce,
uint256 dataVersion,
bytes calldata data
) external;
function fulfillOracleRequest2(
bytes32 requestId,
uint256 payment,
address callbackAddress,
bytes4 callbackFunctionId,
uint256 expiration,
bytes calldata data
) external returns (bool);
function ownerTransferAndCall(
address to,
uint256 value,
bytes calldata data
) external returns (bool success);
function distributeFunds(address payable[] calldata receivers, uint256[] calldata amounts) external payable;
function getAuthorizedSenders() external returns (address[] memory);
function setAuthorizedSenders(address[] calldata senders) external;
function getForwarder() external returns (address);
}
// File @chainlink/contracts/src/v0.8/interfaces/PointerInterface.sol@v0.4.2
interface PointerInterface {
function getAddress() external view returns (address);
}
// File @chainlink/contracts/src/v0.8/vendor/ENSResolver.sol@v0.4.2
abstract contract ENSResolver_Chainlink {
function addr(bytes32 node) public view virtual returns (address);
}
// File @chainlink/contracts/src/v0.8/ChainlinkClient.sol@v0.4.2
/**
* @title The ChainlinkClient contract
* @notice Contract writers can inherit this contract in order to create requests for the
* Chainlink network
*/
abstract contract ChainlinkClient {
using Chainlink for Chainlink.Request;
uint256 internal constant LINK_DIVISIBILITY = 10**18;
uint256 private constant AMOUNT_OVERRIDE = 0;
address private constant SENDER_OVERRIDE = address(0);
uint256 private constant ORACLE_ARGS_VERSION = 1;
uint256 private constant OPERATOR_ARGS_VERSION = 2;
bytes32 private constant ENS_TOKEN_SUBNAME = keccak256("link");
bytes32 private constant ENS_ORACLE_SUBNAME = keccak256("oracle");
address private constant LINK_TOKEN_POINTER = 0xC89bD4E1632D3A43CB03AAAd5262cbe4038Bc571;
ENSInterface private s_ens;
bytes32 private s_ensNode;
LinkTokenInterface private s_link;
OperatorInterface private s_oracle;
uint256 private s_requestCount = 1;
mapping(bytes32 => address) private s_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 callbackAddr address to operate the callback on
* @param callbackFunctionSignature function signature to use for the callback
* @return A Chainlink Request struct in memory
*/
function buildChainlinkRequest(
bytes32 specId,
address callbackAddr,
bytes4 callbackFunctionSignature
) internal pure returns (Chainlink.Request memory) {
Chainlink.Request memory req;
return req.initialize(specId, callbackAddr, callbackFunctionSignature);
}
/**
* @notice Creates a request that can hold additional parameters
* @param specId The Job Specification ID that the request will be created for
* @param callbackFunctionSignature function signature to use for the callback
* @return A Chainlink Request struct in memory
*/
function buildOperatorRequest(bytes32 specId, bytes4 callbackFunctionSignature)
internal
view
returns (Chainlink.Request memory)
{
Chainlink.Request memory req;
return req.initialize(specId, address(this), callbackFunctionSignature);
}
/**
* @notice Creates a Chainlink request to the stored oracle address
* @dev Calls `chainlinkRequestTo` with the stored oracle address
* @param req The initialized Chainlink Request
* @param payment The amount of LINK to send for the request
* @return requestId The request ID
*/
function sendChainlinkRequest(Chainlink.Request memory req, uint256 payment) internal returns (bytes32) {
return sendChainlinkRequestTo(address(s_oracle), req, payment);
}
/**
* @notice Creates a Chainlink request to the specified oracle address
* @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to
* send LINK which creates a request on the target oracle contract.
* Emits ChainlinkRequested event.
* @param oracleAddress The address of the oracle for the request
* @param req The initialized Chainlink Request
* @param payment The amount of LINK to send for the request
* @return requestId The request ID
*/
function sendChainlinkRequestTo(
address oracleAddress,
Chainlink.Request memory req,
uint256 payment
) internal returns (bytes32 requestId) {
uint256 nonce = s_requestCount;
s_requestCount = nonce + 1;
bytes memory encodedRequest = abi.encodeWithSelector(
ChainlinkRequestInterface.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,
address(this),
req.callbackFunctionId,
nonce,
ORACLE_ARGS_VERSION,
req.buf.buf
);
return _rawRequest(oracleAddress, nonce, payment, encodedRequest);
}
/**
* @notice Creates a Chainlink request to the stored oracle address
* @dev This function supports multi-word response
* @dev Calls `sendOperatorRequestTo` with the stored oracle address
* @param req The initialized Chainlink Request
* @param payment The amount of LINK to send for the request
* @return requestId The request ID
*/
function sendOperatorRequest(Chainlink.Request memory req, uint256 payment) internal returns (bytes32) {
return sendOperatorRequestTo(address(s_oracle), req, payment);
}
/**
* @notice Creates a Chainlink request to the specified oracle address
* @dev This function supports multi-word response
* @dev Generates and stores a request ID, increments the local nonce, and uses `transferAndCall` to
* send LINK which creates a request on the target oracle contract.
* Emits ChainlinkRequested event.
* @param oracleAddress The address of the oracle for the request
* @param req The initialized Chainlink Request
* @param payment The amount of LINK to send for the request
* @return requestId The request ID
*/
function sendOperatorRequestTo(
address oracleAddress,
Chainlink.Request memory req,
uint256 payment
) internal returns (bytes32 requestId) {
uint256 nonce = s_requestCount;
s_requestCount = nonce + 1;
bytes memory encodedRequest = abi.encodeWithSelector(
OperatorInterface.operatorRequest.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.callbackFunctionId,
nonce,
OPERATOR_ARGS_VERSION,
req.buf.buf
);
return _rawRequest(oracleAddress, nonce, payment, encodedRequest);
}
/**
* @notice Make a request to an oracle
* @param oracleAddress The address of the oracle for the request
* @param nonce used to generate the request ID
* @param payment The amount of LINK to send for the request
* @param encodedRequest data encoded for request type specific format
* @return requestId The request ID
*/
function _rawRequest(
address oracleAddress,
uint256 nonce,
uint256 payment,
bytes memory encodedRequest
) private returns (bytes32 requestId) {
requestId = keccak256(abi.encodePacked(this, nonce));
s_pendingRequests[requestId] = oracleAddress;
emit ChainlinkRequested(requestId);
require(s_link.transferAndCall(oracleAddress, payment, encodedRequest), "unable to transferAndCall to oracle");
}
/**
* @notice Allows a request to be cancelled if it has not been fulfilled
* @dev Requires keeping track of the expiration value emitted from the oracle contract.
* Deletes the request from the `pendingRequests` mapping.
* Emits ChainlinkCancelled event.
* @param requestId The request ID
* @param payment The amount of LINK sent for the request
* @param callbackFunc The callback function specified for the request
* @param expiration The time of the expiration for the request
*/
function cancelChainlinkRequest(
bytes32 requestId,
uint256 payment,
bytes4 callbackFunc,
uint256 expiration
) internal {
OperatorInterface requested = OperatorInterface(s_pendingRequests[requestId]);
delete s_pendingRequests[requestId];
emit ChainlinkCancelled(requestId);
requested.cancelOracleRequest(requestId, payment, callbackFunc, expiration);
}
/**
* @notice the next request count to be used in generating a nonce
* @dev starts at 1 in order to ensure consistent gas cost
* @return returns the next request count to be used in a nonce
*/
function getNextRequestCount() internal view returns (uint256) {
return s_requestCount;
}
/**
* @notice Sets the stored oracle address
* @param oracleAddress The address of the oracle contract
*/
function setChainlinkOracle(address oracleAddress) internal {
s_oracle = OperatorInterface(oracleAddress);
}
/**
* @notice Sets the LINK token address
* @param linkAddress The address of the LINK token contract
*/
function setChainlinkToken(address linkAddress) internal {
s_link = LinkTokenInterface(linkAddress);
}
/**
* @notice Sets the Chainlink token address for the public
* network as given by the Pointer contract
*/
function setPublicChainlinkToken() internal {
setChainlinkToken(PointerInterface(LINK_TOKEN_POINTER).getAddress());
}
/**
* @notice Retrieves the stored address of the LINK token
* @return The address of the LINK token
*/
function chainlinkTokenAddress() internal view returns (address) {
return address(s_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(s_oracle);
}
/**
* @notice Allows for a request which was created on another contract to be fulfilled
* on this contract
* @param oracleAddress The address of the oracle contract that will fulfill the request
* @param requestId The request ID used for the response
*/
function addChainlinkExternalRequest(address oracleAddress, bytes32 requestId) internal notPendingRequest(requestId) {
s_pendingRequests[requestId] = oracleAddress;
}
/**
* @notice Sets the stored oracle and LINK token contracts with the addresses resolved by ENS
* @dev Accounts for subnodes having different resolvers
* @param ensAddress The address of the ENS contract
* @param node The ENS node hash
*/
function useChainlinkWithENS(address ensAddress, bytes32 node) internal {
s_ens = ENSInterface(ensAddress);
s_ensNode = node;
bytes32 linkSubnode = keccak256(abi.encodePacked(s_ensNode, ENS_TOKEN_SUBNAME));
ENSResolver_Chainlink resolver = ENSResolver_Chainlink(s_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(s_ensNode, ENS_ORACLE_SUBNAME));
ENSResolver_Chainlink resolver = ENSResolver_Chainlink(s_ens.resolver(oracleSubnode));
setChainlinkOracle(resolver.addr(oracleSubnode));
}
/**
* @notice Ensures that the fulfillment is valid for this contract
* @dev Use if the contract developer prefers methods instead of modifiers for validation
* @param requestId The request ID for fulfillment
*/
function validateChainlinkCallback(bytes32 requestId)
internal
recordChainlinkFulfillment(requestId)
// solhint-disable-next-line no-empty-blocks
{
}
/**
* @dev Reverts if the sender is not the oracle of the request.
* Emits ChainlinkFulfilled event.
* @param requestId The request ID for fulfillment
*/
modifier recordChainlinkFulfillment(bytes32 requestId) {
require(msg.sender == s_pendingRequests[requestId], "Source must be the oracle of the request");
delete s_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(s_pendingRequests[requestId] == address(0), "Request is already pending");
_;
}
}
// File contracts/Math/BokkyPooBahsDateTimeLibrary.sol
// ----------------------------------------------------------------------------
// BokkyPooBah's DateTime Library v1.01
//
// A gas-efficient Solidity date and time library
//
// https://github.com/bokkypoobah/BokkyPooBahsDateTimeLibrary
//
// Tested date range 1970/01/01 to 2345/12/31
//
// Conventions:
// Unit | Range | Notes
// :-------- |:-------------:|:-----
// timestamp | >= 0 | Unix timestamp, number of seconds since 1970/01/01 00:00:00 UTC
// year | 1970 ... 2345 |
// month | 1 ... 12 |
// day | 1 ... 31 |
// hour | 0 ... 23 |
// minute | 0 ... 59 |
// second | 0 ... 59 |
// dayOfWeek | 1 ... 7 | 1 = Monday, ..., 7 = Sunday
//
//
// Enjoy. (c) BokkyPooBah / Bok Consulting Pty Ltd 2018-2019. The MIT Licence.
// ----------------------------------------------------------------------------
library BokkyPooBahsDateTimeLibrary {
uint constant SECONDS_PER_DAY = 24 * 60 * 60;
uint constant SECONDS_PER_HOUR = 60 * 60;
uint constant SECONDS_PER_MINUTE = 60;
int constant OFFSET19700101 = 2440588;
uint constant DOW_MON = 1;
uint constant DOW_TUE = 2;
uint constant DOW_WED = 3;
uint constant DOW_THU = 4;
uint constant DOW_FRI = 5;
uint constant DOW_SAT = 6;
uint constant DOW_SUN = 7;
// ------------------------------------------------------------------------
// Calculate the number of days from 1970/01/01 to year/month/day using
// the date conversion algorithm from
// http://aa.usno.navy.mil/faq/docs/JD_Formula.php
// and subtracting the offset 2440588 so that 1970/01/01 is day 0
//
// days = day
// - 32075
// + 1461 * (year + 4800 + (month - 14) / 12) / 4
// + 367 * (month - 2 - (month - 14) / 12 * 12) / 12
// - 3 * ((year + 4900 + (month - 14) / 12) / 100) / 4
// - offset
// ------------------------------------------------------------------------
function _daysFromDate(uint year, uint month, uint day) internal pure returns (uint _days) {
require(year >= 1970);
int _year = int(year);
int _month = int(month);
int _day = int(day);
int __days = _day
- 32075
+ 1461 * (_year + 4800 + (_month - 14) / 12) / 4
+ 367 * (_month - 2 - (_month - 14) / 12 * 12) / 12
- 3 * ((_year + 4900 + (_month - 14) / 12) / 100) / 4
- OFFSET19700101;
_days = uint(__days);
}
// ------------------------------------------------------------------------
// Calculate year/month/day from the number of days since 1970/01/01 using
// the date conversion algorithm from
// http://aa.usno.navy.mil/faq/docs/JD_Formula.php
// and adding the offset 2440588 so that 1970/01/01 is day 0
//
// int L = days + 68569 + offset
// int N = 4 * L / 146097
// L = L - (146097 * N + 3) / 4
// year = 4000 * (L + 1) / 1461001
// L = L - 1461 * year / 4 + 31
// month = 80 * L / 2447
// dd = L - 2447 * month / 80
// L = month / 11
// month = month + 2 - 12 * L
// year = 100 * (N - 49) + year + L
// ------------------------------------------------------------------------
function _daysToDate(uint _days) internal pure returns (uint year, uint month, uint day) {
int __days = int(_days);
int L = __days + 68569 + OFFSET19700101;
int N = 4 * L / 146097;
L = L - (146097 * N + 3) / 4;
int _year = 4000 * (L + 1) / 1461001;
L = L - 1461 * _year / 4 + 31;
int _month = 80 * L / 2447;
int _day = L - 2447 * _month / 80;
L = _month / 11;
_month = _month + 2 - 12 * L;
_year = 100 * (N - 49) + _year + L;
year = uint(_year);
month = uint(_month);
day = uint(_day);
}
function timestampFromDate(uint year, uint month, uint day) internal pure returns (uint timestamp) {
timestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY;
}
function timestampFromDateTime(uint year, uint month, uint day, uint hour, uint minute, uint second) internal pure returns (uint timestamp) {
timestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + hour * SECONDS_PER_HOUR + minute * SECONDS_PER_MINUTE + second;
}
function timestampToDate(uint timestamp) internal pure returns (uint year, uint month, uint day) {
(year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY);
}
function timestampToDateTime(uint timestamp) internal pure returns (uint year, uint month, uint day, uint hour, uint minute, uint second) {
(year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY);
uint secs = timestamp % SECONDS_PER_DAY;
hour = secs / SECONDS_PER_HOUR;
secs = secs % SECONDS_PER_HOUR;
minute = secs / SECONDS_PER_MINUTE;
second = secs % SECONDS_PER_MINUTE;
}
function isValidDate(uint year, uint month, uint day) internal pure returns (bool valid) {
if (year >= 1970 && month > 0 && month <= 12) {
uint daysInMonth = _getDaysInMonth(year, month);
if (day > 0 && day <= daysInMonth) {
valid = true;
}
}
}
function isValidDateTime(uint year, uint month, uint day, uint hour, uint minute, uint second) internal pure returns (bool valid) {
if (isValidDate(year, month, day)) {
if (hour < 24 && minute < 60 && second < 60) {
valid = true;
}
}
}
function isLeapYear(uint timestamp) internal pure returns (bool leapYear) {
(uint year,,) = _daysToDate(timestamp / SECONDS_PER_DAY);
leapYear = _isLeapYear(year);
}
function _isLeapYear(uint year) internal pure returns (bool leapYear) {
leapYear = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}
function isWeekDay(uint timestamp) internal pure returns (bool weekDay) {
weekDay = getDayOfWeek(timestamp) <= DOW_FRI;
}
function isWeekEnd(uint timestamp) internal pure returns (bool weekEnd) {
weekEnd = getDayOfWeek(timestamp) >= DOW_SAT;
}
function getDaysInMonth(uint timestamp) internal pure returns (uint daysInMonth) {
(uint year, uint month,) = _daysToDate(timestamp / SECONDS_PER_DAY);
daysInMonth = _getDaysInMonth(year, month);
}
function _getDaysInMonth(uint year, uint month) internal pure returns (uint daysInMonth) {
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
daysInMonth = 31;
} else if (month != 2) {
daysInMonth = 30;
} else {
daysInMonth = _isLeapYear(year) ? 29 : 28;
}
}
// 1 = Monday, 7 = Sunday
function getDayOfWeek(uint timestamp) internal pure returns (uint dayOfWeek) {
uint _days = timestamp / SECONDS_PER_DAY;
dayOfWeek = (_days + 3) % 7 + 1;
}
function getYear(uint timestamp) internal pure returns (uint year) {
(year,,) = _daysToDate(timestamp / SECONDS_PER_DAY);
}
function getMonth(uint timestamp) internal pure returns (uint month) {
(,month,) = _daysToDate(timestamp / SECONDS_PER_DAY);
}
function getDay(uint timestamp) internal pure returns (uint day) {
(,,day) = _daysToDate(timestamp / SECONDS_PER_DAY);
}
function getHour(uint timestamp) internal pure returns (uint hour) {
uint secs = timestamp % SECONDS_PER_DAY;
hour = secs / SECONDS_PER_HOUR;
}
function getMinute(uint timestamp) internal pure returns (uint minute) {
uint secs = timestamp % SECONDS_PER_HOUR;
minute = secs / SECONDS_PER_MINUTE;
}
function getSecond(uint timestamp) internal pure returns (uint second) {
second = timestamp % SECONDS_PER_MINUTE;
}
function addYears(uint timestamp, uint _years) internal pure returns (uint newTimestamp) {
(uint year, uint month, uint day) = _daysToDate(timestamp / SECONDS_PER_DAY);
year += _years;
uint daysInMonth = _getDaysInMonth(year, month);
if (day > daysInMonth) {
day = daysInMonth;
}
newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + timestamp % SECONDS_PER_DAY;
require(newTimestamp >= timestamp);
}
function addMonths(uint timestamp, uint _months) internal pure returns (uint newTimestamp) {
(uint year, uint month, uint day) = _daysToDate(timestamp / SECONDS_PER_DAY);
month += _months;
year += (month - 1) / 12;
month = (month - 1) % 12 + 1;
uint daysInMonth = _getDaysInMonth(year, month);
if (day > daysInMonth) {
day = daysInMonth;
}
newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + timestamp % SECONDS_PER_DAY;
require(newTimestamp >= timestamp);
}
function addDays(uint timestamp, uint _days) internal pure returns (uint newTimestamp) {
newTimestamp = timestamp + _days * SECONDS_PER_DAY;
require(newTimestamp >= timestamp);
}
function addHours(uint timestamp, uint _hours) internal pure returns (uint newTimestamp) {
newTimestamp = timestamp + _hours * SECONDS_PER_HOUR;
require(newTimestamp >= timestamp);
}
function addMinutes(uint timestamp, uint _minutes) internal pure returns (uint newTimestamp) {
newTimestamp = timestamp + _minutes * SECONDS_PER_MINUTE;
require(newTimestamp >= timestamp);
}
function addSeconds(uint timestamp, uint _seconds) internal pure returns (uint newTimestamp) {
newTimestamp = timestamp + _seconds;
require(newTimestamp >= timestamp);
}
function subYears(uint timestamp, uint _years) internal pure returns (uint newTimestamp) {
(uint year, uint month, uint day) = _daysToDate(timestamp / SECONDS_PER_DAY);
year -= _years;
uint daysInMonth = _getDaysInMonth(year, month);
if (day > daysInMonth) {
day = daysInMonth;
}
newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + timestamp % SECONDS_PER_DAY;
require(newTimestamp <= timestamp);
}
function subMonths(uint timestamp, uint _months) internal pure returns (uint newTimestamp) {
(uint year, uint month, uint day) = _daysToDate(timestamp / SECONDS_PER_DAY);
uint yearMonth = year * 12 + (month - 1) - _months;
year = yearMonth / 12;
month = yearMonth % 12 + 1;
uint daysInMonth = _getDaysInMonth(year, month);
if (day > daysInMonth) {
day = daysInMonth;
}
newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + timestamp % SECONDS_PER_DAY;
require(newTimestamp <= timestamp);
}
function subDays(uint timestamp, uint _days) internal pure returns (uint newTimestamp) {
newTimestamp = timestamp - _days * SECONDS_PER_DAY;
require(newTimestamp <= timestamp);
}
function subHours(uint timestamp, uint _hours) internal pure returns (uint newTimestamp) {
newTimestamp = timestamp - _hours * SECONDS_PER_HOUR;
require(newTimestamp <= timestamp);
}
function subMinutes(uint timestamp, uint _minutes) internal pure returns (uint newTimestamp) {
newTimestamp = timestamp - _minutes * SECONDS_PER_MINUTE;
require(newTimestamp <= timestamp);
}
function subSeconds(uint timestamp, uint _seconds) internal pure returns (uint newTimestamp) {
newTimestamp = timestamp - _seconds;
require(newTimestamp <= timestamp);
}
function diffYears(uint fromTimestamp, uint toTimestamp) internal pure returns (uint _years) {
require(fromTimestamp <= toTimestamp);
(uint fromYear,,) = _daysToDate(fromTimestamp / SECONDS_PER_DAY);
(uint toYear,,) = _daysToDate(toTimestamp / SECONDS_PER_DAY);
_years = toYear - fromYear;
}
function diffMonths(uint fromTimestamp, uint toTimestamp) internal pure returns (uint _months) {
require(fromTimestamp <= toTimestamp);
(uint fromYear, uint fromMonth,) = _daysToDate(fromTimestamp / SECONDS_PER_DAY);
(uint toYear, uint toMonth,) = _daysToDate(toTimestamp / SECONDS_PER_DAY);
_months = toYear * 12 + toMonth - fromYear * 12 - fromMonth;
}
function diffDays(uint fromTimestamp, uint toTimestamp) internal pure returns (uint _days) {
require(fromTimestamp <= toTimestamp);
_days = (toTimestamp - fromTimestamp) / SECONDS_PER_DAY;
}
function diffHours(uint fromTimestamp, uint toTimestamp) internal pure returns (uint _hours) {
require(fromTimestamp <= toTimestamp);
_hours = (toTimestamp - fromTimestamp) / SECONDS_PER_HOUR;
}
function diffMinutes(uint fromTimestamp, uint toTimestamp) internal pure returns (uint _minutes) {
require(fromTimestamp <= toTimestamp);
_minutes = (toTimestamp - fromTimestamp) / SECONDS_PER_MINUTE;
}
function diffSeconds(uint fromTimestamp, uint toTimestamp) internal pure returns (uint _seconds) {
require(fromTimestamp <= toTimestamp);
_seconds = toTimestamp - fromTimestamp;
}
}
// File contracts/Math/BokkyPooBahsDateTimeContract.sol
// ----------------------------------------------------------------------------
// BokkyPooBah's DateTime Library v1.00 - Contract Instance
//
// A gas-efficient Solidity date and time library
//
// https://github.com/bokkypoobah/BokkyPooBahsDateTimeLibrary
//
// Tested date range 1970/01/01 to 2345/12/31
//
// Conventions:
// Unit | Range | Notes
// :-------- |:-------------:|:-----
// timestamp | >= 0 | Unix timestamp, number of seconds since 1970/01/01 00:00:00 UTC
// year | 1970 ... 2345 |
// month | 1 ... 12 |
// day | 1 ... 31 |
// hour | 0 ... 23 |
// minute | 0 ... 59 |
// second | 0 ... 59 |
// dayOfWeek | 1 ... 7 | 1 = Monday, ..., 7 = Sunday
//
//
// Enjoy. (c) BokkyPooBah / Bok Consulting Pty Ltd 2018.
//
// GNU Lesser General Public License 3.0
// https://www.gnu.org/licenses/lgpl-3.0.en.html
// ----------------------------------------------------------------------------
contract BokkyPooBahsDateTimeContract {
uint public constant SECONDS_PER_DAY = 24 * 60 * 60;
uint public constant SECONDS_PER_HOUR = 60 * 60;
uint public constant SECONDS_PER_MINUTE = 60;
int public constant OFFSET19700101 = 2440588;
uint public constant DOW_MON = 1;
uint public constant DOW_TUE = 2;
uint public constant DOW_WED = 3;
uint public constant DOW_THU = 4;
uint public constant DOW_FRI = 5;
uint public constant DOW_SAT = 6;
uint public constant DOW_SUN = 7;
function _now() public view returns (uint timestamp) {
timestamp = block.timestamp;
}
function _nowDateTime() public view returns (uint year, uint month, uint day, uint hour, uint minute, uint second) {
(year, month, day, hour, minute, second) = BokkyPooBahsDateTimeLibrary.timestampToDateTime(block.timestamp);
}
function _daysFromDate(uint year, uint month, uint day) public pure returns (uint _days) {
return BokkyPooBahsDateTimeLibrary._daysFromDate(year, month, day);
}
function _daysToDate(uint _days) public pure returns (uint year, uint month, uint day) {
return BokkyPooBahsDateTimeLibrary._daysToDate(_days);
}
function timestampFromDate(uint year, uint month, uint day) public pure returns (uint timestamp) {
return BokkyPooBahsDateTimeLibrary.timestampFromDate(year, month, day);
}
function timestampFromDateTime(uint year, uint month, uint day, uint hour, uint minute, uint second) public pure returns (uint timestamp) {
return BokkyPooBahsDateTimeLibrary.timestampFromDateTime(year, month, day, hour, minute, second);
}
function timestampToDate(uint timestamp) public pure returns (uint year, uint month, uint day) {
(year, month, day) = BokkyPooBahsDateTimeLibrary.timestampToDate(timestamp);
}
function timestampToDateTime(uint timestamp) public pure returns (uint year, uint month, uint day, uint hour, uint minute, uint second) {
(year, month, day, hour, minute, second) = BokkyPooBahsDateTimeLibrary.timestampToDateTime(timestamp);
}
function isValidDate(uint year, uint month, uint day) public pure returns (bool valid) {
valid = BokkyPooBahsDateTimeLibrary.isValidDate(year, month, day);
}
function isValidDateTime(uint year, uint month, uint day, uint hour, uint minute, uint second) public pure returns (bool valid) {
valid = BokkyPooBahsDateTimeLibrary.isValidDateTime(year, month, day, hour, minute, second);
}
function isLeapYear(uint timestamp) public pure returns (bool leapYear) {
leapYear = BokkyPooBahsDateTimeLibrary.isLeapYear(timestamp);
}
function _isLeapYear(uint year) public pure returns (bool leapYear) {
leapYear = BokkyPooBahsDateTimeLibrary._isLeapYear(year);
}
function isWeekDay(uint timestamp) public pure returns (bool weekDay) {
weekDay = BokkyPooBahsDateTimeLibrary.isWeekDay(timestamp);
}
function isWeekEnd(uint timestamp) public pure returns (bool weekEnd) {
weekEnd = BokkyPooBahsDateTimeLibrary.isWeekEnd(timestamp);
}
function getDaysInMonth(uint timestamp) public pure returns (uint daysInMonth) {
daysInMonth = BokkyPooBahsDateTimeLibrary.getDaysInMonth(timestamp);
}
function _getDaysInMonth(uint year, uint month) public pure returns (uint daysInMonth) {
daysInMonth = BokkyPooBahsDateTimeLibrary._getDaysInMonth(year, month);
}
function getDayOfWeek(uint timestamp) public pure returns (uint dayOfWeek) {
dayOfWeek = BokkyPooBahsDateTimeLibrary.getDayOfWeek(timestamp);
}
function getYear(uint timestamp) public pure returns (uint year) {
year = BokkyPooBahsDateTimeLibrary.getYear(timestamp);
}
function getMonth(uint timestamp) public pure returns (uint month) {
month = BokkyPooBahsDateTimeLibrary.getMonth(timestamp);
}
function getDay(uint timestamp) public pure returns (uint day) {
day = BokkyPooBahsDateTimeLibrary.getDay(timestamp);
}
function getHour(uint timestamp) public pure returns (uint hour) {
hour = BokkyPooBahsDateTimeLibrary.getHour(timestamp);
}
function getMinute(uint timestamp) public pure returns (uint minute) {
minute = BokkyPooBahsDateTimeLibrary.getMinute(timestamp);
}
function getSecond(uint timestamp) public pure returns (uint second) {
second = BokkyPooBahsDateTimeLibrary.getSecond(timestamp);
}
function addYears(uint timestamp, uint _years) public pure returns (uint newTimestamp) {
newTimestamp = BokkyPooBahsDateTimeLibrary.addYears(timestamp, _years);
}
function addMonths(uint timestamp, uint _months) public pure returns (uint newTimestamp) {
newTimestamp = BokkyPooBahsDateTimeLibrary.addMonths(timestamp, _months);
}
function addDays(uint timestamp, uint _days) public pure returns (uint newTimestamp) {
newTimestamp = BokkyPooBahsDateTimeLibrary.addDays(timestamp, _days);
}
function addHours(uint timestamp, uint _hours) public pure returns (uint newTimestamp) {
newTimestamp = BokkyPooBahsDateTimeLibrary.addHours(timestamp, _hours);
}
function addMinutes(uint timestamp, uint _minutes) public pure returns (uint newTimestamp) {
newTimestamp = BokkyPooBahsDateTimeLibrary.addMinutes(timestamp, _minutes);
}
function addSeconds(uint timestamp, uint _seconds) public pure returns (uint newTimestamp) {
newTimestamp = BokkyPooBahsDateTimeLibrary.addSeconds(timestamp, _seconds);
}
function subYears(uint timestamp, uint _years) public pure returns (uint newTimestamp) {
newTimestamp = BokkyPooBahsDateTimeLibrary.subYears(timestamp, _years);
}
function subMonths(uint timestamp, uint _months) public pure returns (uint newTimestamp) {
newTimestamp = BokkyPooBahsDateTimeLibrary.subMonths(timestamp, _months);
}
function subDays(uint timestamp, uint _days) public pure returns (uint newTimestamp) {
newTimestamp = BokkyPooBahsDateTimeLibrary.subDays(timestamp, _days);
}
function subHours(uint timestamp, uint _hours) public pure returns (uint newTimestamp) {
newTimestamp = BokkyPooBahsDateTimeLibrary.subHours(timestamp, _hours);
}
function subMinutes(uint timestamp, uint _minutes) public pure returns (uint newTimestamp) {
newTimestamp = BokkyPooBahsDateTimeLibrary.subMinutes(timestamp, _minutes);
}
function subSeconds(uint timestamp, uint _seconds) public pure returns (uint newTimestamp) {
newTimestamp = BokkyPooBahsDateTimeLibrary.subSeconds(timestamp, _seconds);
}
function diffYears(uint fromTimestamp, uint toTimestamp) public pure returns (uint _years) {
_years = BokkyPooBahsDateTimeLibrary.diffYears(fromTimestamp, toTimestamp);
}
function diffMonths(uint fromTimestamp, uint toTimestamp) public pure returns (uint _months) {
_months = BokkyPooBahsDateTimeLibrary.diffMonths(fromTimestamp, toTimestamp);
}
function diffDays(uint fromTimestamp, uint toTimestamp) public pure returns (uint _days) {
_days = BokkyPooBahsDateTimeLibrary.diffDays(fromTimestamp, toTimestamp);
}
function diffHours(uint fromTimestamp, uint toTimestamp) public pure returns (uint _hours) {
_hours = BokkyPooBahsDateTimeLibrary.diffHours(fromTimestamp, toTimestamp);
}
function diffMinutes(uint fromTimestamp, uint toTimestamp) public pure returns (uint _minutes) {
_minutes = BokkyPooBahsDateTimeLibrary.diffMinutes(fromTimestamp, toTimestamp);
}
function diffSeconds(uint fromTimestamp, uint toTimestamp) public pure returns (uint _seconds) {
_seconds = BokkyPooBahsDateTimeLibrary.diffSeconds(fromTimestamp, toTimestamp);
}
}
// File contracts/Staking/Owned.sol
// https://docs.synthetix.io/contracts/Owned
contract Owned {
address public owner;
address public nominatedOwner;
constructor (address _owner) public {
require(_owner != address(0), "Owner address cannot be 0");
owner = _owner;
emit OwnerChanged(address(0), _owner);
}
function nominateNewOwner(address _owner) external onlyOwner {
nominatedOwner = _owner;
emit OwnerNominated(_owner);
}
function acceptOwnership() external {
require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership");
emit OwnerChanged(owner, nominatedOwner);
owner = nominatedOwner;
nominatedOwner = address(0);
}
modifier onlyOwner {
require(msg.sender == owner, "Only the contract owner may perform this action");
_;
}
event OwnerNominated(address newOwner);
event OwnerChanged(address oldOwner, address newOwner);
}
// File contracts/Uniswap/TransferHelper.sol
// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
function safeApprove(address token, address to, uint value) internal {
// bytes4(keccak256(bytes('approve(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
}
function safeTransfer(address token, address to, uint value) internal {
// bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
}
function safeTransferFrom(address token, address from, address to, uint value) internal {
// bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
}
function safeTransferETH(address to, uint value) internal {
(bool success,) = to.call{value:value}(new bytes(0));
require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
}
}
// File contracts/Oracle/CPITrackerOracle.sol
// ====================================================================
// | ______ _______ |
// | / _____________ __ __ / ____(_____ ____ _____ ________ |
// | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ |
// | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ |
// | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ |
// | |
// ====================================================================
// ========================= CPITrackerOracle =========================
// ====================================================================
// Pull in CPI data and track it in Dec 2021 dollars
// Frax Finance: https://github.com/FraxFinance
// Primary Author(s)
// Travis Moore: https://github.com/FortisFortuna
// Reviewer(s) / Contributor(s)
// Sam Kazemian: https://github.com/samkazemian
// Rich Gee: https://github.com/zer0blockchain
// Dennis: https://github.com/denett
// References
// https://docs.chain.link/docs/make-a-http-get-request/#api-consumer-example
contract CPITrackerOracle is Owned, ChainlinkClient {
using Chainlink for Chainlink.Request;
// Core
BokkyPooBahsDateTimeContract public time_contract;
address public timelock_address;
address public bot_address;
// Data
// CPI-U: https://data.bls.gov/timeseries/CUSR0000SA0
uint256 public cpi_last = 29532800000; // Jun 2022 CPI-U
uint256 public cpi_target = 29527100000; // Jul 2022 CPI-U
uint256 public peg_price_last = 1054268436346501214; // Use currPegPrice(). Will always be in Dec 2021 dollars
uint256 public peg_price_target = 1054064956483867970; // Will always be in Dec 2021 dollars
// Chainlink
address public oracle; // Chainlink CPI oracle address
bytes32 public jobId; // Job ID for the CPI-U date
uint256 public fee; // LINK token fee
// Tracking
uint256 public stored_year = 2022; // Last time (year) the stored CPI data was updated
uint256 public stored_month = 7; // Last time (month) the stored CPI data was updated
uint256 public lastUpdateTime = 1660665713; // Last time the stored CPI data was updated.
uint256 public ramp_period = 28 * 86400; // Apply the CPI delta to the peg price over a set period
uint256 public future_ramp_period = 28 * 86400;
CPIObservation[] public cpi_observations; // Historical tracking of CPI data
// Safety
uint256 public max_delta_frac = 25000; // 2.5%. Max month-to-month CPI delta.
// Misc
string[13] public month_names; // English names of the 12 months
uint256 public fulfill_ready_day = 15; // Date of the month that CPI data is expected to by ready by
/* ========== STRUCTS ========== */
struct CPIObservation {
uint256 result_year;
uint256 result_month;
uint256 cpi_target;
uint256 peg_price_target;
uint256 timestamp;
}
/* ========== MODIFIERS ========== */
modifier onlyByOwnGov() {
require(msg.sender == owner || msg.sender == timelock_address, "Not owner or timelock");
_;
}
modifier onlyByOwnGovBot() {
require(msg.sender == owner || msg.sender == timelock_address || msg.sender == bot_address, "Not owner, tlck, or bot");
_;
}
/* ========== CONSTRUCTOR ========== */
constructor (
address _creator_address,
address _timelock_address,
CPIObservation[] memory initial_observations
) Owned(_creator_address) {
timelock_address = _timelock_address;
// Initialize the array. Cannot be done in the declaration
month_names = [
'',
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
];
// CPI [Ethereum]
// =================================
setPublicChainlinkToken();
time_contract = BokkyPooBahsDateTimeContract(0x90503D86E120B3B309CEBf00C2CA013aB3624736);
oracle = 0x049Bd8C3adC3fE7d3Fc2a44541d955A537c2A484;
jobId = "1c309d42c7084b34b1acf1a89e7b51fc";
fee = 50e18; // 50 LINK
// CPI [Polygon Mainnet]
// =================================
// setChainlinkToken(0x53E0bca35eC356BD5ddDFebbD1Fc0fD03FaBad39);
// time_contract = BokkyPooBahsDateTimeContract(0x998da4fCB229Db1AA84395ef6f0c6be6Ef3dbE58);
// oracle = 0x9B44870bcc35734c08e40F847cC068c0bA618194;
// jobId = "8107f18343a24980b2fe7d3c8f32630f";
// fee = 1e17; // 0.1 LINK
// CPI [Polygon Mumbai]
// =================================
// setChainlinkToken(0x326C977E6efc84E512bB9C30f76E30c160eD06FB);
// time_contract = BokkyPooBahsDateTimeContract(0x2Dd1B4D4548aCCeA497050619965f91f78b3b532);
// oracle = 0x3c30c5c415B2410326297F0f65f5Cbb32f3aefCc;
// jobId = "32c3e7b12fe44665a4e2bb87aa9779af";
// fee = 1e17; // 0.1 LINK
// Add some observations
for (uint256 i = 0; i < initial_observations.length; i++){
cpi_observations.push(initial_observations[i]);
}
}
/* ========== VIEWS ========== */
function upcomingCPIParams() public view returns (
uint256 upcoming_year,
uint256 upcoming_month,
uint256 upcoming_timestamp
) {
if (stored_month == 12) {
upcoming_year = stored_year + 1;
upcoming_month = 1;
}
else {
upcoming_year = stored_year;
upcoming_month = stored_month + 1;
}
// Data is usually released by the 15th day of the next month (fulfill_ready_day)
// https://www.usinflationcalculator.com/inflation/consumer-price-index-release-schedule/
upcoming_timestamp = time_contract.timestampFromDate(upcoming_year, upcoming_month, fulfill_ready_day);
}
// Display the upcoming CPI month
function upcomingSerie() external view returns (string memory serie_name) {
// Get the upcoming CPI params
(uint256 upcoming_year, uint256 upcoming_month, ) = upcomingCPIParams();
// Convert to a string
return string(abi.encodePacked("CUSR0000SA0", " ", month_names[upcoming_month], " ", Strings.toString(upcoming_year)));
}
// Delta between the current and previous peg prices
function currDeltaFracE6() public view returns (int256) {
int256 price_diff = (int256(peg_price_target) - int256(peg_price_last)) * 1e6;
return (price_diff / int256(peg_price_last));
}
// Absolute value of the delta between the current and previous peg prices
function currDeltaFracAbsE6() public view returns (uint256) {
int256 curr_delta_frac = currDeltaFracE6();
if (curr_delta_frac >= 0) return uint256(curr_delta_frac);
else return uint256(-1 * curr_delta_frac);
}
// Current peg price in E18, accounting for the ramping
function currPegPrice() external view returns (uint256) {
uint256 elapsed_time = block.timestamp - lastUpdateTime;
if (elapsed_time >= ramp_period) {
return peg_price_target;
}
else {
// Calculate the fraction of the delta to use, based on the elapsed time
// Can be negative in case of deflation (that never happens right :])
int256 fractional_price_delta = ((int256(peg_price_target) - int256(peg_price_last)) * int256(elapsed_time)) / int256(ramp_period);
return uint256(int256(peg_price_last) + int256(fractional_price_delta));
}
}
/* ========== MUTATIVE ========== */
// Fetch the CPI data from the Chainlink oracle
function requestCPIData() external onlyByOwnGovBot returns (bytes32 requestId)
{
Chainlink.Request memory request = buildChainlinkRequest(jobId, address(this), this.fulfill.selector);
// Get the upcoming CPI params
(uint256 upcoming_year, uint256 upcoming_month, uint256 upcoming_timestamp) = upcomingCPIParams();
// Don't update too fast
require(block.timestamp >= upcoming_timestamp, "Too early");
request.add("serie", "CUSR0000SA0"); // CPI-U: https://data.bls.gov/timeseries/CUSR0000SA0
request.add("month", month_names[upcoming_month]);
request.add("year", Strings.toString(upcoming_year));
return sendChainlinkRequestTo(oracle, request, fee);
}
/**
* Callback function
*/
// Called by the Chainlink oracle
function fulfill(bytes32 _requestId, uint256 result) public recordChainlinkFulfillment(_requestId)
{
// Set the stored CPI and price to the old targets
cpi_last = cpi_target;
peg_price_last = peg_price_target;
// Set the target CPI and price based on the results
cpi_target = result;
peg_price_target = (peg_price_last * cpi_target) / cpi_last;
// Make sure the delta isn't too large
require(currDeltaFracAbsE6() <= max_delta_frac, "Delta too high");
// Update the timestamp
lastUpdateTime = block.timestamp;
// Update the year and month
(uint256 result_year, uint256 result_month, ) = upcomingCPIParams();
stored_year = result_year;
stored_month = result_month;
// Update the future ramp period, if applicable
// A ramp cannot be updated mid-month as it will mess up the last_price math;
ramp_period = future_ramp_period;
// Add the observation
cpi_observations.push(CPIObservation(
result_year,
result_month,
cpi_target,
peg_price_target,
block.timestamp
));
emit CPIUpdated(result_year, result_month, result, peg_price_target, ramp_period);
}
function cancelRequest(
bytes32 _requestId,
uint256 _payment,
bytes4 _callbackFunc,
uint256 _expiration
) external onlyByOwnGovBot {
cancelChainlinkRequest(_requestId, _payment, _callbackFunc, _expiration);
}
/* ========== RESTRICTED FUNCTIONS ========== */
function setTimelock(address _new_timelock_address) external onlyByOwnGov {
timelock_address = _new_timelock_address;
}
function setBot(address _new_bot_address) external onlyByOwnGov {
bot_address = _new_bot_address;
}
function setOracleInfo(address _oracle, bytes32 _jobId, uint256 _fee) external onlyByOwnGov {
oracle = _oracle;
jobId = _jobId;
fee = _fee;
}
function setMaxDeltaFrac(uint256 _max_delta_frac) external onlyByOwnGov {
max_delta_frac = _max_delta_frac;
}
function setFulfillReadyDay(uint256 _fulfill_ready_day) external onlyByOwnGov {
fulfill_ready_day = _fulfill_ready_day;
}
function setFutureRampPeriod(uint256 _future_ramp_period) external onlyByOwnGov {
future_ramp_period = _future_ramp_period; // In sec
}
// Mainly for recovering LINK
function recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyByOwnGov {
// Only the owner address can ever receive the recovery withdrawal
TransferHelper.safeTransfer(tokenAddress, owner, tokenAmount);
}
/* ========== EVENTS ========== */
event CPIUpdated(uint256 year, uint256 month, uint256 result, uint256 peg_price_target, uint256 ramp_period);
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_creator_address","type":"address"},{"internalType":"address","name":"_timelock_address","type":"address"},{"components":[{"internalType":"uint256","name":"result_year","type":"uint256"},{"internalType":"uint256","name":"result_month","type":"uint256"},{"internalType":"uint256","name":"cpi_target","type":"uint256"},{"internalType":"uint256","name":"peg_price_target","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct CPITrackerOracle.CPIObservation[]","name":"initial_observations","type":"tuple[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"year","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"month","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"result","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"peg_price_target","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ramp_period","type":"uint256"}],"name":"CPIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"ChainlinkCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"ChainlinkFulfilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"}],"name":"ChainlinkRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bot_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_requestId","type":"bytes32"},{"internalType":"uint256","name":"_payment","type":"uint256"},{"internalType":"bytes4","name":"_callbackFunc","type":"bytes4"},{"internalType":"uint256","name":"_expiration","type":"uint256"}],"name":"cancelRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cpi_last","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cpi_observations","outputs":[{"internalType":"uint256","name":"result_year","type":"uint256"},{"internalType":"uint256","name":"result_month","type":"uint256"},{"internalType":"uint256","name":"cpi_target","type":"uint256"},{"internalType":"uint256","name":"peg_price_target","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cpi_target","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currDeltaFracAbsE6","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currDeltaFracE6","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currPegPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_requestId","type":"bytes32"},{"internalType":"uint256","name":"result","type":"uint256"}],"name":"fulfill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fulfill_ready_day","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"future_ramp_period","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jobId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"max_delta_frac","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"month_names","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"peg_price_last","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"peg_price_target","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ramp_period","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestCPIData","outputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_new_bot_address","type":"address"}],"name":"setBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fulfill_ready_day","type":"uint256"}],"name":"setFulfillReadyDay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_future_ramp_period","type":"uint256"}],"name":"setFutureRampPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max_delta_frac","type":"uint256"}],"name":"setMaxDeltaFrac","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"bytes32","name":"_jobId","type":"bytes32"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setOracleInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_new_timelock_address","type":"address"}],"name":"setTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stored_month","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stored_year","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"time_contract","outputs":[{"internalType":"contract BokkyPooBahsDateTimeContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelock_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"upcomingCPIParams","outputs":[{"internalType":"uint256","name":"upcoming_year","type":"uint256"},{"internalType":"uint256","name":"upcoming_month","type":"uint256"},{"internalType":"uint256","name":"upcoming_timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"upcomingSerie","outputs":[{"internalType":"string","name":"serie_name","type":"string"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405260016006556406e04ac400600b556406dff3ca60600c55670ea1838e9e56f85e600d55670ea0ca7e45689542600e556107e660125560076013556362fbbf716014556224ea006015556224ea006016556161a8601855600f6026553480156200006c57600080fd5b50604051620036a6380380620036a68339810160408190526200008f916200061f565b826001600160a01b038116620000eb5760405162461bcd60e51b815260206004820152601960248201527f4f776e657220616464726573732063616e6e6f74206265203000000000000000604482015260640160405180910390fd5b600080546001600160a01b0319166001600160a01b03831690811782556040805192835260208301919091527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a150600980546001600160a01b0319166001600160a01b038416178155604080516101c08101825260006101a082019081528152815180830183526007808252664a616e7561727960c81b6020808401919091528084019290925283518085018552600880825267466562727561727960c01b82850152848601919091528451808601865260058082526409ac2e4c6d60db1b8286015260608601919091528551808701875290815264105c1c9a5b60da1b8185015260808501528451808601865260038152624d617960e81b8185015260a0850152845180860186526004808252634a756e6560e01b8286015260c086019190915285518087018752908152634a756c7960e01b8185015260e0850152845180860186526006815265105d59dd5cdd60d21b81850152610100850152845180860186529586526829b2b83a32b6b132b960b91b86840152610120840195909552835180850185529081526627b1ba37b132b960c91b8183015261014083015282518084018452848152672737bb32b6b132b960c11b818301526101608301528251808401909352928252672232b1b2b6b132b960c11b928201929092526101808201526200030890601990600d620004c4565b506200031362000423565b600880546001600160a01b03199081167390503d86e120b3b309cebf00c2ca013ab362473617909155600f805490911673049bd8c3adc3fe7d3fc2a44541d955a537c2a4841790557f31633330396434326337303834623334623161636631613839653762353166636010556802b5e3af16b188000060115560005b815181101562000419576017828281518110620003b057620003b06200073d565b60209081029190910181015182546001818101855560009485529383902082516005909202019081559181015192820192909255604082015160028201556060820151600382015560809091015160049091015580620004108162000753565b9150506200038f565b50505050620008fb565b620004c273c89bd4e1632d3a43cb03aaad5262cbe4038bc5716001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200047a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004a091906200077b565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b565b82600d810192821562000502579160200282015b82811115620005025782518290620004f190826200082f565b5091602001919060010190620004d8565b506200051092915062000514565b5090565b80821115620005105760006200052b828262000535565b5060010162000514565b5080546200054390620007a0565b6000825580601f1062000554575050565b601f01602090049060005260206000209081019062000574919062000577565b50565b5b8082111562000510576000815560010162000578565b80516001600160a01b0381168114620005a657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b0381118282101715620005e657620005e6620005ab565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620006175762000617620005ab565b604052919050565b600080600060608085870312156200063657600080fd5b62000641856200058e565b93506020620006528187016200058e565b604087810151919550906001600160401b03808211156200067257600080fd5b818901915089601f8301126200068757600080fd5b8151818111156200069c576200069c620005ab565b620006ac858260051b01620005ec565b818152858101925060a091820284018601918c831115620006cc57600080fd5b938601935b828510156200072b5780858e031215620006eb5760008081fd5b620006f5620005c1565b855181528786015188820152868601518782015288860151898201526080808701519082015284529384019392860192620006d1565b50809750505050505050509250925092565b634e487b7160e01b600052603260045260246000fd5b6000600182016200077457634e487b7160e01b600052601160045260246000fd5b5060010190565b6000602082840312156200078e57600080fd5b62000799826200058e565b9392505050565b600181811c90821680620007b557607f821691505b602082108103620007d657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200082a57600081815260208120601f850160051c81016020861015620008055750805b601f850160051c820191505b81811015620008265782815560010162000811565b5050505b505050565b81516001600160401b038111156200084b576200084b620005ab565b62000863816200085c8454620007a0565b84620007dc565b602080601f8311600181146200089b5760008415620008825750858301515b600019600386901b1c1916600185901b17855562000826565b600085815260208120601f198616915b82811015620008cc57888601518255948401946001909101908401620008ab565b5085821015620008eb5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612d9b806200090b6000396000f3fe608060405234801561001057600080fd5b50600436106102925760003560e01c80638e9631ea11610160578063c0e3e6cd116100d8578063dc6663c71161008c578063ec65d0f811610071578063ec65d0f814610544578063f53ef21f14610557578063fc6ee7791461056a57600080fd5b8063dc6663c71461051b578063ddca3f431461053b57600080fd5b8063c8f33c91116100bd578063c8f33c91146104e9578063d1011705146104f2578063dbea953d146104fb57600080fd5b8063c0e3e6cd146104d7578063c2939d97146104e057600080fd5b80639e43a4161161012f578063bdacb30311610114578063bdacb303146104b3578063be175fc3146104c6578063c083b26f146104cf57600080fd5b80639e43a41614610497578063a663cbb4146104a057600080fd5b80638e9631ea1461041e57806392847a7b14610459578063933a8fb81461047c57806397db12f31461048f57600080fd5b806355c06e3f1161020e5780637dc0d1d0116101c257806382583a6a116101a757806382583a6a146103e25780638980f11f146103eb5780638da5cb5b146103fe57600080fd5b80637dc0d1d0146103b95780637ff30947146103d957600080fd5b80636b5caec4116101f35780636b5caec41461039557806378d4d360146103a857806379ba5097146103b157600080fd5b806355c06e3f1461038457806369abe4491461038c57600080fd5b806340f55420116102655780634dc70f741161024a5780634dc70f741461033b578063510b45f41461034457806353a47bb71461036457600080fd5b806340f55420146102e35780634357855e1461032857600080fd5b80630e112a4b146102975780631627540c146102b35780631bc59bd4146102c85780633c09868e146102db575b600080fd5b6102a0600c5481565b6040519081526020015b60405180910390f35b6102c66102c136600461242f565b610572565b005b6102c66102d636600461244a565b610697565b6102a061073f565b6008546103039073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102aa565b6102c6610336366004612463565b6107a4565b6102a0600e5481565b61035761035236600461244a565b610ade565b6040516102aa91906124fb565b6001546103039073ffffffffffffffffffffffffffffffffffffffff1681565b610357610b7e565b6102a0600b5481565b6102c66103a336600461242f565b610bd4565b6102a060185481565b6102c6610cbe565b600f546103039073ffffffffffffffffffffffffffffffffffffffff1681565b6102a060135481565b6102a060155481565b6102c66103f936600461250e565b610e09565b6000546103039073ffffffffffffffffffffffffffffffffffffffff1681565b61043161042c36600461244a565b610ed5565b604080519586526020860194909452928401919091526060830152608082015260a0016102aa565b610461610f16565b604080519384526020840192909252908201526060016102aa565b6102c661048a36600461244a565b611001565b6102a06110a9565b6102a060125481565b6102c66104ae36600461244a565b6113e4565b6102c66104c136600461242f565b61148c565b6102a060165481565b6102a0611576565b6102a0600d5481565b6102a060105481565b6102a060145481565b6102a060265481565b600a546103039073ffffffffffffffffffffffffffffffffffffffff1681565b6009546103039073ffffffffffffffffffffffffffffffffffffffff1681565b6102a060115481565b6102c6610552366004612538565b6115c0565b6102c661056536600461259c565b611697565b6102a0611788565b60005473ffffffffffffffffffffffffffffffffffffffff16331461061e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201527f6f726d207468697320616374696f6e000000000000000000000000000000000060648201526084015b60405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229060200160405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314806106d4575060095473ffffffffffffffffffffffffffffffffffffffff1633145b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f722074696d656c6f636b00000000000000000000006044820152606401610615565b602655565b6000806014544261075091906125fe565b90506015548110610763575050600e5490565b600060155482600d54600e546107799190612615565b6107839190612689565b61078d9190612774565b905080600d5461079d91906127dc565b9250505090565b600082815260076020526040902054829073ffffffffffffffffffffffffffffffffffffffff163314610859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f20726571756573740000000000000000000000000000000000000000000000006064820152608401610615565b60008181526007602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a2600c8054600b819055600e54600d81905591849055906108d5908490612850565b6108df919061288d565b600e556018546108ed611576565b1115610955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f44656c746120746f6f20686967680000000000000000000000000000000000006044820152606401610615565b42601455600080610964610f16565b506012829055601381905560165460159081556040805160a080820183528582526020808301868152600c54848601908152600e80546060808801918252426080808a019182526017805460018101825560009190915299517fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c156005909b029a8b015595517fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c168a015593517fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c1789015590517fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c1888015591517fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c19909601959095559354955485518981529283018890529482018c905292810194909452908301919091529294509092507f76bb4a30d8bdc45e1f914f172fce73f6c95236eb8d444640e12b516982edea03910160405180910390a15050505050565b601981600d8110610aee57600080fd5b018054909150610afd906128a1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b29906128a1565b8015610b765780601f10610b4b57610100808354040283529160200191610b76565b820191906000526020600020905b815481529060010190602001808311610b5957829003601f168201915b505050505081565b6060600080610b8b610f16565b5091509150601981600d8110610ba357610ba36128ee565b01610bad836117b8565b604051602001610bbe929190612939565b6040516020818303038152906040529250505090565b60005473ffffffffffffffffffffffffffffffffffffffff16331480610c11575060095473ffffffffffffffffffffffffffffffffffffffff1633145b610c77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f722074696d656c6f636b00000000000000000000006044820152606401610615565b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527f2063616e20616363657074206f776e65727368697000000000000000000000006064820152608401610615565b6000546001546040805173ffffffffffffffffffffffffffffffffffffffff93841681529290911660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a160018054600080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055565b60005473ffffffffffffffffffffffffffffffffffffffff16331480610e46575060095473ffffffffffffffffffffffffffffffffffffffff1633145b610eac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f722074696d656c6f636b00000000000000000000006044820152606401610615565b600054610ed190839073ffffffffffffffffffffffffffffffffffffffff16836118f5565b5050565b60178181548110610ee557600080fd5b6000918252602090912060059091020180546001820154600283015460038401546004909401549294509092909185565b6000806000601354600c03610f3e57601254610f33906001612a91565b925060019150610f55565b60125492506013546001610f529190612a91565b91505b6008546026546040517f1f4f77b20000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604481019190915273ffffffffffffffffffffffffffffffffffffffff90911690631f4f77b290606401602060405180830381865afa158015610fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffa9190612aa9565b9050909192565b60005473ffffffffffffffffffffffffffffffffffffffff1633148061103e575060095473ffffffffffffffffffffffffffffffffffffffff1633145b6110a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f722074696d656c6f636b00000000000000000000006044820152606401610615565b601855565b6000805473ffffffffffffffffffffffffffffffffffffffff163314806110e7575060095473ffffffffffffffffffffffffffffffffffffffff1633145b806111095750600a5473ffffffffffffffffffffffffffffffffffffffff1633145b61116f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e6f74206f776e65722c20746c636b2c206f7220626f740000000000000000006044820152606401610615565b600061118560105430634357855e60e01b611a65565b90506000806000611194610f16565b92509250925080421015611204576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f546f6f206561726c7900000000000000000000000000000000000000000000006044820152606401610615565b6112836040518060400160405280600581526020017f73657269650000000000000000000000000000000000000000000000000000008152506040518060400160405280600b81526020017f435553523030303053413000000000000000000000000000000000000000000081525086611af69092919063ffffffff16565b6113696040518060400160405280600581526020017f6d6f6e7468000000000000000000000000000000000000000000000000000000815250601984600d81106112cf576112cf6128ee565b0180546112db906128a1565b80601f0160208091040260200160405190810160405280929190818152602001828054611307906128a1565b80156113545780601f1061132957610100808354040283529160200191611354565b820191906000526020600020905b81548152906001019060200180831161133757829003601f168201915b505050505086611af69092919063ffffffff16565b6113b36040518060400160405280600481526020017f79656172000000000000000000000000000000000000000000000000000000008152506113ab856117b8565b869190611af6565b600f546011546113db9173ffffffffffffffffffffffffffffffffffffffff16908690611b19565b94505050505090565b60005473ffffffffffffffffffffffffffffffffffffffff16331480611421575060095473ffffffffffffffffffffffffffffffffffffffff1633145b611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f722074696d656c6f636b00000000000000000000006044820152606401610615565b601655565b60005473ffffffffffffffffffffffffffffffffffffffff163314806114c9575060095473ffffffffffffffffffffffffffffffffffffffff1633145b61152f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f722074696d656c6f636b00000000000000000000006044820152606401610615565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080611581611788565b90506000811261159057919050565b6115ba817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612689565b91505090565b60005473ffffffffffffffffffffffffffffffffffffffff163314806115fd575060095473ffffffffffffffffffffffffffffffffffffffff1633145b8061161f5750600a5473ffffffffffffffffffffffffffffffffffffffff1633145b611685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e6f74206f776e65722c20746c636b2c206f7220626f740000000000000000006044820152606401610615565b61169184848484611c10565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314806116d4575060095473ffffffffffffffffffffffffffffffffffffffff1633145b61173a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f722074696d656c6f636b00000000000000000000006044820152606401610615565b600f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9490941693909317909255601055601155565b600080600d54600e5461179b9190612615565b6117a890620f4240612689565b9050600d54816115ba9190612774565b6060816000036117fb57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611825578061180f81612ac2565b915061181e9050600a8361288d565b91506117ff565b60008167ffffffffffffffff81111561184057611840612afa565b6040519080825280601f01601f19166020018201604052801561186a576020820181803683370190505b5090505b84156118ed5761187f6001836125fe565b915061188c600a86612b29565b611897906030612a91565b60f81b8183815181106118ac576118ac6128ee565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506118e6600a8661288d565b945061186e565b949350505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052915160009283929087169161198c9190612b3d565b6000604051808303816000865af19150503d80600081146119c9576040519150601f19603f3d011682016040523d82523d6000602084013e6119ce565b606091505b50915091508180156119f85750805115806119f85750808060200190518101906119f89190612b59565b611a5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152606401610615565b5050505050565b611aa36040805160a0810182526000808252602080830182905282840182905260608084018390528451808601909552845283015290608082015290565b611ae16040805160a0810182526000808252602080830182905282840182905260608084018390528451808601909552845283015290608082015290565b611aed81868686611d45565b95945050505050565b6080830151611b059083611ddd565b6080830151611b149082611ddd565b505050565b600654600090611b2a816001612a91565b600655835160408086015160808701515191516000937f404299460000000000000000000000000000000000000000000000000000000093611b7b9386938493923092918a91600191602401612b7b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050611c0686838684611df4565b9695505050505050565b60008481526007602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000008116909155905173ffffffffffffffffffffffffffffffffffffffff9091169186917fe1fe3afa0f7f761ff0a8b89086790efd5140d2907ebd5b7ff6bfcb5e075fd4c59190a26040517f6ee4d55300000000000000000000000000000000000000000000000000000000815260048101869052602481018590527fffffffff00000000000000000000000000000000000000000000000000000000841660448201526064810183905273ffffffffffffffffffffffffffffffffffffffff821690636ee4d55390608401600060405180830381600087803b158015611d2657600080fd5b505af1158015611d3a573d6000803e3d6000fd5b505050505050505050565b611d836040805160a0810182526000808252602080830182905282840182905260608084018390528451808601909552845283015290608082015290565b611d938560800151610100612001565b505091835273ffffffffffffffffffffffffffffffffffffffff1660208301527fffffffff0000000000000000000000000000000000000000000000000000000016604082015290565b611dea826003835161206c565b611b14828261217b565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b16602082015260348101849052600090605401604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815282825280516020918201206000818152600790925291812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a1617905590925082917fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af99190a2600480546040517f4000aea000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911691634000aea091611f329189918891889101612c04565b6020604051808303816000875af1158015611f51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f759190612b59565b6118ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c6500000000000000000000000000000000000000000000000000000000006064820152608401610615565b604080518082019091526060815260006020820152612021602083612b29565b1561204957612031602083612b29565b61203c9060206125fe565b6120469083612a91565b91505b506020808301829052604080518085526000815283019091019052815b92915050565b60178167ffffffffffffffff1611612091576116918360e0600585901b1683176121a9565b60ff8167ffffffffffffffff16116120cf576120b8836018611fe0600586901b16176121a9565b506116918367ffffffffffffffff831660016121ce565b61ffff8167ffffffffffffffff161161210e576120f7836019611fe0600586901b16176121a9565b506116918367ffffffffffffffff831660026121ce565b63ffffffff8167ffffffffffffffff161161214f5761213883601a611fe0600586901b16176121a9565b506116918367ffffffffffffffff831660046121ce565b61216483601b611fe0600586901b16176121a9565b506116918367ffffffffffffffff831660086121ce565b6040805180820190915260608152600060208201526121a2838460000151518485516121f4565b9392505050565b6040805180820190915260608152600060208201526121a283846000015151846122fc565b6040805180820190915260608152600060208201526118ed848560000151518585612357565b604080518082019091526060815260006020820152825182111561221757600080fd5b60208501516122268386612a91565b11156122595761225985612249876020015187866122449190612a91565b6123d8565b612254906002612850565b6123ef565b6000808651805187602083010193508088870111156122785787860182525b505050602084015b602084106122b85780518252612297602083612a91565b91506122a4602082612a91565b90506122b16020856125fe565b9350612280565b5181517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60208690036101000a019081169019919091161790525083949350505050565b604080518082019091526060815260006020820152836020015183106123315761233184856020015160026122549190612850565b835180516020858301018481535080850361234d576001810182525b5093949350505050565b604080518082019091526060815260006020820152602085015161237b8584612a91565b111561238f5761238f856122498685612a91565b6000600161239f84610100612d59565b6123a991906125fe565b90508551838682010185831982511617815250805184870111156123cd5783860181525b509495945050505050565b6000818311156123e9575081612066565b50919050565b81516123fb8383612001565b50611691838261217b565b803573ffffffffffffffffffffffffffffffffffffffff8116811461242a57600080fd5b919050565b60006020828403121561244157600080fd5b6121a282612406565b60006020828403121561245c57600080fd5b5035919050565b6000806040838503121561247657600080fd5b50508035926020909101359150565b60005b838110156124a0578181015183820152602001612488565b838111156116915750506000910152565b600081518084526124c9816020860160208601612485565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006121a260208301846124b1565b6000806040838503121561252157600080fd5b61252a83612406565b946020939093013593505050565b6000806000806080858703121561254e57600080fd5b843593506020850135925060408501357fffffffff000000000000000000000000000000000000000000000000000000008116811461258c57600080fd5b9396929550929360600135925050565b6000806000606084860312156125b157600080fd5b6125ba84612406565b95602085013595506040909401359392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612610576126106125cf565b500390565b6000808312837f80000000000000000000000000000000000000000000000000000000000000000183128115161561264f5761264f6125cf565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615612683576126836125cf565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156126ca576126ca6125cf565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615612705576127056125cf565b60008712925087820587128484161615612721576127216125cf565b87850587128184161615612737576127376125cf565b505050929093029392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261278357612783612745565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156127d7576127d76125cf565b500590565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615612816576128166125cf565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561284a5761284a6125cf565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612888576128886125cf565b500290565b60008261289c5761289c612745565b500490565b600181811c908216806128b557607f821691505b6020821081036123e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815161292f818560208601612485565b9290920192915050565b7f435553523030303053413000000000000000000000000000000000000000000081527f2000000000000000000000000000000000000000000000000000000000000000600b8201526000600c6000855481600182811c9150808316806129a157607f831692505b602080841082036129d9577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b8180156129ed5760018114612a2457612a55565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616888b01528785151586028b01019650612a55565b60008c81526020902060005b86811015612a4b5781548c82018b0152908501908301612a30565b505087858b010196505b505050505050611c06612a8b827f2000000000000000000000000000000000000000000000000000000000000000815260010190565b8661291d565b60008219821115612aa457612aa46125cf565b500190565b600060208284031215612abb57600080fd5b5051919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612af357612af36125cf565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082612b3857612b38612745565b500690565b60008251612b4f818460208701612485565b9190910192915050565b600060208284031215612b6b57600080fd5b815180151581146121a257600080fd5b600061010073ffffffffffffffffffffffffffffffffffffffff808c1684528a60208501528960408501528089166060850152507fffffffff00000000000000000000000000000000000000000000000000000000871660808401528560a08401528460c08401528060e0840152612bf5818401856124b1565b9b9a5050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000611aed60608301846124b1565b600181815b80851115612c9257817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612c7857612c786125cf565b80851615612c8557918102915b93841c9390800290612c3e565b509250929050565b600082612ca957506001612066565b81612cb657506000612066565b8160018114612ccc5760028114612cd657612cf2565b6001915050612066565b60ff841115612ce757612ce76125cf565b50506001821b612066565b5060208310610133831016604e8410600b8410161715612d15575081810a612066565b612d1f8383612c39565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612d5157612d516125cf565b029392505050565b60006121a28383612c9a56fea264697066735822122060953409e6fc4252c556fd36c8e65fed673b84571add297cc498cbd4b68c0fe164736f6c634300080f003300000000000000000000000026ce2091749059a66703cd4b998156d94ec393ef00000000000000000000000044a95a619815a3cccad8cbeb6293c181b7b1a9d60000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000007e5000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000685ae5ac00000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000061e21c9000000000000000000000000000000000000000000000000000000000000007e600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000690739e200000000000000000000000000000000000000000000000000df7a18cfb81fe0800000000000000000000000000000000000000000000000000000000620afb1000000000000000000000000000000000000000000000000000000000000007e60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000069ddb51c00000000000000000000000000000000000000000000000000e142774cb5648ef000000000000000000000000000000000000000000000000000000006243475100000000000000000000000000000000000000000000000000000000000007e6000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000006b2df91800000000000000000000000000000000000000000000000000e40df710538b07b000000000000000000000000000000000000000000000000000000006259c92b00000000000000000000000000000000000000000000000000000000000007e6000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000006b890c8600000000000000000000000000000000000000000000000000e4cfc12a1507952000000000000000000000000000000000000000000000000000000006281a6d000000000000000000000000000000000000000000000000000000000000007e6000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000006c95207400000000000000000000000000000000000000000000000000e70a2a49a9b0a2a0000000000000000000000000000000000000000000000000000000062aa23ff00000000000000000000000000000000000000000000000000000000000007e6000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000006e04ac4000000000000000000000000000000000000000000000000000ea1838e9e56f85e0000000000000000000000000000000000000000000000000000000062d1fced00000000000000000000000000000000000000000000000000000000000007e6000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000006dff3ca600000000000000000000000000000000000000000000000000ea0ca7e456895420000000000000000000000000000000000000000000000000000000062fbbf71
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102925760003560e01c80638e9631ea11610160578063c0e3e6cd116100d8578063dc6663c71161008c578063ec65d0f811610071578063ec65d0f814610544578063f53ef21f14610557578063fc6ee7791461056a57600080fd5b8063dc6663c71461051b578063ddca3f431461053b57600080fd5b8063c8f33c91116100bd578063c8f33c91146104e9578063d1011705146104f2578063dbea953d146104fb57600080fd5b8063c0e3e6cd146104d7578063c2939d97146104e057600080fd5b80639e43a4161161012f578063bdacb30311610114578063bdacb303146104b3578063be175fc3146104c6578063c083b26f146104cf57600080fd5b80639e43a41614610497578063a663cbb4146104a057600080fd5b80638e9631ea1461041e57806392847a7b14610459578063933a8fb81461047c57806397db12f31461048f57600080fd5b806355c06e3f1161020e5780637dc0d1d0116101c257806382583a6a116101a757806382583a6a146103e25780638980f11f146103eb5780638da5cb5b146103fe57600080fd5b80637dc0d1d0146103b95780637ff30947146103d957600080fd5b80636b5caec4116101f35780636b5caec41461039557806378d4d360146103a857806379ba5097146103b157600080fd5b806355c06e3f1461038457806369abe4491461038c57600080fd5b806340f55420116102655780634dc70f741161024a5780634dc70f741461033b578063510b45f41461034457806353a47bb71461036457600080fd5b806340f55420146102e35780634357855e1461032857600080fd5b80630e112a4b146102975780631627540c146102b35780631bc59bd4146102c85780633c09868e146102db575b600080fd5b6102a0600c5481565b6040519081526020015b60405180910390f35b6102c66102c136600461242f565b610572565b005b6102c66102d636600461244a565b610697565b6102a061073f565b6008546103039073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102aa565b6102c6610336366004612463565b6107a4565b6102a0600e5481565b61035761035236600461244a565b610ade565b6040516102aa91906124fb565b6001546103039073ffffffffffffffffffffffffffffffffffffffff1681565b610357610b7e565b6102a0600b5481565b6102c66103a336600461242f565b610bd4565b6102a060185481565b6102c6610cbe565b600f546103039073ffffffffffffffffffffffffffffffffffffffff1681565b6102a060135481565b6102a060155481565b6102c66103f936600461250e565b610e09565b6000546103039073ffffffffffffffffffffffffffffffffffffffff1681565b61043161042c36600461244a565b610ed5565b604080519586526020860194909452928401919091526060830152608082015260a0016102aa565b610461610f16565b604080519384526020840192909252908201526060016102aa565b6102c661048a36600461244a565b611001565b6102a06110a9565b6102a060125481565b6102c66104ae36600461244a565b6113e4565b6102c66104c136600461242f565b61148c565b6102a060165481565b6102a0611576565b6102a0600d5481565b6102a060105481565b6102a060145481565b6102a060265481565b600a546103039073ffffffffffffffffffffffffffffffffffffffff1681565b6009546103039073ffffffffffffffffffffffffffffffffffffffff1681565b6102a060115481565b6102c6610552366004612538565b6115c0565b6102c661056536600461259c565b611697565b6102a0611788565b60005473ffffffffffffffffffffffffffffffffffffffff16331461061e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660448201527f6f726d207468697320616374696f6e000000000000000000000000000000000060648201526084015b60405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce229060200160405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314806106d4575060095473ffffffffffffffffffffffffffffffffffffffff1633145b61073a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f722074696d656c6f636b00000000000000000000006044820152606401610615565b602655565b6000806014544261075091906125fe565b90506015548110610763575050600e5490565b600060155482600d54600e546107799190612615565b6107839190612689565b61078d9190612774565b905080600d5461079d91906127dc565b9250505090565b600082815260076020526040902054829073ffffffffffffffffffffffffffffffffffffffff163314610859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f536f75726365206d75737420626520746865206f7261636c65206f662074686560448201527f20726571756573740000000000000000000000000000000000000000000000006064820152608401610615565b60008181526007602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555182917f7cc135e0cebb02c3480ae5d74d377283180a2601f8f644edf7987b009316c63a91a2600c8054600b819055600e54600d81905591849055906108d5908490612850565b6108df919061288d565b600e556018546108ed611576565b1115610955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f44656c746120746f6f20686967680000000000000000000000000000000000006044820152606401610615565b42601455600080610964610f16565b506012829055601381905560165460159081556040805160a080820183528582526020808301868152600c54848601908152600e80546060808801918252426080808a019182526017805460018101825560009190915299517fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c156005909b029a8b015595517fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c168a015593517fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c1789015590517fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c1888015591517fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c19909601959095559354955485518981529283018890529482018c905292810194909452908301919091529294509092507f76bb4a30d8bdc45e1f914f172fce73f6c95236eb8d444640e12b516982edea03910160405180910390a15050505050565b601981600d8110610aee57600080fd5b018054909150610afd906128a1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b29906128a1565b8015610b765780601f10610b4b57610100808354040283529160200191610b76565b820191906000526020600020905b815481529060010190602001808311610b5957829003601f168201915b505050505081565b6060600080610b8b610f16565b5091509150601981600d8110610ba357610ba36128ee565b01610bad836117b8565b604051602001610bbe929190612939565b6040516020818303038152906040529250505090565b60005473ffffffffffffffffffffffffffffffffffffffff16331480610c11575060095473ffffffffffffffffffffffffffffffffffffffff1633145b610c77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f722074696d656c6f636b00000000000000000000006044820152606401610615565b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527f2063616e20616363657074206f776e65727368697000000000000000000000006064820152608401610615565b6000546001546040805173ffffffffffffffffffffffffffffffffffffffff93841681529290911660208301527fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c910160405180910390a160018054600080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055565b60005473ffffffffffffffffffffffffffffffffffffffff16331480610e46575060095473ffffffffffffffffffffffffffffffffffffffff1633145b610eac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f722074696d656c6f636b00000000000000000000006044820152606401610615565b600054610ed190839073ffffffffffffffffffffffffffffffffffffffff16836118f5565b5050565b60178181548110610ee557600080fd5b6000918252602090912060059091020180546001820154600283015460038401546004909401549294509092909185565b6000806000601354600c03610f3e57601254610f33906001612a91565b925060019150610f55565b60125492506013546001610f529190612a91565b91505b6008546026546040517f1f4f77b20000000000000000000000000000000000000000000000000000000081526004810186905260248101859052604481019190915273ffffffffffffffffffffffffffffffffffffffff90911690631f4f77b290606401602060405180830381865afa158015610fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffa9190612aa9565b9050909192565b60005473ffffffffffffffffffffffffffffffffffffffff1633148061103e575060095473ffffffffffffffffffffffffffffffffffffffff1633145b6110a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f722074696d656c6f636b00000000000000000000006044820152606401610615565b601855565b6000805473ffffffffffffffffffffffffffffffffffffffff163314806110e7575060095473ffffffffffffffffffffffffffffffffffffffff1633145b806111095750600a5473ffffffffffffffffffffffffffffffffffffffff1633145b61116f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e6f74206f776e65722c20746c636b2c206f7220626f740000000000000000006044820152606401610615565b600061118560105430634357855e60e01b611a65565b90506000806000611194610f16565b92509250925080421015611204576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f546f6f206561726c7900000000000000000000000000000000000000000000006044820152606401610615565b6112836040518060400160405280600581526020017f73657269650000000000000000000000000000000000000000000000000000008152506040518060400160405280600b81526020017f435553523030303053413000000000000000000000000000000000000000000081525086611af69092919063ffffffff16565b6113696040518060400160405280600581526020017f6d6f6e7468000000000000000000000000000000000000000000000000000000815250601984600d81106112cf576112cf6128ee565b0180546112db906128a1565b80601f0160208091040260200160405190810160405280929190818152602001828054611307906128a1565b80156113545780601f1061132957610100808354040283529160200191611354565b820191906000526020600020905b81548152906001019060200180831161133757829003601f168201915b505050505086611af69092919063ffffffff16565b6113b36040518060400160405280600481526020017f79656172000000000000000000000000000000000000000000000000000000008152506113ab856117b8565b869190611af6565b600f546011546113db9173ffffffffffffffffffffffffffffffffffffffff16908690611b19565b94505050505090565b60005473ffffffffffffffffffffffffffffffffffffffff16331480611421575060095473ffffffffffffffffffffffffffffffffffffffff1633145b611487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f722074696d656c6f636b00000000000000000000006044820152606401610615565b601655565b60005473ffffffffffffffffffffffffffffffffffffffff163314806114c9575060095473ffffffffffffffffffffffffffffffffffffffff1633145b61152f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f722074696d656c6f636b00000000000000000000006044820152606401610615565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080611581611788565b90506000811261159057919050565b6115ba817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612689565b91505090565b60005473ffffffffffffffffffffffffffffffffffffffff163314806115fd575060095473ffffffffffffffffffffffffffffffffffffffff1633145b8061161f5750600a5473ffffffffffffffffffffffffffffffffffffffff1633145b611685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4e6f74206f776e65722c20746c636b2c206f7220626f740000000000000000006044820152606401610615565b61169184848484611c10565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314806116d4575060095473ffffffffffffffffffffffffffffffffffffffff1633145b61173a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f74206f776e6572206f722074696d656c6f636b00000000000000000000006044820152606401610615565b600f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9490941693909317909255601055601155565b600080600d54600e5461179b9190612615565b6117a890620f4240612689565b9050600d54816115ba9190612774565b6060816000036117fb57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611825578061180f81612ac2565b915061181e9050600a8361288d565b91506117ff565b60008167ffffffffffffffff81111561184057611840612afa565b6040519080825280601f01601f19166020018201604052801561186a576020820181803683370190505b5090505b84156118ed5761187f6001836125fe565b915061188c600a86612b29565b611897906030612a91565b60f81b8183815181106118ac576118ac6128ee565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506118e6600a8661288d565b945061186e565b949350505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052915160009283929087169161198c9190612b3d565b6000604051808303816000865af19150503d80600081146119c9576040519150601f19603f3d011682016040523d82523d6000602084013e6119ce565b606091505b50915091508180156119f85750805115806119f85750808060200190518101906119f89190612b59565b611a5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c4544006044820152606401610615565b5050505050565b611aa36040805160a0810182526000808252602080830182905282840182905260608084018390528451808601909552845283015290608082015290565b611ae16040805160a0810182526000808252602080830182905282840182905260608084018390528451808601909552845283015290608082015290565b611aed81868686611d45565b95945050505050565b6080830151611b059083611ddd565b6080830151611b149082611ddd565b505050565b600654600090611b2a816001612a91565b600655835160408086015160808701515191516000937f404299460000000000000000000000000000000000000000000000000000000093611b7b9386938493923092918a91600191602401612b7b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050611c0686838684611df4565b9695505050505050565b60008481526007602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000008116909155905173ffffffffffffffffffffffffffffffffffffffff9091169186917fe1fe3afa0f7f761ff0a8b89086790efd5140d2907ebd5b7ff6bfcb5e075fd4c59190a26040517f6ee4d55300000000000000000000000000000000000000000000000000000000815260048101869052602481018590527fffffffff00000000000000000000000000000000000000000000000000000000841660448201526064810183905273ffffffffffffffffffffffffffffffffffffffff821690636ee4d55390608401600060405180830381600087803b158015611d2657600080fd5b505af1158015611d3a573d6000803e3d6000fd5b505050505050505050565b611d836040805160a0810182526000808252602080830182905282840182905260608084018390528451808601909552845283015290608082015290565b611d938560800151610100612001565b505091835273ffffffffffffffffffffffffffffffffffffffff1660208301527fffffffff0000000000000000000000000000000000000000000000000000000016604082015290565b611dea826003835161206c565b611b14828261217b565b6040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003060601b16602082015260348101849052600090605401604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815282825280516020918201206000818152600790925291812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a1617905590925082917fb5e6e01e79f91267dc17b4e6314d5d4d03593d2ceee0fbb452b750bd70ea5af99190a2600480546040517f4000aea000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911691634000aea091611f329189918891889101612c04565b6020604051808303816000875af1158015611f51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f759190612b59565b6118ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f756e61626c6520746f207472616e73666572416e6443616c6c20746f206f726160448201527f636c6500000000000000000000000000000000000000000000000000000000006064820152608401610615565b604080518082019091526060815260006020820152612021602083612b29565b1561204957612031602083612b29565b61203c9060206125fe565b6120469083612a91565b91505b506020808301829052604080518085526000815283019091019052815b92915050565b60178167ffffffffffffffff1611612091576116918360e0600585901b1683176121a9565b60ff8167ffffffffffffffff16116120cf576120b8836018611fe0600586901b16176121a9565b506116918367ffffffffffffffff831660016121ce565b61ffff8167ffffffffffffffff161161210e576120f7836019611fe0600586901b16176121a9565b506116918367ffffffffffffffff831660026121ce565b63ffffffff8167ffffffffffffffff161161214f5761213883601a611fe0600586901b16176121a9565b506116918367ffffffffffffffff831660046121ce565b61216483601b611fe0600586901b16176121a9565b506116918367ffffffffffffffff831660086121ce565b6040805180820190915260608152600060208201526121a2838460000151518485516121f4565b9392505050565b6040805180820190915260608152600060208201526121a283846000015151846122fc565b6040805180820190915260608152600060208201526118ed848560000151518585612357565b604080518082019091526060815260006020820152825182111561221757600080fd5b60208501516122268386612a91565b11156122595761225985612249876020015187866122449190612a91565b6123d8565b612254906002612850565b6123ef565b6000808651805187602083010193508088870111156122785787860182525b505050602084015b602084106122b85780518252612297602083612a91565b91506122a4602082612a91565b90506122b16020856125fe565b9350612280565b5181517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60208690036101000a019081169019919091161790525083949350505050565b604080518082019091526060815260006020820152836020015183106123315761233184856020015160026122549190612850565b835180516020858301018481535080850361234d576001810182525b5093949350505050565b604080518082019091526060815260006020820152602085015161237b8584612a91565b111561238f5761238f856122498685612a91565b6000600161239f84610100612d59565b6123a991906125fe565b90508551838682010185831982511617815250805184870111156123cd5783860181525b509495945050505050565b6000818311156123e9575081612066565b50919050565b81516123fb8383612001565b50611691838261217b565b803573ffffffffffffffffffffffffffffffffffffffff8116811461242a57600080fd5b919050565b60006020828403121561244157600080fd5b6121a282612406565b60006020828403121561245c57600080fd5b5035919050565b6000806040838503121561247657600080fd5b50508035926020909101359150565b60005b838110156124a0578181015183820152602001612488565b838111156116915750506000910152565b600081518084526124c9816020860160208601612485565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006121a260208301846124b1565b6000806040838503121561252157600080fd5b61252a83612406565b946020939093013593505050565b6000806000806080858703121561254e57600080fd5b843593506020850135925060408501357fffffffff000000000000000000000000000000000000000000000000000000008116811461258c57600080fd5b9396929550929360600135925050565b6000806000606084860312156125b157600080fd5b6125ba84612406565b95602085013595506040909401359392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015612610576126106125cf565b500390565b6000808312837f80000000000000000000000000000000000000000000000000000000000000000183128115161561264f5761264f6125cf565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018313811615612683576126836125cf565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156126ca576126ca6125cf565b7f80000000000000000000000000000000000000000000000000000000000000006000871286820588128184161615612705576127056125cf565b60008712925087820587128484161615612721576127216125cf565b87850587128184161615612737576127376125cf565b505050929093029392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261278357612783612745565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156127d7576127d76125cf565b500590565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03841381151615612816576128166125cf565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561284a5761284a6125cf565b50500190565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612888576128886125cf565b500290565b60008261289c5761289c612745565b500490565b600181811c908216806128b557607f821691505b6020821081036123e9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000815161292f818560208601612485565b9290920192915050565b7f435553523030303053413000000000000000000000000000000000000000000081527f2000000000000000000000000000000000000000000000000000000000000000600b8201526000600c6000855481600182811c9150808316806129a157607f831692505b602080841082036129d9577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b8180156129ed5760018114612a2457612a55565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008616888b01528785151586028b01019650612a55565b60008c81526020902060005b86811015612a4b5781548c82018b0152908501908301612a30565b505087858b010196505b505050505050611c06612a8b827f2000000000000000000000000000000000000000000000000000000000000000815260010190565b8661291d565b60008219821115612aa457612aa46125cf565b500190565b600060208284031215612abb57600080fd5b5051919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612af357612af36125cf565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082612b3857612b38612745565b500690565b60008251612b4f818460208701612485565b9190910192915050565b600060208284031215612b6b57600080fd5b815180151581146121a257600080fd5b600061010073ffffffffffffffffffffffffffffffffffffffff808c1684528a60208501528960408501528089166060850152507fffffffff00000000000000000000000000000000000000000000000000000000871660808401528560a08401528460c08401528060e0840152612bf5818401856124b1565b9b9a5050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000611aed60608301846124b1565b600181815b80851115612c9257817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612c7857612c786125cf565b80851615612c8557918102915b93841c9390800290612c3e565b509250929050565b600082612ca957506001612066565b81612cb657506000612066565b8160018114612ccc5760028114612cd657612cf2565b6001915050612066565b60ff841115612ce757612ce76125cf565b50506001821b612066565b5060208310610133831016604e8410600b8410161715612d15575081810a612066565b612d1f8383612c39565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115612d5157612d516125cf565b029392505050565b60006121a28383612c9a56fea264697066735822122060953409e6fc4252c556fd36c8e65fed673b84571add297cc498cbd4b68c0fe164736f6c634300080f0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000026ce2091749059a66703cd4b998156d94ec393ef00000000000000000000000044a95a619815a3cccad8cbeb6293c181b7b1a9d60000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000007e5000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000685ae5ac00000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000000000061e21c9000000000000000000000000000000000000000000000000000000000000007e600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000690739e200000000000000000000000000000000000000000000000000df7a18cfb81fe0800000000000000000000000000000000000000000000000000000000620afb1000000000000000000000000000000000000000000000000000000000000007e60000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000069ddb51c00000000000000000000000000000000000000000000000000e142774cb5648ef000000000000000000000000000000000000000000000000000000006243475100000000000000000000000000000000000000000000000000000000000007e6000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000006b2df91800000000000000000000000000000000000000000000000000e40df710538b07b000000000000000000000000000000000000000000000000000000006259c92b00000000000000000000000000000000000000000000000000000000000007e6000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000006b890c8600000000000000000000000000000000000000000000000000e4cfc12a1507952000000000000000000000000000000000000000000000000000000006281a6d000000000000000000000000000000000000000000000000000000000000007e6000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000006c95207400000000000000000000000000000000000000000000000000e70a2a49a9b0a2a0000000000000000000000000000000000000000000000000000000062aa23ff00000000000000000000000000000000000000000000000000000000000007e6000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000006e04ac4000000000000000000000000000000000000000000000000000ea1838e9e56f85e0000000000000000000000000000000000000000000000000000000062d1fced00000000000000000000000000000000000000000000000000000000000007e6000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000006dff3ca600000000000000000000000000000000000000000000000000ea0ca7e456895420000000000000000000000000000000000000000000000000000000062fbbf71
-----Decoded View---------------
Arg [0] : _creator_address (address): 0x26Ce2091749059a66703CD4B998156d94eC393ef
Arg [1] : _timelock_address (address): 0x44a95A619815a3ccCAd8cbEb6293C181B7B1a9D6
Arg [2] : initial_observations (tuple[]):
Arg [1] : result_year (uint256): 2021
Arg [2] : result_month (uint256): 12
Arg [3] : cpi_target (uint256): 28012600000
Arg [4] : peg_price_target (uint256): 1000000000000000000
Arg [5] : timestamp (uint256): 1642208400
Arg [1] : result_year (uint256): 2022
Arg [2] : result_month (uint256): 1
Arg [3] : cpi_target (uint256): 28193300000
Arg [4] : peg_price_target (uint256): 1006450668627688968
Arg [5] : timestamp (uint256): 1644886800
Arg [1] : result_year (uint256): 2022
Arg [2] : result_month (uint256): 2
Arg [3] : cpi_target (uint256): 28418200000
Arg [4] : peg_price_target (uint256): 1014479198646323439
Arg [5] : timestamp (uint256): 1648576337
Arg [1] : result_year (uint256): 2022
Arg [2] : result_month (uint256): 3
Arg [3] : cpi_target (uint256): 28770800000
Arg [4] : peg_price_target (uint256): 1027066391552372859
Arg [5] : timestamp (uint256): 1650051371
Arg [1] : result_year (uint256): 2022
Arg [2] : result_month (uint256): 4
Arg [3] : cpi_target (uint256): 28866300000
Arg [4] : peg_price_target (uint256): 1030475571707017554
Arg [5] : timestamp (uint256): 1652664016
Arg [1] : result_year (uint256): 2022
Arg [2] : result_month (uint256): 5
Arg [3] : cpi_target (uint256): 29147400000
Arg [4] : peg_price_target (uint256): 1040510341774772778
Arg [5] : timestamp (uint256): 1655317503
Arg [1] : result_year (uint256): 2022
Arg [2] : result_month (uint256): 6
Arg [3] : cpi_target (uint256): 29532800000
Arg [4] : peg_price_target (uint256): 1054268436346501214
Arg [5] : timestamp (uint256): 1657928941
Arg [1] : result_year (uint256): 2022
Arg [2] : result_month (uint256): 7
Arg [3] : cpi_target (uint256): 29527100000
Arg [4] : peg_price_target (uint256): 1054064956483867970
Arg [5] : timestamp (uint256): 1660665713
-----Encoded View---------------
44 Constructor Arguments found :
Arg [0] : 00000000000000000000000026ce2091749059a66703cd4b998156d94ec393ef
Arg [1] : 00000000000000000000000044a95a619815a3cccad8cbeb6293c181b7b1a9d6
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [4] : 00000000000000000000000000000000000000000000000000000000000007e5
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [6] : 0000000000000000000000000000000000000000000000000000000685ae5ac0
Arg [7] : 0000000000000000000000000000000000000000000000000de0b6b3a7640000
Arg [8] : 0000000000000000000000000000000000000000000000000000000061e21c90
Arg [9] : 00000000000000000000000000000000000000000000000000000000000007e6
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [11] : 0000000000000000000000000000000000000000000000000000000690739e20
Arg [12] : 0000000000000000000000000000000000000000000000000df7a18cfb81fe08
Arg [13] : 00000000000000000000000000000000000000000000000000000000620afb10
Arg [14] : 00000000000000000000000000000000000000000000000000000000000007e6
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [16] : 000000000000000000000000000000000000000000000000000000069ddb51c0
Arg [17] : 0000000000000000000000000000000000000000000000000e142774cb5648ef
Arg [18] : 0000000000000000000000000000000000000000000000000000000062434751
Arg [19] : 00000000000000000000000000000000000000000000000000000000000007e6
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [21] : 00000000000000000000000000000000000000000000000000000006b2df9180
Arg [22] : 0000000000000000000000000000000000000000000000000e40df710538b07b
Arg [23] : 000000000000000000000000000000000000000000000000000000006259c92b
Arg [24] : 00000000000000000000000000000000000000000000000000000000000007e6
Arg [25] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [26] : 00000000000000000000000000000000000000000000000000000006b890c860
Arg [27] : 0000000000000000000000000000000000000000000000000e4cfc12a1507952
Arg [28] : 000000000000000000000000000000000000000000000000000000006281a6d0
Arg [29] : 00000000000000000000000000000000000000000000000000000000000007e6
Arg [30] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [31] : 00000000000000000000000000000000000000000000000000000006c9520740
Arg [32] : 0000000000000000000000000000000000000000000000000e70a2a49a9b0a2a
Arg [33] : 0000000000000000000000000000000000000000000000000000000062aa23ff
Arg [34] : 00000000000000000000000000000000000000000000000000000000000007e6
Arg [35] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [36] : 00000000000000000000000000000000000000000000000000000006e04ac400
Arg [37] : 0000000000000000000000000000000000000000000000000ea1838e9e56f85e
Arg [38] : 0000000000000000000000000000000000000000000000000000000062d1fced
Arg [39] : 00000000000000000000000000000000000000000000000000000000000007e6
Arg [40] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [41] : 00000000000000000000000000000000000000000000000000000006dff3ca60
Arg [42] : 0000000000000000000000000000000000000000000000000ea0ca7e45689542
Arg [43] : 0000000000000000000000000000000000000000000000000000000062fbbf71
Deployed Bytecode Sourcemap
63697:10755:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64080:39;;;;;;;;;160:25:1;;;148:2;133:18;64080:39:0;;;;;;;;60243:141;;;;;;:::i;:::-;;:::i;:::-;;73707:136;;;;;;:::i;:::-;;:::i;69874:650::-;;;:::i;63817:49::-;;;;;;;;;;;;986:42:1;974:55;;;956:74;;944:2;929:18;63817:49:0;773:263:1;71470:1323:0;;;;;;:::i;:::-;;:::i;64260:53::-;;;;;;65189:29;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;60011:::-;;;;;;;;;68836:367;;;:::i;64018:37::-;;;;;;73273:113;;;;;;:::i;:::-;;:::i;65090:37::-;;;;;;60392:271;;;:::i;64378:21::-;;;;;;;;;64648:31;;;;;;64834:39;;;;;;74043:243;;;;;;:::i;:::-;;:::i;59984:20::-;;;;;;;;;64991:40;;;;;;:::i;:::-;;:::i;:::-;;;;2875:25:1;;;2931:2;2916:18;;2909:34;;;;2959:18;;;2952:34;;;;3017:2;3002:18;;2995:34;3060:3;3045:19;;3038:35;2862:3;2847:19;64991:40:0;2616:463:1;68074:715:0;;;:::i;:::-;;;;3286:25:1;;;3342:2;3327:18;;3320:34;;;;3370:18;;;3363:34;3274:2;3259:18;68074:715:0;3084:319:1;73575:124:0;;;;;;:::i;:::-;;:::i;70629:749::-;;;:::i;64556:33::-;;;;;;73851:149;;;;;;:::i;:::-;;:::i;73132:133::-;;;;;;:::i;:::-;;:::i;64938:46::-;;;;;;69564:241;;;:::i;64144:51::-;;;;;;64438:20;;;;;;64739:42;;;;;;65259:37;;;;;;63911:26;;;;;;;;;63873:31;;;;;;;;;64494:18;;;;;;72801:263;;;;;;:::i;:::-;;:::i;73394:173::-;;;;;;:::i;:::-;;:::i;69269:207::-;;;:::i;60243:141::-;60723:5;;;;60709:10;:19;60701:79;;;;;;;4841:2:1;60701:79:0;;;4823:21:1;4880:2;4860:18;;;4853:30;4919:34;4899:18;;;4892:62;4990:17;4970:18;;;4963:45;5025:19;;60701:79:0;;;;;;;;;60315:14:::1;:23:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;60354:22:::1;::::0;956:74:1;;;60354:22:0::1;::::0;944:2:1;929:18;60354:22:0::1;;;;;;;60243:141:::0;:::o;73707:136::-;65709:5;;;;65695:10;:19;;:53;;-1:-1:-1;65732:16:0;;;;65718:10;:30;65695:53;65687:87;;;;;;;5257:2:1;65687:87:0;;;5239:21:1;5296:2;5276:18;;;5269:30;5335:23;5315:18;;;5308:51;5376:18;;65687:87:0;5055:345:1;65687:87:0;73796:17:::1;:38:::0;73707:136::o;69874:650::-;69921:7;69941:20;69982:14;;69964:15;:32;;;;:::i;:::-;69941:55;;70027:11;;70011:12;:27;70007:510;;-1:-1:-1;;70062:16:0;;;69874:650::o;70007:510::-;70289:29;70407:11;;70383:12;70357:14;;70330:16;;70323:49;;;;:::i;:::-;70322:74;;;;:::i;:::-;70321:98;;;;:::i;:::-;70289:130;;70481:22;70456:14;;70449:55;;;;:::i;:::-;70434:71;;;;69874:650;:::o;71470:1323::-;36753:28;;;;:17;:28;;;;;;;;;;36739:10;:42;36731:95;;;;;;;7834:2:1;36731:95:0;;;7816:21:1;7873:2;7853:18;;;7846:30;7912:34;7892:18;;;7885:62;7983:10;7963:18;;;7956:38;8011:19;;36731:95:0;7632:404:1;36731:95:0;36840:28;;;;:17;:28;;;;;;36833:35;;;;;;36880:29;36858:9;;36880:29;;;71656:10:::1;::::0;;71645:8:::1;:21:::0;;;71694:16:::1;::::0;71677:14:::1;:33:::0;;;71785:19;;;;71656:10;71835:27:::1;::::0;71798:6;;71835:27:::1;:::i;:::-;71834:40;;;;:::i;:::-;71815:16;:59:::0;71967:14:::1;::::0;71943:20:::1;:18;:20::i;:::-;:38;;71935:65;;;::::0;::::1;::::0;;8601:2:1;71935:65:0::1;::::0;::::1;8583:21:1::0;8640:2;8620:18;;;8613:30;8679:16;8659:18;;;8652:44;8713:18;;71935:65:0::1;8399:338:1::0;71935:65:0::1;72063:15;72046:14;:32:::0;72130:19:::1;::::0;72177::::1;:17;:19::i;:::-;-1:-1:-1::0;72207:11:0::1;:25:::0;;;72243:12:::1;:27:::0;;;72441:18:::1;::::0;72427:11:::1;:32:::0;;;72526:164:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;72608:10:::1;::::0;72526:164;;;;;;72633:16:::1;::::0;;72526:164;;;;;;;72664:15:::1;72526:164:::0;;;;;;;72504:16:::1;:187:::0;;-1:-1:-1;72504:187:0;::::1;::::0;;-1:-1:-1;72504:187:0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72755:16;;72773:11;;72709:76;;2875:25:1;;;2916:18;;;2909:34;;;2959:18;;;2952:34;;;3002:18;;;2995:34;;;;3045:19;;;3038:35;;;;72207:25:0;;-1:-1:-1;72243:27:0;;-1:-1:-1;72709:76:0::1;::::0;2847:19:1;72709:76:0::1;;;;;;;71574:1219;;71470:1323:::0;;;:::o;65189:29::-;;;;;;;;;;;;;;;;;-1:-1:-1;65189:29:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68836:367::-;68884:24;68962:21;68985:22;69013:19;:17;:19::i;:::-;68961:71;;;;;69128:11;69140:14;69128:27;;;;;;;:::i;:::-;;69162:31;69179:13;69162:16;:31::i;:::-;69091:103;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69077:118;;;;68836:367;:::o;73273:113::-;65709:5;;;;65695:10;:19;;:53;;-1:-1:-1;65732:16:0;;;;65718:10;:30;65695:53;65687:87;;;;;;;5257:2:1;65687:87:0;;;5239:21:1;5296:2;5276:18;;;5269:30;5335:23;5315:18;;;5308:51;5376:18;;65687:87:0;5055:345:1;65687:87:0;73348:11:::1;:30:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;73273:113::o;60392:271::-;60461:14;;;;60447:10;:28;60439:94;;;;;;;11793:2:1;60439:94:0;;;11775:21:1;11832:2;11812:18;;;11805:30;11871:34;11851:18;;;11844:62;11942:23;11922:18;;;11915:51;11983:19;;60439:94:0;11591:417:1;60439:94:0;60562:5;;;60569:14;60549:35;;;60562:5;;;;12248:34:1;;60569:14:0;;;;12313:2:1;12298:18;;12291:43;60549:35:0;;12160:18:1;60549:35:0;;;;;;;60603:14;;;;60595:22;;;;;;60603:14;;;60595:22;;;;60628:27;;;60392:271::o;74043:243::-;65709:5;;;;65695:10;:19;;:53;;-1:-1:-1;65732:16:0;;;;65718:10;:30;65695:53;65687:87;;;;;;;5257:2:1;65687:87:0;;;5239:21:1;5296:2;5276:18;;;5269:30;5335:23;5315:18;;;5308:51;5376:18;;65687:87:0;5055:345:1;65687:87:0;74259:5:::1;::::0;74217:61:::1;::::0;74245:12;;74259:5:::1;;74266:11:::0;74217:27:::1;:61::i;:::-;74043:243:::0;;:::o;64991:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64991:40:0;;;;;:::o;68074:715::-;68134:21;68166:22;68200:26;68249:12;;68265:2;68249:18;68245:232;;68300:11;;:15;;68314:1;68300:15;:::i;:::-;68284:31;;68347:1;68330:18;;68245:232;;;68406:11;;68390:27;;68449:12;;68464:1;68449:16;;;;:::i;:::-;68432:33;;68245:232;68700:13;;68763:17;;68700:81;;;;;;;;3286:25:1;;;3327:18;;;3320:34;;;3370:18;;;3363:34;;;;68700:13:0;;;;;:31;;3259:18:1;;68700:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68679:102;;68074:715;;;:::o;73575:124::-;65709:5;;;;65695:10;:19;;:53;;-1:-1:-1;65732:16:0;;;;65718:10;:30;65695:53;65687:87;;;;;;;5257:2:1;65687:87:0;;;5239:21:1;5296:2;5276:18;;;5269:30;5335:23;5315:18;;;5308:51;5376:18;;65687:87:0;5055:345:1;65687:87:0;73658:14:::1;:32:::0;73575:124::o;70629:749::-;70689:17;65862:5;;;;65848:10;:19;;:53;;-1:-1:-1;65885:16:0;;;;65871:10;:30;65848:53;:82;;;-1:-1:-1;65919:11:0;;;;65905:10;:25;65848:82;65840:118;;;;;;;12869:2:1;65840:118:0;;;12851:21:1;12908:2;12888:18;;;12881:30;12947:25;12927:18;;;12920:53;12990:18;;65840:118:0;12667:347:1;65840:118:0;70725:32:::1;70760:66;70782:5;;70797:4;70804:21;;;70760;:66::i;:::-;70725:101;;70880:21;70903:22:::0;70927:26:::1;70957:19;:17;:19::i;:::-;70879:97;;;;;;71050:18;71031:15;:37;;71023:59;;;::::0;::::1;::::0;;13221:2:1;71023:59:0::1;::::0;::::1;13203:21:1::0;13260:1;13240:18;;;13233:29;13298:11;13278:18;;;13271:39;13327:18;;71023:59:0::1;13019:332:1::0;71023:59:0::1;71095:35;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;::::0;:7:::1;:11;;:35;;;;;:::i;:::-;71195:49;;;;;;;;;;;;;;;;;::::0;71216:11:::1;71228:14;71216:27;;;;;;;:::i;:::-;;71195:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:11;;:49;;;;;:::i;:::-;71255:52;;;;;;;;;;;;;;;;;::::0;71275:31:::1;71292:13;71275:16;:31::i;:::-;71255:7:::0;;:52;:11:::1;:52::i;:::-;71349:6;::::0;71366:3:::1;::::0;71326:44:::1;::::0;71349:6:::1;;::::0;71357:7;;71326:22:::1;:44::i;:::-;71319:51;;;;;;70629:749:::0;:::o;73851:149::-;65709:5;;;;65695:10;:19;;:53;;-1:-1:-1;65732:16:0;;;;65718:10;:30;65695:53;65687:87;;;;;;;5257:2:1;65687:87:0;;;5239:21:1;5296:2;5276:18;;;5269:30;5335:23;5315:18;;;5308:51;5376:18;;65687:87:0;5055:345:1;65687:87:0;73942:18:::1;:40:::0;73851:149::o;73132:133::-;65709:5;;;;65695:10;:19;;:53;;-1:-1:-1;65732:16:0;;;;65718:10;:30;65695:53;65687:87;;;;;;;5257:2:1;65687:87:0;;;5239:21:1;5296:2;5276:18;;;5269:30;5335:23;5315:18;;;5308:51;5376:18;;65687:87:0;5055:345:1;65687:87:0;73217:16:::1;:40:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;73132:133::o;69564:241::-;69615:7;69635:22;69660:17;:15;:17::i;:::-;69635:42;;69711:1;69692:15;:20;69688:109;;69729:15;69564:241;-1:-1:-1;69564:241:0:o;69688:109::-;69776:20;69781:15;69776:2;:20;:::i;:::-;69761:36;;;69564:241;:::o;72801:263::-;65862:5;;;;65848:10;:19;;:53;;-1:-1:-1;65885:16:0;;;;65871:10;:30;65848:53;:82;;;-1:-1:-1;65919:11:0;;;;65905:10;:25;65848:82;65840:118;;;;;;;12869:2:1;65840:118:0;;;12851:21:1;12908:2;12888:18;;;12881:30;12947:25;12927:18;;;12920:53;12990:18;;65840:118:0;12667:347:1;65840:118:0;72984:72:::1;73007:10;73019:8;73029:13;73044:11;72984:22;:72::i;:::-;72801:263:::0;;;;:::o;73394:173::-;65709:5;;;;65695:10;:19;;:53;;-1:-1:-1;65732:16:0;;;;65718:10;:30;65695:53;65687:87;;;;;;;5257:2:1;65687:87:0;;;5239:21:1;5296:2;5276:18;;;5269:30;5335:23;5315:18;;;5308:51;5376:18;;65687:87:0;5055:345:1;65687:87:0;73497:6:::1;:16:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;;73524:5:::1;:14:::0;73549:3:::1;:10:::0;73394:173::o;69269:207::-;69317:6;69336:17;69391:14;;69364:16;;69357:49;;;;:::i;:::-;69356:57;;69410:3;69356:57;:::i;:::-;69336:77;;69452:14;;69432:10;:35;;;;:::i;548:723::-;604:13;825:5;834:1;825:10;821:53;;-1:-1:-1;;852:10:0;;;;;;;;;;;;;;;;;;548:723::o;821:53::-;899:5;884:12;940:78;947:9;;940:78;;973:8;;;;:::i;:::-;;-1:-1:-1;996:10:0;;-1:-1:-1;1004:2:0;996:10;;:::i;:::-;;;940:78;;;1028:19;1060:6;1050:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1050:17:0;;1028:39;;1078:154;1085:10;;1078:154;;1112:11;1122:1;1112:11;;:::i;:::-;;-1:-1:-1;1181:10:0;1189:2;1181:5;:10;:::i;:::-;1168:24;;:2;:24;:::i;:::-;1155:39;;1138:6;1145;1138:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1209:11:0;1218:2;1209:11;;:::i;:::-;;;1078:154;;;1256:6;548:723;-1:-1:-1;;;;548:723:0:o;61475:361::-;61670:45;;;61659:10;14054:55:1;;;61670:45:0;;;14036:74:1;14126:18;;;;14119:34;;;61670:45:0;;;;;;;;;;14009:18:1;;;;61670:45:0;;;;;;;;;;;;;61659:57;;-1:-1:-1;;;;61659:10:0;;;;:57;;61670:45;61659:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61623:93;;;;61735:7;:57;;;;-1:-1:-1;61747:11:0;;:16;;:44;;;61778:4;61767:24;;;;;;;;;;;;:::i;:::-;61727:101;;;;;;;14927:2:1;61727:101:0;;;14909:21:1;14966:2;14946:18;;;14939:30;15005:33;14985:18;;;14978:61;15056:18;;61727:101:0;14725:355:1;61727:101:0;61545:291;;61475:361;;;:::o;26686:290::-;26832:24;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26832:24:0;26865:28;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26865:28:0;26907:63;:3;26922:6;26930:12;26944:25;26907:14;:63::i;:::-;26900:70;26686:290;-1:-1:-1;;;;;26686:290:0:o;18384:182::-;18499:8;;;;:26;;18521:3;18499:21;:26::i;:::-;18532:8;;;;:28;;18554:5;18532:21;:28::i;:::-;18384:182;;;:::o;28568:775::-;28750:14;;28708:17;;28788:9;28750:14;28796:1;28788:9;:::i;:::-;28771:14;:26;29137:6;;29174:22;;;;;29247:7;;;;:11;28834:431;;28804:27;;28865:48;;28834:431;;28804:27;;;;29137:6;29160:4;;29174:22;29205:5;;25649:1;;28834:431;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29279:58:0;29291:13;29306:5;29313:7;28834:431;29279:11;:58::i;:::-;29272:65;28568:775;-1:-1:-1;;;;;;28568:775:0:o;32550:398::-;32700:27;32748:28;;;:17;:28;;;;;;;;32784:35;;;;;;32831:29;;32748:28;;;;;32766:9;;32831:29;;32700:27;32831:29;32867:75;;;;;;;;16221:25:1;;;16262:18;;;16255:34;;;16337:66;16325:79;;16305:18;;;16298:107;16421:18;;;16414:34;;;32867:29:0;;;;;;16193:19:1;;32867:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32693:255;32550:398;;;;:::o;17390:362::-;17537:24;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17537:24:0;17570:49;17591:4;:8;;;16743:3;17570:20;:49::i;:::-;-1:-1:-1;;17626:15:0;;;17648:35;;:20;;;:35;17690:38;;:23;;;:38;17626:15;17390:362::o;15858:207::-;15957:71;15976:3;13398:1;16013:5;16007:19;15957:18;:71::i;:::-;16035:24;:3;16052:5;16035:10;:24::i;31582:440::-;31777:29;;16673:66:1;31794:4:0;16660:2:1;16656:15;16652:88;31777:29:0;;;16640:101:1;16757:12;;;16750:28;;;31729:17:0;;16794:12:1;;31777:29:0;;;;;;;;;;;;;31767:40;;31777:29;31767:40;;;;31814:28;;;;:17;:28;;;;;;:44;;;;;;;;;;31767:40;;-1:-1:-1;31767:40:0;;31870:29;;31814:28;31870:29;31914:6;;;:62;;;;;:6;;;;;:22;;:62;;31937:13;;31952:7;;31961:14;;31914:62;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31906:110;;;;;;;17444:2:1;31906:110:0;;;17426:21:1;17483:2;17463:18;;;17456:30;17522:34;17502:18;;;17495:62;17593:5;17573:18;;;17566:33;17616:19;;31906:110:0;17242:399:1;3663:412:0;-1:-1:-1;;;;;;;;;;;;;;;;;3763:13:0;3774:2;3763:8;:13;:::i;:::-;:18;3759:73;;3810:13;3821:2;3810:8;:13;:::i;:::-;3804:20;;:2;:20;:::i;:::-;3792:32;;;;:::i;:::-;;;3759:73;-1:-1:-1;3881:12:0;;;;:23;;;3946:4;3940:11;;3959:16;;;-1:-1:-1;3983:14:0;;4026:18;;4018:27;;;4005:41;;3881:3;3663:412;;;;;:::o;13706:641::-;13828:2;13819:5;:11;;;13816:526;;13841:44;:3;13863:20;13873:1;13864:10;;;13863:20;;;13841:15;:44::i;13816:526::-;13912:4;13903:5;:13;;;13899:443;;13927:41;:3;13964:2;13950:10;13959:1;13950:10;;;;13949:17;13927:15;:41::i;:::-;-1:-1:-1;13977:23:0;:3;:23;;;13998:1;13977:13;:23::i;13899:443::-;14027:6;14018:5;:15;;;14014:328;;14044:41;:3;14081:2;14067:10;14076:1;14067:10;;;;14066:17;14044:15;:41::i;:::-;-1:-1:-1;14094:23:0;:3;:23;;;14115:1;14094:13;:23::i;14014:328::-;14144:10;14135:5;:19;;;14131:211;;14165:41;:3;14202:2;14188:10;14197:1;14188:10;;;;14187:17;14165:15;:41::i;:::-;-1:-1:-1;14215:23:0;:3;:23;;;14236:1;14215:13;:23::i;14131:211::-;14261:41;:3;14298:2;14284:10;14293:1;14284:10;;;;14283:17;14261:15;:41::i;:::-;-1:-1:-1;14311:23:0;:3;:23;;;14332:1;14311:13;:23::i;7490:157::-;-1:-1:-1;;;;;;;;;;;;;;;;;7596:45:0;7602:3;7607;:7;;;:14;7623:4;7629;:11;7596:5;:45::i;:::-;7589:52;7490:157;-1:-1:-1;;;7490:157:0:o;8882:147::-;-1:-1:-1;;;;;;;;;;;;;;;;;8986:37:0;8997:3;9002;:7;;;:14;9018:4;8986:10;:37::i;12857:183::-;-1:-1:-1;;;;;;;;;;;;;;;;;12994:40:0;13003:3;13008;:7;;;:14;13024:4;13030:3;12994:8;:40::i;5470:1258::-;-1:-1:-1;;;;;;;;;;;;;;;;;5634:4:0;:11;5627:3;:18;;5619:27;;;;;;5671:12;;;;5659:9;5665:3;5659;:9;:::i;:::-;:24;5655:92;;;5694:45;5701:3;5706:28;5710:3;:12;;;5730:3;5724;:9;;;;:::i;:::-;5706:3;:28::i;:::-;:32;;5737:1;5706:32;:::i;:::-;5694:6;:45::i;:::-;5755:12;5774:11;5874:3;5868:10;5947:6;5941:13;6065:3;6060:2;6052:6;6048:15;6044:25;6036:33;;6151:6;6145:3;6140;6136:13;6133:25;6130:78;;;6194:3;6189;6185:13;6177:6;6170:29;6130:78;-1:-1:-1;;;6233:2:0;6223:13;;6298:135;6312:2;6305:3;:9;6298:135;;6369:10;;6356:24;;6397:10;6405:2;6363:4;6397:10;:::i;:::-;;-1:-1:-1;6416:9:0;6423:2;6416:9;;:::i;:::-;;-1:-1:-1;6316:9:0;6323:2;6316:9;;:::i;:::-;;;6298:135;;;6573:10;6625:11;;6504:21;6511:2;:8;;;6505:3;:15;6504:21;6621:22;;;6585:9;;6569:26;;;;6666:21;6653:35;;-1:-1:-1;6719:3:0;5470:1258;;;;;;:::o;7958:662::-;-1:-1:-1;;;;;;;;;;;;;;;;;8098:3:0;:12;;;8091:3;:19;8087:71;;8121:29;8128:3;8133;:12;;;8148:1;8133:16;;;;:::i;8121:29::-;8248:3;8242:10;8321:6;8315:13;8435:2;8429:3;8421:6;8417:16;8413:25;8460:4;8454;8446:19;;8533:6;8528:3;8525:15;8522:69;;8579:1;8571:6;8567:14;8559:6;8552:30;8522:69;-1:-1:-1;8611:3:0;;7958:662;-1:-1:-1;;;;7958:662:0:o;11905:698::-;-1:-1:-1;;;;;;;;;;;;;;;;;12067:12:0;;;;12055:9;12061:3;12055;:9;:::i;:::-;:24;12051:75;;;12090:28;12097:3;12103:9;12109:3;12103;:9;:::i;12090:28::-;12134:12;12162:1;12150:8;12155:3;12150;:8;:::i;:::-;12149:14;;;;:::i;:::-;12134:29;;12252:3;12246:10;12369:3;12363;12355:6;12351:16;12347:26;12426:4;12418;12414:9;12407:4;12401:11;12397:27;12394:37;12388:4;12381:51;;12516:6;12510:13;12504:3;12499;12495:13;12492:32;12489:85;;;12560:3;12555;12551:13;12543:6;12536:29;12489:85;-1:-1:-1;12594:3:0;;11905:698;-1:-1:-1;;;;;11905:698:0:o;4657:129::-;4714:7;4738:1;4734;:5;4730:36;;;-1:-1:-1;4757:1:0;4750:8;;4730:36;-1:-1:-1;4779:1:0;4657:129;-1:-1:-1;4657:129:0:o;4491:160::-;4586:7;;4600:19;4586:3;4610:8;4600:4;:19::i;:::-;;4626;4633:3;4638:6;4626;:19::i;196:196:1:-;264:20;;324:42;313:54;;303:65;;293:93;;382:1;379;372:12;293:93;196:196;;;:::o;397:186::-;456:6;509:2;497:9;488:7;484:23;480:32;477:52;;;525:1;522;515:12;477:52;548:29;567:9;548:29;:::i;588:180::-;647:6;700:2;688:9;679:7;675:23;671:32;668:52;;;716:1;713;706:12;668:52;-1:-1:-1;739:23:1;;588:180;-1:-1:-1;588:180:1:o;1041:248::-;1109:6;1117;1170:2;1158:9;1149:7;1145:23;1141:32;1138:52;;;1186:1;1183;1176:12;1138:52;-1:-1:-1;;1209:23:1;;;1279:2;1264:18;;;1251:32;;-1:-1:-1;1041:248:1:o;1294:258::-;1366:1;1376:113;1390:6;1387:1;1384:13;1376:113;;;1466:11;;;1460:18;1447:11;;;1440:39;1412:2;1405:10;1376:113;;;1507:6;1504:1;1501:13;1498:48;;;-1:-1:-1;;1542:1:1;1524:16;;1517:27;1294:258::o;1557:328::-;1610:3;1648:5;1642:12;1675:6;1670:3;1663:19;1691:63;1747:6;1740:4;1735:3;1731:14;1724:4;1717:5;1713:16;1691:63;:::i;:::-;1799:2;1787:15;1804:66;1783:88;1774:98;;;;1874:4;1770:109;;1557:328;-1:-1:-1;;1557:328:1:o;1890:231::-;2039:2;2028:9;2021:21;2002:4;2059:56;2111:2;2100:9;2096:18;2088:6;2059:56;:::i;2357:254::-;2425:6;2433;2486:2;2474:9;2465:7;2461:23;2457:32;2454:52;;;2502:1;2499;2492:12;2454:52;2525:29;2544:9;2525:29;:::i;:::-;2515:39;2601:2;2586:18;;;;2573:32;;-1:-1:-1;;;2357:254:1:o;3590:537::-;3675:6;3683;3691;3699;3752:3;3740:9;3731:7;3727:23;3723:33;3720:53;;;3769:1;3766;3759:12;3720:53;3805:9;3792:23;3782:33;;3862:2;3851:9;3847:18;3834:32;3824:42;;3916:2;3905:9;3901:18;3888:32;3960:66;3953:5;3949:78;3942:5;3939:89;3929:117;;4042:1;4039;4032:12;3929:117;3590:537;;;;-1:-1:-1;4065:5:1;;4117:2;4102:18;4089:32;;-1:-1:-1;;3590:537:1:o;4132:322::-;4209:6;4217;4225;4278:2;4266:9;4257:7;4253:23;4249:32;4246:52;;;4294:1;4291;4284:12;4246:52;4317:29;4336:9;4317:29;:::i;:::-;4307:39;4393:2;4378:18;;4365:32;;-1:-1:-1;4444:2:1;4429:18;;;4416:32;;4132:322;-1:-1:-1;;;4132:322:1:o;5405:184::-;5457:77;5454:1;5447:88;5554:4;5551:1;5544:15;5578:4;5575:1;5568:15;5594:125;5634:4;5662:1;5659;5656:8;5653:34;;;5667:18;;:::i;:::-;-1:-1:-1;5704:9:1;;5594:125::o;5724:369::-;5763:4;5799:1;5796;5792:9;5908:1;5840:66;5836:74;5833:1;5829:82;5824:2;5817:10;5813:99;5810:125;;;5915:18;;:::i;:::-;6034:1;5966:66;5962:74;5959:1;5955:82;5951:2;5947:91;5944:117;;;6041:18;;:::i;:::-;-1:-1:-1;;6078:9:1;;5724:369::o;6098:655::-;6137:7;6169:66;6261:1;6258;6254:9;6289:1;6286;6282:9;6334:1;6330:2;6326:10;6323:1;6320:17;6315:2;6311;6307:11;6303:35;6300:61;;;6341:18;;:::i;:::-;6380:66;6472:1;6469;6465:9;6519:1;6515:2;6510:11;6507:1;6503:19;6498:2;6494;6490:11;6486:37;6483:63;;;6526:18;;:::i;:::-;6572:1;6569;6565:9;6555:19;;6619:1;6615:2;6610:11;6607:1;6603:19;6598:2;6594;6590:11;6586:37;6583:63;;;6626:18;;:::i;:::-;6691:1;6687:2;6682:11;6679:1;6675:19;6670:2;6666;6662:11;6658:37;6655:63;;;6698:18;;:::i;:::-;-1:-1:-1;;;6738:9:1;;;;;6098:655;-1:-1:-1;;;6098:655:1:o;6758:184::-;6810:77;6807:1;6800:88;6907:4;6904:1;6897:15;6931:4;6928:1;6921:15;6947:308;6986:1;7012;7002:35;;7017:18;;:::i;:::-;7134:66;7131:1;7128:73;7059:66;7056:1;7053:73;7049:153;7046:179;;;7205:18;;:::i;:::-;-1:-1:-1;7239:10:1;;6947:308::o;7260:367::-;7299:3;7334:1;7331;7327:9;7443:1;7375:66;7371:74;7368:1;7364:82;7359:2;7352:10;7348:99;7345:125;;;7450:18;;:::i;:::-;7569:1;7501:66;7497:74;7494:1;7490:82;7486:2;7482:91;7479:117;;;7576:18;;:::i;:::-;-1:-1:-1;;7612:9:1;;7260:367::o;8041:228::-;8081:7;8207:1;8139:66;8135:74;8132:1;8129:81;8124:1;8117:9;8110:17;8106:105;8103:131;;;8214:18;;:::i;:::-;-1:-1:-1;8254:9:1;;8041:228::o;8274:120::-;8314:1;8340;8330:35;;8345:18;;:::i;:::-;-1:-1:-1;8379:9:1;;8274:120::o;8742:437::-;8821:1;8817:12;;;;8864;;;8885:61;;8939:4;8931:6;8927:17;8917:27;;8885:61;8992:2;8984:6;8981:14;8961:18;8958:38;8955:218;;9029:77;9026:1;9019:88;9130:4;9127:1;9120:15;9158:4;9155:1;9148:15;9184:184;9236:77;9233:1;9226:88;9333:4;9330:1;9323:15;9357:4;9354:1;9347:15;9618:185;9660:3;9698:5;9692:12;9713:52;9758:6;9753:3;9746:4;9739:5;9735:16;9713:52;:::i;:::-;9781:16;;;;;9618:185;-1:-1:-1;;9618:185:1:o;9808:1778::-;10317:13;10312:3;10305:26;10361:3;10356:2;10351:3;10347:12;10340:25;10287:3;10384:2;10406:1;10439:6;10433:13;10469:3;10491:1;10519:9;10515:2;10511:18;10501:28;;10579:2;10568:9;10564:18;10601;10591:61;;10645:4;10637:6;10633:17;10623:27;;10591:61;10671:2;10719;10711:6;10708:14;10688:18;10685:38;10682:222;;10758:77;10753:3;10746:90;10859:4;10856:1;10849:15;10889:4;10884:3;10877:17;10682:222;10920:18;10947:209;;;;11170:1;11165:338;;;;10913:590;;10947:209;11004:66;10993:9;10989:82;10984:2;10979:3;10975:12;10968:104;11143:2;11131:6;11124:14;11117:22;11109:6;11105:35;11100:3;11096:45;11092:54;11085:61;;10947:209;;11165:338;9565:1;9558:14;;;9602:4;9589:18;;11260:1;11274:174;11288:6;11285:1;11282:13;11274:174;;;11375:14;;11357:11;;;11353:20;;11346:44;11418:16;;;;11303:10;;11274:174;;;11278:3;;11490:2;11481:6;11476:3;11472:16;11468:25;11461:32;;10913:590;;;;;;;11519:61;11545:34;11575:3;9450;9438:16;;9479:1;9470:11;;9373:114;11545:34;11537:6;11519:61;:::i;12345:128::-;12385:3;12416:1;12412:6;12409:1;12406:13;12403:39;;;12422:18;;:::i;:::-;-1:-1:-1;12458:9:1;;12345:128::o;12478:184::-;12548:6;12601:2;12589:9;12580:7;12576:23;12572:32;12569:52;;;12617:1;12614;12607:12;12569:52;-1:-1:-1;12640:16:1;;12478:184;-1:-1:-1;12478:184:1:o;13356:195::-;13395:3;13426:66;13419:5;13416:77;13413:103;;13496:18;;:::i;:::-;-1:-1:-1;13543:1:1;13532:13;;13356:195::o;13556:184::-;13608:77;13605:1;13598:88;13705:4;13702:1;13695:15;13729:4;13726:1;13719:15;13745:112;13777:1;13803;13793:35;;13808:18;;:::i;:::-;-1:-1:-1;13842:9:1;;13745:112::o;14164:274::-;14293:3;14331:6;14325:13;14347:53;14393:6;14388:3;14381:4;14373:6;14369:17;14347:53;:::i;:::-;14416:16;;;;;14164:274;-1:-1:-1;;14164:274:1:o;14443:277::-;14510:6;14563:2;14551:9;14542:7;14538:23;14534:32;14531:52;;;14579:1;14576;14569:12;14531:52;14611:9;14605:16;14664:5;14657:13;14650:21;14643:5;14640:32;14630:60;;14686:1;14683;14676:12;15085:902;15389:4;15418:3;15440:42;15521:2;15513:6;15509:15;15498:9;15491:34;15561:6;15556:2;15545:9;15541:18;15534:34;15604:6;15599:2;15588:9;15584:18;15577:34;15659:2;15651:6;15647:15;15642:2;15631:9;15627:18;15620:43;;15712:66;15704:6;15700:79;15694:3;15683:9;15679:19;15672:108;15817:6;15811:3;15800:9;15796:19;15789:35;15861:6;15855:3;15844:9;15840:19;15833:35;15905:2;15899:3;15888:9;15884:19;15877:31;15925:56;15977:2;15966:9;15962:18;15954:6;15925:56;:::i;:::-;15917:64;15085:902;-1:-1:-1;;;;;;;;;;;15085:902:1:o;16817:420::-;17032:42;17024:6;17020:55;17009:9;17002:74;17112:6;17107:2;17096:9;17092:18;17085:34;17155:2;17150;17139:9;17135:18;17128:30;16983:4;17175:56;17227:2;17216:9;17212:18;17204:6;17175:56;:::i;17646:482::-;17735:1;17778:5;17735:1;17792:330;17813:7;17803:8;17800:21;17792:330;;;17932:4;17864:66;17860:77;17854:4;17851:87;17848:113;;;17941:18;;:::i;:::-;17991:7;17981:8;17977:22;17974:55;;;18011:16;;;;17974:55;18090:22;;;;18050:15;;;;17792:330;;;17796:3;17646:482;;;;;:::o;18133:866::-;18182:5;18212:8;18202:80;;-1:-1:-1;18253:1:1;18267:5;;18202:80;18301:4;18291:76;;-1:-1:-1;18338:1:1;18352:5;;18291:76;18383:4;18401:1;18396:59;;;;18469:1;18464:130;;;;18376:218;;18396:59;18426:1;18417:10;;18440:5;;;18464:130;18501:3;18491:8;18488:17;18485:43;;;18508:18;;:::i;:::-;-1:-1:-1;;18564:1:1;18550:16;;18579:5;;18376:218;;18678:2;18668:8;18665:16;18659:3;18653:4;18650:13;18646:36;18640:2;18630:8;18627:16;18622:2;18616:4;18613:12;18609:35;18606:77;18603:159;;;-1:-1:-1;18715:19:1;;;18747:5;;18603:159;18794:34;18819:8;18813:4;18794:34;:::i;:::-;18924:6;18856:66;18852:79;18843:7;18840:92;18837:118;;;18935:18;;:::i;:::-;18973:20;;18133:866;-1:-1:-1;;;18133:866:1:o;19004:131::-;19064:5;19093:36;19120:8;19114:4;19093:36;:::i
Swarm Source
ipfs://60953409e6fc4252c556fd36c8e65fed673b84571add297cc498cbd4b68c0fe1
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.