Source Code
Latest 9 from a total of 9 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Trusted Remo... | 28464466 | 961 days ago | IN | 0 XDAI | 0.00016848 | ||||
| Send Message | 28464200 | 961 days ago | IN | 0.038 XDAI | 0.00023465 | ||||
| Send Message | 28463349 | 961 days ago | IN | 0.04 XDAI | 0.00023464 | ||||
| Send Message | 28463269 | 961 days ago | IN | 0.03736934 XDAI | 0.00062589 | ||||
| Set Trusted Remo... | 28463248 | 961 days ago | IN | 0 XDAI | 0.00020178 | ||||
| Send Message | 28462848 | 961 days ago | IN | 0.41878017 XDAI | 0.00040596 | ||||
| Set Trusted Remo... | 28462738 | 961 days ago | IN | 0 XDAI | 0.00016888 | ||||
| Set Trusted Remo... | 28462604 | 961 days ago | IN | 0 XDAI | 0.00003425 | ||||
| Set Trusted Remo... | 28462242 | 961 days ago | IN | 0 XDAI | 0.00016885 |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
HuyTruongMessage
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
/**
*Submitted for verification at gnosisscan.io on 2023-06-10
*/
// File: https://github.com/LayerZero-Labs/solidity-examples/blob/main/contracts/util/ExcessivelySafeCall.sol
pragma solidity >=0.7.6;
library ExcessivelySafeCall {
uint256 constant LOW_28_MASK =
0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff;
/// @notice Use when you _really_ really _really_ don't trust the called
/// contract. This prevents the called contract from causing reversion of
/// the caller in as many ways as we can.
/// @dev The main difference between this and a solidity low-level call is
/// that we limit the number of bytes that the callee can cause to be
/// copied to caller memory. This prevents stupid things like malicious
/// contracts returning 10,000,000 bytes causing a local OOG when copying
/// to memory.
/// @param _target The address to call
/// @param _gas The amount of gas to forward to the remote contract
/// @param _maxCopy The maximum number of bytes of returndata to copy
/// to memory.
/// @param _calldata The data to send to the remote contract
/// @return success and returndata, as `.call()`. Returndata is capped to
/// `_maxCopy` bytes.
function excessivelySafeCall(
address _target,
uint256 _gas,
uint16 _maxCopy,
bytes memory _calldata
) internal returns (bool, bytes memory) {
// set up for assembly call
uint256 _toCopy;
bool _success;
bytes memory _returnData = new bytes(_maxCopy);
// dispatch message to recipient
// by assembly calling "handle" function
// we call via assembly to avoid memcopying a very large returndata
// returned by a malicious contract
assembly {
_success := call(
_gas, // gas
_target, // recipient
0, // ether value
add(_calldata, 0x20), // inloc
mload(_calldata), // inlen
0, // outloc
0 // outlen
)
// limit our copy to 256 bytes
_toCopy := returndatasize()
if gt(_toCopy, _maxCopy) {
_toCopy := _maxCopy
}
// Store the length of the copied bytes
mstore(_returnData, _toCopy)
// copy the bytes from returndata[0:_toCopy]
returndatacopy(add(_returnData, 0x20), 0, _toCopy)
}
return (_success, _returnData);
}
/// @notice Use when you _really_ really _really_ don't trust the called
/// contract. This prevents the called contract from causing reversion of
/// the caller in as many ways as we can.
/// @dev The main difference between this and a solidity low-level call is
/// that we limit the number of bytes that the callee can cause to be
/// copied to caller memory. This prevents stupid things like malicious
/// contracts returning 10,000,000 bytes causing a local OOG when copying
/// to memory.
/// @param _target The address to call
/// @param _gas The amount of gas to forward to the remote contract
/// @param _maxCopy The maximum number of bytes of returndata to copy
/// to memory.
/// @param _calldata The data to send to the remote contract
/// @return success and returndata, as `.call()`. Returndata is capped to
/// `_maxCopy` bytes.
function excessivelySafeStaticCall(
address _target,
uint256 _gas,
uint16 _maxCopy,
bytes memory _calldata
) internal view returns (bool, bytes memory) {
// set up for assembly call
uint256 _toCopy;
bool _success;
bytes memory _returnData = new bytes(_maxCopy);
// dispatch message to recipient
// by assembly calling "handle" function
// we call via assembly to avoid memcopying a very large returndata
// returned by a malicious contract
assembly {
_success := staticcall(
_gas, // gas
_target, // recipient
add(_calldata, 0x20), // inloc
mload(_calldata), // inlen
0, // outloc
0 // outlen
)
// limit our copy to 256 bytes
_toCopy := returndatasize()
if gt(_toCopy, _maxCopy) {
_toCopy := _maxCopy
}
// Store the length of the copied bytes
mstore(_returnData, _toCopy)
// copy the bytes from returndata[0:_toCopy]
returndatacopy(add(_returnData, 0x20), 0, _toCopy)
}
return (_success, _returnData);
}
/**
* @notice Swaps function selectors in encoded contract calls
* @dev Allows reuse of encoded calldata for functions with identical
* argument types but different names. It simply swaps out the first 4 bytes
* for the new selector. This function modifies memory in place, and should
* only be used with caution.
* @param _newSelector The new 4-byte selector
* @param _buf The encoded contract args
*/
function swapSelector(
bytes4 _newSelector,
bytes memory _buf
) internal pure {
require(_buf.length >= 4);
uint256 _mask = LOW_28_MASK;
assembly {
// load the first word of
let _word := mload(add(_buf, 0x20))
// mask out the top 4 bytes
// /x
_word := and(_word, _mask)
_word := or(_newSelector, _word)
mstore(add(_buf, 0x20), _word)
}
}
}
// File: https://github.com/LayerZero-Labs/solidity-examples/blob/main/contracts/util/BytesLib.sol
/*
* @title Solidity Bytes Arrays Utils
* @author Gonçalo Sá <[email protected]>
*
* @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.
* The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.
*/
pragma solidity >=0.8.0 <0.9.0;
library BytesLib {
function concat(
bytes memory _preBytes,
bytes memory _postBytes
) internal pure returns (bytes memory) {
bytes memory tempBytes;
assembly {
// Get a location of some free memory and store it in tempBytes as
// Solidity does for memory variables.
tempBytes := mload(0x40)
// Store the length of the first bytes array at the beginning of
// the memory for tempBytes.
let length := mload(_preBytes)
mstore(tempBytes, length)
// Maintain a memory counter for the current write location in the
// temp bytes array by adding the 32 bytes for the array length to
// the starting location.
let mc := add(tempBytes, 0x20)
// Stop copying when the memory counter reaches the length of the
// first bytes array.
let end := add(mc, length)
for {
// Initialize a copy counter to the start of the _preBytes data,
// 32 bytes into its memory.
let cc := add(_preBytes, 0x20)
} lt(mc, end) {
// Increase both counters by 32 bytes each iteration.
mc := add(mc, 0x20)
cc := add(cc, 0x20)
} {
// Write the _preBytes data into the tempBytes memory 32 bytes
// at a time.
mstore(mc, mload(cc))
}
// Add the length of _postBytes to the current length of tempBytes
// and store it as the new length in the first 32 bytes of the
// tempBytes memory.
length := mload(_postBytes)
mstore(tempBytes, add(length, mload(tempBytes)))
// Move the memory counter back from a multiple of 0x20 to the
// actual end of the _preBytes data.
mc := end
// Stop copying when the memory counter reaches the new combined
// length of the arrays.
end := add(mc, length)
for {
let cc := add(_postBytes, 0x20)
} lt(mc, end) {
mc := add(mc, 0x20)
cc := add(cc, 0x20)
} {
mstore(mc, mload(cc))
}
// Update the free-memory pointer by padding our last write location
// to 32 bytes: add 31 bytes to the end of tempBytes to move to the
// next 32 byte block, then round down to the nearest multiple of
// 32. If the sum of the length of the two arrays is zero then add
// one before rounding down to leave a blank 32 bytes (the length block with 0).
mstore(
0x40,
and(
add(add(end, iszero(add(length, mload(_preBytes)))), 31),
not(31) // Round down to the nearest 32 bytes.
)
)
}
return tempBytes;
}
function concatStorage(
bytes storage _preBytes,
bytes memory _postBytes
) internal {
assembly {
// Read the first 32 bytes of _preBytes storage, which is the length
// of the array. (We don't need to use the offset into the slot
// because arrays use the entire slot.)
let fslot := sload(_preBytes.slot)
// Arrays of 31 bytes or less have an even value in their slot,
// while longer arrays have an odd value. The actual length is
// the slot divided by two for odd values, and the lowest order
// byte divided by two for even values.
// If the slot is even, bitwise and the slot with 255 and divide by
// two to get the length. If the slot is odd, bitwise and the slot
// with -1 and divide by two.
let slength := div(
and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)),
2
)
let mlength := mload(_postBytes)
let newlength := add(slength, mlength)
// slength can contain both the length and contents of the array
// if length < 32 bytes so let's prepare for that
// v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage
switch add(lt(slength, 32), lt(newlength, 32))
case 2 {
// Since the new array still fits in the slot, we just need to
// update the contents of the slot.
// uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length
sstore(
_preBytes.slot,
// all the modifications to the slot are inside this
// next block
add(
// we can just add to the slot contents because the
// bytes we want to change are the LSBs
fslot,
add(
mul(
div(
// load the bytes from memory
mload(add(_postBytes, 0x20)),
// zero all bytes to the right
exp(0x100, sub(32, mlength))
),
// and now shift left the number of bytes to
// leave space for the length in the slot
exp(0x100, sub(32, newlength))
),
// increase length by the double of the memory
// bytes length
mul(mlength, 2)
)
)
)
}
case 1 {
// The stored value fits in the slot, but the combined value
// will exceed it.
// get the keccak hash to get the contents of the array
mstore(0x0, _preBytes.slot)
let sc := add(keccak256(0x0, 0x20), div(slength, 32))
// save new length
sstore(_preBytes.slot, add(mul(newlength, 2), 1))
// The contents of the _postBytes array start 32 bytes into
// the structure. Our first read should obtain the `submod`
// bytes that can fit into the unused space in the last word
// of the stored array. To get this, we read 32 bytes starting
// from `submod`, so the data we read overlaps with the array
// contents by `submod` bytes. Masking the lowest-order
// `submod` bytes allows us to add that value directly to the
// stored value.
let submod := sub(32, slength)
let mc := add(_postBytes, submod)
let end := add(_postBytes, mlength)
let mask := sub(exp(0x100, submod), 1)
sstore(
sc,
add(
and(
fslot,
0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
),
and(mload(mc), mask)
)
)
for {
mc := add(mc, 0x20)
sc := add(sc, 1)
} lt(mc, end) {
sc := add(sc, 1)
mc := add(mc, 0x20)
} {
sstore(sc, mload(mc))
}
mask := exp(0x100, sub(mc, end))
sstore(sc, mul(div(mload(mc), mask), mask))
}
default {
// get the keccak hash to get the contents of the array
mstore(0x0, _preBytes.slot)
// Start copying to the last used word of the stored array.
let sc := add(keccak256(0x0, 0x20), div(slength, 32))
// save new length
sstore(_preBytes.slot, add(mul(newlength, 2), 1))
// Copy over the first `submod` bytes of the new data as in
// case 1 above.
let slengthmod := mod(slength, 32)
let mlengthmod := mod(mlength, 32)
let submod := sub(32, slengthmod)
let mc := add(_postBytes, submod)
let end := add(_postBytes, mlength)
let mask := sub(exp(0x100, submod), 1)
sstore(sc, add(sload(sc), and(mload(mc), mask)))
for {
sc := add(sc, 1)
mc := add(mc, 0x20)
} lt(mc, end) {
sc := add(sc, 1)
mc := add(mc, 0x20)
} {
sstore(sc, mload(mc))
}
mask := exp(0x100, sub(mc, end))
sstore(sc, mul(div(mload(mc), mask), mask))
}
}
}
function slice(
bytes memory _bytes,
uint256 _start,
uint256 _length
) internal pure returns (bytes memory) {
require(_length + 31 >= _length, "slice_overflow");
require(_bytes.length >= _start + _length, "slice_outOfBounds");
bytes memory tempBytes;
assembly {
switch iszero(_length)
case 0 {
// Get a location of some free memory and store it in tempBytes as
// Solidity does for memory variables.
tempBytes := mload(0x40)
// The first word of the slice result is potentially a partial
// word read from the original array. To read it, we calculate
// the length of that partial word and start copying that many
// bytes into the array. The first word we copy will start with
// data we don't care about, but the last `lengthmod` bytes will
// land at the beginning of the contents of the new array. When
// we're done copying, we overwrite the full first word with
// the actual length of the slice.
let lengthmod := and(_length, 31)
// The multiplication in the next line is necessary
// because when slicing multiples of 32 bytes (lengthmod == 0)
// the following copy loop was copying the origin's length
// and then ending prematurely not copying everything it should.
let mc := add(
add(tempBytes, lengthmod),
mul(0x20, iszero(lengthmod))
)
let end := add(mc, _length)
for {
// The multiplication in the next line has the same exact purpose
// as the one above.
let cc := add(
add(
add(_bytes, lengthmod),
mul(0x20, iszero(lengthmod))
),
_start
)
} lt(mc, end) {
mc := add(mc, 0x20)
cc := add(cc, 0x20)
} {
mstore(mc, mload(cc))
}
mstore(tempBytes, _length)
//update free-memory pointer
//allocating the array padded to 32 bytes like the compiler does now
mstore(0x40, and(add(mc, 31), not(31)))
}
//if we want a zero-length slice let's just return a zero-length array
default {
tempBytes := mload(0x40)
//zero out the 32 bytes slice we are about to return
//we need to do it because Solidity does not garbage collect
mstore(tempBytes, 0)
mstore(0x40, add(tempBytes, 0x20))
}
}
return tempBytes;
}
function toAddress(
bytes memory _bytes,
uint256 _start
) internal pure returns (address) {
require(_bytes.length >= _start + 20, "toAddress_outOfBounds");
address tempAddress;
assembly {
tempAddress := div(
mload(add(add(_bytes, 0x20), _start)),
0x1000000000000000000000000
)
}
return tempAddress;
}
function toUint8(
bytes memory _bytes,
uint256 _start
) internal pure returns (uint8) {
require(_bytes.length >= _start + 1, "toUint8_outOfBounds");
uint8 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0x1), _start))
}
return tempUint;
}
function toUint16(
bytes memory _bytes,
uint256 _start
) internal pure returns (uint16) {
require(_bytes.length >= _start + 2, "toUint16_outOfBounds");
uint16 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0x2), _start))
}
return tempUint;
}
function toUint32(
bytes memory _bytes,
uint256 _start
) internal pure returns (uint32) {
require(_bytes.length >= _start + 4, "toUint32_outOfBounds");
uint32 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0x4), _start))
}
return tempUint;
}
function toUint64(
bytes memory _bytes,
uint256 _start
) internal pure returns (uint64) {
require(_bytes.length >= _start + 8, "toUint64_outOfBounds");
uint64 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0x8), _start))
}
return tempUint;
}
function toUint96(
bytes memory _bytes,
uint256 _start
) internal pure returns (uint96) {
require(_bytes.length >= _start + 12, "toUint96_outOfBounds");
uint96 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0xc), _start))
}
return tempUint;
}
function toUint128(
bytes memory _bytes,
uint256 _start
) internal pure returns (uint128) {
require(_bytes.length >= _start + 16, "toUint128_outOfBounds");
uint128 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0x10), _start))
}
return tempUint;
}
function toUint256(
bytes memory _bytes,
uint256 _start
) internal pure returns (uint256) {
require(_bytes.length >= _start + 32, "toUint256_outOfBounds");
uint256 tempUint;
assembly {
tempUint := mload(add(add(_bytes, 0x20), _start))
}
return tempUint;
}
function toBytes32(
bytes memory _bytes,
uint256 _start
) internal pure returns (bytes32) {
require(_bytes.length >= _start + 32, "toBytes32_outOfBounds");
bytes32 tempBytes32;
assembly {
tempBytes32 := mload(add(add(_bytes, 0x20), _start))
}
return tempBytes32;
}
function equal(
bytes memory _preBytes,
bytes memory _postBytes
) internal pure returns (bool) {
bool success = true;
assembly {
let length := mload(_preBytes)
// if lengths don't match the arrays are not equal
switch eq(length, mload(_postBytes))
case 1 {
// cb is a circuit breaker in the for loop since there's
// no said feature for inline assembly loops
// cb = 1 - don't breaker
// cb = 0 - break
let cb := 1
let mc := add(_preBytes, 0x20)
let end := add(mc, length)
for {
let cc := add(_postBytes, 0x20)
// the next line is the loop condition:
// while(uint256(mc < end) + cb == 2)
} eq(add(lt(mc, end), cb), 2) {
mc := add(mc, 0x20)
cc := add(cc, 0x20)
} {
// if any of these checks fails then arrays are not equal
if iszero(eq(mload(mc), mload(cc))) {
// unsuccess:
success := 0
cb := 0
}
}
}
default {
// unsuccess:
success := 0
}
}
return success;
}
function equalStorage(
bytes storage _preBytes,
bytes memory _postBytes
) internal view returns (bool) {
bool success = true;
assembly {
// we know _preBytes_offset is 0
let fslot := sload(_preBytes.slot)
// Decode the length of the stored array like in concatStorage().
let slength := div(
and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)),
2
)
let mlength := mload(_postBytes)
// if lengths don't match the arrays are not equal
switch eq(slength, mlength)
case 1 {
// slength can contain both the length and contents of the array
// if length < 32 bytes so let's prepare for that
// v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage
if iszero(iszero(slength)) {
switch lt(slength, 32)
case 1 {
// blank the last byte which is the length
fslot := mul(div(fslot, 0x100), 0x100)
if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {
// unsuccess:
success := 0
}
}
default {
// cb is a circuit breaker in the for loop since there's
// no said feature for inline assembly loops
// cb = 1 - don't breaker
// cb = 0 - break
let cb := 1
// get the keccak hash to get the contents of the array
mstore(0x0, _preBytes.slot)
let sc := keccak256(0x0, 0x20)
let mc := add(_postBytes, 0x20)
let end := add(mc, mlength)
// the next line is the loop condition:
// while(uint256(mc < end) + cb == 2)
for {
} eq(add(lt(mc, end), cb), 2) {
sc := add(sc, 1)
mc := add(mc, 0x20)
} {
if iszero(eq(sload(sc), mload(mc))) {
// unsuccess:
success := 0
cb := 0
}
}
}
}
}
default {
// unsuccess:
success := 0
}
}
return success;
}
}
// File: https://github.com/LayerZero-Labs/solidity-examples/blob/main/contracts/interfaces/ILayerZeroUserApplicationConfig.sol
pragma solidity >=0.5.0;
interface ILayerZeroUserApplicationConfig {
// @notice set the configuration of the LayerZero messaging library of the specified version
// @param _version - messaging library version
// @param _chainId - the chainId for the pending config change
// @param _configType - type of configuration. every messaging library has its own convention.
// @param _config - configuration in the bytes. can encode arbitrary content.
function setConfig(
uint16 _version,
uint16 _chainId,
uint _configType,
bytes calldata _config
) external;
// @notice set the send() LayerZero messaging library version to _version
// @param _version - new messaging library version
function setSendVersion(uint16 _version) external;
// @notice set the lzReceive() LayerZero messaging library version to _version
// @param _version - new messaging library version
function setReceiveVersion(uint16 _version) external;
// @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload
// @param _srcChainId - the chainId of the source chain
// @param _srcAddress - the contract address of the source contract at the source chain
function forceResumeReceive(
uint16 _srcChainId,
bytes calldata _srcAddress
) external;
}
// File: https://github.com/LayerZero-Labs/solidity-examples/blob/main/contracts/interfaces/ILayerZeroEndpoint.sol
pragma solidity >=0.5.0;
interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {
// @notice send a LayerZero message to the specified address at a LayerZero endpoint.
// @param _dstChainId - the destination chain identifier
// @param _destination - the address on destination chain (in bytes). address length/format may vary by chains
// @param _payload - a custom bytes payload to send to the destination contract
// @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address
// @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction
// @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination
function send(
uint16 _dstChainId,
bytes calldata _destination,
bytes calldata _payload,
address payable _refundAddress,
address _zroPaymentAddress,
bytes calldata _adapterParams
) external payable;
// @notice used by the messaging library to publish verified payload
// @param _srcChainId - the source chain identifier
// @param _srcAddress - the source contract (as bytes) at the source chain
// @param _dstAddress - the address on destination chain
// @param _nonce - the unbound message ordering nonce
// @param _gasLimit - the gas limit for external contract execution
// @param _payload - verified payload to send to the destination contract
function receivePayload(
uint16 _srcChainId,
bytes calldata _srcAddress,
address _dstAddress,
uint64 _nonce,
uint _gasLimit,
bytes calldata _payload
) external;
// @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain
// @param _srcChainId - the source chain identifier
// @param _srcAddress - the source chain contract address
function getInboundNonce(
uint16 _srcChainId,
bytes calldata _srcAddress
) external view returns (uint64);
// @notice get the outboundNonce from this source chain which, consequently, is always an EVM
// @param _srcAddress - the source chain contract address
function getOutboundNonce(
uint16 _dstChainId,
address _srcAddress
) external view returns (uint64);
// @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery
// @param _dstChainId - the destination chain identifier
// @param _userApplication - the user app address on this EVM chain
// @param _payload - the custom message to send over LayerZero
// @param _payInZRO - if false, user app pays the protocol fee in native token
// @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain
function estimateFees(
uint16 _dstChainId,
address _userApplication,
bytes calldata _payload,
bool _payInZRO,
bytes calldata _adapterParam
) external view returns (uint nativeFee, uint zroFee);
// @notice get this Endpoint's immutable source identifier
function getChainId() external view returns (uint16);
// @notice the interface to retry failed message on this Endpoint destination
// @param _srcChainId - the source chain identifier
// @param _srcAddress - the source chain contract address
// @param _payload - the payload to be retried
function retryPayload(
uint16 _srcChainId,
bytes calldata _srcAddress,
bytes calldata _payload
) external;
// @notice query if any STORED payload (message blocking) at the endpoint.
// @param _srcChainId - the source chain identifier
// @param _srcAddress - the source chain contract address
function hasStoredPayload(
uint16 _srcChainId,
bytes calldata _srcAddress
) external view returns (bool);
// @notice query if the _libraryAddress is valid for sending msgs.
// @param _userApplication - the user app address on this EVM chain
function getSendLibraryAddress(
address _userApplication
) external view returns (address);
// @notice query if the _libraryAddress is valid for receiving msgs.
// @param _userApplication - the user app address on this EVM chain
function getReceiveLibraryAddress(
address _userApplication
) external view returns (address);
// @notice query if the non-reentrancy guard for send() is on
// @return true if the guard is on. false otherwise
function isSendingPayload() external view returns (bool);
// @notice query if the non-reentrancy guard for receive() is on
// @return true if the guard is on. false otherwise
function isReceivingPayload() external view returns (bool);
// @notice get the configuration of the LayerZero messaging library of the specified version
// @param _version - messaging library version
// @param _chainId - the chainId for the pending config change
// @param _userApplication - the contract address of the user application
// @param _configType - type of configuration. every messaging library has its own convention.
function getConfig(
uint16 _version,
uint16 _chainId,
address _userApplication,
uint _configType
) external view returns (bytes memory);
// @notice get the send() LayerZero messaging library version
// @param _userApplication - the contract address of the user application
function getSendVersion(
address _userApplication
) external view returns (uint16);
// @notice get the lzReceive() LayerZero messaging library version
// @param _userApplication - the contract address of the user application
function getReceiveVersion(
address _userApplication
) external view returns (uint16);
}
// File: https://github.com/LayerZero-Labs/solidity-examples/blob/main/contracts/interfaces/ILayerZeroReceiver.sol
pragma solidity >=0.5.0;
interface ILayerZeroReceiver {
// @notice LayerZero endpoint will invoke this function to deliver the message on the destination
// @param _srcChainId - the source endpoint identifier
// @param _srcAddress - the source sending contract address from the source chain
// @param _nonce - the ordered message nonce
// @param _payload - the signed payload is the UA bytes has encoded to be sent
function lzReceive(
uint16 _srcChainId,
bytes calldata _srcAddress,
uint64 _nonce,
bytes calldata _payload
) external;
}
// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @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;
}
}
// File: @openzeppelin/contracts/access/Ownable.sol
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
/**
* @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.
*
* By default, the owner account will be the one that deploys the contract. 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;
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @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 {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @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 {
require(
newOwner != address(0),
"Ownable: new owner is the zero address"
);
_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);
}
}
// File: https://github.com/LayerZero-Labs/solidity-examples/blob/main/contracts/lzApp/LzApp.sol
pragma solidity ^0.8.0;
/*
* a generic LzReceiver implementation
*/
abstract contract LzApp is
Ownable,
ILayerZeroReceiver,
ILayerZeroUserApplicationConfig
{
using BytesLib for bytes;
// ua can not send payload larger than this by default, but it can be changed by the ua owner
uint public constant DEFAULT_PAYLOAD_SIZE_LIMIT = 10000;
ILayerZeroEndpoint public immutable lzEndpoint;
mapping(uint16 => bytes) public trustedRemoteLookup;
mapping(uint16 => mapping(uint16 => uint)) public minDstGasLookup;
mapping(uint16 => uint) public payloadSizeLimitLookup;
address public precrime;
event SetPrecrime(address precrime);
event SetTrustedRemote(uint16 _remoteChainId, bytes _path);
event SetTrustedRemoteAddress(uint16 _remoteChainId, bytes _remoteAddress);
event SetMinDstGas(uint16 _dstChainId, uint16 _type, uint _minDstGas);
constructor(address _endpoint) {
lzEndpoint = ILayerZeroEndpoint(_endpoint);
}
function lzReceive(
uint16 _srcChainId,
bytes calldata _srcAddress,
uint64 _nonce,
bytes calldata _payload
) public virtual override {
// lzReceive must be called by the endpoint for security
require(
_msgSender() == address(lzEndpoint),
"LzApp: invalid endpoint caller"
);
bytes memory trustedRemote = trustedRemoteLookup[_srcChainId];
// if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote.
require(
_srcAddress.length == trustedRemote.length &&
trustedRemote.length > 0 &&
keccak256(_srcAddress) == keccak256(trustedRemote),
"LzApp: invalid source sending contract"
);
_blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
}
// abstract function - the default behaviour of LayerZero is blocking. See: NonblockingLzApp if you dont need to enforce ordered messaging
function _blockingLzReceive(
uint16 _srcChainId,
bytes memory _srcAddress,
uint64 _nonce,
bytes memory _payload
) internal virtual;
function _lzSend(
uint16 _dstChainId,
bytes memory _payload,
address payable _refundAddress,
address _zroPaymentAddress,
bytes memory _adapterParams,
uint _nativeFee
) internal virtual {
bytes memory trustedRemote = trustedRemoteLookup[_dstChainId];
require(
trustedRemote.length != 0,
"LzApp: destination chain is not a trusted source"
);
_checkPayloadSize(_dstChainId, _payload.length);
lzEndpoint.send{value: _nativeFee}(
_dstChainId,
trustedRemote,
_payload,
_refundAddress,
_zroPaymentAddress,
_adapterParams
);
}
function _checkGasLimit(
uint16 _dstChainId,
uint16 _type,
bytes memory _adapterParams,
uint _extraGas
) internal view virtual {
uint providedGasLimit = _getGasLimit(_adapterParams);
uint minGasLimit = minDstGasLookup[_dstChainId][_type] + _extraGas;
require(minGasLimit > 0, "LzApp: minGasLimit not set");
require(providedGasLimit >= minGasLimit, "LzApp: gas limit is too low");
}
function _getGasLimit(
bytes memory _adapterParams
) internal pure virtual returns (uint gasLimit) {
require(_adapterParams.length >= 34, "LzApp: invalid adapterParams");
assembly {
gasLimit := mload(add(_adapterParams, 34))
}
}
function _checkPayloadSize(
uint16 _dstChainId,
uint _payloadSize
) internal view virtual {
uint payloadSizeLimit = payloadSizeLimitLookup[_dstChainId];
if (payloadSizeLimit == 0) {
// use default if not set
payloadSizeLimit = DEFAULT_PAYLOAD_SIZE_LIMIT;
}
require(
_payloadSize <= payloadSizeLimit,
"LzApp: payload size is too large"
);
}
//---------------------------UserApplication config----------------------------------------
function getConfig(
uint16 _version,
uint16 _chainId,
address,
uint _configType
) external view returns (bytes memory) {
return
lzEndpoint.getConfig(
_version,
_chainId,
address(this),
_configType
);
}
// generic config for LayerZero user Application
function setConfig(
uint16 _version,
uint16 _chainId,
uint _configType,
bytes calldata _config
) external override onlyOwner {
lzEndpoint.setConfig(_version, _chainId, _configType, _config);
}
function setSendVersion(uint16 _version) external override onlyOwner {
lzEndpoint.setSendVersion(_version);
}
function setReceiveVersion(uint16 _version) external override onlyOwner {
lzEndpoint.setReceiveVersion(_version);
}
function forceResumeReceive(
uint16 _srcChainId,
bytes calldata _srcAddress
) external override onlyOwner {
lzEndpoint.forceResumeReceive(_srcChainId, _srcAddress);
}
// _path = abi.encodePacked(remoteAddress, localAddress)
// this function set the trusted path for the cross-chain communication
function setTrustedRemote(
uint16 _remoteChainId,
bytes calldata _path
) external onlyOwner {
trustedRemoteLookup[_remoteChainId] = _path;
emit SetTrustedRemote(_remoteChainId, _path);
}
function setTrustedRemoteAddress(
uint16 _remoteChainId,
bytes calldata _remoteAddress
) external onlyOwner {
trustedRemoteLookup[_remoteChainId] = abi.encodePacked(
_remoteAddress,
address(this)
);
emit SetTrustedRemoteAddress(_remoteChainId, _remoteAddress);
}
function getTrustedRemoteAddress(
uint16 _remoteChainId
) external view returns (bytes memory) {
bytes memory path = trustedRemoteLookup[_remoteChainId];
require(path.length != 0, "LzApp: no trusted path record");
return path.slice(0, path.length - 20); // the last 20 bytes should be address(this)
}
function setPrecrime(address _precrime) external onlyOwner {
precrime = _precrime;
emit SetPrecrime(_precrime);
}
function setMinDstGas(
uint16 _dstChainId,
uint16 _packetType,
uint _minGas
) external onlyOwner {
require(_minGas > 0, "LzApp: invalid minGas");
minDstGasLookup[_dstChainId][_packetType] = _minGas;
emit SetMinDstGas(_dstChainId, _packetType, _minGas);
}
// if the size is 0, it means default size limit
function setPayloadSizeLimit(
uint16 _dstChainId,
uint _size
) external onlyOwner {
payloadSizeLimitLookup[_dstChainId] = _size;
}
//--------------------------- VIEW FUNCTION ----------------------------------------
function isTrustedRemote(
uint16 _srcChainId,
bytes calldata _srcAddress
) external view returns (bool) {
bytes memory trustedSource = trustedRemoteLookup[_srcChainId];
return keccak256(trustedSource) == keccak256(_srcAddress);
}
}
// File: https://github.com/LayerZero-Labs/solidity-examples/blob/main/contracts/lzApp/NonblockingLzApp.sol
pragma solidity ^0.8.0;
/*
* the default LayerZero messaging behaviour is blocking, i.e. any failed message will block the channel
* this abstract class try-catch all fail messages and store locally for future retry. hence, non-blocking
* NOTE: if the srcAddress is not configured properly, it will still block the message pathway from (srcChainId, srcAddress)
*/
abstract contract NonblockingLzApp is LzApp {
using ExcessivelySafeCall for address;
constructor(address _endpoint) LzApp(_endpoint) {}
mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32)))
public failedMessages;
event MessageFailed(
uint16 _srcChainId,
bytes _srcAddress,
uint64 _nonce,
bytes _payload,
bytes _reason
);
event RetryMessageSuccess(
uint16 _srcChainId,
bytes _srcAddress,
uint64 _nonce,
bytes32 _payloadHash
);
// overriding the virtual function in LzReceiver
function _blockingLzReceive(
uint16 _srcChainId,
bytes memory _srcAddress,
uint64 _nonce,
bytes memory _payload
) internal virtual override {
(bool success, bytes memory reason) = address(this).excessivelySafeCall(
gasleft(),
150,
abi.encodeWithSelector(
this.nonblockingLzReceive.selector,
_srcChainId,
_srcAddress,
_nonce,
_payload
)
);
// try-catch all errors/exceptions
if (!success) {
_storeFailedMessage(
_srcChainId,
_srcAddress,
_nonce,
_payload,
reason
);
}
}
function _storeFailedMessage(
uint16 _srcChainId,
bytes memory _srcAddress,
uint64 _nonce,
bytes memory _payload,
bytes memory _reason
) internal virtual {
failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload);
emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload, _reason);
}
function nonblockingLzReceive(
uint16 _srcChainId,
bytes calldata _srcAddress,
uint64 _nonce,
bytes calldata _payload
) public virtual {
// only internal transaction
require(
_msgSender() == address(this),
"NonblockingLzApp: caller must be LzApp"
);
_nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
}
//@notice override this function
function _nonblockingLzReceive(
uint16 _srcChainId,
bytes memory _srcAddress,
uint64 _nonce,
bytes memory _payload
) internal virtual;
function retryMessage(
uint16 _srcChainId,
bytes calldata _srcAddress,
uint64 _nonce,
bytes calldata _payload
) public payable virtual {
// assert there is message to retry
bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress][_nonce];
require(
payloadHash != bytes32(0),
"NonblockingLzApp: no stored message"
);
require(
keccak256(_payload) == payloadHash,
"NonblockingLzApp: invalid payload"
);
// clear the stored message
failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0);
// execute the message. revert if it fails again
_nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
emit RetryMessageSuccess(_srcChainId, _srcAddress, _nonce, payloadHash);
}
// function lzReceive(
// uint16 _srcChainId,
// bytes calldata _srcAddress,
// uint64 _nonce,
// bytes calldata _payload
// ) public virtual override {
// // lzReceive must be called by the endpoint for security
// require(
// _msgSender() == address(lzEndpoint),
// "LzApp: invalid endpoint caller"
// );
// bytes memory trustedRemote = trustedRemoteLookup[_srcChainId];
// // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote.
// require(
// _srcAddress.length == trustedRemote.length &&
// trustedRemote.length > 0 &&
// keccak256(_srcAddress) == keccak256(trustedRemote),
// "LzApp: invalid source sending contract"
// );
// _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
// }//@audit change
}
// File: gist-54b79e3a5b95605c298edaf2f23614cd/SimpleGeneralMessage.sol
pragma solidity ^0.8.12;
contract HuyTruongMessage is NonblockingLzApp {
using BytesLib for bytes;
uint256 fee; //fee=10000 => 100%
uint public constant BASE_FEE = 10000;
mapping(address => string) public lastMessage;
constructor(
address _lzEndpoint,
uint256 _fee
) NonblockingLzApp(_lzEndpoint) {
fee = _fee;
}
function _nonblockingLzReceive(
uint16,
bytes memory,
uint64,
bytes memory _payload
) internal override {
(address sender, string memory message) = abi.decode(
_payload,
(address, string)
);
lastMessage[sender] = message;
}
function configFee(uint256 _fee) external onlyOwner {
fee = _fee;
}
function sendMessage(
string memory message,
uint16 destChainId
) external payable {
bytes memory payload = abi.encode(msg.sender, message);
(uint256 lzFee, uint256 protocolFee) = _getMessageFee(
destChainId,
payload
);
require(msg.value >= lzFee + protocolFee, "not enough fee");
_lzSend({
_dstChainId: destChainId,
_payload: payload,
_refundAddress: payable(msg.sender),
_zroPaymentAddress: address(0x0),
_adapterParams: bytes(""),
_nativeFee: lzFee
});
}
//NEW FEATURE:
function getMessageFee(
string memory message,
uint16 destChainId
) external view returns (uint totalFee) {
bytes memory payload = abi.encode(msg.sender, message);
(uint256 lzFee, uint256 protocolFee) = _getMessageFee(
destChainId,
payload
);
totalFee = lzFee + protocolFee;
}
function _getMessageFee(
uint16 destChainId,
bytes memory payload
) internal view returns (uint lzFee, uint protocolFee) {
(lzFee, ) = lzEndpoint.estimateFees({
_dstChainId: destChainId,
_userApplication: address(this),
_payload: payload,
_payInZRO: false,
_adapterParam: bytes("")
});
protocolFee = (lzFee * fee) / BASE_FEE;
}
function withdraw() public onlyOwner {
payable(msg.sender).transfer(address(this).balance);
}
function setTrustedRemoteAddresses(
uint16[] calldata _remoteChainIds,
bytes[] calldata _remoteAddresses
) external onlyOwner {
require(
_remoteChainIds.length == _remoteAddresses.length,
"not equal length"
);
for (uint256 i = 0; i < _remoteChainIds.length; i++) {
trustedRemoteLookup[_remoteChainIds[i]] = abi.encodePacked(
_remoteAddresses[i],
address(this)
);
}
}
function lzReceive(
uint16 _srcChainId,
bytes calldata _srcAddress,
uint64 _nonce,
bytes calldata _payload
) public virtual override {
// lzReceive must be called by the endpoint for security
require(
_msgSender() == address(lzEndpoint),
"LzApp: invalid endpoint caller"
);
// bytes memory trustedRemote = trustedRemoteLookup[_srcChainId];
// // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote.
// require(
// _srcAddress.length == trustedRemote.length &&
// trustedRemote.length > 0 &&
// keccak256(_srcAddress) == keccak256(trustedRemote),
// "LzApp: invalid source sending contract"
// );
_nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_lzEndpoint","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_reason","type":"bytes"}],"name":"MessageFailed","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"RetryMessageSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"_type","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"_minDstGas","type":"uint256"}],"name":"SetMinDstGas","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"precrime","type":"address"}],"name":"SetPrecrime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_path","type":"bytes"}],"name":"SetTrustedRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"SetTrustedRemoteAddress","type":"event"},{"inputs":[],"name":"BASE_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_PAYLOAD_SIZE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"configFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"failedMessages","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"message","type":"string"},{"internalType":"uint16","name":"destChainId","type":"uint16"}],"name":"getMessageFee","outputs":[{"internalType":"uint256","name":"totalFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"}],"name":"getTrustedRemoteAddress","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"isTrustedRemote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastMessage","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lzEndpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"minDstGasLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"nonblockingLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"payloadSizeLimitLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"precrime","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"message","type":"string"},{"internalType":"uint16","name":"destChainId","type":"uint16"}],"name":"sendMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint16","name":"_packetType","type":"uint16"},{"internalType":"uint256","name":"_minGas","type":"uint256"}],"name":"setMinDstGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_size","type":"uint256"}],"name":"setPayloadSizeLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_precrime","type":"address"}],"name":"setPrecrime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_path","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"setTrustedRemoteAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"_remoteChainIds","type":"uint16[]"},{"internalType":"bytes[]","name":"_remoteAddresses","type":"bytes[]"}],"name":"setTrustedRemoteAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a06040523480156200001157600080fd5b5060405162002550380380620025508339810160408190526200003491620000a8565b8180620000413362000058565b6001600160a01b03166080525060065550620000e4565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008060408385031215620000bc57600080fd5b82516001600160a01b0381168114620000d457600080fd5b6020939093015192949293505050565b60805161241862000138600039600081816104d10152818161063c01528181610755015281816107fd0152818161095701528181610d4c01528181611290015281816115cc015261179801526124186000f3fe6080604052600436106101e25760003560e01c80639f38369a11610102578063d1deba1f11610095578063ed76c2f411610064578063ed76c2f4146105c6578063f2fde38b146105e6578063f5ecbdbc14610606578063faba50351461062657600080fd5b8063d1deba1f14610553578063df2a5b3b14610566578063eb8d72b714610586578063ecfd594d146105a657600080fd5b8063baf3292d116100d1578063baf3292d146104f3578063c44618341461027e578063cbb4c4cf14610513578063cbed8b9c1461053357600080fd5b80639f38369a1461045f578063a6c3d1651461047f578063b18dfd3d1461049f578063b353aaa7146104bf57600080fd5b806342d65a8d1161017a5780637533d788116101495780637533d788146103a85780638cfd8f5c146103d55780638da5cb5b1461040d578063950c8a741461043f57600080fd5b806342d65a8d146103045780635b8c41e61461032457806366ad5c8a14610373578063715018a61461039357600080fd5b80633ccfd60b116101b65780633ccfd60b146102695780633d18651e1461027e5780633d8b38f6146102a75780633f1f4fa4146102d757600080fd5b80621d3567146101e757806307e0db17146102095780630df374831461022957806310ddb13714610249575b600080fd5b3480156101f357600080fd5b50610207610202366004611900565b610639565b005b34801561021557600080fd5b50610207610224366004611993565b610734565b34801561023557600080fd5b506102076102443660046119ae565b6107bd565b34801561025557600080fd5b50610207610264366004611993565b6107dc565b34801561027557600080fd5b50610207610834565b34801561028a57600080fd5b5061029461271081565b6040519081526020015b60405180910390f35b3480156102b357600080fd5b506102c76102c23660046119d8565b61086b565b604051901515815260200161029e565b3480156102e357600080fd5b506102946102f2366004611993565b60036020526000908152604090205481565b34801561031057600080fd5b5061020761031f3660046119d8565b610938565b34801561033057600080fd5b5061029461033f366004611ad5565b6005602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561037f57600080fd5b5061020761038e366004611900565b6109c7565b34801561039f57600080fd5b50610207610a25565b3480156103b457600080fd5b506103c86103c3366004611993565b610a39565b60405161029e9190611b96565b3480156103e157600080fd5b506102946103f0366004611ba9565b600260209081526000928352604080842090915290825290205481565b34801561041957600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161029e565b34801561044b57600080fd5b50600454610427906001600160a01b031681565b34801561046b57600080fd5b506103c861047a366004611993565b610ad3565b34801561048b57600080fd5b5061020761049a3660046119d8565b610be2565b3480156104ab57600080fd5b506103c86104ba366004611be8565b610c6b565b3480156104cb57600080fd5b506104277f000000000000000000000000000000000000000000000000000000000000000081565b3480156104ff57600080fd5b5061020761050e366004611be8565b610c84565b34801561051f57600080fd5b5061029461052e366004611c05565b610ce0565b34801561053f57600080fd5b5061020761054e366004611c5d565b610d2d565b610207610561366004611900565b610dc2565b34801561057257600080fd5b50610207610581366004611ccb565b610fd8565b34801561059257600080fd5b506102076105a13660046119d8565b61108a565b3480156105b257600080fd5b506102076105c1366004611d4b565b6110e4565b3480156105d257600080fd5b506102076105e1366004611db6565b6111dc565b3480156105f257600080fd5b50610207610601366004611be8565b6111e9565b34801561061257600080fd5b506103c8610621366004611dcf565b61125f565b610207610634366004611c05565b611310565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146106b65760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61072c8686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8901819004810282018101909252878152899350915087908790819084018382808284376000920191909152506113b092505050565b505050505050565b61073c6113ee565b6040516307e0db1760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906307e0db17906024015b600060405180830381600087803b1580156107a257600080fd5b505af11580156107b6573d6000803e3d6000fd5b5050505050565b6107c56113ee565b61ffff909116600090815260036020526040902055565b6107e46113ee565b6040516310ddb13760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906310ddb13790602401610788565b61083c6113ee565b60405133904780156108fc02916000818181858888f19350505050158015610868573d6000803e3d6000fd5b50565b61ffff83166000908152600160205260408120805482919061088c90611e1c565b80601f01602080910402602001604051908101604052809291908181526020018280546108b890611e1c565b80156109055780601f106108da57610100808354040283529160200191610905565b820191906000526020600020905b8154815290600101906020018083116108e857829003601f168201915b50505050509050838360405161091c929190611e56565b60405180910390208180519060200120149150505b9392505050565b6109406113ee565b6040516342d65a8d60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342d65a8d9061099090869086908690600401611e8f565b600060405180830381600087803b1580156109aa57600080fd5b505af11580156109be573d6000803e3d6000fd5b50505050505050565b3330146106b65760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b60648201526084016106ad565b610a2d6113ee565b610a376000611448565b565b60016020526000908152604090208054610a5290611e1c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7e90611e1c565b8015610acb5780601f10610aa057610100808354040283529160200191610acb565b820191906000526020600020905b815481529060010190602001808311610aae57829003601f168201915b505050505081565b61ffff8116600090815260016020526040812080546060929190610af690611e1c565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2290611e1c565b8015610b6f5780601f10610b4457610100808354040283529160200191610b6f565b820191906000526020600020905b815481529060010190602001808311610b5257829003601f168201915b505050505090508051600003610bc75760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f726400000060448201526064016106ad565b610931600060148351610bda9190611ec3565b839190611498565b610bea6113ee565b818130604051602001610bff93929190611edc565b60408051601f1981840301815291815261ffff8516600090815260016020522090610c2a9082611f48565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce838383604051610c5e93929190611e8f565b60405180910390a1505050565b60076020526000908152604090208054610a5290611e1c565b610c8c6113ee565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b9060200160405180910390a150565b6000803384604051602001610cf6929190612007565b6040516020818303038152906040529050600080610d1485846115a5565b9092509050610d238183612033565b9695505050505050565b610d356113ee565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c90610d899088908890889088908890600401612046565b600060405180830381600087803b158015610da357600080fd5b505af1158015610db7573d6000803e3d6000fd5b505050505050505050565b61ffff86166000908152600560205260408082209051610de59088908890611e56565b90815260408051602092819003830190206001600160401b03871660009081529252902054905080610e655760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b60648201526084016106ad565b808383604051610e76929190611e56565b604051809103902014610ed55760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b60648201526084016106ad565b61ffff87166000908152600560205260408082209051610ef89089908990611e56565b90815260408051602092819003830181206001600160401b038916600090815290845282902093909355601f88018290048202830182019052868252610f90918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284376000920191909152506113b092505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051610fc795949392919061207f565b60405180910390a150505050505050565b610fe06113ee565b600081116110285760405162461bcd60e51b81526020600482015260156024820152744c7a4170703a20696e76616c6964206d696e47617360581b60448201526064016106ad565b61ffff83811660008181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac090606001610c5e565b6110926113ee565b61ffff831660009081526001602052604090206110b08284836120ba565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051610c5e93929190611e8f565b6110ec6113ee565b82811461112e5760405162461bcd60e51b815260206004820152601060248201526f0dcdee840cae2eac2d840d8cadccee8d60831b60448201526064016106ad565b60005b838110156107b65782828281811061114b5761114b612179565b905060200281019061115d919061218f565b3060405160200161117093929190611edc565b6040516020818303038152906040526001600087878581811061119557611195612179565b90506020020160208101906111aa9190611993565b61ffff1681526020810191909152604001600020906111c99082611f48565b50806111d4816121d5565b915050611131565b6111e46113ee565b600655565b6111f16113ee565b6001600160a01b0381166112565760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106ad565b61086881611448565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f5ecbdbc90608401600060405180830381865afa1580156112df573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611307919081019061221e565b95945050505050565b60003383604051602001611325929190612007565b604051602081830303815290604052905060008061134384846115a5565b90925090506113528183612033565b3410156113925760405162461bcd60e51b815260206004820152600e60248201526d6e6f7420656e6f7567682066656560901b60448201526064016106ad565b6107b68484336000604051806020016040528060008152508761166f565b600080828060200190518101906113c79190612266565b6001600160a01b038216600090815260076020526040902091935091506109be8282611f48565b6000546001600160a01b03163314610a375760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106ad565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060816114a681601f612033565b10156114e55760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b60448201526064016106ad565b6114ef8284612033565b845110156115335760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b60448201526064016106ad565b606082158015611552576040519150600082526020820160405261159c565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561158b578051835260209283019201611573565b5050858452601f01601f1916604052505b50949350505050565b604080516020810182526000808252915163040a7bb160e41b815282916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916340a7bb10916116079188913091899188916004016122ca565b6040805180830381865afa158015611623573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611647919061231e565b506006549092506127109061165c9084612342565b6116669190612359565b90509250929050565b61ffff86166000908152600160205260408120805461168d90611e1c565b80601f01602080910402602001604051908101604052809291908181526020018280546116b990611e1c565b80156117065780601f106116db57610100808354040283529160200191611706565b820191906000526020600020905b8154815290600101906020018083116116e957829003601f168201915b5050505050905080516000036117775760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b60648201526084016106ad565b611782878751611814565b60405162c5803160e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c58031009084906117d9908b9086908c908c908c908c9060040161237b565b6000604051808303818588803b1580156117f257600080fd5b505af1158015611806573d6000803e3d6000fd5b505050505050505050505050565b61ffff82166000908152600360205260408120549081900361183557506127105b808211156118855760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c6172676560448201526064016106ad565b505050565b803561ffff8116811461189c57600080fd5b919050565b60008083601f8401126118b357600080fd5b5081356001600160401b038111156118ca57600080fd5b6020830191508360208285010111156118e257600080fd5b9250929050565b80356001600160401b038116811461189c57600080fd5b6000806000806000806080878903121561191957600080fd5b6119228761188a565b955060208701356001600160401b038082111561193e57600080fd5b61194a8a838b016118a1565b909750955085915061195e60408a016118e9565b9450606089013591508082111561197457600080fd5b5061198189828a016118a1565b979a9699509497509295939492505050565b6000602082840312156119a557600080fd5b6109318261188a565b600080604083850312156119c157600080fd5b6119ca8361188a565b946020939093013593505050565b6000806000604084860312156119ed57600080fd5b6119f68461188a565b925060208401356001600160401b03811115611a1157600080fd5b611a1d868287016118a1565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611a6857611a68611a2a565b604052919050565b60006001600160401b03821115611a8957611a89611a2a565b50601f01601f191660200190565b6000611aaa611aa584611a70565b611a40565b9050828152838383011115611abe57600080fd5b828260208301376000602084830101529392505050565b600080600060608486031215611aea57600080fd5b611af38461188a565b925060208401356001600160401b03811115611b0e57600080fd5b8401601f81018613611b1f57600080fd5b611b2e86823560208401611a97565b925050611b3d604085016118e9565b90509250925092565b60005b83811015611b61578181015183820152602001611b49565b50506000910152565b60008151808452611b82816020860160208601611b46565b601f01601f19169290920160200192915050565b6020815260006109316020830184611b6a565b60008060408385031215611bbc57600080fd5b611bc58361188a565b91506116666020840161188a565b6001600160a01b038116811461086857600080fd5b600060208284031215611bfa57600080fd5b813561093181611bd3565b60008060408385031215611c1857600080fd5b82356001600160401b03811115611c2e57600080fd5b8301601f81018513611c3f57600080fd5b611c4e85823560208401611a97565b9250506116666020840161188a565b600080600080600060808688031215611c7557600080fd5b611c7e8661188a565b9450611c8c6020870161188a565b93506040860135925060608601356001600160401b03811115611cae57600080fd5b611cba888289016118a1565b969995985093965092949392505050565b600080600060608486031215611ce057600080fd5b611ce98461188a565b9250611cf76020850161188a565b9150604084013590509250925092565b60008083601f840112611d1957600080fd5b5081356001600160401b03811115611d3057600080fd5b6020830191508360208260051b85010111156118e257600080fd5b60008060008060408587031215611d6157600080fd5b84356001600160401b0380821115611d7857600080fd5b611d8488838901611d07565b90965094506020870135915080821115611d9d57600080fd5b50611daa87828801611d07565b95989497509550505050565b600060208284031215611dc857600080fd5b5035919050565b60008060008060808587031215611de557600080fd5b611dee8561188a565b9350611dfc6020860161188a565b92506040850135611e0c81611bd3565b9396929550929360600135925050565b600181811c90821680611e3057607f821691505b602082108103611e5057634e487b7160e01b600052602260045260246000fd5b50919050565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff84168152604060208201526000611307604083018486611e66565b634e487b7160e01b600052601160045260246000fd5b81810381811115611ed657611ed6611ead565b92915050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b601f82111561188557600081815260208120601f850160051c81016020861015611f295750805b601f850160051c820191505b8181101561072c57828155600101611f35565b81516001600160401b03811115611f6157611f61611a2a565b611f7581611f6f8454611e1c565b84611f02565b602080601f831160018114611faa5760008415611f925750858301515b600019600386901b1c1916600185901b17855561072c565b600085815260208120601f198616915b82811015611fd957888601518255948401946001909101908401611fba565b5085821015611ff75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b038316815260406020820181905260009061202b90830184611b6a565b949350505050565b80820180821115611ed657611ed6611ead565b600061ffff808816835280871660208401525084604083015260806060830152612074608083018486611e66565b979650505050505050565b61ffff8616815260806020820152600061209d608083018688611e66565b6001600160401b0394909416604083015250606001529392505050565b6001600160401b038311156120d1576120d1611a2a565b6120e5836120df8354611e1c565b83611f02565b6000601f84116001811461211957600085156121015750838201355b600019600387901b1c1916600186901b1783556107b6565b600083815260209020601f19861690835b8281101561214a578685013582556020948501946001909201910161212a565b50868210156121675760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e198436030181126121a657600080fd5b8301803591506001600160401b038211156121c057600080fd5b6020019150368190038213156118e257600080fd5b6000600182016121e7576121e7611ead565b5060010190565b60006121fc611aa584611a70565b905082815283838301111561221057600080fd5b610931836020830184611b46565b60006020828403121561223057600080fd5b81516001600160401b0381111561224657600080fd5b8201601f8101841361225757600080fd5b61202b848251602084016121ee565b6000806040838503121561227957600080fd5b825161228481611bd3565b60208401519092506001600160401b038111156122a057600080fd5b8301601f810185136122b157600080fd5b6122c0858251602084016121ee565b9150509250929050565b61ffff861681526001600160a01b038516602082015260a0604082018190526000906122f890830186611b6a565b841515606084015282810360808401526123128185611b6a565b98975050505050505050565b6000806040838503121561233157600080fd5b505080516020909101519092909150565b8082028115828204841417611ed657611ed6611ead565b60008261237657634e487b7160e01b600052601260045260246000fd5b500490565b61ffff8716815260c06020820152600061239860c0830188611b6a565b82810360408401526123aa8188611b6a565b6001600160a01b0387811660608601528616608085015283810360a085015290506123d58185611b6a565b999850505050505050505056fea26469706673582212201b6ed14224905cfe8f2468cc3105b396ba7e37785d9744ad139f0f239daca81664736f6c634300081200330000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e400000000000000000000000000000000000000000000000000000000000003e8
Deployed Bytecode
0x6080604052600436106101e25760003560e01c80639f38369a11610102578063d1deba1f11610095578063ed76c2f411610064578063ed76c2f4146105c6578063f2fde38b146105e6578063f5ecbdbc14610606578063faba50351461062657600080fd5b8063d1deba1f14610553578063df2a5b3b14610566578063eb8d72b714610586578063ecfd594d146105a657600080fd5b8063baf3292d116100d1578063baf3292d146104f3578063c44618341461027e578063cbb4c4cf14610513578063cbed8b9c1461053357600080fd5b80639f38369a1461045f578063a6c3d1651461047f578063b18dfd3d1461049f578063b353aaa7146104bf57600080fd5b806342d65a8d1161017a5780637533d788116101495780637533d788146103a85780638cfd8f5c146103d55780638da5cb5b1461040d578063950c8a741461043f57600080fd5b806342d65a8d146103045780635b8c41e61461032457806366ad5c8a14610373578063715018a61461039357600080fd5b80633ccfd60b116101b65780633ccfd60b146102695780633d18651e1461027e5780633d8b38f6146102a75780633f1f4fa4146102d757600080fd5b80621d3567146101e757806307e0db17146102095780630df374831461022957806310ddb13714610249575b600080fd5b3480156101f357600080fd5b50610207610202366004611900565b610639565b005b34801561021557600080fd5b50610207610224366004611993565b610734565b34801561023557600080fd5b506102076102443660046119ae565b6107bd565b34801561025557600080fd5b50610207610264366004611993565b6107dc565b34801561027557600080fd5b50610207610834565b34801561028a57600080fd5b5061029461271081565b6040519081526020015b60405180910390f35b3480156102b357600080fd5b506102c76102c23660046119d8565b61086b565b604051901515815260200161029e565b3480156102e357600080fd5b506102946102f2366004611993565b60036020526000908152604090205481565b34801561031057600080fd5b5061020761031f3660046119d8565b610938565b34801561033057600080fd5b5061029461033f366004611ad5565b6005602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561037f57600080fd5b5061020761038e366004611900565b6109c7565b34801561039f57600080fd5b50610207610a25565b3480156103b457600080fd5b506103c86103c3366004611993565b610a39565b60405161029e9190611b96565b3480156103e157600080fd5b506102946103f0366004611ba9565b600260209081526000928352604080842090915290825290205481565b34801561041957600080fd5b506000546001600160a01b03165b6040516001600160a01b03909116815260200161029e565b34801561044b57600080fd5b50600454610427906001600160a01b031681565b34801561046b57600080fd5b506103c861047a366004611993565b610ad3565b34801561048b57600080fd5b5061020761049a3660046119d8565b610be2565b3480156104ab57600080fd5b506103c86104ba366004611be8565b610c6b565b3480156104cb57600080fd5b506104277f0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e481565b3480156104ff57600080fd5b5061020761050e366004611be8565b610c84565b34801561051f57600080fd5b5061029461052e366004611c05565b610ce0565b34801561053f57600080fd5b5061020761054e366004611c5d565b610d2d565b610207610561366004611900565b610dc2565b34801561057257600080fd5b50610207610581366004611ccb565b610fd8565b34801561059257600080fd5b506102076105a13660046119d8565b61108a565b3480156105b257600080fd5b506102076105c1366004611d4b565b6110e4565b3480156105d257600080fd5b506102076105e1366004611db6565b6111dc565b3480156105f257600080fd5b50610207610601366004611be8565b6111e9565b34801561061257600080fd5b506103c8610621366004611dcf565b61125f565b610207610634366004611c05565b611310565b337f0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e46001600160a01b0316146106b65760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61072c8686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8901819004810282018101909252878152899350915087908790819084018382808284376000920191909152506113b092505050565b505050505050565b61073c6113ee565b6040516307e0db1760e01b815261ffff821660048201527f0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e46001600160a01b0316906307e0db17906024015b600060405180830381600087803b1580156107a257600080fd5b505af11580156107b6573d6000803e3d6000fd5b5050505050565b6107c56113ee565b61ffff909116600090815260036020526040902055565b6107e46113ee565b6040516310ddb13760e01b815261ffff821660048201527f0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e46001600160a01b0316906310ddb13790602401610788565b61083c6113ee565b60405133904780156108fc02916000818181858888f19350505050158015610868573d6000803e3d6000fd5b50565b61ffff83166000908152600160205260408120805482919061088c90611e1c565b80601f01602080910402602001604051908101604052809291908181526020018280546108b890611e1c565b80156109055780601f106108da57610100808354040283529160200191610905565b820191906000526020600020905b8154815290600101906020018083116108e857829003601f168201915b50505050509050838360405161091c929190611e56565b60405180910390208180519060200120149150505b9392505050565b6109406113ee565b6040516342d65a8d60e01b81526001600160a01b037f0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e416906342d65a8d9061099090869086908690600401611e8f565b600060405180830381600087803b1580156109aa57600080fd5b505af11580156109be573d6000803e3d6000fd5b50505050505050565b3330146106b65760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062656044820152650204c7a4170760d41b60648201526084016106ad565b610a2d6113ee565b610a376000611448565b565b60016020526000908152604090208054610a5290611e1c565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7e90611e1c565b8015610acb5780601f10610aa057610100808354040283529160200191610acb565b820191906000526020600020905b815481529060010190602001808311610aae57829003601f168201915b505050505081565b61ffff8116600090815260016020526040812080546060929190610af690611e1c565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2290611e1c565b8015610b6f5780601f10610b4457610100808354040283529160200191610b6f565b820191906000526020600020905b815481529060010190602001808311610b5257829003601f168201915b505050505090508051600003610bc75760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f726400000060448201526064016106ad565b610931600060148351610bda9190611ec3565b839190611498565b610bea6113ee565b818130604051602001610bff93929190611edc565b60408051601f1981840301815291815261ffff8516600090815260016020522090610c2a9082611f48565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce838383604051610c5e93929190611e8f565b60405180910390a1505050565b60076020526000908152604090208054610a5290611e1c565b610c8c6113ee565b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b9060200160405180910390a150565b6000803384604051602001610cf6929190612007565b6040516020818303038152906040529050600080610d1485846115a5565b9092509050610d238183612033565b9695505050505050565b610d356113ee565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e4169063cbed8b9c90610d899088908890889088908890600401612046565b600060405180830381600087803b158015610da357600080fd5b505af1158015610db7573d6000803e3d6000fd5b505050505050505050565b61ffff86166000908152600560205260408082209051610de59088908890611e56565b90815260408051602092819003830190206001600160401b03871660009081529252902054905080610e655760405162461bcd60e51b815260206004820152602360248201527f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360448201526261676560e81b60648201526084016106ad565b808383604051610e76929190611e56565b604051809103902014610ed55760405162461bcd60e51b815260206004820152602160248201527f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f616044820152601960fa1b60648201526084016106ad565b61ffff87166000908152600560205260408082209051610ef89089908990611e56565b90815260408051602092819003830181206001600160401b038916600090815290845282902093909355601f88018290048202830182019052868252610f90918991899089908190840183828082843760009201919091525050604080516020601f8a018190048102820181019092528881528a9350915088908890819084018382808284376000920191909152506113b092505050565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051610fc795949392919061207f565b60405180910390a150505050505050565b610fe06113ee565b600081116110285760405162461bcd60e51b81526020600482015260156024820152744c7a4170703a20696e76616c6964206d696e47617360581b60448201526064016106ad565b61ffff83811660008181526002602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac090606001610c5e565b6110926113ee565b61ffff831660009081526001602052604090206110b08284836120ba565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051610c5e93929190611e8f565b6110ec6113ee565b82811461112e5760405162461bcd60e51b815260206004820152601060248201526f0dcdee840cae2eac2d840d8cadccee8d60831b60448201526064016106ad565b60005b838110156107b65782828281811061114b5761114b612179565b905060200281019061115d919061218f565b3060405160200161117093929190611edc565b6040516020818303038152906040526001600087878581811061119557611195612179565b90506020020160208101906111aa9190611993565b61ffff1681526020810191909152604001600020906111c99082611f48565b50806111d4816121d5565b915050611131565b6111e46113ee565b600655565b6111f16113ee565b6001600160a01b0381166112565760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106ad565b61086881611448565b604051633d7b2f6f60e21b815261ffff808616600483015284166024820152306044820152606481018290526060907f0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e46001600160a01b03169063f5ecbdbc90608401600060405180830381865afa1580156112df573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611307919081019061221e565b95945050505050565b60003383604051602001611325929190612007565b604051602081830303815290604052905060008061134384846115a5565b90925090506113528183612033565b3410156113925760405162461bcd60e51b815260206004820152600e60248201526d6e6f7420656e6f7567682066656560901b60448201526064016106ad565b6107b68484336000604051806020016040528060008152508761166f565b600080828060200190518101906113c79190612266565b6001600160a01b038216600090815260076020526040902091935091506109be8282611f48565b6000546001600160a01b03163314610a375760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106ad565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060816114a681601f612033565b10156114e55760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b60448201526064016106ad565b6114ef8284612033565b845110156115335760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b60448201526064016106ad565b606082158015611552576040519150600082526020820160405261159c565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561158b578051835260209283019201611573565b5050858452601f01601f1916604052505b50949350505050565b604080516020810182526000808252915163040a7bb160e41b815282916001600160a01b037f0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e416916340a7bb10916116079188913091899188916004016122ca565b6040805180830381865afa158015611623573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611647919061231e565b506006549092506127109061165c9084612342565b6116669190612359565b90509250929050565b61ffff86166000908152600160205260408120805461168d90611e1c565b80601f01602080910402602001604051908101604052809291908181526020018280546116b990611e1c565b80156117065780601f106116db57610100808354040283529160200191611706565b820191906000526020600020905b8154815290600101906020018083116116e957829003601f168201915b5050505050905080516000036117775760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b60648201526084016106ad565b611782878751611814565b60405162c5803160e81b81526001600160a01b037f0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e4169063c58031009084906117d9908b9086908c908c908c908c9060040161237b565b6000604051808303818588803b1580156117f257600080fd5b505af1158015611806573d6000803e3d6000fd5b505050505050505050505050565b61ffff82166000908152600360205260408120549081900361183557506127105b808211156118855760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c6172676560448201526064016106ad565b505050565b803561ffff8116811461189c57600080fd5b919050565b60008083601f8401126118b357600080fd5b5081356001600160401b038111156118ca57600080fd5b6020830191508360208285010111156118e257600080fd5b9250929050565b80356001600160401b038116811461189c57600080fd5b6000806000806000806080878903121561191957600080fd5b6119228761188a565b955060208701356001600160401b038082111561193e57600080fd5b61194a8a838b016118a1565b909750955085915061195e60408a016118e9565b9450606089013591508082111561197457600080fd5b5061198189828a016118a1565b979a9699509497509295939492505050565b6000602082840312156119a557600080fd5b6109318261188a565b600080604083850312156119c157600080fd5b6119ca8361188a565b946020939093013593505050565b6000806000604084860312156119ed57600080fd5b6119f68461188a565b925060208401356001600160401b03811115611a1157600080fd5b611a1d868287016118a1565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715611a6857611a68611a2a565b604052919050565b60006001600160401b03821115611a8957611a89611a2a565b50601f01601f191660200190565b6000611aaa611aa584611a70565b611a40565b9050828152838383011115611abe57600080fd5b828260208301376000602084830101529392505050565b600080600060608486031215611aea57600080fd5b611af38461188a565b925060208401356001600160401b03811115611b0e57600080fd5b8401601f81018613611b1f57600080fd5b611b2e86823560208401611a97565b925050611b3d604085016118e9565b90509250925092565b60005b83811015611b61578181015183820152602001611b49565b50506000910152565b60008151808452611b82816020860160208601611b46565b601f01601f19169290920160200192915050565b6020815260006109316020830184611b6a565b60008060408385031215611bbc57600080fd5b611bc58361188a565b91506116666020840161188a565b6001600160a01b038116811461086857600080fd5b600060208284031215611bfa57600080fd5b813561093181611bd3565b60008060408385031215611c1857600080fd5b82356001600160401b03811115611c2e57600080fd5b8301601f81018513611c3f57600080fd5b611c4e85823560208401611a97565b9250506116666020840161188a565b600080600080600060808688031215611c7557600080fd5b611c7e8661188a565b9450611c8c6020870161188a565b93506040860135925060608601356001600160401b03811115611cae57600080fd5b611cba888289016118a1565b969995985093965092949392505050565b600080600060608486031215611ce057600080fd5b611ce98461188a565b9250611cf76020850161188a565b9150604084013590509250925092565b60008083601f840112611d1957600080fd5b5081356001600160401b03811115611d3057600080fd5b6020830191508360208260051b85010111156118e257600080fd5b60008060008060408587031215611d6157600080fd5b84356001600160401b0380821115611d7857600080fd5b611d8488838901611d07565b90965094506020870135915080821115611d9d57600080fd5b50611daa87828801611d07565b95989497509550505050565b600060208284031215611dc857600080fd5b5035919050565b60008060008060808587031215611de557600080fd5b611dee8561188a565b9350611dfc6020860161188a565b92506040850135611e0c81611bd3565b9396929550929360600135925050565b600181811c90821680611e3057607f821691505b602082108103611e5057634e487b7160e01b600052602260045260246000fd5b50919050565b8183823760009101908152919050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff84168152604060208201526000611307604083018486611e66565b634e487b7160e01b600052601160045260246000fd5b81810381811115611ed657611ed6611ead565b92915050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b601f82111561188557600081815260208120601f850160051c81016020861015611f295750805b601f850160051c820191505b8181101561072c57828155600101611f35565b81516001600160401b03811115611f6157611f61611a2a565b611f7581611f6f8454611e1c565b84611f02565b602080601f831160018114611faa5760008415611f925750858301515b600019600386901b1c1916600185901b17855561072c565b600085815260208120601f198616915b82811015611fd957888601518255948401946001909101908401611fba565b5085821015611ff75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b038316815260406020820181905260009061202b90830184611b6a565b949350505050565b80820180821115611ed657611ed6611ead565b600061ffff808816835280871660208401525084604083015260806060830152612074608083018486611e66565b979650505050505050565b61ffff8616815260806020820152600061209d608083018688611e66565b6001600160401b0394909416604083015250606001529392505050565b6001600160401b038311156120d1576120d1611a2a565b6120e5836120df8354611e1c565b83611f02565b6000601f84116001811461211957600085156121015750838201355b600019600387901b1c1916600186901b1783556107b6565b600083815260209020601f19861690835b8281101561214a578685013582556020948501946001909201910161212a565b50868210156121675760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e198436030181126121a657600080fd5b8301803591506001600160401b038211156121c057600080fd5b6020019150368190038213156118e257600080fd5b6000600182016121e7576121e7611ead565b5060010190565b60006121fc611aa584611a70565b905082815283838301111561221057600080fd5b610931836020830184611b46565b60006020828403121561223057600080fd5b81516001600160401b0381111561224657600080fd5b8201601f8101841361225757600080fd5b61202b848251602084016121ee565b6000806040838503121561227957600080fd5b825161228481611bd3565b60208401519092506001600160401b038111156122a057600080fd5b8301601f810185136122b157600080fd5b6122c0858251602084016121ee565b9150509250929050565b61ffff861681526001600160a01b038516602082015260a0604082018190526000906122f890830186611b6a565b841515606084015282810360808401526123128185611b6a565b98975050505050505050565b6000806040838503121561233157600080fd5b505080516020909101519092909150565b8082028115828204841417611ed657611ed6611ead565b60008261237657634e487b7160e01b600052601260045260246000fd5b500490565b61ffff8716815260c06020820152600061239860c0830188611b6a565b82810360408401526123aa8188611b6a565b6001600160a01b0387811660608601528616608085015283810360a085015290506123d58185611b6a565b999850505050505050505056fea26469706673582212201b6ed14224905cfe8f2468cc3105b396ba7e37785d9744ad139f0f239daca81664736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e400000000000000000000000000000000000000000000000000000000000003e8
-----Decoded View---------------
Arg [0] : _lzEndpoint (address): 0x9740FF91F1985D8d2B71494aE1A2f723bb3Ed9E4
Arg [1] : _fee (uint256): 1000
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000009740ff91f1985d8d2b71494ae1a2f723bb3ed9e4
Arg [1] : 00000000000000000000000000000000000000000000000000000000000003e8
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.05
Net Worth in XDAI
Token Allocations
XDAI
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| GNO | 100.00% | $0.999496 | 0.0515 | $0.051498 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.