Source Code
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MockADCSConsumer
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
No with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "../ADCSConsumerFulfill.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract MockADCSConsumer is
ADCSConsumerFulfillUint256,
ADCSConsumerFulfillBool,
ADCSConsumerFulfillBytes32,
ADCSConsumerFulfillBytes,
ADCSConsumerFulfillStringAndBool,
Ownable
{
using ADCS for ADCS.Request;
uint256 public lastUint256;
bool public lastBool;
bytes32 public lastBytes32;
bytes public lastBytes;
struct MemeCoinTrade {
string name;
bool isBuy;
uint256 updatedAt;
}
MemeCoinTrade public lastMemeCoinTrade;
event DataRequestedUint256(uint256 indexed requestId);
event DataRequestedBool(uint256 indexed requestId);
event DataRequestedBytes32(uint256 indexed requestId);
event DataRequestedBytes(uint256 indexed requestId);
event DataRequestedMemeCoinTrade(uint256 indexed requestId);
constructor(address _coordinator) ADCSConsumerBase(_coordinator) Ownable(_msgSender()) {}
function requestUint256Data(
uint32 _callbackGasLimit,
bytes32 _jobId,
string memory _from,
string memory _to
) external returns (uint256 requestId) {
bytes32 typeId = keccak256(abi.encodePacked("uint256"));
ADCS.Request memory req = buildRequest(_jobId, typeId);
req.add("from", _from);
req.add("to", _to);
requestId = COORDINATOR.requestData(_callbackGasLimit, req);
emit DataRequestedUint256(requestId);
}
function requestBoolData(
uint32 _callbackGasLimit,
bytes32 _jobId
) external returns (uint256 requestId) {
bytes32 typeId = keccak256(abi.encodePacked("bool"));
ADCS.Request memory req = buildRequest(_jobId, typeId);
requestId = COORDINATOR.requestData(_callbackGasLimit, req);
emit DataRequestedBool(requestId);
}
function requestBytes32Data(
uint32 _callbackGasLimit,
bytes32 _jobId
) external returns (uint256 requestId) {
ADCS.Request memory req = buildRequest(_jobId, keccak256(abi.encodePacked("bytes32")));
requestId = COORDINATOR.requestData(_callbackGasLimit, req);
emit DataRequestedBytes32(requestId);
}
function requestBytesData(
uint32 _callbackGasLimit,
bytes32 _jobId
) external returns (uint256 requestId) {
ADCS.Request memory req = buildRequest(_jobId, keccak256(abi.encodePacked("bytes")));
requestId = COORDINATOR.requestData(_callbackGasLimit, req);
emit DataRequestedBytes(requestId);
}
function requestMemeCoinTrade(
uint32 _callbackGasLimit,
bytes32 _jobId
) external returns (uint256 requestId) {
bytes32 typeId = keccak256(abi.encodePacked("stringAndbool"));
ADCS.Request memory req = buildRequest(_jobId, typeId);
requestId = COORDINATOR.requestData(_callbackGasLimit, req);
emit DataRequestedMemeCoinTrade(requestId);
return requestId;
}
function fulfillDataRequest(uint256, uint256 response) internal virtual override {
lastUint256 = response;
}
function fulfillDataRequest(uint256, bool response) internal virtual override {
lastBool = response;
}
function fulfillDataRequest(uint256, bytes32 response) internal virtual override {
lastBytes32 = response;
}
function fulfillDataRequest(uint256, bytes memory response) internal virtual override {
lastBytes = response;
}
function fulfillDataRequest(uint256, StringAndBool memory response) internal virtual override {
lastMemeCoinTrade = MemeCoinTrade({
name: response.name,
isBuy: response.response,
updatedAt: block.timestamp
});
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "./interfaces/IADCSCoordinator.sol";
abstract contract ADCSConsumerBase {
using ADCS for ADCS.Request;
struct StringAndBool {
string name;
bool response;
}
error OnlyCoordinatorCanFulfill(address have, address want);
mapping(bytes32 => bytes4) private sTypeIdToFunctionSelector;
IADCSCoordinator public immutable COORDINATOR;
/**
* @param _adcsResponseCoordinator address of ADCSCoordinator contract
*/
constructor(address _adcsResponseCoordinator) {
COORDINATOR = IADCSCoordinator(_adcsResponseCoordinator);
sTypeIdToFunctionSelector[keccak256(abi.encodePacked("uint256"))] = COORDINATOR
.fulfillDataRequestUint256
.selector;
sTypeIdToFunctionSelector[keccak256(abi.encodePacked("bool"))] = COORDINATOR
.fulfillDataRequestBool
.selector;
sTypeIdToFunctionSelector[keccak256(abi.encodePacked("bytes32"))] = COORDINATOR
.fulfillDataRequestBytes32
.selector;
sTypeIdToFunctionSelector[keccak256(abi.encodePacked("bytes"))] = COORDINATOR
.fulfillDataRequestBytes
.selector;
sTypeIdToFunctionSelector[keccak256(abi.encodePacked("stringAndbool"))] = COORDINATOR
.fulfillDataRequestStringAndBool
.selector;
}
/**
* @notice Build a request using the Orakl library
* @param jobId the job specification ID that the request is created for
* @param typeId the reponse type ID that the request is created for
* @return req request in memory
*/
function buildRequest(
bytes32 jobId,
bytes32 typeId
) internal view returns (ADCS.Request memory req) {
return req.initialize(jobId, address(COORDINATOR), sTypeIdToFunctionSelector[typeId]);
}
modifier verifyRawFulfillment() {
address coordinatorAddress = address(COORDINATOR);
if (msg.sender != coordinatorAddress) {
revert OnlyCoordinatorCanFulfill(msg.sender, coordinatorAddress);
}
_;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "./ADCSConsumerBase.sol";
abstract contract ADCSConsumerFulfillUint256 is ADCSConsumerBase {
function fulfillDataRequest(uint256 requestId, uint256 response) internal virtual;
function rawFulfillDataRequest(
uint256 requestId,
uint256 response
) external verifyRawFulfillment {
fulfillDataRequest(requestId, response);
}
}
abstract contract ADCSConsumerFulfillBool is ADCSConsumerBase {
function fulfillDataRequest(uint256 requestId, bool response) internal virtual;
function rawFulfillDataRequest(uint256 requestId, bool response) external verifyRawFulfillment {
fulfillDataRequest(requestId, response);
}
}
abstract contract ADCSConsumerFulfillBytes32 is ADCSConsumerBase {
function fulfillDataRequest(uint256 requestId, bytes32 response) internal virtual;
function rawFulfillDataRequest(
uint256 requestId,
bytes32 response
) external verifyRawFulfillment {
fulfillDataRequest(requestId, response);
}
}
abstract contract ADCSConsumerFulfillBytes is ADCSConsumerBase {
function fulfillDataRequest(uint256 requestId, bytes memory response) internal virtual;
function rawFulfillDataRequest(
uint256 requestId,
bytes memory response
) external verifyRawFulfillment {
fulfillDataRequest(requestId, response);
}
}
abstract contract ADCSConsumerFulfillStringAndBool is ADCSConsumerBase {
function fulfillDataRequest(uint256 requestId, StringAndBool memory response) internal virtual;
function rawFulfillDataRequest(
uint256 requestId,
StringAndBool memory response
) external verifyRawFulfillment {
fulfillDataRequest(requestId, response);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.16;
import "./IADCSCoordinatorBase.sol";
import "./ICoordinatorBase.sol";
interface IADCSCoordinator is IADCSCoordinatorBase, ICoordinatorBase {}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.16;
import "../libraries/ADCS.sol";
interface IADCSCoordinatorBase {
// RequestCommitment holds information sent from off-chain oracle
// describing details of request.
struct RequestCommitment {
uint64 blockNum;
uint256 callbackGasLimit;
address sender;
bytes32 jobId;
}
struct StringAndBool {
string name;
bool response;
}
function requestData(
uint256 callbackGasLimit,
ADCS.Request memory req
) external returns (uint256);
function fulfillDataRequestUint256(
uint256 requestId,
uint256 response,
RequestCommitment memory rc
) external;
function fulfillDataRequestBool(
uint256 requestId,
bool response,
RequestCommitment memory rc
) external;
function fulfillDataRequestBytes32(
uint256 requestId,
bytes32 response,
RequestCommitment memory rc
) external;
function fulfillDataRequestBytes(
uint256 requestId,
bytes memory response,
RequestCommitment memory rc
) external;
function fulfillDataRequestStringAndBool(
uint256 requestId,
StringAndBool memory response,
RequestCommitment memory rc
) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.16;
interface ICoordinatorBase {
/**
* @notice Sets the configuration of the VRF coordinator
* @param maxGasLimit global max for request gas limit
* @param gasAfterPaymentCalculation gas used in doing accounting
* after completing the gas measurement
*/
function setConfig(uint256 maxGasLimit, uint256 gasAfterPaymentCalculation) external;
function pendingRequestExists(address consumer, uint64 nonce) external view returns (bool);
/**
* @notice Get request commitment.
* @param requestId id of request
* @return commmitment value that can be used to determine whether
* a request is fulfilled or not. If `requestId` is valid and
* commitment equals to bytes32(0), the request was fulfilled.
*/
function getCommitment(uint256 requestId) external view returns (bytes32);
/**
* @notice Canceling oracle request
* @param requestId - ID of the Oracle Request
*/
function cancelRequest(uint256 requestId) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.16;
// https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/Chainlink.sol
import {Buffer} from "./Buffer.sol";
import {CBOR} from "./CBOR.sol";
library ADCS {
uint256 internal constant defaultBufferSize = 256;
using CBOR for Buffer.buffer;
// structure for storing requests done off-chain
struct Request {
bytes32 id;
address callbackAddr;
bytes4 callbackFunc;
uint256 nonce;
Buffer.buffer buf;
}
/**
* @notice Initializes a request
* @dev Sets ID, callback address, and callback function
* @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 (ADCS.Request memory) {
Buffer.init(self.buf, defaultBufferSize);
self.id = jobId;
self.callbackAddr = callbackAddr;
self.callbackFunc = callbackFunc;
return self;
}
/**
* @notice sets the data for buffer
* @param _request the initialized request
* @param _data the CBOR data
*/
function setBuffer(Request memory _request, bytes memory _data) internal pure {
Buffer.init(_request.buf, _data.length);
Buffer.append(_request.buf, _data);
}
/**
* @notice Adds a string value to the request in a key - value pair format
* @param self - the initalized 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 byte value to the request in a key - value pair format
* @param _request - the initalized request
* @param _key - the name of the key
* @param _value - the bytes value to add
*/
function addBytes(
Request memory _request,
string memory _key,
bytes memory _value
) internal pure {
_request.buf.encodeString(_key);
_request.buf.encodeBytes(_value);
}
/**
* @notice Adds a Int256 value to the request in a key - value pair format
* @param _request - the initalized request
* @param _key - the name of the key
* @param _value - the int256 value to add
*/
function addInt(Request memory _request, string memory _key, int256 _value) internal pure {
_request.buf.encodeString(_key);
_request.buf.encodeInt(_value);
}
/**
* @notice Adds a UInt256 value to the request in a key - value pair format
* @param _request - the initalized request
* @param _key - the name of the key
* @param _value - the uint256 value to add
*/
function addUInt(Request memory _request, string memory _key, uint256 _value) internal pure {
_request.buf.encodeString(_key);
_request.buf.encodeUInt(_value);
}
/**
* @notice Adds an array of string value to the request in a key - value pair format
* @param _request - the initalized request
* @param _key - the name of the key
* @param _values - the array of string value to add
*/
function addStringArray(
Request memory _request,
string memory _key,
string[] memory _values
) internal pure {
_request.buf.encodeString(_key);
_request.buf.startArray();
for (uint256 i; i < _values.length; i++) {
_request.buf.encodeString(_values[i]);
}
_request.buf.endSequence();
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev A library for working with mutable byte buffers in Solidity.
*
* Byte buffers are mutable and expandable, and provide a variety of primitives
* for writing to them. At any time you can fetch a bytes object containing the
* current contents of the buffer. The bytes object should not be stored between
* operations, as it may change due to resizing of the buffer.
*/
library Buffer {
/**
* @dev Represents a mutable buffer. Buffers have a current value (buf) and
* a capacity. The capacity may be longer than the current value, in
* which case it can be extended without the need to allocate more memory.
*/
struct buffer {
bytes buf;
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);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.16;
// https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/vendor/CBORChainlink.sol
import {Buffer} from "./Buffer.sol";
// Encoding library for Binary Object Representation
library CBOR {
using Buffer for Buffer.buffer;
// DECLARE TYPES FOR EASIER REFERENCE OF VARIABLE TYPE
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(Buffer.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(Buffer.buffer memory buf, uint8 major) private pure {
buf.appendUint8(uint8((major << 5) | 31));
}
function encodeUInt(Buffer.buffer memory buf, uint value) internal pure {
if (value > 0xFFFFFFFFFFFFFFFF) {
encodeBigNum(buf, value);
} else {
encodeFixedNumeric(buf, MAJOR_TYPE_INT, uint64(value));
}
}
function encodeInt(Buffer.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(Buffer.buffer memory buf, bytes memory value) internal pure {
encodeFixedNumeric(buf, MAJOR_TYPE_BYTES, uint64(value.length));
buf.append(value);
}
function encodeBigNum(Buffer.buffer memory buf, uint value) internal pure {
buf.appendUint8(uint8((MAJOR_TYPE_TAG << 5) | TAG_TYPE_BIGNUM));
encodeBytes(buf, abi.encode(value));
}
function encodeSignedBigNum(Buffer.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(Buffer.buffer memory buf, string memory value) internal pure {
encodeFixedNumeric(buf, MAJOR_TYPE_STRING, uint64(bytes(value).length));
buf.append(bytes(value));
}
function startArray(Buffer.buffer memory buf) internal pure {
encodeIndefiniteLengthType(buf, MAJOR_TYPE_ARRAY);
}
function startMap(Buffer.buffer memory buf) internal pure {
encodeIndefiniteLengthType(buf, MAJOR_TYPE_MAP);
}
function endSequence(Buffer.buffer memory buf) internal pure {
encodeIndefiniteLengthType(buf, MAJOR_TYPE_CONTENT_FREE);
}
}{
"evmVersion": "paris",
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_coordinator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"DataRequestedBool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"DataRequestedBytes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"DataRequestedBytes32","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"DataRequestedMemeCoinTrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"DataRequestedUint256","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"COORDINATOR","outputs":[{"internalType":"contract IADCSCoordinator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBytes","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBytes32","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastMemeCoinTrade","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"bool","name":"isBuy","type":"bool"},{"internalType":"uint256","name":"updatedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUint256","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"bool","name":"response","type":"bool"}],"internalType":"struct ADCSConsumerBase.StringAndBool","name":"response","type":"tuple"}],"name":"rawFulfillDataRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"bytes","name":"response","type":"bytes"}],"name":"rawFulfillDataRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256","name":"response","type":"uint256"}],"name":"rawFulfillDataRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"bool","name":"response","type":"bool"}],"name":"rawFulfillDataRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"bytes32","name":"response","type":"bytes32"}],"name":"rawFulfillDataRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_callbackGasLimit","type":"uint32"},{"internalType":"bytes32","name":"_jobId","type":"bytes32"}],"name":"requestBoolData","outputs":[{"internalType":"uint256","name":"requestId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_callbackGasLimit","type":"uint32"},{"internalType":"bytes32","name":"_jobId","type":"bytes32"}],"name":"requestBytes32Data","outputs":[{"internalType":"uint256","name":"requestId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_callbackGasLimit","type":"uint32"},{"internalType":"bytes32","name":"_jobId","type":"bytes32"}],"name":"requestBytesData","outputs":[{"internalType":"uint256","name":"requestId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_callbackGasLimit","type":"uint32"},{"internalType":"bytes32","name":"_jobId","type":"bytes32"}],"name":"requestMemeCoinTrade","outputs":[{"internalType":"uint256","name":"requestId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_callbackGasLimit","type":"uint32"},{"internalType":"bytes32","name":"_jobId","type":"bytes32"},{"internalType":"string","name":"_from","type":"string"},{"internalType":"string","name":"_to","type":"string"}],"name":"requestUint256Data","outputs":[{"internalType":"uint256","name":"requestId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a06040523480156200001157600080fd5b50604051620031c6380380620031c683398181016040528101906200003791906200040a565b62000047620002d260201b60201c565b818073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505063e9d3462860e01b600080604051602001620000989062000497565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548163ffffffff021916908360e01c0217905550634b9c308360e01b600080604051602001620000f390620004fe565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548163ffffffff021916908360e01c0217905550631228cabf60e01b6000806040516020016200014e9062000565565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548163ffffffff021916908360e01c02179055506329ba70c460e01b600080604051602001620001a990620005cc565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548163ffffffff021916908360e01c0217905550632f44d44960e01b600080604051602001620002049062000633565b60405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548163ffffffff021916908360e01c021790555050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620002b95760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620002b091906200065b565b60405180910390fd5b620002ca81620002da60201b60201c565b505062000678565b600033905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003d282620003a5565b9050919050565b620003e481620003c5565b8114620003f057600080fd5b50565b6000815190506200040481620003d9565b92915050565b600060208284031215620004235762000422620003a0565b5b60006200043384828501620003f3565b91505092915050565b600081905092915050565b7f75696e7432353600000000000000000000000000000000000000000000000000600082015250565b60006200047f6007836200043c565b91506200048c8262000447565b600782019050919050565b6000620004a48262000470565b9150819050919050565b7f626f6f6c00000000000000000000000000000000000000000000000000000000600082015250565b6000620004e66004836200043c565b9150620004f382620004ae565b600482019050919050565b60006200050b82620004d7565b9150819050919050565b7f6279746573333200000000000000000000000000000000000000000000000000600082015250565b60006200054d6007836200043c565b91506200055a8262000515565b600782019050919050565b600062000572826200053e565b9150819050919050565b7f6279746573000000000000000000000000000000000000000000000000000000600082015250565b6000620005b46005836200043c565b9150620005c1826200057c565b600582019050919050565b6000620005d982620005a5565b9150819050919050565b7f737472696e67416e64626f6f6c00000000000000000000000000000000000000600082015250565b60006200061b600d836200043c565b91506200062882620005e3565b600d82019050919050565b600062000640826200060c565b9150819050919050565b6200065581620003c5565b82525050565b60006020820190506200067260008301846200064a565b92915050565b608051612ae5620006e1600039600081816103a0015281816105100152818161061f015281816106f6015281816107cd015281816108a1015281816108f801528181610b3f01528181610c4301528181610d1301528181610e3f0152610f630152612ae56000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80634ef61f69116100ad5780638da5cb5b116100715780638da5cb5b1461030c57806390d95efc1461032a578063f2fde38b14610346578063f40b4def14610362578063feac766d1461037e57610121565b80634ef61f691461027a578063513bd64d146102aa5780636dfe4e4c146102c8578063715018a6146102e657806377f262ea146102f057610121565b80631b30a0b7116100f45780631b30a0b7146101be5780633b2bcbf1146101ee5780633c54126f1461020c57806346742eff1461023c57806348da5f061461025a57610121565b80630e2c871f14610126578063148b424e14610142578063171f4db51461017257806319e2cd2f146101a2575b600080fd5b610140600480360381019061013b919061198b565b61039c565b005b61015c60048036038101906101579190611a59565b610442565b6040516101699190611b07565b60405180910390f35b61018c60048036038101906101879190611b22565b6105e5565b6040516101999190611b07565b60405180910390f35b6101bc60048036038101906101b79190611c03565b6106f2565b005b6101d860048036038101906101d39190611b22565b610798565b6040516101e59190611b07565b60405180910390f35b6101f661089f565b6040516102039190611cde565b60405180910390f35b61022660048036038101906102219190611b22565b6108c3565b6040516102339190611b07565b60405180910390f35b6102446109ca565b6040516102519190611d78565b60405180910390f35b610262610a58565b60405161027193929190611dfe565b60405180910390f35b610294600480360381019061028f9190611b22565b610b05565b6040516102a19190611b07565b60405180910390f35b6102b2610c12565b6040516102bf9190611e4b565b60405180910390f35b6102d0610c18565b6040516102dd9190611e66565b60405180910390f35b6102ee610c2b565b005b61030a60048036038101906103059190611e81565b610c3f565b005b610314610ce5565b6040516103219190611ee2565b60405180910390f35b610344600480360381019061033f9190611efd565b610d0f565b005b610360600480360381019061035b9190611f69565b610db5565b005b61037c60048036038101906103779190611f96565b610e3b565b005b610386610ee1565b6040516103939190611b07565b60405180910390f35b60007f000000000000000000000000000000000000000000000000000000000000000090508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104335733816040517f1cf993f400000000000000000000000000000000000000000000000000000000815260040161042a929190611fd6565b60405180910390fd5b61043d8383610ee7565b505050565b60008060405160200161045490612056565b60405160208183030381529060405280519060200120905060006104788683610f55565b90506104c46040518060400160405280600481526020017f66726f6d000000000000000000000000000000000000000000000000000000008152508683610fbb9092919063ffffffff16565b61050e6040518060400160405280600281526020017f746f0000000000000000000000000000000000000000000000000000000000008152508583610fbb9092919063ffffffff16565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663db750a2d88836040518363ffffffff1660e01b8152600401610569929190612201565b6020604051808303816000875af1158015610588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190612246565b9250827f2f9bce8ee79bb2471696219a14b13ee8fc00b505941b718e981d7dcc58c8a61060405160405180910390a25050949350505050565b6000806040516020016105f7906122bf565b604051602081830303815290604052805190602001209050600061061b8483610f55565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663db750a2d86836040518363ffffffff1660e01b8152600401610678929190612201565b6020604051808303816000875af1158015610697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bb9190612246565b9250827fbe404c45b6b74531e0c631fa8236b0b2abbf5f24b37ee4f83b77e99b1e13aeb360405160405180910390a2505092915050565b60007f000000000000000000000000000000000000000000000000000000000000000090508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107895733816040517f1cf993f4000000000000000000000000000000000000000000000000000000008152600401610780929190611fd6565b60405180910390fd5b6107938383610fee565b505050565b6000806107c9836040516020016107ae90612320565b60405160208183030381529060405280519060200120610f55565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663db750a2d85836040518363ffffffff1660e01b8152600401610826929190612201565b6020604051808303816000875af1158015610845573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108699190612246565b9150817f06a2b4387d37a456e7f9fcaf47b429a6079f5227f0788867c8920370872284d860405160405180910390a25092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806108f4836040516020016108d990612381565b60405160208183030381529060405280519060200120610f55565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663db750a2d85836040518363ffffffff1660e01b8152600401610951929190612201565b6020604051808303816000875af1158015610970573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109949190612246565b9150817f867c522a119b99440246a0577cfbd60ded830a28eb054fe6608c75b445f329e160405160405180910390a25092915050565b600580546109d7906123c5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a03906123c5565b8015610a505780601f10610a2557610100808354040283529160200191610a50565b820191906000526020600020905b815481529060010190602001808311610a3357829003601f168201915b505050505081565b6006806000018054610a69906123c5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a95906123c5565b8015610ae25780601f10610ab757610100808354040283529160200191610ae2565b820191906000526020600020905b815481529060010190602001808311610ac557829003601f168201915b5050505050908060010160009054906101000a900460ff16908060020154905083565b600080604051602001610b1790612442565b6040516020818303038152906040528051906020012090506000610b3b8483610f55565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663db750a2d86836040518363ffffffff1660e01b8152600401610b98929190612201565b6020604051808303816000875af1158015610bb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdb9190612246565b9250827fa1bdcda4cbab6259d872bde70432bab9c5d87a7be2172ce3931ca2e53e64f4c260405160405180910390a2505092915050565b60045481565b600360009054906101000a900460ff1681565b610c33611002565b610c3d6000611089565b565b60007f000000000000000000000000000000000000000000000000000000000000000090508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cd65733816040517f1cf993f4000000000000000000000000000000000000000000000000000000008152600401610ccd929190611fd6565b60405180910390fd5b610ce0838361114f565b505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f000000000000000000000000000000000000000000000000000000000000000090508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610da65733816040517f1cf993f4000000000000000000000000000000000000000000000000000000008152600401610d9d929190611fd6565b60405180910390fd5b610db0838361115a565b505050565b610dbd611002565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e2f5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610e269190611ee2565b60405180910390fd5b610e3881611089565b50565b60007f000000000000000000000000000000000000000000000000000000000000000090508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ed25733816040517f1cf993f4000000000000000000000000000000000000000000000000000000008152600401610ec9929190611fd6565b60405180910390fd5b610edc8383611178565b505050565b60025481565b6040518060600160405280826000015181526020018260200151151581526020014281525060066000820151816000019081610f2391906125f9565b5060208201518160010160006101000a81548160ff021916908315150217905550604082015181600201559050505050565b610f5d6116c6565b610fb3837f000000000000000000000000000000000000000000000000000000000000000060008086815260200190815260200160002060009054906101000a900460e01b84611183909392919063ffffffff16565b905092915050565b610fd282846080015161123390919063ffffffff16565b610fe981846080015161123390919063ffffffff16565b505050565b8060059081610ffd9190612726565b505050565b61100a611258565b73ffffffffffffffffffffffffffffffffffffffff16611028610ce5565b73ffffffffffffffffffffffffffffffffffffffff16146110875761104b611258565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161107e9190611ee2565b60405180910390fd5b565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b806002819055505050565b80600360006101000a81548160ff0219169083151502179055505050565b806004819055505050565b61118b6116c6565b61119b8560800151610100611260565b508385600001818152505082856020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508185604001907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681525050849050949350505050565b61124082600383516112ca565b611253818361144f90919063ffffffff16565b505050565b600033905090565b611268611733565b60006020836112779190612827565b146112a3576020826112899190612827565b60206112959190612887565b826112a091906128bb565b91505b81836020018181525050604051808452600081528281016020016040525082905092915050565b60178167ffffffffffffffff1611611301576112fb8160058460ff16901b60ff16178461147190919063ffffffff16565b5061144a565b60ff8167ffffffffffffffff161161135757611330601860058460ff16901b178461147190919063ffffffff16565b506113518167ffffffffffffffff166001856114919092919063ffffffff16565b50611449565b61ffff8167ffffffffffffffff16116113ae57611387601960058460ff16901b178461147190919063ffffffff16565b506113a88167ffffffffffffffff166002856114919092919063ffffffff16565b50611448565b63ffffffff8167ffffffffffffffff1611611407576113e0601a60058460ff16901b178461147190919063ffffffff16565b506114018167ffffffffffffffff166004856114919092919063ffffffff16565b50611447565b611424601b60058460ff16901b178461147190919063ffffffff16565b506114458167ffffffffffffffff166008856114919092919063ffffffff16565b505b5b5b5b505050565b611457611733565b611469838460000151518485516114b3565b905092915050565b611479611733565b61148983846000015151846115a2565b905092915050565b611499611733565b6114aa8485600001515185856115f8565b90509392505050565b6114bb611733565b82518211156114c957600080fd5b846020015182856114da91906128bb565b111561150f5761150e8560026114ff886020015188876114fa91906128bb565b611686565b61150991906128ef565b6116a2565b5b60008086518051876020830101935080888701111561152e5787860182525b60208701925050505b60208410611575578051825260208261155091906128bb565b915060208161155f91906128bb565b905060208461156e9190612887565b9350611537565b60006001856020036101000a03905080198251168184511681811785525050508692505050949350505050565b6115aa611733565b836020015183106115d0576115cf84600286602001516115ca91906128ef565b6116a2565b5b835180516020858301018481538186036115eb576001820183525b5050508390509392505050565b611600611733565b8460200151848361161191906128bb565b111561163957611638856002868561162991906128bb565b61163391906128ef565b6116a2565b5b600060018361010061164b9190612a64565b6116559190612887565b905085518386820101858319825116178152815185880111156116785784870182525b505085915050949350505050565b6000818311156116985782905061169c565b8190505b92915050565b6000826000015190506116b58383611260565b506116c0838261144f565b50505050565b6040518060a0016040528060008019168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020016000815260200161172d611733565b81525090565b604051806040016040528060608152602001600081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61177481611761565b811461177f57600080fd5b50565b6000813590506117918161176b565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6117e58261179c565b810181811067ffffffffffffffff82111715611804576118036117ad565b5b80604052505050565b600061181761174d565b905061182382826117dc565b919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff821115611852576118516117ad565b5b61185b8261179c565b9050602081019050919050565b82818337600083830152505050565b600061188a61188584611837565b61180d565b9050828152602081018484840111156118a6576118a5611832565b5b6118b1848285611868565b509392505050565b600082601f8301126118ce576118cd61182d565b5b81356118de848260208601611877565b91505092915050565b60008115159050919050565b6118fc816118e7565b811461190757600080fd5b50565b600081359050611919816118f3565b92915050565b60006040828403121561193557611934611797565b5b61193f604061180d565b9050600082013567ffffffffffffffff81111561195f5761195e611828565b5b61196b848285016118b9565b600083015250602061197f8482850161190a565b60208301525092915050565b600080604083850312156119a2576119a1611757565b5b60006119b085828601611782565b925050602083013567ffffffffffffffff8111156119d1576119d061175c565b5b6119dd8582860161191f565b9150509250929050565b600063ffffffff82169050919050565b611a00816119e7565b8114611a0b57600080fd5b50565b600081359050611a1d816119f7565b92915050565b6000819050919050565b611a3681611a23565b8114611a4157600080fd5b50565b600081359050611a5381611a2d565b92915050565b60008060008060808587031215611a7357611a72611757565b5b6000611a8187828801611a0e565b9450506020611a9287828801611a44565b935050604085013567ffffffffffffffff811115611ab357611ab261175c565b5b611abf878288016118b9565b925050606085013567ffffffffffffffff811115611ae057611adf61175c565b5b611aec878288016118b9565b91505092959194509250565b611b0181611761565b82525050565b6000602082019050611b1c6000830184611af8565b92915050565b60008060408385031215611b3957611b38611757565b5b6000611b4785828601611a0e565b9250506020611b5885828601611a44565b9150509250929050565b600067ffffffffffffffff821115611b7d57611b7c6117ad565b5b611b868261179c565b9050602081019050919050565b6000611ba6611ba184611b62565b61180d565b905082815260208101848484011115611bc257611bc1611832565b5b611bcd848285611868565b509392505050565b600082601f830112611bea57611be961182d565b5b8135611bfa848260208601611b93565b91505092915050565b60008060408385031215611c1a57611c19611757565b5b6000611c2885828601611782565b925050602083013567ffffffffffffffff811115611c4957611c4861175c565b5b611c5585828601611bd5565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000611ca4611c9f611c9a84611c5f565b611c7f565b611c5f565b9050919050565b6000611cb682611c89565b9050919050565b6000611cc882611cab565b9050919050565b611cd881611cbd565b82525050565b6000602082019050611cf36000830184611ccf565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611d33578082015181840152602081019050611d18565b60008484015250505050565b6000611d4a82611cf9565b611d548185611d04565b9350611d64818560208601611d15565b611d6d8161179c565b840191505092915050565b60006020820190508181036000830152611d928184611d3f565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000611dc182611d9a565b611dcb8185611da5565b9350611ddb818560208601611d15565b611de48161179c565b840191505092915050565b611df8816118e7565b82525050565b60006060820190508181036000830152611e188186611db6565b9050611e276020830185611def565b611e346040830184611af8565b949350505050565b611e4581611a23565b82525050565b6000602082019050611e606000830184611e3c565b92915050565b6000602082019050611e7b6000830184611def565b92915050565b60008060408385031215611e9857611e97611757565b5b6000611ea685828601611782565b9250506020611eb785828601611782565b9150509250929050565b6000611ecc82611c5f565b9050919050565b611edc81611ec1565b82525050565b6000602082019050611ef76000830184611ed3565b92915050565b60008060408385031215611f1457611f13611757565b5b6000611f2285828601611782565b9250506020611f338582860161190a565b9150509250929050565b611f4681611ec1565b8114611f5157600080fd5b50565b600081359050611f6381611f3d565b92915050565b600060208284031215611f7f57611f7e611757565b5b6000611f8d84828501611f54565b91505092915050565b60008060408385031215611fad57611fac611757565b5b6000611fbb85828601611782565b9250506020611fcc85828601611a44565b9150509250929050565b6000604082019050611feb6000830185611ed3565b611ff86020830184611ed3565b9392505050565b600081905092915050565b7f75696e7432353600000000000000000000000000000000000000000000000000600082015250565b6000612040600783611fff565b915061204b8261200a565b600782019050919050565b600061206182612033565b9150819050919050565b600061208661208161207c846119e7565b611c7f565b611761565b9050919050565b6120968161206b565b82525050565b6120a581611a23565b82525050565b6120b481611ec1565b82525050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6120ef816120ba565b82525050565b6120fe81611761565b82525050565b600082825260208201905092915050565b600061212082611cf9565b61212a8185612104565b935061213a818560208601611d15565b6121438161179c565b840191505092915050565b6000604083016000830151848203600086015261216b8282612115565b915050602083015161218060208601826120f5565b508091505092915050565b600060a0830160008301516121a3600086018261209c565b5060208301516121b660208601826120ab565b5060408301516121c960408601826120e6565b5060608301516121dc60608601826120f5565b50608083015184820360808601526121f4828261214e565b9150508091505092915050565b6000604082019050612216600083018561208d565b8181036020830152612228818461218b565b90509392505050565b6000815190506122408161176b565b92915050565b60006020828403121561225c5761225b611757565b5b600061226a84828501612231565b91505092915050565b7f626f6f6c00000000000000000000000000000000000000000000000000000000600082015250565b60006122a9600483611fff565b91506122b482612273565b600482019050919050565b60006122ca8261229c565b9150819050919050565b7f6279746573000000000000000000000000000000000000000000000000000000600082015250565b600061230a600583611fff565b9150612315826122d4565b600582019050919050565b600061232b826122fd565b9150819050919050565b7f6279746573333200000000000000000000000000000000000000000000000000600082015250565b600061236b600783611fff565b915061237682612335565b600782019050919050565b600061238c8261235e565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806123dd57607f821691505b6020821081036123f0576123ef612396565b5b50919050565b7f737472696e67416e64626f6f6c00000000000000000000000000000000000000600082015250565b600061242c600d83611fff565b9150612437826123f6565b600d82019050919050565b600061244d8261241f565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026124b97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261247c565b6124c3868361247c565b95508019841693508086168417925050509392505050565b60006124f66124f16124ec84611761565b611c7f565b611761565b9050919050565b6000819050919050565b612510836124db565b61252461251c826124fd565b848454612489565b825550505050565b600090565b61253961252c565b612544818484612507565b505050565b5b818110156125685761255d600082612531565b60018101905061254a565b5050565b601f8211156125ad5761257e81612457565b6125878461246c565b81016020851015612596578190505b6125aa6125a28561246c565b830182612549565b50505b505050565b600082821c905092915050565b60006125d0600019846008026125b2565b1980831691505092915050565b60006125e983836125bf565b9150826002028217905092915050565b61260282611d9a565b67ffffffffffffffff81111561261b5761261a6117ad565b5b61262582546123c5565b61263082828561256c565b600060209050601f8311600181146126635760008415612651578287015190505b61265b85826125dd565b8655506126c3565b601f19841661267186612457565b60005b8281101561269957848901518255600182019150602085019450602081019050612674565b868310156126b657848901516126b2601f8916826125bf565b8355505b6001600288020188555050505b505050505050565b60008190508160005260206000209050919050565b601f821115612721576126f2816126cb565b6126fb8461246c565b8101602085101561270a578190505b61271e6127168561246c565b830182612549565b50505b505050565b61272f82611cf9565b67ffffffffffffffff811115612748576127476117ad565b5b61275282546123c5565b61275d8282856126e0565b600060209050601f831160018114612790576000841561277e578287015190505b61278885826125dd565b8655506127f0565b601f19841661279e866126cb565b60005b828110156127c6578489015182556001820191506020850194506020810190506127a1565b868310156127e357848901516127df601f8916826125bf565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061283282611761565b915061283d83611761565b92508261284d5761284c6127f8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061289282611761565b915061289d83611761565b92508282039050818111156128b5576128b4612858565b5b92915050565b60006128c682611761565b91506128d183611761565b92508282019050808211156128e9576128e8612858565b5b92915050565b60006128fa82611761565b915061290583611761565b925082820261291381611761565b9150828204841483151761292a57612929612858565b5b5092915050565b60008160011c9050919050565b6000808291508390505b60018511156129885780860481111561296457612963612858565b5b60018516156129735780820291505b808102905061298185612931565b9450612948565b94509492505050565b6000826129a15760019050612a5d565b816129af5760009050612a5d565b81600181146129c557600281146129cf576129fe565b6001915050612a5d565b60ff8411156129e1576129e0612858565b5b8360020a9150848211156129f8576129f7612858565b5b50612a5d565b5060208310610133831016604e8410600b8410161715612a335782820a905083811115612a2e57612a2d612858565b5b612a5d565b612a40848484600161293e565b92509050818404811115612a5757612a56612858565b5b81810290505b9392505050565b6000612a6f82611761565b9150612a7a83611761565b9250612aa77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612991565b90509291505056fea26469706673582212203414b435b81176edde11779e881cc0acae7c82cfd2acdc640dab6757c2d6694864736f6c634300081400330000000000000000000000007eb5b9b83e1aa1abafe7243a79910fc9aedd6ff2
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101215760003560e01c80634ef61f69116100ad5780638da5cb5b116100715780638da5cb5b1461030c57806390d95efc1461032a578063f2fde38b14610346578063f40b4def14610362578063feac766d1461037e57610121565b80634ef61f691461027a578063513bd64d146102aa5780636dfe4e4c146102c8578063715018a6146102e657806377f262ea146102f057610121565b80631b30a0b7116100f45780631b30a0b7146101be5780633b2bcbf1146101ee5780633c54126f1461020c57806346742eff1461023c57806348da5f061461025a57610121565b80630e2c871f14610126578063148b424e14610142578063171f4db51461017257806319e2cd2f146101a2575b600080fd5b610140600480360381019061013b919061198b565b61039c565b005b61015c60048036038101906101579190611a59565b610442565b6040516101699190611b07565b60405180910390f35b61018c60048036038101906101879190611b22565b6105e5565b6040516101999190611b07565b60405180910390f35b6101bc60048036038101906101b79190611c03565b6106f2565b005b6101d860048036038101906101d39190611b22565b610798565b6040516101e59190611b07565b60405180910390f35b6101f661089f565b6040516102039190611cde565b60405180910390f35b61022660048036038101906102219190611b22565b6108c3565b6040516102339190611b07565b60405180910390f35b6102446109ca565b6040516102519190611d78565b60405180910390f35b610262610a58565b60405161027193929190611dfe565b60405180910390f35b610294600480360381019061028f9190611b22565b610b05565b6040516102a19190611b07565b60405180910390f35b6102b2610c12565b6040516102bf9190611e4b565b60405180910390f35b6102d0610c18565b6040516102dd9190611e66565b60405180910390f35b6102ee610c2b565b005b61030a60048036038101906103059190611e81565b610c3f565b005b610314610ce5565b6040516103219190611ee2565b60405180910390f35b610344600480360381019061033f9190611efd565b610d0f565b005b610360600480360381019061035b9190611f69565b610db5565b005b61037c60048036038101906103779190611f96565b610e3b565b005b610386610ee1565b6040516103939190611b07565b60405180910390f35b60007f0000000000000000000000007eb5b9b83e1aa1abafe7243a79910fc9aedd6ff290508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104335733816040517f1cf993f400000000000000000000000000000000000000000000000000000000815260040161042a929190611fd6565b60405180910390fd5b61043d8383610ee7565b505050565b60008060405160200161045490612056565b60405160208183030381529060405280519060200120905060006104788683610f55565b90506104c46040518060400160405280600481526020017f66726f6d000000000000000000000000000000000000000000000000000000008152508683610fbb9092919063ffffffff16565b61050e6040518060400160405280600281526020017f746f0000000000000000000000000000000000000000000000000000000000008152508583610fbb9092919063ffffffff16565b7f0000000000000000000000007eb5b9b83e1aa1abafe7243a79910fc9aedd6ff273ffffffffffffffffffffffffffffffffffffffff1663db750a2d88836040518363ffffffff1660e01b8152600401610569929190612201565b6020604051808303816000875af1158015610588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac9190612246565b9250827f2f9bce8ee79bb2471696219a14b13ee8fc00b505941b718e981d7dcc58c8a61060405160405180910390a25050949350505050565b6000806040516020016105f7906122bf565b604051602081830303815290604052805190602001209050600061061b8483610f55565b90507f0000000000000000000000007eb5b9b83e1aa1abafe7243a79910fc9aedd6ff273ffffffffffffffffffffffffffffffffffffffff1663db750a2d86836040518363ffffffff1660e01b8152600401610678929190612201565b6020604051808303816000875af1158015610697573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bb9190612246565b9250827fbe404c45b6b74531e0c631fa8236b0b2abbf5f24b37ee4f83b77e99b1e13aeb360405160405180910390a2505092915050565b60007f0000000000000000000000007eb5b9b83e1aa1abafe7243a79910fc9aedd6ff290508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107895733816040517f1cf993f4000000000000000000000000000000000000000000000000000000008152600401610780929190611fd6565b60405180910390fd5b6107938383610fee565b505050565b6000806107c9836040516020016107ae90612320565b60405160208183030381529060405280519060200120610f55565b90507f0000000000000000000000007eb5b9b83e1aa1abafe7243a79910fc9aedd6ff273ffffffffffffffffffffffffffffffffffffffff1663db750a2d85836040518363ffffffff1660e01b8152600401610826929190612201565b6020604051808303816000875af1158015610845573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108699190612246565b9150817f06a2b4387d37a456e7f9fcaf47b429a6079f5227f0788867c8920370872284d860405160405180910390a25092915050565b7f0000000000000000000000007eb5b9b83e1aa1abafe7243a79910fc9aedd6ff281565b6000806108f4836040516020016108d990612381565b60405160208183030381529060405280519060200120610f55565b90507f0000000000000000000000007eb5b9b83e1aa1abafe7243a79910fc9aedd6ff273ffffffffffffffffffffffffffffffffffffffff1663db750a2d85836040518363ffffffff1660e01b8152600401610951929190612201565b6020604051808303816000875af1158015610970573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109949190612246565b9150817f867c522a119b99440246a0577cfbd60ded830a28eb054fe6608c75b445f329e160405160405180910390a25092915050565b600580546109d7906123c5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a03906123c5565b8015610a505780601f10610a2557610100808354040283529160200191610a50565b820191906000526020600020905b815481529060010190602001808311610a3357829003601f168201915b505050505081565b6006806000018054610a69906123c5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a95906123c5565b8015610ae25780601f10610ab757610100808354040283529160200191610ae2565b820191906000526020600020905b815481529060010190602001808311610ac557829003601f168201915b5050505050908060010160009054906101000a900460ff16908060020154905083565b600080604051602001610b1790612442565b6040516020818303038152906040528051906020012090506000610b3b8483610f55565b90507f0000000000000000000000007eb5b9b83e1aa1abafe7243a79910fc9aedd6ff273ffffffffffffffffffffffffffffffffffffffff1663db750a2d86836040518363ffffffff1660e01b8152600401610b98929190612201565b6020604051808303816000875af1158015610bb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdb9190612246565b9250827fa1bdcda4cbab6259d872bde70432bab9c5d87a7be2172ce3931ca2e53e64f4c260405160405180910390a2505092915050565b60045481565b600360009054906101000a900460ff1681565b610c33611002565b610c3d6000611089565b565b60007f0000000000000000000000007eb5b9b83e1aa1abafe7243a79910fc9aedd6ff290508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cd65733816040517f1cf993f4000000000000000000000000000000000000000000000000000000008152600401610ccd929190611fd6565b60405180910390fd5b610ce0838361114f565b505050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f0000000000000000000000007eb5b9b83e1aa1abafe7243a79910fc9aedd6ff290508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610da65733816040517f1cf993f4000000000000000000000000000000000000000000000000000000008152600401610d9d929190611fd6565b60405180910390fd5b610db0838361115a565b505050565b610dbd611002565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e2f5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610e269190611ee2565b60405180910390fd5b610e3881611089565b50565b60007f0000000000000000000000007eb5b9b83e1aa1abafe7243a79910fc9aedd6ff290508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ed25733816040517f1cf993f4000000000000000000000000000000000000000000000000000000008152600401610ec9929190611fd6565b60405180910390fd5b610edc8383611178565b505050565b60025481565b6040518060600160405280826000015181526020018260200151151581526020014281525060066000820151816000019081610f2391906125f9565b5060208201518160010160006101000a81548160ff021916908315150217905550604082015181600201559050505050565b610f5d6116c6565b610fb3837f0000000000000000000000007eb5b9b83e1aa1abafe7243a79910fc9aedd6ff260008086815260200190815260200160002060009054906101000a900460e01b84611183909392919063ffffffff16565b905092915050565b610fd282846080015161123390919063ffffffff16565b610fe981846080015161123390919063ffffffff16565b505050565b8060059081610ffd9190612726565b505050565b61100a611258565b73ffffffffffffffffffffffffffffffffffffffff16611028610ce5565b73ffffffffffffffffffffffffffffffffffffffff16146110875761104b611258565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161107e9190611ee2565b60405180910390fd5b565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b806002819055505050565b80600360006101000a81548160ff0219169083151502179055505050565b806004819055505050565b61118b6116c6565b61119b8560800151610100611260565b508385600001818152505082856020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508185604001907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681525050849050949350505050565b61124082600383516112ca565b611253818361144f90919063ffffffff16565b505050565b600033905090565b611268611733565b60006020836112779190612827565b146112a3576020826112899190612827565b60206112959190612887565b826112a091906128bb565b91505b81836020018181525050604051808452600081528281016020016040525082905092915050565b60178167ffffffffffffffff1611611301576112fb8160058460ff16901b60ff16178461147190919063ffffffff16565b5061144a565b60ff8167ffffffffffffffff161161135757611330601860058460ff16901b178461147190919063ffffffff16565b506113518167ffffffffffffffff166001856114919092919063ffffffff16565b50611449565b61ffff8167ffffffffffffffff16116113ae57611387601960058460ff16901b178461147190919063ffffffff16565b506113a88167ffffffffffffffff166002856114919092919063ffffffff16565b50611448565b63ffffffff8167ffffffffffffffff1611611407576113e0601a60058460ff16901b178461147190919063ffffffff16565b506114018167ffffffffffffffff166004856114919092919063ffffffff16565b50611447565b611424601b60058460ff16901b178461147190919063ffffffff16565b506114458167ffffffffffffffff166008856114919092919063ffffffff16565b505b5b5b5b505050565b611457611733565b611469838460000151518485516114b3565b905092915050565b611479611733565b61148983846000015151846115a2565b905092915050565b611499611733565b6114aa8485600001515185856115f8565b90509392505050565b6114bb611733565b82518211156114c957600080fd5b846020015182856114da91906128bb565b111561150f5761150e8560026114ff886020015188876114fa91906128bb565b611686565b61150991906128ef565b6116a2565b5b60008086518051876020830101935080888701111561152e5787860182525b60208701925050505b60208410611575578051825260208261155091906128bb565b915060208161155f91906128bb565b905060208461156e9190612887565b9350611537565b60006001856020036101000a03905080198251168184511681811785525050508692505050949350505050565b6115aa611733565b836020015183106115d0576115cf84600286602001516115ca91906128ef565b6116a2565b5b835180516020858301018481538186036115eb576001820183525b5050508390509392505050565b611600611733565b8460200151848361161191906128bb565b111561163957611638856002868561162991906128bb565b61163391906128ef565b6116a2565b5b600060018361010061164b9190612a64565b6116559190612887565b905085518386820101858319825116178152815185880111156116785784870182525b505085915050949350505050565b6000818311156116985782905061169c565b8190505b92915050565b6000826000015190506116b58383611260565b506116c0838261144f565b50505050565b6040518060a0016040528060008019168152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020016000815260200161172d611733565b81525090565b604051806040016040528060608152602001600081525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61177481611761565b811461177f57600080fd5b50565b6000813590506117918161176b565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6117e58261179c565b810181811067ffffffffffffffff82111715611804576118036117ad565b5b80604052505050565b600061181761174d565b905061182382826117dc565b919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff821115611852576118516117ad565b5b61185b8261179c565b9050602081019050919050565b82818337600083830152505050565b600061188a61188584611837565b61180d565b9050828152602081018484840111156118a6576118a5611832565b5b6118b1848285611868565b509392505050565b600082601f8301126118ce576118cd61182d565b5b81356118de848260208601611877565b91505092915050565b60008115159050919050565b6118fc816118e7565b811461190757600080fd5b50565b600081359050611919816118f3565b92915050565b60006040828403121561193557611934611797565b5b61193f604061180d565b9050600082013567ffffffffffffffff81111561195f5761195e611828565b5b61196b848285016118b9565b600083015250602061197f8482850161190a565b60208301525092915050565b600080604083850312156119a2576119a1611757565b5b60006119b085828601611782565b925050602083013567ffffffffffffffff8111156119d1576119d061175c565b5b6119dd8582860161191f565b9150509250929050565b600063ffffffff82169050919050565b611a00816119e7565b8114611a0b57600080fd5b50565b600081359050611a1d816119f7565b92915050565b6000819050919050565b611a3681611a23565b8114611a4157600080fd5b50565b600081359050611a5381611a2d565b92915050565b60008060008060808587031215611a7357611a72611757565b5b6000611a8187828801611a0e565b9450506020611a9287828801611a44565b935050604085013567ffffffffffffffff811115611ab357611ab261175c565b5b611abf878288016118b9565b925050606085013567ffffffffffffffff811115611ae057611adf61175c565b5b611aec878288016118b9565b91505092959194509250565b611b0181611761565b82525050565b6000602082019050611b1c6000830184611af8565b92915050565b60008060408385031215611b3957611b38611757565b5b6000611b4785828601611a0e565b9250506020611b5885828601611a44565b9150509250929050565b600067ffffffffffffffff821115611b7d57611b7c6117ad565b5b611b868261179c565b9050602081019050919050565b6000611ba6611ba184611b62565b61180d565b905082815260208101848484011115611bc257611bc1611832565b5b611bcd848285611868565b509392505050565b600082601f830112611bea57611be961182d565b5b8135611bfa848260208601611b93565b91505092915050565b60008060408385031215611c1a57611c19611757565b5b6000611c2885828601611782565b925050602083013567ffffffffffffffff811115611c4957611c4861175c565b5b611c5585828601611bd5565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000611ca4611c9f611c9a84611c5f565b611c7f565b611c5f565b9050919050565b6000611cb682611c89565b9050919050565b6000611cc882611cab565b9050919050565b611cd881611cbd565b82525050565b6000602082019050611cf36000830184611ccf565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611d33578082015181840152602081019050611d18565b60008484015250505050565b6000611d4a82611cf9565b611d548185611d04565b9350611d64818560208601611d15565b611d6d8161179c565b840191505092915050565b60006020820190508181036000830152611d928184611d3f565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000611dc182611d9a565b611dcb8185611da5565b9350611ddb818560208601611d15565b611de48161179c565b840191505092915050565b611df8816118e7565b82525050565b60006060820190508181036000830152611e188186611db6565b9050611e276020830185611def565b611e346040830184611af8565b949350505050565b611e4581611a23565b82525050565b6000602082019050611e606000830184611e3c565b92915050565b6000602082019050611e7b6000830184611def565b92915050565b60008060408385031215611e9857611e97611757565b5b6000611ea685828601611782565b9250506020611eb785828601611782565b9150509250929050565b6000611ecc82611c5f565b9050919050565b611edc81611ec1565b82525050565b6000602082019050611ef76000830184611ed3565b92915050565b60008060408385031215611f1457611f13611757565b5b6000611f2285828601611782565b9250506020611f338582860161190a565b9150509250929050565b611f4681611ec1565b8114611f5157600080fd5b50565b600081359050611f6381611f3d565b92915050565b600060208284031215611f7f57611f7e611757565b5b6000611f8d84828501611f54565b91505092915050565b60008060408385031215611fad57611fac611757565b5b6000611fbb85828601611782565b9250506020611fcc85828601611a44565b9150509250929050565b6000604082019050611feb6000830185611ed3565b611ff86020830184611ed3565b9392505050565b600081905092915050565b7f75696e7432353600000000000000000000000000000000000000000000000000600082015250565b6000612040600783611fff565b915061204b8261200a565b600782019050919050565b600061206182612033565b9150819050919050565b600061208661208161207c846119e7565b611c7f565b611761565b9050919050565b6120968161206b565b82525050565b6120a581611a23565b82525050565b6120b481611ec1565b82525050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6120ef816120ba565b82525050565b6120fe81611761565b82525050565b600082825260208201905092915050565b600061212082611cf9565b61212a8185612104565b935061213a818560208601611d15565b6121438161179c565b840191505092915050565b6000604083016000830151848203600086015261216b8282612115565b915050602083015161218060208601826120f5565b508091505092915050565b600060a0830160008301516121a3600086018261209c565b5060208301516121b660208601826120ab565b5060408301516121c960408601826120e6565b5060608301516121dc60608601826120f5565b50608083015184820360808601526121f4828261214e565b9150508091505092915050565b6000604082019050612216600083018561208d565b8181036020830152612228818461218b565b90509392505050565b6000815190506122408161176b565b92915050565b60006020828403121561225c5761225b611757565b5b600061226a84828501612231565b91505092915050565b7f626f6f6c00000000000000000000000000000000000000000000000000000000600082015250565b60006122a9600483611fff565b91506122b482612273565b600482019050919050565b60006122ca8261229c565b9150819050919050565b7f6279746573000000000000000000000000000000000000000000000000000000600082015250565b600061230a600583611fff565b9150612315826122d4565b600582019050919050565b600061232b826122fd565b9150819050919050565b7f6279746573333200000000000000000000000000000000000000000000000000600082015250565b600061236b600783611fff565b915061237682612335565b600782019050919050565b600061238c8261235e565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806123dd57607f821691505b6020821081036123f0576123ef612396565b5b50919050565b7f737472696e67416e64626f6f6c00000000000000000000000000000000000000600082015250565b600061242c600d83611fff565b9150612437826123f6565b600d82019050919050565b600061244d8261241f565b9150819050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026124b97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261247c565b6124c3868361247c565b95508019841693508086168417925050509392505050565b60006124f66124f16124ec84611761565b611c7f565b611761565b9050919050565b6000819050919050565b612510836124db565b61252461251c826124fd565b848454612489565b825550505050565b600090565b61253961252c565b612544818484612507565b505050565b5b818110156125685761255d600082612531565b60018101905061254a565b5050565b601f8211156125ad5761257e81612457565b6125878461246c565b81016020851015612596578190505b6125aa6125a28561246c565b830182612549565b50505b505050565b600082821c905092915050565b60006125d0600019846008026125b2565b1980831691505092915050565b60006125e983836125bf565b9150826002028217905092915050565b61260282611d9a565b67ffffffffffffffff81111561261b5761261a6117ad565b5b61262582546123c5565b61263082828561256c565b600060209050601f8311600181146126635760008415612651578287015190505b61265b85826125dd565b8655506126c3565b601f19841661267186612457565b60005b8281101561269957848901518255600182019150602085019450602081019050612674565b868310156126b657848901516126b2601f8916826125bf565b8355505b6001600288020188555050505b505050505050565b60008190508160005260206000209050919050565b601f821115612721576126f2816126cb565b6126fb8461246c565b8101602085101561270a578190505b61271e6127168561246c565b830182612549565b50505b505050565b61272f82611cf9565b67ffffffffffffffff811115612748576127476117ad565b5b61275282546123c5565b61275d8282856126e0565b600060209050601f831160018114612790576000841561277e578287015190505b61278885826125dd565b8655506127f0565b601f19841661279e866126cb565b60005b828110156127c6578489015182556001820191506020850194506020810190506127a1565b868310156127e357848901516127df601f8916826125bf565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061283282611761565b915061283d83611761565b92508261284d5761284c6127f8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061289282611761565b915061289d83611761565b92508282039050818111156128b5576128b4612858565b5b92915050565b60006128c682611761565b91506128d183611761565b92508282019050808211156128e9576128e8612858565b5b92915050565b60006128fa82611761565b915061290583611761565b925082820261291381611761565b9150828204841483151761292a57612929612858565b5b5092915050565b60008160011c9050919050565b6000808291508390505b60018511156129885780860481111561296457612963612858565b5b60018516156129735780820291505b808102905061298185612931565b9450612948565b94509492505050565b6000826129a15760019050612a5d565b816129af5760009050612a5d565b81600181146129c557600281146129cf576129fe565b6001915050612a5d565b60ff8411156129e1576129e0612858565b5b8360020a9150848211156129f8576129f7612858565b5b50612a5d565b5060208310610133831016604e8410600b8410161715612a335782820a905083811115612a2e57612a2d612858565b5b612a5d565b612a40848484600161293e565b92509050818404811115612a5757612a56612858565b5b81810290505b9392505050565b6000612a6f82611761565b9150612a7a83611761565b9250612aa77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612991565b90509291505056fea26469706673582212203414b435b81176edde11779e881cc0acae7c82cfd2acdc640dab6757c2d6694864736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007eb5b9b83e1aa1abafe7243a79910fc9aedd6ff2
-----Decoded View---------------
Arg [0] : _coordinator (address): 0x7eb5b9b83E1aA1AbafE7243A79910FC9AEdD6Ff2
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007eb5b9b83e1aa1abafe7243a79910fc9aedd6ff2
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.