Source Code
Overview
MNT Balance
MNT Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FPValidator
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 10000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.7.6;
pragma abicoder v2;
import "./utility/LayerZeroPacket.sol";
import "../interfaces/ILayerZeroValidationLibrary.sol";
import "../interfaces/IValidationLibraryHelperV2.sol";
interface IStargate {
// Stargate objects for abi encoding / decoding
struct SwapObj {
uint amount;
uint eqFee;
uint eqReward;
uint lpFee;
uint protocolFee;
uint lkbRemove;
}
struct CreditObj {
uint credits;
uint idealBalance;
}
}
contract FPValidator is ILayerZeroValidationLibrary, IValidationLibraryHelperV2 {
uint8 public proofType = 2;
uint8 public utilsVersion = 1;
address public immutable stargateBridgeAddress;
address public immutable stargateTokenAddress;
constructor(address _stargateBridgeAddress, address _stargateTokenAddress) {
stargateBridgeAddress = _stargateBridgeAddress;
stargateTokenAddress = _stargateTokenAddress;
}
function validateProof(
bytes32 _packetHash,
bytes calldata _transactionProof,
uint _remoteAddressSize
) external view override returns (LayerZeroPacket.Packet memory packet) {
require(_remoteAddressSize > 0, "ProofLib: invalid address size");
// _transactionProof = srcUlnAddress (32 bytes) + lzPacket
require(
_transactionProof.length > 32 && keccak256(_transactionProof) == _packetHash,
"ProofLib: invalid transaction proof"
);
bytes memory ulnAddressBytes = bytes(_transactionProof[0:32]);
bytes32 ulnAddress;
assembly {
ulnAddress := mload(add(ulnAddressBytes, 32))
}
packet = LayerZeroPacket.getPacketV3(_transactionProof[32:], _remoteAddressSize, ulnAddress);
if (packet.dstAddress == stargateBridgeAddress) packet.payload = _secureStgPayload(packet.payload);
if (packet.dstAddress == stargateTokenAddress) packet.payload = _secureStgTokenPayload(packet.payload);
return packet;
}
function _secureStgTokenPayload(bytes memory _payload) internal pure returns (bytes memory) {
(bytes memory toAddressBytes, uint qty) = abi.decode(_payload, (bytes, uint));
address toAddress = address(0);
if (toAddressBytes.length > 0) {
assembly {
toAddress := mload(add(toAddressBytes, 20))
}
}
if (toAddress == address(0)) {
address deadAddress = address(0x000000000000000000000000000000000000dEaD);
bytes memory newToAddressBytes = abi.encodePacked(deadAddress);
return abi.encode(newToAddressBytes, qty);
}
// default to return the original payload
return _payload;
}
function _secureStgPayload(bytes memory _payload) internal view returns (bytes memory) {
// functionType is uint8 even though the encoding will take up the side of uint256
uint8 functionType;
assembly {
functionType := mload(add(_payload, 32))
}
// TYPE_SWAP_REMOTE == 1 && only if the payload has a payload
// only swapRemote inside of stargate can call sgReceive on an user supplied to address
// thus we do not care about the other type functions even if the toAddress is overly long.
if (functionType == 1) {
// decode the _payload with its types
(
,
uint srcPoolId,
uint dstPoolId,
uint dstGasForCall,
IStargate.CreditObj memory c,
IStargate.SwapObj memory s,
bytes memory toAddressBytes,
bytes memory contractCallPayload
) = abi.decode(_payload, (uint8, uint, uint, uint, IStargate.CreditObj, IStargate.SwapObj, bytes, bytes));
// if contractCallPayload.length > 0 need to check if the to address is a contract or not
if (contractCallPayload.length > 0) {
// otherwise, need to check if the payload can be delivered to the toAddress
address toAddress = address(0);
if (toAddressBytes.length > 0) {
assembly {
toAddress := mload(add(toAddressBytes, 20))
}
}
// check if the toAddress is a contract. We are not concerned about addresses that pretend to be wallets. because worst case we just delete their payload if being malicious
// we can guarantee that if a size > 0, then the contract is definitely a contract address in this context
uint size;
assembly {
size := extcodesize(toAddress)
}
if (size == 0) {
// size == 0 indicates its not a contract, payload wont be delivered
// secure the _payload to make sure funds can be delivered to the toAddress
bytes memory newToAddressBytes = abi.encodePacked(toAddress);
bytes memory securePayload = abi.encode(
functionType,
srcPoolId,
dstPoolId,
dstGasForCall,
c,
s,
newToAddressBytes,
bytes("")
);
return securePayload;
}
}
}
// default to return the original payload
return _payload;
}
function secureStgTokenPayload(bytes memory _payload) external pure returns (bytes memory) {
return _secureStgTokenPayload(_payload);
}
function secureStgPayload(bytes memory _payload) external view returns (bytes memory) {
return _secureStgPayload(_payload);
}
function getUtilsVersion() external view override returns (uint8) {
return utilsVersion;
}
function getProofType() external view override returns (uint8) {
return proofType;
}
function getVerifyLog(
bytes32,
uint[] calldata,
uint,
bytes[] calldata proof
) external pure override returns (ULNLog memory log) {}
function getPacket(
bytes memory data,
uint sizeOfSrcAddress,
bytes32 ulnAddress
) external pure override returns (LayerZeroPacket.Packet memory) {
return LayerZeroPacket.getPacketV3(data, sizeOfSrcAddress, ulnAddress);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryDiv}.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.7.0;
pragma abicoder v2;
import "../proof/utility/LayerZeroPacket.sol";
interface ILayerZeroValidationLibrary {
function validateProof(
bytes32 blockData,
bytes calldata _data,
uint _remoteAddressSize
) external returns (LayerZeroPacket.Packet memory packet);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.7.0;
pragma abicoder v2;
import "../proof/utility/LayerZeroPacket.sol";
interface IValidationLibraryHelperV2 {
struct ULNLog {
bytes32 contractAddress;
bytes32 topicZeroSig;
bytes data;
}
function getVerifyLog(
bytes32 hashRoot,
uint[] calldata receiptSlotIndex,
uint logIndex,
bytes[] calldata proof
) external pure returns (ULNLog memory);
function getPacket(
bytes calldata data,
uint sizeOfSrcAddress,
bytes32 ulnAddress
) external pure returns (LayerZeroPacket.Packet memory);
function getUtilsVersion() external view returns (uint8);
function getProofType() external view returns (uint8);
}// SPDX-License-Identifier: BUSL-1.1
// https://github.com/ensdomains/buffer
pragma solidity ^0.7.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;
uint capacity;
}
/**
* @dev Initializes a buffer with an initial capacity.a co
* @param buf The buffer to initialize.
* @param capacity The number of bytes of space to allocate the buffer.
* @return The buffer, for chaining.
*/
function init(buffer memory buf, uint capacity) internal pure returns (buffer memory) {
if (capacity % 32 != 0) {
capacity += 32 - (capacity % 32);
}
// Allocate space for the buffer data
buf.capacity = capacity;
assembly {
let ptr := mload(0x40)
mstore(buf, ptr)
mstore(ptr, 0)
mstore(0x40, add(32, add(ptr, capacity)))
}
return buf;
}
/**
* @dev 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 rawData The data to append.
* @param len The number of bytes to copy.
* @return The original buffer, for chaining.
*/
function writeRawBytes(
buffer memory buf,
uint off,
bytes memory rawData,
uint offData,
uint len
) internal pure returns (buffer memory) {
if (off + len > buf.capacity) {
resize(buf, max(buf.capacity, len + off) * 2);
}
uint dest;
uint src;
assembly {
// Memory address of the buffer data
let bufptr := mload(buf)
// Length of existing buffer data
let buflen := mload(bufptr)
// Start address = buffer address + offset + sizeof(buffer length)
dest := add(add(bufptr, 32), off)
// Update buffer length if we're extending it
if gt(add(len, off), buflen) {
mstore(bufptr, add(len, off))
}
src := add(rawData, offData)
}
// Copy word-length chunks while possible
for (; len >= 32; len -= 32) {
assembly {
mstore(dest, mload(src))
}
dest += 32;
src += 32;
}
// Copy remaining bytes
uint mask = 256 ** (32 - len) - 1;
assembly {
let srcpart := and(mload(src), not(mask))
let destpart := and(mload(dest), mask)
mstore(dest, or(destpart, srcpart))
}
return buf;
}
/**
* @dev Writes a byte string to a buffer. Resizes if doing so would exceed
* the capacity of the buffer.
* @param buf The buffer to append to.
* @param off The start offset to write to.
* @param data The data to append.
* @param len The number of bytes to copy.
* @return The original buffer, for chaining.
*/
function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns (buffer memory) {
require(len <= data.length);
if (off + len > buf.capacity) {
resize(buf, max(buf.capacity, len + off) * 2);
}
uint dest;
uint src;
assembly {
// Memory address of the buffer data
let bufptr := mload(buf)
// Length of existing buffer data
let buflen := mload(bufptr)
// Start address = buffer address + offset + sizeof(buffer length)
dest := add(add(bufptr, 32), off)
// Update buffer length if we're extending it
if gt(add(len, off), buflen) {
mstore(bufptr, add(len, off))
}
src := add(data, 32)
}
// Copy word-length chunks while possible
for (; len >= 32; len -= 32) {
assembly {
mstore(dest, mload(src))
}
dest += 32;
src += 32;
}
// Copy remaining bytes
uint mask = 256 ** (32 - len) - 1;
assembly {
let srcpart := and(mload(src), not(mask))
let destpart := and(mload(dest), mask)
mstore(dest, or(destpart, srcpart))
}
return buf;
}
function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) {
return write(buf, buf.buf.length, data, data.length);
}
function resize(buffer memory buf, uint capacity) private pure {
bytes memory oldbuf = buf.buf;
init(buf, capacity);
append(buf, oldbuf);
}
function max(uint a, uint b) private pure returns (uint) {
if (a > b) {
return a;
}
return b;
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.7.6;
import "./Buffer.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
library LayerZeroPacket {
using Buffer for Buffer.buffer;
using SafeMath for uint;
struct Packet {
uint16 srcChainId;
uint16 dstChainId;
uint64 nonce;
address dstAddress;
bytes srcAddress;
bytes32 ulnAddress;
bytes payload;
}
function getPacket(
bytes memory data,
uint16 srcChain,
uint sizeOfSrcAddress,
bytes32 ulnAddress
) internal pure returns (LayerZeroPacket.Packet memory) {
uint16 dstChainId;
address dstAddress;
uint size;
uint64 nonce;
// The log consists of the destination chain id and then a bytes payload
// 0--------------------------------------------31
// 0 | total bytes size
// 32 | destination chain id
// 64 | bytes offset
// 96 | bytes array size
// 128 | payload
assembly {
dstChainId := mload(add(data, 32))
size := mload(add(data, 96)) /// size of the byte array
nonce := mload(add(data, 104)) // offset to convert to uint64 128 is index -24
dstAddress := mload(add(data, sub(add(128, sizeOfSrcAddress), 4))) // offset to convert to address 12 -8
}
Buffer.buffer memory srcAddressBuffer;
srcAddressBuffer.init(sizeOfSrcAddress);
srcAddressBuffer.writeRawBytes(0, data, 136, sizeOfSrcAddress); // 128 + 8
uint payloadSize = size.sub(28).sub(sizeOfSrcAddress);
Buffer.buffer memory payloadBuffer;
payloadBuffer.init(payloadSize);
payloadBuffer.writeRawBytes(0, data, sizeOfSrcAddress.add(156), payloadSize); // 148 + 8
return
LayerZeroPacket.Packet(
srcChain,
dstChainId,
nonce,
dstAddress,
srcAddressBuffer.buf,
ulnAddress,
payloadBuffer.buf
);
}
function getPacketV2(
bytes memory data,
uint sizeOfSrcAddress,
bytes32 ulnAddress
) internal pure returns (LayerZeroPacket.Packet memory) {
// packet def: abi.encodePacked(nonce, srcChain, srcAddress, dstChain, dstAddress, payload);
// data def: abi.encode(packet) = offset(32) + length(32) + packet
// if from EVM
// 0 - 31 0 - 31 | total bytes size
// 32 - 63 32 - 63 | location
// 64 - 95 64 - 95 | size of the packet
// 96 - 103 96 - 103 | nonce
// 104 - 105 104 - 105 | srcChainId
// 106 - P 106 - 125 | srcAddress, where P = 106 + sizeOfSrcAddress - 1,
// P+1 - P+2 126 - 127 | dstChainId
// P+3 - P+22 128 - 147 | dstAddress
// P+23 - END 148 - END | payload
// decode the packet
uint256 realSize;
uint64 nonce;
uint16 srcChain;
uint16 dstChain;
address dstAddress;
assembly {
realSize := mload(add(data, 64))
nonce := mload(add(data, 72)) // 104 - 32
srcChain := mload(add(data, 74)) // 106 - 32
dstChain := mload(add(data, add(76, sizeOfSrcAddress))) // P + 3 - 32 = 105 + size + 3 - 32 = 76 + size
dstAddress := mload(add(data, add(96, sizeOfSrcAddress))) // P + 23 - 32 = 105 + size + 23 - 32 = 96 + size
}
require(srcChain != 0, "LayerZeroPacket: invalid packet");
Buffer.buffer memory srcAddressBuffer;
srcAddressBuffer.init(sizeOfSrcAddress);
srcAddressBuffer.writeRawBytes(0, data, 106, sizeOfSrcAddress);
uint nonPayloadSize = sizeOfSrcAddress.add(32); // 2 + 2 + 8 + 20, 32 + 20 = 52 if sizeOfSrcAddress == 20
uint payloadSize = realSize.sub(nonPayloadSize);
Buffer.buffer memory payloadBuffer;
payloadBuffer.init(payloadSize);
payloadBuffer.writeRawBytes(0, data, nonPayloadSize.add(96), payloadSize);
return
LayerZeroPacket.Packet(
srcChain,
dstChain,
nonce,
dstAddress,
srcAddressBuffer.buf,
ulnAddress,
payloadBuffer.buf
);
}
function getPacketV3(
bytes memory data,
uint sizeOfSrcAddress,
bytes32 ulnAddress
) internal pure returns (LayerZeroPacket.Packet memory) {
// data def: abi.encodePacked(nonce, srcChain, srcAddress, dstChain, dstAddress, payload);
// if from EVM
// 0 - 31 0 - 31 | total bytes size
// 32 - 39 32 - 39 | nonce
// 40 - 41 40 - 41 | srcChainId
// 42 - P 42 - 61 | srcAddress, where P = 41 + sizeOfSrcAddress,
// P+1 - P+2 62 - 63 | dstChainId
// P+3 - P+22 64 - 83 | dstAddress
// P+23 - END 84 - END | payload
// decode the packet
uint256 realSize = data.length;
uint nonPayloadSize = sizeOfSrcAddress.add(32); // 2 + 2 + 8 + 20, 32 + 20 = 52 if sizeOfSrcAddress == 20
require(realSize >= nonPayloadSize, "LayerZeroPacket: invalid packet");
uint payloadSize = realSize - nonPayloadSize;
uint64 nonce;
uint16 srcChain;
uint16 dstChain;
address dstAddress;
assembly {
nonce := mload(add(data, 8)) // 40 - 32
srcChain := mload(add(data, 10)) // 42 - 32
dstChain := mload(add(data, add(12, sizeOfSrcAddress))) // P + 3 - 32 = 41 + size + 3 - 32 = 12 + size
dstAddress := mload(add(data, add(32, sizeOfSrcAddress))) // P + 23 - 32 = 41 + size + 23 - 32 = 32 + size
}
require(srcChain != 0, "LayerZeroPacket: invalid packet");
Buffer.buffer memory srcAddressBuffer;
srcAddressBuffer.init(sizeOfSrcAddress);
srcAddressBuffer.writeRawBytes(0, data, 42, sizeOfSrcAddress);
Buffer.buffer memory payloadBuffer;
if (payloadSize > 0) {
payloadBuffer.init(payloadSize);
payloadBuffer.writeRawBytes(0, data, nonPayloadSize.add(32), payloadSize);
}
return
LayerZeroPacket.Packet(
srcChain,
dstChain,
nonce,
dstAddress,
srcAddressBuffer.buf,
ulnAddress,
payloadBuffer.buf
);
}
}{
"libraries": {},
"metadata": {
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 10000
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_stargateBridgeAddress","type":"address"},{"internalType":"address","name":"_stargateTokenAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"sizeOfSrcAddress","type":"uint256"},{"internalType":"bytes32","name":"ulnAddress","type":"bytes32"}],"name":"getPacket","outputs":[{"components":[{"internalType":"uint16","name":"srcChainId","type":"uint16"},{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"internalType":"address","name":"dstAddress","type":"address"},{"internalType":"bytes","name":"srcAddress","type":"bytes"},{"internalType":"bytes32","name":"ulnAddress","type":"bytes32"},{"internalType":"bytes","name":"payload","type":"bytes"}],"internalType":"struct LayerZeroPacket.Packet","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getProofType","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUtilsVersion","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes[]","name":"proof","type":"bytes[]"}],"name":"getVerifyLog","outputs":[{"components":[{"internalType":"bytes32","name":"contractAddress","type":"bytes32"},{"internalType":"bytes32","name":"topicZeroSig","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IValidationLibraryHelperV2.ULNLog","name":"log","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"proofType","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"secureStgPayload","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"secureStgTokenPayload","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"stargateBridgeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stargateTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"utilsVersion","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_packetHash","type":"bytes32"},{"internalType":"bytes","name":"_transactionProof","type":"bytes"},{"internalType":"uint256","name":"_remoteAddressSize","type":"uint256"}],"name":"validateProof","outputs":[{"components":[{"internalType":"uint16","name":"srcChainId","type":"uint16"},{"internalType":"uint16","name":"dstChainId","type":"uint16"},{"internalType":"uint64","name":"nonce","type":"uint64"},{"internalType":"address","name":"dstAddress","type":"address"},{"internalType":"bytes","name":"srcAddress","type":"bytes"},{"internalType":"bytes32","name":"ulnAddress","type":"bytes32"},{"internalType":"bytes","name":"payload","type":"bytes"}],"internalType":"struct LayerZeroPacket.Packet","name":"packet","type":"tuple"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60c06040526000805461ff001960ff199091166002171661010017905534801561002857600080fd5b5060405161139538038061139583398101604081905261004791610081565b6001600160601b0319606092831b8116608052911b1660a0526100b3565b80516001600160a01b038116811461007c57600080fd5b919050565b60008060408385031215610093578182fd5b61009c83610065565b91506100aa60208401610065565b90509250929050565b60805160601c60a05160601c6112af6100e6600039806103dc528061045f525080610200528061037152506112af6000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c80636348d26911610081578063d633ad611161005b578063d633ad6114610184578063e965c1921461018c578063ea455df914610194576100c9565b80636348d269146101545780639bcd850f14610169578063b71e0f7114610171576100c9565b80632ff20449116100b25780632ff204491461010c57806347713b391461012c5780635711c2a814610134576100c9565b806305af5d35146100ce5780630f222e65146100ec575b600080fd5b6100d66101a7565b6040516100e3919061112f565b60405180910390f35b6100ff6100fa366004610c82565b6101b0565b6040516100e39190611100565b61011f61011a366004610df7565b6101c2565b6040516100e39190611070565b6100d66101dd565b610147610142366004610d7f565b6101eb565b6040516100e39190610fa7565b61015c6101fe565b6040516100e39190610f86565b6100d6610222565b61011f61017f366004610d02565b61022b565b6100d661044f565b61015c61045d565b6101476101a2366004610d7f565b610481565b60005460ff1681565b6101b8610a73565b9695505050505050565b6101ca610a92565b6101d584848461048c565b949350505050565b600054610100900460ff1681565b60606101f682610666565b90505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005460ff1690565b610233610a92565b60008211610276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161026d90611039565b60405180910390fd5b60208311801561029c5750848484604051610292929190610f76565b6040518091039020145b6102d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161026d90610fdc565b60006102e16020828688611225565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505060208083015192935061036d915061032f908790818a611225565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525088925085915061048c9050565b92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16836060015173ffffffffffffffffffffffffffffffffffffffff1614156103da576103d48360c00151610666565b60c08401525b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16836060015173ffffffffffffffffffffffffffffffffffffffff1614156104455761043f8360c0015161074b565b60c08401525b5050949350505050565b600054610100900460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606101f68261074b565b610494610a92565b835160006104a38560206107f5565b90508082101561051457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4c617965725a65726f5061636b65743a20696e76616c6964207061636b657400604482015290519081900360640190fd5b6008860151600a870151868801600c8101516020909101518486039392919061ffff83166105a357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4c617965725a65726f5061636b65743a20696e76616c6964207061636b657400604482015290519081900360640190fd5b6105ab610ad0565b6105b5818c610872565b506105c58160008e602a8f6108ac565b506105ce610ad0565b86156105fc576105de8188610872565b506105fa60008e6105f08b60206107f5565b849291908b6108ac565b505b6040805160e08101825261ffff968716815294909516602085015267ffffffffffffffff9095169383019390935273ffffffffffffffffffffffffffffffffffffffff1660608201529051608082015260a08101879052905160c082015293505050509392505050565b6020810151606090600160ff82161415610744576000806000806000806000898060200190518101906106999190610e43565b97509750975097509750975097505060008151111561073c578151600090156106c3575060148201515b803b80610739576000826040516020016106dd9190610f46565b60408051601f1981840301815260208381018352600080855292519194509192610715928f928f928f928f928f928f928b920161113d565b60408051601f198184030181529190529c506101f99b505050505050505050505050565b50505b505050505050505b5090919050565b6060600080838060200190518101906107649190610db2565b915091506000808351111561077a575060148201515b73ffffffffffffffffffffffffffffffffffffffff81166107ec5760405161dead906000906107ad908390602001610f46565b604051602081830303815290604052905080846040516020016107d1929190610fba565b604051602081830303815290604052955050505050506101f9565b50929392505050565b60008282018381101561086957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b61087a610ad0565b602082061561088f5760208206602003820191505b506020828101829052604080518085526000815290920101905290565b6108b4610ad0565b856020015182860111156108de576108de866108d68860200151888601610968565b60020261097f565b6000808751805188602083010193508089870111156108fd5788860182525b5050508484015b602084106109235780518252601f199093019260209182019101610904565b5181517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60208690036101000a01908116901991909116179052508495945050505050565b60008183111561097957508161086c565b50919050565b815161098b8383610872565b50610996838261099c565b50505050565b6109a4610ad0565b610869838460000151518485516109b9610ad0565b82518211156109c757600080fd5b846020015182850111156109e9576109e9856108d68760200151878601610968565b600080865180518760208301019350808887011115610a085787860182525b505050602084015b60208410610a2f5780518252601f199093019260209182019101610a10565b5181517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60208690036101000a019081169019919091161790525083949350505050565b6040805160608082018352600080835260208301529181019190915290565b6040805160e08101825260008082526020820181905291810182905260608082018390526080820181905260a082019290925260c081019190915290565b604051806040016040528060608152602001600081525090565b60008083601f840112610afb578081fd5b50813567ffffffffffffffff811115610b12578182fd5b6020830191508360208083028501011115610b2c57600080fd5b9250929050565b600082601f830112610b43578081fd5b8135610b56610b5182611203565b6111df565b818152846020838601011115610b6a578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112610b94578081fd5b8151610ba2610b5182611203565b818152846020838601011115610bb6578283fd5b6101d582602083016020870161124d565b600060408284031215610bd8578081fd5b6040516040810181811067ffffffffffffffff82111715610bf557fe5b604052825181526020928301519281019290925250919050565b600060c08284031215610c20578081fd5b60405160c0810181811067ffffffffffffffff82111715610c3d57fe5b8060405250809150825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a08201525092915050565b60008060008060008060808789031215610c9a578182fd5b86359550602087013567ffffffffffffffff80821115610cb8578384fd5b610cc48a838b01610aea565b9097509550604089013594506060890135915080821115610ce3578384fd5b50610cf089828a01610aea565b979a9699509497509295939492505050565b60008060008060608587031215610d17578384fd5b84359350602085013567ffffffffffffffff80821115610d35578485fd5b818701915087601f830112610d48578485fd5b813581811115610d56578586fd5b886020828501011115610d67578586fd5b95986020929092019750949560400135945092505050565b600060208284031215610d90578081fd5b813567ffffffffffffffff811115610da6578182fd5b6101d584828501610b33565b60008060408385031215610dc4578182fd5b825167ffffffffffffffff811115610dda578283fd5b610de685828601610b84565b925050602083015190509250929050565b600080600060608486031215610e0b578283fd5b833567ffffffffffffffff811115610e21578384fd5b610e2d86828701610b33565b9660208601359650604090950135949350505050565b6000806000806000806000806101c0898b031215610e5f578182fd5b885160ff81168114610e6f578283fd5b80985050602089015196506040890151955060608901519450610e958a60808b01610bc7565b9350610ea48a60c08b01610c0f565b925061018089015167ffffffffffffffff80821115610ec1578384fd5b610ecd8c838d01610b84565b93506101a08b0151915080821115610ee3578283fd5b50610ef08b828c01610b84565b9150509295985092959890939650565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452610f3281602086016020860161124d565b601f01601f19169290920160200192915050565b60609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815260140190565b6000828483379101908152919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6000602082526108696020830184610f1a565b600060408252610fcd6040830185610f1a565b90508260208301529392505050565b60208082526023908201527f50726f6f664c69623a20696e76616c6964207472616e73616374696f6e20707260408201527f6f6f660000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f50726f6f664c69623a20696e76616c696420616464726573732073697a650000604082015260600190565b60006020825261ffff8084511660208401528060208501511660408401525067ffffffffffffffff604084015116606083015260608301516110b56080840182610f00565b50608083015160e060a08401526110d0610100840182610f1a565b905060a084015160c084015260c0840151601f198483030160e08501526110f78282610f1a565b95945050505050565b600060208252825160208301526020830151604083015260408301516060808401526101d56080840182610f1a565b60ff91909116815260200190565b60006101c060ff8b16835289602084015288604084015287606084015286516080840152602087015160a0840152855160c0840152602086015160e084015260408601516101008401526060860151610120840152608086015161014084015260a0860151610160840152806101808401526111bb81840186610f1a565b90508281036101a08401526111d08185610f1a565b9b9a5050505050505050505050565b60405181810167ffffffffffffffff811182821017156111fb57fe5b604052919050565b600067ffffffffffffffff82111561121757fe5b50601f01601f191660200190565b60008085851115611234578182fd5b83861115611240578182fd5b5050820193919092039150565b60005b83811015611268578181015183820152602001611250565b83811115610996575050600091015256fea26469706673582212200bc6632f15b3aab0b1a705a34639ab874b271ae5506d53b35dafc51882474b2b64736f6c6343000706003300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100c95760003560e01c80636348d26911610081578063d633ad611161005b578063d633ad6114610184578063e965c1921461018c578063ea455df914610194576100c9565b80636348d269146101545780639bcd850f14610169578063b71e0f7114610171576100c9565b80632ff20449116100b25780632ff204491461010c57806347713b391461012c5780635711c2a814610134576100c9565b806305af5d35146100ce5780630f222e65146100ec575b600080fd5b6100d66101a7565b6040516100e3919061112f565b60405180910390f35b6100ff6100fa366004610c82565b6101b0565b6040516100e39190611100565b61011f61011a366004610df7565b6101c2565b6040516100e39190611070565b6100d66101dd565b610147610142366004610d7f565b6101eb565b6040516100e39190610fa7565b61015c6101fe565b6040516100e39190610f86565b6100d6610222565b61011f61017f366004610d02565b61022b565b6100d661044f565b61015c61045d565b6101476101a2366004610d7f565b610481565b60005460ff1681565b6101b8610a73565b9695505050505050565b6101ca610a92565b6101d584848461048c565b949350505050565b600054610100900460ff1681565b60606101f682610666565b90505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005460ff1690565b610233610a92565b60008211610276576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161026d90611039565b60405180910390fd5b60208311801561029c5750848484604051610292929190610f76565b6040518091039020145b6102d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161026d90610fdc565b60006102e16020828688611225565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505060208083015192935061036d915061032f908790818a611225565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525088925085915061048c9050565b92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16836060015173ffffffffffffffffffffffffffffffffffffffff1614156103da576103d48360c00151610666565b60c08401525b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16836060015173ffffffffffffffffffffffffffffffffffffffff1614156104455761043f8360c0015161074b565b60c08401525b5050949350505050565b600054610100900460ff1690565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606101f68261074b565b610494610a92565b835160006104a38560206107f5565b90508082101561051457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4c617965725a65726f5061636b65743a20696e76616c6964207061636b657400604482015290519081900360640190fd5b6008860151600a870151868801600c8101516020909101518486039392919061ffff83166105a357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4c617965725a65726f5061636b65743a20696e76616c6964207061636b657400604482015290519081900360640190fd5b6105ab610ad0565b6105b5818c610872565b506105c58160008e602a8f6108ac565b506105ce610ad0565b86156105fc576105de8188610872565b506105fa60008e6105f08b60206107f5565b849291908b6108ac565b505b6040805160e08101825261ffff968716815294909516602085015267ffffffffffffffff9095169383019390935273ffffffffffffffffffffffffffffffffffffffff1660608201529051608082015260a08101879052905160c082015293505050509392505050565b6020810151606090600160ff82161415610744576000806000806000806000898060200190518101906106999190610e43565b97509750975097509750975097505060008151111561073c578151600090156106c3575060148201515b803b80610739576000826040516020016106dd9190610f46565b60408051601f1981840301815260208381018352600080855292519194509192610715928f928f928f928f928f928f928b920161113d565b60408051601f198184030181529190529c506101f99b505050505050505050505050565b50505b505050505050505b5090919050565b6060600080838060200190518101906107649190610db2565b915091506000808351111561077a575060148201515b73ffffffffffffffffffffffffffffffffffffffff81166107ec5760405161dead906000906107ad908390602001610f46565b604051602081830303815290604052905080846040516020016107d1929190610fba565b604051602081830303815290604052955050505050506101f9565b50929392505050565b60008282018381101561086957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b61087a610ad0565b602082061561088f5760208206602003820191505b506020828101829052604080518085526000815290920101905290565b6108b4610ad0565b856020015182860111156108de576108de866108d68860200151888601610968565b60020261097f565b6000808751805188602083010193508089870111156108fd5788860182525b5050508484015b602084106109235780518252601f199093019260209182019101610904565b5181517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60208690036101000a01908116901991909116179052508495945050505050565b60008183111561097957508161086c565b50919050565b815161098b8383610872565b50610996838261099c565b50505050565b6109a4610ad0565b610869838460000151518485516109b9610ad0565b82518211156109c757600080fd5b846020015182850111156109e9576109e9856108d68760200151878601610968565b600080865180518760208301019350808887011115610a085787860182525b505050602084015b60208410610a2f5780518252601f199093019260209182019101610a10565b5181517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60208690036101000a019081169019919091161790525083949350505050565b6040805160608082018352600080835260208301529181019190915290565b6040805160e08101825260008082526020820181905291810182905260608082018390526080820181905260a082019290925260c081019190915290565b604051806040016040528060608152602001600081525090565b60008083601f840112610afb578081fd5b50813567ffffffffffffffff811115610b12578182fd5b6020830191508360208083028501011115610b2c57600080fd5b9250929050565b600082601f830112610b43578081fd5b8135610b56610b5182611203565b6111df565b818152846020838601011115610b6a578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112610b94578081fd5b8151610ba2610b5182611203565b818152846020838601011115610bb6578283fd5b6101d582602083016020870161124d565b600060408284031215610bd8578081fd5b6040516040810181811067ffffffffffffffff82111715610bf557fe5b604052825181526020928301519281019290925250919050565b600060c08284031215610c20578081fd5b60405160c0810181811067ffffffffffffffff82111715610c3d57fe5b8060405250809150825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a08201525092915050565b60008060008060008060808789031215610c9a578182fd5b86359550602087013567ffffffffffffffff80821115610cb8578384fd5b610cc48a838b01610aea565b9097509550604089013594506060890135915080821115610ce3578384fd5b50610cf089828a01610aea565b979a9699509497509295939492505050565b60008060008060608587031215610d17578384fd5b84359350602085013567ffffffffffffffff80821115610d35578485fd5b818701915087601f830112610d48578485fd5b813581811115610d56578586fd5b886020828501011115610d67578586fd5b95986020929092019750949560400135945092505050565b600060208284031215610d90578081fd5b813567ffffffffffffffff811115610da6578182fd5b6101d584828501610b33565b60008060408385031215610dc4578182fd5b825167ffffffffffffffff811115610dda578283fd5b610de685828601610b84565b925050602083015190509250929050565b600080600060608486031215610e0b578283fd5b833567ffffffffffffffff811115610e21578384fd5b610e2d86828701610b33565b9660208601359650604090950135949350505050565b6000806000806000806000806101c0898b031215610e5f578182fd5b885160ff81168114610e6f578283fd5b80985050602089015196506040890151955060608901519450610e958a60808b01610bc7565b9350610ea48a60c08b01610c0f565b925061018089015167ffffffffffffffff80821115610ec1578384fd5b610ecd8c838d01610b84565b93506101a08b0151915080821115610ee3578283fd5b50610ef08b828c01610b84565b9150509295985092959890939650565b73ffffffffffffffffffffffffffffffffffffffff169052565b60008151808452610f3281602086016020860161124d565b601f01601f19169290920160200192915050565b60609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815260140190565b6000828483379101908152919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b6000602082526108696020830184610f1a565b600060408252610fcd6040830185610f1a565b90508260208301529392505050565b60208082526023908201527f50726f6f664c69623a20696e76616c6964207472616e73616374696f6e20707260408201527f6f6f660000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f50726f6f664c69623a20696e76616c696420616464726573732073697a650000604082015260600190565b60006020825261ffff8084511660208401528060208501511660408401525067ffffffffffffffff604084015116606083015260608301516110b56080840182610f00565b50608083015160e060a08401526110d0610100840182610f1a565b905060a084015160c084015260c0840151601f198483030160e08501526110f78282610f1a565b95945050505050565b600060208252825160208301526020830151604083015260408301516060808401526101d56080840182610f1a565b60ff91909116815260200190565b60006101c060ff8b16835289602084015288604084015287606084015286516080840152602087015160a0840152855160c0840152602086015160e084015260408601516101008401526060860151610120840152608086015161014084015260a0860151610160840152806101808401526111bb81840186610f1a565b90508281036101a08401526111d08185610f1a565b9b9a5050505050505050505050565b60405181810167ffffffffffffffff811182821017156111fb57fe5b604052919050565b600067ffffffffffffffff82111561121757fe5b50601f01601f191660200190565b60008085851115611234578182fd5b83861115611240578182fd5b5050820193919092039150565b60005b83811015611268578181015183820152602001611250565b83811115610996575050600091015256fea26469706673582212200bc6632f15b3aab0b1a705a34639ab874b271ae5506d53b35dafc51882474b2b64736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _stargateBridgeAddress (address): 0x0000000000000000000000000000000000000000
Arg [1] : _stargateTokenAddress (address): 0x0000000000000000000000000000000000000000
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.24
Net Worth in MNT
Token Allocations
AVAX
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| AVAX | 100.00% | $11.71 | 0.0204 | $0.23872 |
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.