Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MockKeystoneForwarder
Compiler Version
v0.8.26+commit.8a97fa7a
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import {IReceiver} from "./interfaces/IReceiver.sol";
import {IRouter} from "./interfaces/IRouter.sol";
import {ITypeAndVersion} from "../shared/interfaces/ITypeAndVersion.sol";
import {OwnerIsCreator} from "../shared/access/OwnerIsCreator.sol";
/// @notice Simplified mock version of KeystoneForwarder for testing purposes.
/// The report function is permissionless and skips all validations.
contract MockKeystoneForwarder is OwnerIsCreator, ITypeAndVersion, IRouter {
/// @notice This error is returned when the report is shorter than REPORT_METADATA_LENGTH,
/// which is the minimum length of a report.
error InvalidReport();
struct Transmission {
address transmitter;
// This is true if the receiver is not a contract or does not implement the `IReceiver` interface.
bool invalidReceiver;
// Whether the transmission attempt was successful. If `false`, the transmission can be retried
// with an increased gas limit.
bool success;
// The amount of gas allocated for the `IReceiver.onReport` call. uint80 allows storing gas for known EVM block
// gas limits. Ensures that the minimum gas requested by the user is available during the transmission attempt.
// If the transmission fails (indicated by a `false` success state), it can be retried with an increased gas limit.
uint80 gasLimit;
}
/// @notice Emitted when a report is processed
/// @param result The result of the attempted delivery. True if successful.
event ReportProcessed(
address indexed receiver,
bytes32 indexed workflowExecutionId,
bytes2 indexed reportId,
bool result
);
string public constant override typeAndVersion = "MockKeystoneForwarder 1.0.0";
constructor() OwnerIsCreator() {
s_forwarders[address(this)] = true;
}
uint256 internal constant METADATA_LENGTH = 109;
uint256 internal constant FORWARDER_METADATA_LENGTH = 45;
/// @dev This is the gas required to store `success` after the report is processed.
/// It is a warm storage write because of the packed struct. In practice it will cost less.
uint256 internal constant INTERNAL_GAS_REQUIREMENTS_AFTER_REPORT = 5_000;
/// @dev This is the gas required to store the transmission struct and perform other checks.
uint256 internal constant INTERNAL_GAS_REQUIREMENTS = 25_000 + INTERNAL_GAS_REQUIREMENTS_AFTER_REPORT;
/// @dev This is the minimum gas required to route a report. This includes internal gas requirements
/// as well as the minimum gas that the user contract will receive. 30k * 3 gas is to account for
/// cases where consumers need close to the 30k limit provided in the supportsInterface check.
uint256 internal constant MINIMUM_GAS_LIMIT = INTERNAL_GAS_REQUIREMENTS + 30_000 * 3 + 10_000;
// ================================================================
// │ Router │
// ================================================================
mapping(address forwarder => bool isForwarder) internal s_forwarders;
mapping(bytes32 transmissionId => Transmission transmission) internal s_transmissions;
function addForwarder(address forwarder) external onlyOwner {
s_forwarders[forwarder] = true;
emit ForwarderAdded(forwarder);
}
function removeForwarder(address forwarder) external onlyOwner {
s_forwarders[forwarder] = false;
emit ForwarderRemoved(forwarder);
}
function route(
bytes32 transmissionId,
address transmitter,
address receiver,
bytes calldata metadata,
bytes calldata validatedReport
) public returns (bool) {
s_transmissions[transmissionId].transmitter = transmitter;
s_transmissions[transmissionId].gasLimit = uint80(gasleft());
// Always call onReport on the receiver
bool success;
bytes memory payload = abi.encodeCall(IReceiver.onReport, (metadata, validatedReport));
assembly {
// call and return whether we succeeded. ignore return data
// call(gas,addr,value,argsOffset,argsLength,retOffset,retLength)
success := call(gas(), receiver, 0, add(payload, 0x20), mload(payload), 0x0, 0x0)
}
s_transmissions[transmissionId].success = success;
return success;
}
function getTransmissionId(
address receiver,
bytes32 workflowExecutionId,
bytes2 reportId
) public pure returns (bytes32) {
// This is slightly cheaper compared to `keccak256(abi.encode(receiver, workflowExecutionId, reportId));`
return keccak256(bytes.concat(bytes20(uint160(receiver)), workflowExecutionId, reportId));
}
function getTransmissionInfo(
address receiver,
bytes32 workflowExecutionId,
bytes2 reportId
) external view returns (TransmissionInfo memory) {
bytes32 transmissionId = getTransmissionId(receiver, workflowExecutionId, reportId);
Transmission memory transmission = s_transmissions[transmissionId];
TransmissionState state;
if (transmission.transmitter == address(0)) {
state = IRouter.TransmissionState.NOT_ATTEMPTED;
} else if (transmission.invalidReceiver) {
state = IRouter.TransmissionState.INVALID_RECEIVER;
} else {
state = transmission.success ? IRouter.TransmissionState.SUCCEEDED : IRouter.TransmissionState.FAILED;
}
return
TransmissionInfo({
gasLimit: transmission.gasLimit,
invalidReceiver: transmission.invalidReceiver,
state: state,
success: transmission.success,
transmissionId: transmissionId,
transmitter: transmission.transmitter
});
}
/// @notice Get transmitter of a given report or 0x0 if it wasn't transmitted yet
function getTransmitter(
address receiver,
bytes32 workflowExecutionId,
bytes2 reportId
) external view returns (address) {
return s_transmissions[getTransmissionId(receiver, workflowExecutionId, reportId)].transmitter;
}
function isForwarder(address forwarder) external view returns (bool) {
return s_forwarders[forwarder];
}
// ================================================================
// │ Forwarder │
// ================================================================
/// @notice Simplified permissionless report function that skips all validations
/// and does not call onReport on consumer contracts
function report(
address receiver,
bytes calldata rawReport,
bytes calldata reportContext,
bytes[] calldata signatures
) external {
if (rawReport.length < METADATA_LENGTH) {
revert InvalidReport();
}
bytes32 workflowExecutionId;
bytes2 reportId;
{
uint64 configId;
(workflowExecutionId, configId, reportId) = _getMetadata(rawReport);
}
// Skip all validations and signature checks
// Skip onReport call to consumer contracts
bool success = this.route(
getTransmissionId(receiver, workflowExecutionId, reportId),
msg.sender,
receiver,
rawReport[FORWARDER_METADATA_LENGTH:METADATA_LENGTH],
rawReport[METADATA_LENGTH:]
);
emit ReportProcessed(receiver, workflowExecutionId, reportId, success);
}
// solhint-disable-next-line chainlink-solidity/explicit-returns
function _getMetadata(
bytes memory rawReport
) internal pure returns (bytes32 workflowExecutionId, uint64 configId, bytes2 reportId) {
// (first 32 bytes of memory contain length of the report)
// version offset 32, size 1
// workflow_execution_id offset 33, size 32
// timestamp offset 65, size 4
// don_id offset 69, size 4
// don_config_version, offset 73, size 4
// workflow_cid offset 77, size 32
// workflow_name offset 109, size 10
// workflow_owner offset 119, size 20
// report_id offset 139, size 2
assembly {
workflowExecutionId := mload(add(rawReport, 33))
// shift right by 24 bytes to get the combined don_id and don_config_version
configId := shr(mul(24, 8), mload(add(rawReport, 69)))
reportId := mload(add(rawReport, 139))
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {IERC165} from "@openzeppelin/[email protected]/utils/introspection/IERC165.sol";
/// @title IReceiver - receives keystone reports
/// @notice Implementations must support the IReceiver interface through ERC165.
interface IReceiver is IERC165 {
/// @notice Handles incoming keystone reports.
/// @dev If this function call reverts, it can be retried with a higher gas
/// limit. The receiver is responsible for discarding stale reports.
/// @param metadata Report's metadata.
/// @param report Workflow report.
function onReport(bytes calldata metadata, bytes calldata report) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
/// @title IRouter - delivers keystone reports to receiver
interface IRouter {
error UnauthorizedForwarder();
/// @dev Thrown when the gas limit is insufficient for handling state after
/// calling the receiver function.
error InsufficientGasForRouting(bytes32 transmissionId);
error AlreadyAttempted(bytes32 transmissionId);
event ForwarderAdded(address indexed forwarder);
event ForwarderRemoved(address indexed forwarder);
enum TransmissionState {
NOT_ATTEMPTED,
SUCCEEDED,
INVALID_RECEIVER,
FAILED
}
struct TransmissionInfo {
bytes32 transmissionId;
TransmissionState state;
address transmitter;
// This is true if the receiver is not a contract or does not implement the
// `IReceiver` interface.
bool invalidReceiver;
// Whether the transmission attempt was successful. If `false`, the
// transmission can be retried with an increased gas limit.
bool success;
// The amount of gas allocated for the `IReceiver.onReport` call. uint80
// allows storing gas for known EVM block gas limits.
// Ensures that the minimum gas requested by the user is available during
// the transmission attempt. If the transmission fails (indicated by a
// `false` success state), it can be retried with an increased gas limit.
uint80 gasLimit;
}
function addForwarder(
address forwarder
) external;
function removeForwarder(
address forwarder
) external;
function route(
bytes32 transmissionId,
address transmitter,
address receiver,
bytes calldata metadata,
bytes calldata report
) external returns (bool);
function getTransmissionId(
address receiver,
bytes32 workflowExecutionId,
bytes2 reportId
) external pure returns (bytes32);
function getTransmissionInfo(
address receiver,
bytes32 workflowExecutionId,
bytes2 reportId
) external view returns (TransmissionInfo memory);
function getTransmitter(
address receiver,
bytes32 workflowExecutionId,
bytes2 reportId
) external view returns (address);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface ITypeAndVersion {
function typeAndVersion() external pure returns (string memory);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {ConfirmedOwner} from "./ConfirmedOwner.sol";
/// @title The OwnerIsCreator contract
/// @notice A contract with helpers for basic contract ownership.
contract OwnerIsCreator is ConfirmedOwner {
constructor() ConfirmedOwner(msg.sender) {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {ConfirmedOwnerWithProposal} from "./ConfirmedOwnerWithProposal.sol";
/// @title The ConfirmedOwner contract
/// @notice A contract with helpers for basic contract ownership.
contract ConfirmedOwner is ConfirmedOwnerWithProposal {
constructor(
address newOwner
) ConfirmedOwnerWithProposal(newOwner, address(0)) {}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {IOwnable} from "../interfaces/IOwnable.sol";
/// @title The ConfirmedOwner contract
/// @notice A contract with helpers for basic contract ownership.
contract ConfirmedOwnerWithProposal is IOwnable {
address private s_owner;
address private s_pendingOwner;
event OwnershipTransferRequested(address indexed from, address indexed to);
event OwnershipTransferred(address indexed from, address indexed to);
constructor(address newOwner, address pendingOwner) {
// solhint-disable-next-line gas-custom-errors
require(newOwner != address(0), "Cannot set owner to zero");
s_owner = newOwner;
if (pendingOwner != address(0)) {
_transferOwnership(pendingOwner);
}
}
/// @notice Allows an owner to begin transferring ownership to a new address.
function transferOwnership(
address to
) public override onlyOwner {
_transferOwnership(to);
}
/// @notice Allows an ownership transfer to be completed by the recipient.
function acceptOwnership() external override {
// solhint-disable-next-line gas-custom-errors
require(msg.sender == s_pendingOwner, "Must be proposed owner");
address oldOwner = s_owner;
s_owner = msg.sender;
s_pendingOwner = address(0);
emit OwnershipTransferred(oldOwner, msg.sender);
}
/// @notice Get the current owner
function owner() public view override returns (address) {
return s_owner;
}
/// @notice validate, transfer ownership, and emit relevant events
function _transferOwnership(
address to
) private {
// solhint-disable-next-line gas-custom-errors
require(to != msg.sender, "Cannot transfer to self");
s_pendingOwner = to;
emit OwnershipTransferRequested(s_owner, to);
}
/// @notice validate access
function _validateOwnership() internal view {
// solhint-disable-next-line gas-custom-errors
require(msg.sender == s_owner, "Only callable by owner");
}
/// @notice Reverts if called by anyone other than the contract owner.
modifier onlyOwner() {
_validateOwnership();
_;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IOwnable {
function owner() external returns (address);
function transferOwnership(
address recipient
) external;
function acceptOwnership() external;
}{
"remappings": [
"forge-std/=src/v0.8/vendor/forge-std/src/",
"@openzeppelin/[email protected]/=node_modules/@openzeppelin/contracts-4.7.3/",
"@openzeppelin/[email protected]/=node_modules/@openzeppelin/contracts-4.8.3/",
"@openzeppelin/[email protected]/=node_modules/@openzeppelin/contracts-4.9.6/",
"@openzeppelin/[email protected]/=node_modules/@openzeppelin/contracts-5.0.2/",
"@openzeppelin/[email protected]/=node_modules/@openzeppelin/contracts-5.1.0/",
"@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/",
"@arbitrum/=node_modules/@arbitrum/",
"hardhat/=node_modules/hardhat/",
"@eth-optimism/=node_modules/@eth-optimism/",
"@scroll-tech/=node_modules/@scroll-tech/",
"@zksync/=node_modules/@zksync/"
],
"optimizer": {
"enabled": true,
"runs": 1000000
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "none",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "cancun",
"viaIR": false
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"transmissionId","type":"bytes32"}],"name":"AlreadyAttempted","type":"error"},{"inputs":[{"internalType":"bytes32","name":"transmissionId","type":"bytes32"}],"name":"InsufficientGasForRouting","type":"error"},{"inputs":[],"name":"InvalidReport","type":"error"},{"inputs":[],"name":"UnauthorizedForwarder","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"forwarder","type":"address"}],"name":"ForwarderAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"forwarder","type":"address"}],"name":"ForwarderRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"bytes32","name":"workflowExecutionId","type":"bytes32"},{"indexed":true,"internalType":"bytes2","name":"reportId","type":"bytes2"},{"indexed":false,"internalType":"bool","name":"result","type":"bool"}],"name":"ReportProcessed","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"addForwarder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes32","name":"workflowExecutionId","type":"bytes32"},{"internalType":"bytes2","name":"reportId","type":"bytes2"}],"name":"getTransmissionId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes32","name":"workflowExecutionId","type":"bytes32"},{"internalType":"bytes2","name":"reportId","type":"bytes2"}],"name":"getTransmissionInfo","outputs":[{"components":[{"internalType":"bytes32","name":"transmissionId","type":"bytes32"},{"internalType":"enum IRouter.TransmissionState","name":"state","type":"uint8"},{"internalType":"address","name":"transmitter","type":"address"},{"internalType":"bool","name":"invalidReceiver","type":"bool"},{"internalType":"bool","name":"success","type":"bool"},{"internalType":"uint80","name":"gasLimit","type":"uint80"}],"internalType":"struct IRouter.TransmissionInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes32","name":"workflowExecutionId","type":"bytes32"},{"internalType":"bytes2","name":"reportId","type":"bytes2"}],"name":"getTransmitter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"removeForwarder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"rawReport","type":"bytes"},{"internalType":"bytes","name":"reportContext","type":"bytes"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"report","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"transmissionId","type":"bytes32"},{"internalType":"address","name":"transmitter","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"metadata","type":"bytes"},{"internalType":"bytes","name":"validatedReport","type":"bytes"}],"name":"route","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"typeAndVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405234801561000f575f80fd5b5033805f816100655760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b5f80546001600160a01b0319166001600160a01b038481169190911790915581161561009457610094816100b5565b5050305f908152600260205260409020805460ff191660011790555061015d565b336001600160a01b0382160361010d5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161005c565b600180546001600160a01b0319166001600160a01b038381169182179092555f8054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6111b18061016a5f395ff3fe608060405234801561000f575f80fd5b50600436106100cf575f3560e01c80635c41d2fe1161007d5780638da5cb5b116100585780638da5cb5b14610321578063abcef5541461033e578063f2fde38b14610376575f80fd5b80635c41d2fe1461022e57806379ba5097146102415780638864b86414610249575f80fd5b8063272cbd93116100ad578063272cbd931461015d578063354bdd661461017d5780634d93172d1461021b575f80fd5b806311289565146100d3578063181f5a77146100e8578063233fd52d1461013a575b5f80fd5b6100e66100e1366004610d4b565b610389565b005b6101246040518060400160405280601b81526020017f4d6f636b4b657973746f6e65466f7277617264657220312e302e30000000000081525081565b6040516101319190610e2c565b60405180910390f35b61014d610148366004610e7f565b61059e565b6040519015158152602001610131565b61017061016b366004610f18565b61073c565b6040516101319190610fa6565b61020d61018b366004610f18565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b166020820152603481018390527fffff000000000000000000000000000000000000000000000000000000000000821660548201525f906056016040516020818303038152906040528051906020012090509392505050565b604051908152602001610131565b6100e6610229366004611054565b61093f565b6100e661023c366004611054565b6109ba565b6100e6610a38565b6102fc610257366004610f18565b6040805160609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208086019190915260348501939093527fffff00000000000000000000000000000000000000000000000000000000000091909116605484015280516036818503018152605690930181528251928201929092205f9081526003909152205473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610131565b5f5473ffffffffffffffffffffffffffffffffffffffff166102fc565b61014d61034c366004611054565b73ffffffffffffffffffffffffffffffffffffffff165f9081526002602052604090205460ff1690565b6100e6610384366004611054565b610b39565b606d8510156103c4576040517fb55ac75400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f61040589898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610b4d92505050565b6040805160608f901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602080830191909152603482018690527fffff00000000000000000000000000000000000000000000000000000000000084166054830152825160368184030181526056909201909252805191012092955093505f9250309163233fd52d9150338d8d8d602d90606d926104a693929190611074565b8f8f606d9080926104b993929190611074565b6040518863ffffffff1660e01b81526004016104db97969594939291906110e2565b6020604051808303815f875af11580156104f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051b9190611154565b9050817dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916838b73ffffffffffffffffffffffffffffffffffffffff167f3617b009e9785c42daebadb6d3fb553243a4bf586d07ea72d65d80013ce116b58460405161058a911515815260200190565b60405180910390a450505050505050505050565b5f87815260036020526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555a5f89815260036020526040808220805469ffffffffffffffffffff949094167601000000000000000000000000000000000000000000000275ffffffffffffffffffffffffffffffffffffffffffff909416939093179092559051819061065b908890889088908890602401611173565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f805f21320000000000000000000000000000000000000000000000000000000017815281519192505f918291828c5af15f9a8b5260036020526040909a2080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000008c151502179055509798975050505050505050565b6040805160c0810182525f808252602080830182905282840182905260608084018390526080840183905260a0840183905284519088901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001681830152603481018790527fffff000000000000000000000000000000000000000000000000000000000000861660548201528451603681830301815260568201808752815191840191909120808552600390935285842060d68301909652945473ffffffffffffffffffffffffffffffffffffffff811680875274010000000000000000000000000000000000000000820460ff9081161515607685015275010000000000000000000000000000000000000000008304161515609684015276010000000000000000000000000000000000000000000090910469ffffffffffffffffffff1660b6909201919091529293909290919061089857505f6108c0565b8160200151156108aa575060026108c0565b81604001516108ba5760036108bd565b60015b90505b6040518060c001604052808481526020018260038111156108e3576108e3610f79565b8152602001835f015173ffffffffffffffffffffffffffffffffffffffff168152602001836020015115158152602001836040015115158152602001836060015169ffffffffffffffffffff1681525093505050509392505050565b610947610b68565b73ffffffffffffffffffffffffffffffffffffffff81165f8181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517fb96d15bf9258c7b8df062753a6a262864611fc7b060a5ee2e57e79b85f898d389190a250565b6109c2610b68565b73ffffffffffffffffffffffffffffffffffffffff81165f8181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f0ea0ce2c048ff45a4a95f2947879de3fb94abec2f152190400cab2d1272a68e79190a250565b60015473ffffffffffffffffffffffffffffffffffffffff163314610abe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b5f8054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610b41610b68565b610b4a81610bea565b50565b60218101516045820151608b90920151909260c09290921c91565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610be8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610ab5565b565b3373ffffffffffffffffffffffffffffffffffffffff821603610c69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610ab5565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8381169182179092555f8054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b803573ffffffffffffffffffffffffffffffffffffffff81168114610d01575f80fd5b919050565b5f8083601f840112610d16575f80fd5b50813567ffffffffffffffff811115610d2d575f80fd5b602083019150836020828501011115610d44575f80fd5b9250929050565b5f805f805f805f6080888a031215610d61575f80fd5b610d6a88610cde565b9650602088013567ffffffffffffffff811115610d85575f80fd5b610d918a828b01610d06565b909750955050604088013567ffffffffffffffff811115610db0575f80fd5b610dbc8a828b01610d06565b909550935050606088013567ffffffffffffffff811115610ddb575f80fd5b8801601f81018a13610deb575f80fd5b803567ffffffffffffffff811115610e01575f80fd5b8a60208260051b8401011115610e15575f80fd5b602082019350809250505092959891949750929550565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f805f805f805f60a0888a031215610e95575f80fd5b87359650610ea560208901610cde565b9550610eb360408901610cde565b9450606088013567ffffffffffffffff811115610ece575f80fd5b610eda8a828b01610d06565b909550935050608088013567ffffffffffffffff811115610ef9575f80fd5b610f058a828b01610d06565b989b979a50959850939692959293505050565b5f805f60608486031215610f2a575f80fd5b610f3384610cde565b92506020840135915060408401357fffff00000000000000000000000000000000000000000000000000000000000081168114610f6e575f80fd5b809150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b81518152602082015160c082019060048110610fe9577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b8060208401525073ffffffffffffffffffffffffffffffffffffffff6040840151166040830152606083015115156060830152608083015161102f608084018215159052565b5060a083015161104d60a084018269ffffffffffffffffffff169052565b5092915050565b5f60208284031215611064575f80fd5b61106d82610cde565b9392505050565b5f8085851115611082575f80fd5b8386111561108e575f80fd5b5050820193919092039150565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b87815273ffffffffffffffffffffffffffffffffffffffff8716602082015273ffffffffffffffffffffffffffffffffffffffff8616604082015260a060608201525f61113360a08301868861109b565b828103608084015261114681858761109b565b9a9950505050505050505050565b5f60208284031215611164575f80fd5b8151801515811461106d575f80fd5b604081525f61118660408301868861109b565b828103602084015261119981858761109b565b97965050505050505056fea164736f6c634300081a000a
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106100cf575f3560e01c80635c41d2fe1161007d5780638da5cb5b116100585780638da5cb5b14610321578063abcef5541461033e578063f2fde38b14610376575f80fd5b80635c41d2fe1461022e57806379ba5097146102415780638864b86414610249575f80fd5b8063272cbd93116100ad578063272cbd931461015d578063354bdd661461017d5780634d93172d1461021b575f80fd5b806311289565146100d3578063181f5a77146100e8578063233fd52d1461013a575b5f80fd5b6100e66100e1366004610d4b565b610389565b005b6101246040518060400160405280601b81526020017f4d6f636b4b657973746f6e65466f7277617264657220312e302e30000000000081525081565b6040516101319190610e2c565b60405180910390f35b61014d610148366004610e7f565b61059e565b6040519015158152602001610131565b61017061016b366004610f18565b61073c565b6040516101319190610fa6565b61020d61018b366004610f18565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b166020820152603481018390527fffff000000000000000000000000000000000000000000000000000000000000821660548201525f906056016040516020818303038152906040528051906020012090509392505050565b604051908152602001610131565b6100e6610229366004611054565b61093f565b6100e661023c366004611054565b6109ba565b6100e6610a38565b6102fc610257366004610f18565b6040805160609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208086019190915260348501939093527fffff00000000000000000000000000000000000000000000000000000000000091909116605484015280516036818503018152605690930181528251928201929092205f9081526003909152205473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610131565b5f5473ffffffffffffffffffffffffffffffffffffffff166102fc565b61014d61034c366004611054565b73ffffffffffffffffffffffffffffffffffffffff165f9081526002602052604090205460ff1690565b6100e6610384366004611054565b610b39565b606d8510156103c4576040517fb55ac75400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f61040589898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610b4d92505050565b6040805160608f901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602080830191909152603482018690527fffff00000000000000000000000000000000000000000000000000000000000084166054830152825160368184030181526056909201909252805191012092955093505f9250309163233fd52d9150338d8d8d602d90606d926104a693929190611074565b8f8f606d9080926104b993929190611074565b6040518863ffffffff1660e01b81526004016104db97969594939291906110e2565b6020604051808303815f875af11580156104f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051b9190611154565b9050817dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916838b73ffffffffffffffffffffffffffffffffffffffff167f3617b009e9785c42daebadb6d3fb553243a4bf586d07ea72d65d80013ce116b58460405161058a911515815260200190565b60405180910390a450505050505050505050565b5f87815260036020526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555a5f89815260036020526040808220805469ffffffffffffffffffff949094167601000000000000000000000000000000000000000000000275ffffffffffffffffffffffffffffffffffffffffffff909416939093179092559051819061065b908890889088908890602401611173565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f805f21320000000000000000000000000000000000000000000000000000000017815281519192505f918291828c5af15f9a8b5260036020526040909a2080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000008c151502179055509798975050505050505050565b6040805160c0810182525f808252602080830182905282840182905260608084018390526080840183905260a0840183905284519088901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001681830152603481018790527fffff000000000000000000000000000000000000000000000000000000000000861660548201528451603681830301815260568201808752815191840191909120808552600390935285842060d68301909652945473ffffffffffffffffffffffffffffffffffffffff811680875274010000000000000000000000000000000000000000820460ff9081161515607685015275010000000000000000000000000000000000000000008304161515609684015276010000000000000000000000000000000000000000000090910469ffffffffffffffffffff1660b6909201919091529293909290919061089857505f6108c0565b8160200151156108aa575060026108c0565b81604001516108ba5760036108bd565b60015b90505b6040518060c001604052808481526020018260038111156108e3576108e3610f79565b8152602001835f015173ffffffffffffffffffffffffffffffffffffffff168152602001836020015115158152602001836040015115158152602001836060015169ffffffffffffffffffff1681525093505050509392505050565b610947610b68565b73ffffffffffffffffffffffffffffffffffffffff81165f8181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517fb96d15bf9258c7b8df062753a6a262864611fc7b060a5ee2e57e79b85f898d389190a250565b6109c2610b68565b73ffffffffffffffffffffffffffffffffffffffff81165f8181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f0ea0ce2c048ff45a4a95f2947879de3fb94abec2f152190400cab2d1272a68e79190a250565b60015473ffffffffffffffffffffffffffffffffffffffff163314610abe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b5f8054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610b41610b68565b610b4a81610bea565b50565b60218101516045820151608b90920151909260c09290921c91565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610be8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610ab5565b565b3373ffffffffffffffffffffffffffffffffffffffff821603610c69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610ab5565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8381169182179092555f8054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b803573ffffffffffffffffffffffffffffffffffffffff81168114610d01575f80fd5b919050565b5f8083601f840112610d16575f80fd5b50813567ffffffffffffffff811115610d2d575f80fd5b602083019150836020828501011115610d44575f80fd5b9250929050565b5f805f805f805f6080888a031215610d61575f80fd5b610d6a88610cde565b9650602088013567ffffffffffffffff811115610d85575f80fd5b610d918a828b01610d06565b909750955050604088013567ffffffffffffffff811115610db0575f80fd5b610dbc8a828b01610d06565b909550935050606088013567ffffffffffffffff811115610ddb575f80fd5b8801601f81018a13610deb575f80fd5b803567ffffffffffffffff811115610e01575f80fd5b8a60208260051b8401011115610e15575f80fd5b602082019350809250505092959891949750929550565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f805f805f805f60a0888a031215610e95575f80fd5b87359650610ea560208901610cde565b9550610eb360408901610cde565b9450606088013567ffffffffffffffff811115610ece575f80fd5b610eda8a828b01610d06565b909550935050608088013567ffffffffffffffff811115610ef9575f80fd5b610f058a828b01610d06565b989b979a50959850939692959293505050565b5f805f60608486031215610f2a575f80fd5b610f3384610cde565b92506020840135915060408401357fffff00000000000000000000000000000000000000000000000000000000000081168114610f6e575f80fd5b809150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b81518152602082015160c082019060048110610fe9577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b8060208401525073ffffffffffffffffffffffffffffffffffffffff6040840151166040830152606083015115156060830152608083015161102f608084018215159052565b5060a083015161104d60a084018269ffffffffffffffffffff169052565b5092915050565b5f60208284031215611064575f80fd5b61106d82610cde565b9392505050565b5f8085851115611082575f80fd5b8386111561108e575f80fd5b5050820193919092039150565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b87815273ffffffffffffffffffffffffffffffffffffffff8716602082015273ffffffffffffffffffffffffffffffffffffffff8616604082015260a060608201525f61113360a08301868861109b565b828103608084015261114681858761109b565b9a9950505050505050505050565b5f60208284031215611164575f80fd5b8151801515811461106d575f80fd5b604081525f61118660408301868861109b565b828103602084015261119981858761109b565b97965050505050505056fea164736f6c634300081a000a
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.