// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {OFT} from "./OFT.sol";
import {OmniseaFeesManager} from "./OmniseaFeesManager.sol";
import {OmniseaMetadataReader} from "./OmniseaMetadataReader.sol";
import {OmniseaOptionsValidator} from "./OmniseaOptionsValidator.sol";
import {
ILayerZeroEndpointV2,
MessagingFee,
MessagingParams,
MessagingReceipt,
Origin
} from "./layerzero/ILayerZeroEndpointV2.sol";
interface IOmniseaCrossVmOFTHookReceiver {
function omReceive(
bytes32 guid,
uint32 srcEid,
uint8 assetKind,
uint32 originalChainId,
address originalToken,
address localToken,
address sender,
address recipient,
uint256 value,
bytes calldata payload
) external;
}
contract Omnisea is Ownable, ReentrancyGuard {
using SafeERC20 for IERC20;
uint8 public constant ASSET_KIND_ERC20 = 1;
uint8 public constant ADDRESS_TYPE_EVM = 1;
uint8 public constant ADDRESS_TYPE_SOLANA = 2;
uint16 public constant PAYLOAD_VERSION = 3;
uint16 private constant TOKEN_KEY_VERSION = 2;
uint64 private constant ENDPOINT_ACTIVATION_TIME = 7 days;
uint256 public constant MAX_BRIDGE_MESSAGE_BYTES = 16_384;
error InvalidAddress();
error InvalidAmount();
error InvalidDestination();
error InvalidEndpoint();
error InvalidOriginal();
error InvalidPeer(uint32 eid, bytes32 peer);
error PeerAlreadySet(uint32 eid, bytes32 currentPeer, bytes32 newPeer);
error InvalidSender();
error InvalidHook();
error InsufficientLayerZeroGas(uint128 providedGas, uint128 requiredGas);
error MessageTooLarge();
error FailedMessageNotFound(bytes32 guid);
error FailedMessageHashMismatch();
error MessageAlreadyConsumed(bytes32 guid);
error NotRepresentation();
error ProtocolFeeTooHigh(uint256 fee, uint256 maxFee);
error RepresentationMustUseSendOFT();
error UnsupportedAddressType(uint8 addressType);
error UnsupportedRecipientAddressType(uint8 addressType);
error WithdrawFailed();
error InvalidFee();
enum MessageKind {
Transfer,
Restore,
OwnerSync
}
struct Hook {
address target;
uint128 gasLimit;
bytes payload;
}
struct TokenPayload {
uint16 payloadVersion;
MessageKind messageKind;
uint32 originalChainId;
uint8 originalTokenAddressType;
bytes32 originalToken;
uint256 amount;
uint8 senderAddressType;
bytes32 sender;
uint8 recipientAddressType;
bytes32 recipient;
string tokenName;
string tokenSymbol;
uint8 tokenDecimals;
string contractURI;
bool hasContractOwner;
uint8 contractOwnerAddressType;
bytes32 contractOwner;
Hook hook;
}
struct OriginalToken {
uint32 originalChainId;
uint8 originalTokenAddressType;
bytes32 originalToken;
bool exists;
}
struct FailedMessage {
bool exists;
uint32 srcEid;
bytes32 sender;
uint64 nonce;
bytes message;
bytes32 messageHash;
bytes32 reasonHash;
uint256 failedAt;
}
ILayerZeroEndpointV2 public immutable endpoint;
uint32 public immutable localEndpointId;
uint32 public immutable localChainId;
address public immutable oftImplementation;
OmniseaFeesManager public immutable feesManager;
OmniseaMetadataReader public immutable metadataReader;
OmniseaOptionsValidator public immutable optionsValidator;
mapping(uint32 eid => bytes32 peer) public peers;
mapping(uint32 eid => uint64 setAt) public peerSetAt;
mapping(uint32 eid => uint32 chainId) public chainIdForEid;
mapping(bytes32 originalTokenKey => address representation) public originalToOFT;
mapping(address representation => OriginalToken original) public oftToOriginal;
mapping(address originalToken => uint256 amount) public lockedBalance;
mapping(bytes32 guid => FailedMessage failedMessage) public failedMessages;
mapping(bytes32 guid => bool consumed) public consumedMessages;
uint128 public minTransferGas;
uint128 public minCreationGas;
event PeerSet(uint32 indexed eid, bytes32 peer, uint64 setAt, uint64 activationTime, bool sameAddressPeer);
event OriginalLocked(address indexed originalToken, address indexed owner, uint256 requestedAmount, uint256 actualAmount);
event RepresentationBurned(
address indexed representation,
uint32 indexed originalChainId,
uint8 indexed originalTokenAddressType,
bytes32 originalToken,
address owner,
uint256 amount
);
event OriginalUnlocked(address indexed originalToken, address indexed recipient, uint256 amount);
event RepresentationDeployed(
uint32 indexed originalChainId,
uint8 indexed originalTokenAddressType,
bytes32 indexed originalToken,
address representation
);
event RepresentationMinted(
address indexed representation,
uint32 indexed originalChainId,
uint8 indexed originalTokenAddressType,
bytes32 originalToken,
address recipient,
uint256 amount
);
event AssetMetadataSynced(
uint32 indexed originalChainId,
uint8 indexed originalTokenAddressType,
bytes32 indexed originalToken,
string tokenName,
string tokenSymbol,
uint8 tokenDecimals
);
event BridgeMessageSent(
bytes32 indexed guid,
uint32 indexed dstEid,
uint32 indexed originalChainId,
uint8 originalTokenAddressType,
bytes32 originalToken,
uint256 amount,
uint8 recipientAddressType,
bytes32 recipient,
uint256 nativeFee,
uint256 protocolFee
);
event BridgeMessageReceived(
bytes32 indexed guid,
uint32 indexed srcEid,
uint32 indexed originalChainId,
uint8 originalTokenAddressType,
bytes32 originalToken,
uint8 recipientAddressType,
bytes32 recipient,
uint256 amount
);
event FixedProtocolFeeChanged(uint256 previousFee, uint256 newFee);
event FixedFeeTokenProtocolFeeChanged(uint256 previousFee, uint256 newFee);
event ProtocolFeeReceiverChanged(address indexed previousReceiver, address indexed newReceiver);
event TokenIssuerSet(uint32 indexed chainId, address indexed token, address indexed issuer);
event OFTStateChanged(address indexed representation, uint8 indexed action, uint8 feature, address account, bool flag);
event ProtocolFeeDistributed(
address indexed feeToken,
address indexed protocolFeeReceiver,
address indexed issuer,
uint256 protocolAmount,
uint256 issuerAmount,
bool protocolPaid,
bool issuerPaid
);
event ProtocolFeesWithdrawn(address indexed recipient, uint256 amount);
event FeeTokenProtocolFeesWithdrawn(address indexed feeToken, address indexed recipient, uint256 amount);
event IssuerProtocolFeesWithdrawn(address indexed issuer, address indexed recipient, uint256 amount);
event IssuerFeeTokenProtocolFeesWithdrawn(
address indexed feeToken,
address indexed issuer,
address indexed recipient,
uint256 amount
);
event LayerZeroDelegateSet(address indexed delegate);
event MinTransferGasChanged(uint128 previousGas, uint128 newGas);
event MinCreationGasChanged(uint128 previousGas, uint128 newGas);
event MessageFailed(
bytes32 indexed guid,
uint32 indexed srcEid,
uint32 indexed originalChainId,
uint8 originalTokenAddressType,
bytes32 originalToken,
uint8 recipientAddressType,
bytes32 recipient,
uint256 amount,
bytes32 reasonHash
);
event FailedMessageRetried(bytes32 indexed guid, uint32 indexed srcEid);
event FailedMessageRestored(
bytes32 indexed guid,
bytes32 indexed restoreGuid,
uint32 indexed dstEid,
uint8 refundRecipientAddressType,
bytes32 refundRecipient,
uint256 nativeFee
);
event HookSucceeded(
bytes32 indexed guid,
address indexed target,
address indexed localToken,
address recipient,
uint256 value,
uint128 gasLimit,
bytes32 payloadHash,
bytes32 returnDataHash
);
event HookFailed(
bytes32 indexed guid,
address indexed target,
address indexed localToken,
address recipient,
uint256 value,
uint128 gasLimit,
bytes32 payloadHash,
bytes32 reasonHash
);
modifier onlyEndpoint() {
if (msg.sender != address(endpoint)) revert InvalidEndpoint();
_;
}
constructor(
address endpoint_,
uint32 localEndpointId_,
uint32 localChainId_,
address oftImplementation_,
uint256 fixedProtocolFee_,
uint256 fixedFeeTokenProtocolFee_,
uint256 maxProtocolFee_,
uint256 maxFeeTokenProtocolFee_,
address initialOwner_,
address feesManager_,
address metadataReader_,
address optionsValidator_
) Ownable(initialOwner_) {
if (
endpoint_ == address(0) ||
localEndpointId_ == 0 ||
localChainId_ == 0 ||
oftImplementation_ == address(0) ||
initialOwner_ == address(0) ||
feesManager_ == address(0) ||
metadataReader_ == address(0) ||
optionsValidator_ == address(0)
) {
revert InvalidAddress();
}
if (fixedProtocolFee_ > maxProtocolFee_) revert ProtocolFeeTooHigh(fixedProtocolFee_, maxProtocolFee_);
if (fixedFeeTokenProtocolFee_ > maxFeeTokenProtocolFee_) {
revert ProtocolFeeTooHigh(fixedFeeTokenProtocolFee_, maxFeeTokenProtocolFee_);
}
endpoint = ILayerZeroEndpointV2(endpoint_);
endpoint.setDelegate(initialOwner_);
localEndpointId = localEndpointId_;
localChainId = localChainId_;
oftImplementation = oftImplementation_;
feesManager = OmniseaFeesManager(payable(feesManager_));
metadataReader = OmniseaMetadataReader(metadataReader_);
optionsValidator = OmniseaOptionsValidator(optionsValidator_);
if (feesManager.bridge() == address(0)) {
feesManager.bindBridge();
}
if (feesManager.bridge() != address(this)) revert InvalidAddress();
if (
feesManager.fixedProtocolFee() != fixedProtocolFee_ ||
feesManager.fixedFeeTokenProtocolFee() != fixedFeeTokenProtocolFee_ ||
feesManager.maxProtocolFee() != maxProtocolFee_ ||
feesManager.maxFeeTokenProtocolFee() != maxFeeTokenProtocolFee_
) {
revert InvalidFee();
}
if (feesManager.protocolFeeReceiver() != initialOwner_) revert InvalidAddress();
chainIdForEid[localEndpointId_] = localChainId_;
emit FixedProtocolFeeChanged(0, fixedProtocolFee_);
emit FixedFeeTokenProtocolFeeChanged(0, fixedFeeTokenProtocolFee_);
emit ProtocolFeeReceiverChanged(address(0), initialOwner_);
emit LayerZeroDelegateSet(initialOwner_);
}
function setPeer(uint32 eid, bytes32 peer) external onlyOwner {
if (peer == bytes32(0)) revert InvalidPeer(eid, peer);
bytes32 currentPeer = peers[eid];
if (currentPeer != bytes32(0)) {
if (currentPeer != peer) revert PeerAlreadySet(eid, currentPeer, peer);
return;
}
uint64 setAt = uint64(block.timestamp);
peers[eid] = peer;
peerSetAt[eid] = setAt;
emit PeerSet(eid, peer, setAt, peerActivationTime(eid), _isSameAddressPeer(peer));
}
function setChainIdForEid(uint32 eid, uint32 chainId) external onlyOwner {
if (eid == 0 || chainId == 0) revert InvalidEndpoint();
chainIdForEid[eid] = chainId;
}
function allowInitializePath(Origin calldata origin) external view returns (bool) {
return isTrustedPeer(origin.srcEid, origin.sender);
}
function nextNonce(uint32, bytes32) external pure returns (uint64) {
return 0;
}
function setLayerZeroDelegate(address delegate) external onlyOwner {
if (delegate == address(0)) revert InvalidAddress();
endpoint.setDelegate(delegate);
emit LayerZeroDelegateSet(delegate);
}
function setProtocolFeeReceiver(address payable newReceiver) external onlyOwner {
address previousReceiver = feesManager.setProtocolFeeReceiver(newReceiver);
emit ProtocolFeeReceiverChanged(previousReceiver, newReceiver);
}
function setTokenIssuer(uint32 chainId, address token, address issuer) external onlyOwner {
feesManager.setTokenIssuer(chainId, token, issuer);
emit TokenIssuerSet(chainId, token, issuer);
}
function authorizeOftFeature(address representation, OFT.Feature feature) external onlyOwner {
if (!oftToOriginal[representation].exists) revert NotRepresentation();
OFT(representation).authorizeFeature(feature);
emit OFTStateChanged(representation, 2, uint8(feature), msg.sender, true);
}
function notifyOftStateChanged(uint8 action, uint8 feature, address account, bool flag) external {
if (!oftToOriginal[msg.sender].exists) revert NotRepresentation();
if (action == 0 || action == 2 || action > 6) revert InvalidSender();
emit OFTStateChanged(msg.sender, action, feature, account, flag);
}
function setFixedProtocolFee(uint256 newFee) external onlyOwner {
uint256 previousFee = feesManager.setFixedProtocolFee(newFee);
emit FixedProtocolFeeChanged(previousFee, newFee);
}
function setFixedFeeTokenProtocolFee(uint256 newFee) external onlyOwner {
uint256 previousFee = feesManager.setFixedFeeTokenProtocolFee(newFee);
emit FixedFeeTokenProtocolFeeChanged(previousFee, newFee);
}
function setMinTransferGas(uint128 newGas) external onlyOwner {
uint128 previousGas = minTransferGas;
minTransferGas = newGas;
emit MinTransferGasChanged(previousGas, newGas);
}
function setMinCreationGas(uint128 newGas) external onlyOwner {
uint128 previousGas = minCreationGas;
minCreationGas = newGas;
emit MinCreationGasChanged(previousGas, newGas);
}
function withdrawProtocolFees(address payable recipient, uint256 amount) external onlyOwner nonReentrant {
feesManager.withdrawProtocolFees(recipient, amount);
emit ProtocolFeesWithdrawn(recipient, amount);
}
function withdrawFeeTokenProtocolFees(address feeToken, address recipient, uint256 amount) external onlyOwner nonReentrant {
feesManager.withdrawFeeTokenProtocolFees(feeToken, recipient, amount);
emit FeeTokenProtocolFeesWithdrawn(feeToken, recipient, amount);
}
function withdrawIssuerProtocolFees(
address issuer,
address payable recipient,
uint256 amount
) external onlyOwner nonReentrant {
feesManager.withdrawIssuerProtocolFees(issuer, recipient, amount);
emit IssuerProtocolFeesWithdrawn(issuer, recipient, amount);
}
function withdrawIssuerFeeTokenProtocolFees(
address feeToken,
address issuer,
address recipient,
uint256 amount
) external onlyOwner nonReentrant {
feesManager.withdrawIssuerFeeTokenProtocolFees(feeToken, issuer, recipient, amount);
emit IssuerFeeTokenProtocolFeesWithdrawn(feeToken, issuer, recipient, amount);
}
function endpointNativeToken() public view returns (address) {
return endpoint.nativeToken();
}
function fixedProtocolFee() external view returns (uint256) {
return feesManager.fixedProtocolFee();
}
function fixedFeeTokenProtocolFee() external view returns (uint256) {
return feesManager.fixedFeeTokenProtocolFee();
}
function collectedProtocolFees() external view returns (uint256) {
return feesManager.collectedProtocolFees();
}
function collectedFeeTokenProtocolFees(address feeToken) external view returns (uint256) {
return feesManager.collectedFeeTokenProtocolFees(feeToken);
}
function peerActivationTime(uint32 eid) public view returns (uint64) {
bytes32 peer = peers[eid];
uint64 setAt = peerSetAt[eid];
if (peer == bytes32(0)) return 0;
if (_isSameAddressPeer(peer)) return setAt;
return setAt + ENDPOINT_ACTIVATION_TIME;
}
function isPeerActive(uint32 eid) public view returns (bool) {
return peers[eid] != bytes32(0) && block.timestamp >= peerActivationTime(eid);
}
function isTrustedPeer(uint32 eid, bytes32 peer) public view returns (bool) {
return peers[eid] == peer && isPeerActive(eid);
}
function quoteSendOriginalTo(
uint32 dstEid,
address originalToken,
uint256 amount,
uint8 recipientAddressType,
bytes32 recipient,
bool isFirstTransfer,
Hook calldata hook,
bytes calldata options
) external view returns (uint256 totalFee) {
if (oftToOriginal[originalToken].exists) revert RepresentationMustUseSendOFT();
TokenPayload memory payload = _payloadFromOriginal(originalToken, amount, recipientAddressType, recipient, hook);
return _quote(dstEid, payload, isFirstTransfer, options) + _protocolFee(endpointNativeToken());
}
function quoteSendOFTTo(
uint32 dstEid,
address representation,
uint256 amount,
uint8 recipientAddressType,
bytes32 recipient,
bool isFirstTransfer,
Hook calldata hook,
bytes calldata options
) external view returns (uint256 totalFee) {
TokenPayload memory payload = _payloadFromOFT(representation, amount, recipientAddressType, recipient, hook);
return _quote(dstEid, payload, isFirstTransfer, options) + _protocolFee(endpointNativeToken());
}
function quoteSyncOriginalOwnerTo(
uint32 dstEid,
address originalToken,
bytes calldata options
) external view returns (uint256 totalFee) {
if (oftToOriginal[originalToken].exists) revert RepresentationMustUseSendOFT();
TokenPayload memory payload = _ownerSyncPayloadFromOriginal(originalToken);
return _quote(dstEid, payload, false, options);
}
function sendOriginalTo(
uint32 dstEid,
address originalToken,
uint256 amount,
uint8 recipientAddressType,
bytes32 recipient,
bool isFirstTransfer,
Hook calldata hook,
bytes calldata options
) external payable nonReentrant returns (MessagingReceipt memory receipt) {
_validateDestination(dstEid, recipientAddressType, recipient);
if (oftToOriginal[originalToken].exists) revert RepresentationMustUseSendOFT();
if (amount == 0) revert InvalidAmount();
TokenPayload memory payload = _payloadFromOriginal(originalToken, amount, recipientAddressType, recipient, hook);
uint256 lzFee = _quote(dstEid, payload, isFirstTransfer, options);
address feeToken = endpointNativeToken();
uint256 protocolFee = _protocolFee(feeToken);
_requireExactFee(feeToken, lzFee, true);
uint256 beforeBalance = IERC20(originalToken).balanceOf(address(this));
IERC20(originalToken).safeTransferFrom(msg.sender, address(this), amount);
uint256 actualAmount = IERC20(originalToken).balanceOf(address(this)) - beforeBalance;
if (actualAmount == 0) revert InvalidAmount();
payload.amount = actualAmount;
lockedBalance[originalToken] += actualAmount;
uint256 receivedProtocolFee = _collectProtocolFee(feeToken);
receipt = _sendPayload(dstEid, payload, options, lzFee, feeToken);
_distributeProtocolFee(feeToken, originalToken, receivedProtocolFee);
emit OriginalLocked(originalToken, msg.sender, amount, actualAmount);
emit BridgeMessageSent(
receipt.guid,
dstEid,
payload.originalChainId,
payload.originalTokenAddressType,
payload.originalToken,
payload.amount,
payload.recipientAddressType,
payload.recipient,
lzFee,
protocolFee
);
}
function sendOFTTo(
uint32 dstEid,
address representation,
uint256 amount,
uint8 recipientAddressType,
bytes32 recipient,
bool isFirstTransfer,
Hook calldata hook,
bytes calldata options
) external payable nonReentrant returns (MessagingReceipt memory receipt) {
_validateDestination(dstEid, recipientAddressType, recipient);
if (amount == 0) revert InvalidAmount();
OriginalToken memory original = oftToOriginal[representation];
if (!original.exists) revert NotRepresentation();
TokenPayload memory payload = _payloadFromOFT(representation, amount, recipientAddressType, recipient, hook);
uint256 lzFee = _quote(dstEid, payload, isFirstTransfer, options);
address feeToken = endpointNativeToken();
uint256 protocolFee = _protocolFee(feeToken);
_requireExactFee(feeToken, lzFee, true);
OFT(representation).burn(msg.sender, amount);
uint256 receivedProtocolFee = _collectProtocolFee(feeToken);
receipt = _sendPayload(dstEid, payload, options, lzFee, feeToken);
_distributeProtocolFee(feeToken, representation, receivedProtocolFee);
emit RepresentationBurned(
representation,
original.originalChainId,
original.originalTokenAddressType,
original.originalToken,
msg.sender,
amount
);
emit BridgeMessageSent(
receipt.guid,
dstEid,
payload.originalChainId,
payload.originalTokenAddressType,
payload.originalToken,
amount,
payload.recipientAddressType,
payload.recipient,
lzFee,
protocolFee
);
}
function syncOriginalOwnerTo(
uint32 dstEid,
address originalToken,
bytes calldata options
) external payable nonReentrant returns (MessagingReceipt memory receipt) {
bytes32 sender = _addressToBytes32(msg.sender);
_validateDestination(dstEid, ADDRESS_TYPE_EVM, sender);
if (oftToOriginal[originalToken].exists) revert RepresentationMustUseSendOFT();
TokenPayload memory payload = _ownerSyncPayloadFromOriginal(originalToken);
uint256 lzFee = _quote(dstEid, payload, false, options);
address feeToken = endpointNativeToken();
_requireExactFee(feeToken, lzFee, false);
receipt = _sendPayload(dstEid, payload, options, lzFee, feeToken);
}
function lzReceive(
Origin calldata origin,
bytes32 guid,
bytes calldata message,
address,
bytes calldata
) external payable onlyEndpoint nonReentrant {
if (!isTrustedPeer(origin.srcEid, origin.sender)) revert InvalidPeer(origin.srcEid, origin.sender);
if (consumedMessages[guid]) revert MessageAlreadyConsumed(guid);
_validateMessageSize(message.length);
bytes32 messageHash = keccak256(message);
FailedMessage storage cachedFailed = failedMessages[guid];
if (cachedFailed.exists && cachedFailed.messageHash != messageHash) {
revert FailedMessageHashMismatch();
}
TokenPayload memory payload = abi.decode(message, (TokenPayload));
_validatePayload(payload);
try this.executeLzMessage(origin, guid, payload) {
consumedMessages[guid] = true;
delete failedMessages[guid];
return;
} catch (bytes memory reason) {
if (payload.messageKind == MessageKind.Restore) {
assembly {
revert(add(reason, 0x20), mload(reason))
}
}
bytes32 reasonHash = keccak256(reason);
failedMessages[guid] = FailedMessage({
exists: true,
srcEid: origin.srcEid,
sender: origin.sender,
nonce: origin.nonce,
message: message,
messageHash: messageHash,
reasonHash: reasonHash,
failedAt: block.timestamp
});
emit MessageFailed(
guid,
origin.srcEid,
payload.originalChainId,
payload.originalTokenAddressType,
payload.originalToken,
payload.recipientAddressType,
payload.recipient,
payload.amount,
reasonHash
);
}
}
function executeLzMessage(Origin calldata origin, bytes32 guid, TokenPayload calldata payload) external {
if (msg.sender != address(this)) revert InvalidSender();
_executePayload(origin.srcEid, guid, payload, true);
}
function retryFailedMessage(bytes32 guid) external nonReentrant {
FailedMessage memory failed = failedMessages[guid];
if (!failed.exists) revert FailedMessageNotFound(guid);
if (consumedMessages[guid]) revert MessageAlreadyConsumed(guid);
TokenPayload memory payload = abi.decode(failed.message, (TokenPayload));
_executePayload(failed.srcEid, guid, payload, false);
delete failedMessages[guid];
consumedMessages[guid] = true;
emit FailedMessageRetried(guid, failed.srcEid);
}
function quoteRestore(bytes32 guid, bytes calldata options) external view returns (uint256 nativeFee) {
FailedMessage memory failed = failedMessages[guid];
if (!failed.exists) revert FailedMessageNotFound(guid);
TokenPayload memory payload = abi.decode(failed.message, (TokenPayload));
TokenPayload memory restorePayload = _restorePayload(payload);
return _quoteRestore(failed.srcEid, restorePayload, options);
}
function restoreFailedMessage(
bytes32 guid,
bytes calldata options
) external payable nonReentrant returns (MessagingReceipt memory receipt) {
FailedMessage memory failed = failedMessages[guid];
if (!failed.exists) revert FailedMessageNotFound(guid);
TokenPayload memory payload = abi.decode(failed.message, (TokenPayload));
TokenPayload memory restorePayload = _restorePayload(payload);
uint256 lzFee = _quoteRestore(failed.srcEid, restorePayload, options);
address feeToken = endpointNativeToken();
_requireExactFee(feeToken, lzFee, false);
delete failedMessages[guid];
receipt = _sendPayloadTo(failed.srcEid, restorePayload, options, lzFee, feeToken, payable(msg.sender));
consumedMessages[guid] = true;
emit FailedMessageRestored(
guid,
receipt.guid,
failed.srcEid,
restorePayload.recipientAddressType,
restorePayload.recipient,
lzFee
);
}
function tokenKey(
uint32 originalChainId,
uint8 originalTokenAddressType,
bytes32 originalToken
) public pure returns (bytes32) {
return keccak256(abi.encode(TOKEN_KEY_VERSION, originalChainId, originalTokenAddressType, originalToken));
}
function representationFor(
uint32 originalChainId,
uint8 originalTokenAddressType,
bytes32 originalToken
) external view returns (address) {
return originalToOFT[tokenKey(originalChainId, originalTokenAddressType, originalToken)];
}
function predictRepresentation(
uint32 originalChainId,
uint8 originalTokenAddressType,
bytes32 originalToken
) external view returns (address) {
return Clones.predictDeterministicAddress(
oftImplementation,
tokenKey(originalChainId, originalTokenAddressType, originalToken),
address(this)
);
}
function _executePayload(
uint32 srcEid,
bytes32 guid,
TokenPayload memory payload,
bool syncExistingOwner
) internal {
address localToken;
if (payload.messageKind == MessageKind.OwnerSync) {
localToken = _syncRepresentationOwnerOnly(srcEid, payload, syncExistingOwner);
} else if (payload.originalChainId == localChainId && payload.originalTokenAddressType == ADDRESS_TYPE_EVM) {
localToken = _unlockOriginal(payload);
} else {
localToken = _mintRepresentation(srcEid, payload, syncExistingOwner);
}
emit BridgeMessageReceived(
guid,
srcEid,
payload.originalChainId,
payload.originalTokenAddressType,
payload.originalToken,
payload.recipientAddressType,
payload.recipient,
payload.amount
);
if (payload.messageKind != MessageKind.OwnerSync) {
_executeHook(guid, srcEid, payload, localToken);
}
}
function _unlockOriginal(TokenPayload memory payload) internal returns (address localToken) {
address originalToken = _bytes32ToAddress(payload.originalToken);
address recipient = _requireEvmAddress(payload.recipientAddressType, payload.recipient);
if (lockedBalance[originalToken] < payload.amount) revert InvalidAmount();
lockedBalance[originalToken] -= payload.amount;
IERC20(originalToken).safeTransfer(recipient, payload.amount);
emit OriginalUnlocked(originalToken, recipient, payload.amount);
return originalToken;
}
function _mintRepresentation(
uint32 srcEid,
TokenPayload memory payload,
bool syncExistingOwner
) internal returns (address localToken) {
address recipient = _requireEvmAddress(payload.recipientAddressType, payload.recipient);
(address representation, bool representationExisted) = _getOrDeployRepresentation(srcEid, payload);
if (syncExistingOwner || !representationExisted) {
_syncRepresentationOwnerFromOriginal(srcEid, payload, representation);
}
OFT(representation).mint(recipient, payload.amount);
emit RepresentationMinted(
representation,
payload.originalChainId,
payload.originalTokenAddressType,
payload.originalToken,
recipient,
payload.amount
);
emit AssetMetadataSynced(
payload.originalChainId,
payload.originalTokenAddressType,
payload.originalToken,
payload.tokenName,
payload.tokenSymbol,
payload.tokenDecimals
);
return representation;
}
function _syncRepresentationOwnerOnly(
uint32 srcEid,
TokenPayload memory payload,
bool syncExistingOwner
) internal returns (address localToken) {
if (payload.originalChainId == localChainId && payload.originalTokenAddressType == ADDRESS_TYPE_EVM) {
revert InvalidDestination();
}
(address representation, bool representationExisted) = _getOrDeployRepresentation(srcEid, payload);
if (syncExistingOwner || !representationExisted) {
_syncRepresentationOwnerFromOriginal(srcEid, payload, representation);
}
emit AssetMetadataSynced(
payload.originalChainId,
payload.originalTokenAddressType,
payload.originalToken,
payload.tokenName,
payload.tokenSymbol,
payload.tokenDecimals
);
return representation;
}
function _executeHook(bytes32 guid, uint32 srcEid, TokenPayload memory payload, address localToken) internal {
Hook memory hook = payload.hook;
if (hook.target == address(0)) return;
address recipient = _requireEvmAddress(payload.recipientAddressType, payload.recipient);
address originalToken = _bytes32ToAddressOrZero(payload.originalTokenAddressType, payload.originalToken);
address sender = _bytes32ToAddressOrZero(payload.senderAddressType, payload.sender);
(bool ok, bytes memory data) = hook.target.call{gas: hook.gasLimit}(
abi.encodeCall(
IOmniseaCrossVmOFTHookReceiver.omReceive,
(
guid,
srcEid,
ASSET_KIND_ERC20,
payload.originalChainId,
originalToken,
localToken,
sender,
recipient,
payload.amount,
hook.payload
)
)
);
if (ok) {
emit HookSucceeded(
guid,
hook.target,
localToken,
recipient,
payload.amount,
hook.gasLimit,
keccak256(hook.payload),
keccak256(data)
);
} else {
emit HookFailed(
guid,
hook.target,
localToken,
recipient,
payload.amount,
hook.gasLimit,
keccak256(hook.payload),
keccak256(data)
);
}
}
function _getOrDeployRepresentation(
uint32 srcEid,
TokenPayload memory payload
) internal returns (address representation, bool existed) {
bytes32 key = tokenKey(payload.originalChainId, payload.originalTokenAddressType, payload.originalToken);
representation = originalToOFT[key];
if (representation != address(0)) return (representation, true);
bool usePayloadOwner = _isCanonicalOwnerSource(srcEid, payload);
representation = Clones.cloneDeterministic(oftImplementation, key);
OFT(representation).initializeCrossVm(
address(this),
payload.originalChainId,
payload.originalTokenAddressType,
payload.originalToken,
payload.tokenName,
payload.tokenSymbol,
payload.tokenDecimals,
payload.contractURI,
usePayloadOwner && payload.hasContractOwner,
usePayloadOwner ? _bytes32ToAddressOrZero(payload.contractOwnerAddressType, payload.contractOwner) : address(0)
);
originalToOFT[key] = representation;
oftToOriginal[representation] = OriginalToken({
originalChainId: payload.originalChainId,
originalTokenAddressType: payload.originalTokenAddressType,
originalToken: payload.originalToken,
exists: true
});
emit RepresentationDeployed(
payload.originalChainId,
payload.originalTokenAddressType,
payload.originalToken,
representation
);
}
function _syncRepresentationOwnerFromOriginal(
uint32 srcEid,
TokenPayload memory payload,
address representation
) internal {
if (!_isCanonicalOwnerSource(srcEid, payload)) return;
(, address newOwner) = OFT(representation).syncOwnershipFromBridge(
payload.hasContractOwner,
_bytes32ToAddressOrZero(payload.contractOwnerAddressType, payload.contractOwner)
);
emit OFTStateChanged(representation, 7, 0, newOwner, payload.hasContractOwner);
}
function _isCanonicalOwnerSource(uint32 srcEid, TokenPayload memory payload) internal view returns (bool) {
return chainIdForEid[srcEid] == payload.originalChainId;
}
function _sendPayload(
uint32 dstEid,
TokenPayload memory payload,
bytes calldata options,
uint256 lzFee,
address feeToken
) internal returns (MessagingReceipt memory receipt) {
receipt = _sendPayloadTo(dstEid, payload, options, lzFee, feeToken, payable(msg.sender));
}
function _sendPayloadTo(
uint32 dstEid,
TokenPayload memory payload,
bytes calldata options,
uint256 lzFee,
address feeToken,
address payable refundAddress
) internal returns (MessagingReceipt memory receipt) {
bytes memory message = abi.encode(payload);
_validateMessageSize(message.length);
MessagingParams memory params = MessagingParams({
dstEid: dstEid,
receiver: peers[dstEid],
message: message,
options: options,
payInLzToken: false
});
if (feeToken == address(0)) {
receipt = endpoint.send{value: lzFee}(params, refundAddress);
} else {
if (lzFee > 0) IERC20(feeToken).safeTransferFrom(msg.sender, address(endpoint), lzFee);
receipt = endpoint.send{value: 0}(params, refundAddress);
}
}
function _quote(
uint32 dstEid,
TokenPayload memory payload,
bool isFirstTransfer,
bytes calldata options
) internal view returns (uint256 nativeFee) {
_validateDestination(dstEid, payload.recipientAddressType, payload.recipient);
return _quoteLayerZero(dstEid, payload, isFirstTransfer, options);
}
function _quoteRestore(
uint32 dstEid,
TokenPayload memory payload,
bytes calldata options
) internal view returns (uint256 nativeFee) {
if (dstEid == 0 || dstEid == localEndpointId) revert InvalidDestination();
if (peers[dstEid] == bytes32(0)) revert InvalidPeer(dstEid, bytes32(0));
return _quoteLayerZero(dstEid, payload, false, options);
}
function _quoteLayerZero(
uint32 dstEid,
TokenPayload memory payload,
bool isFirstTransfer,
bytes calldata options
) internal view returns (uint256 nativeFee) {
_requireMinDestinationGas(options, isFirstTransfer, payload.hook);
bytes memory message = abi.encode(payload);
_validateMessageSize(message.length);
MessagingFee memory fee = endpoint.quote(
MessagingParams({
dstEid: dstEid,
receiver: peers[dstEid],
message: message,
options: options,
payInLzToken: false
}),
address(this)
);
return fee.nativeFee;
}
function _requireMinDestinationGas(bytes calldata options, bool isFirstTransfer, Hook memory hook) internal view {
optionsValidator.requireMinDestinationGas(
options,
isFirstTransfer,
hook.target,
hook.gasLimit,
hook.payload.length,
minTransferGas,
minCreationGas
);
}
function _requireExactFee(address feeToken, uint256 lzFee, bool includeProtocolFee) internal view {
if (feeToken == address(0)) {
uint256 protocolFee = includeProtocolFee ? feesManager.fixedProtocolFee() : 0;
if (msg.value != lzFee + protocolFee) revert InvalidFee();
} else {
if (msg.value != 0) revert InvalidFee();
}
}
function _collectProtocolFee(address feeToken) internal returns (uint256 received) {
if (feeToken == address(0)) {
return feesManager.fixedProtocolFee();
}
uint256 protocolFee = feesManager.fixedFeeTokenProtocolFee();
if (protocolFee > 0) {
uint256 beforeBalance = IERC20(feeToken).balanceOf(address(feesManager));
IERC20(feeToken).safeTransferFrom(msg.sender, address(feesManager), protocolFee);
return IERC20(feeToken).balanceOf(address(feesManager)) - beforeBalance;
}
}
function _distributeProtocolFee(address feeToken, address sourceToken, uint256 totalFee) internal {
if (totalFee == 0) return;
OmniseaFeesManager.DistributionResult memory result = feesManager.distributeProtocolFee{
value: feeToken == address(0) ? totalFee : 0
}(feeToken, localChainId, sourceToken, totalFee);
emit ProtocolFeeDistributed(
feeToken,
result.protocolFeeReceiver,
result.issuer,
result.protocolAmount,
result.issuerAmount,
result.protocolPaid,
result.issuerPaid
);
}
function _protocolFee(address feeToken) internal view returns (uint256) {
return feesManager.protocolFee(feeToken);
}
function _validateDestination(
uint32 dstEid,
uint8 recipientAddressType,
bytes32 recipient
) internal view {
if (dstEid == 0 || dstEid == localEndpointId || recipientAddressType == 0 || recipient == bytes32(0)) {
revert InvalidDestination();
}
_validateAddressType(recipientAddressType);
if (recipientAddressType == ADDRESS_TYPE_EVM) {
_validateCanonicalEvmAddress(recipient);
if (_bytes32ToAddress(recipient) == address(0)) revert InvalidDestination();
}
if (peers[dstEid] == bytes32(0)) revert InvalidPeer(dstEid, bytes32(0));
if (!isPeerActive(dstEid)) revert InvalidPeer(dstEid, peers[dstEid]);
}
function _payloadFromOriginal(
address originalToken,
uint256 amount,
uint8 recipientAddressType,
bytes32 recipient,
Hook memory hook
) internal view returns (TokenPayload memory payload) {
if (originalToken == address(0)) revert InvalidOriginal();
if (amount == 0) revert InvalidAmount();
if (recipientAddressType == 0 || recipient == bytes32(0)) revert InvalidDestination();
payload.payloadVersion = PAYLOAD_VERSION;
payload.originalChainId = localChainId;
payload.originalTokenAddressType = ADDRESS_TYPE_EVM;
payload.originalToken = _addressToBytes32(originalToken);
payload.amount = amount;
payload.senderAddressType = ADDRESS_TYPE_EVM;
payload.sender = _addressToBytes32(msg.sender);
payload.recipientAddressType = recipientAddressType;
payload.recipient = recipient;
payload.messageKind = MessageKind.Transfer;
_fillOriginalMetadata(payload, originalToken);
payload.hook = hook;
}
function _ownerSyncPayloadFromOriginal(address originalToken) internal view returns (TokenPayload memory payload) {
if (originalToken == address(0)) revert InvalidOriginal();
if (originalToken.code.length == 0) revert InvalidOriginal();
payload.payloadVersion = PAYLOAD_VERSION;
payload.messageKind = MessageKind.OwnerSync;
payload.originalChainId = localChainId;
payload.originalTokenAddressType = ADDRESS_TYPE_EVM;
payload.originalToken = _addressToBytes32(originalToken);
payload.senderAddressType = ADDRESS_TYPE_EVM;
payload.sender = _addressToBytes32(msg.sender);
payload.recipientAddressType = ADDRESS_TYPE_EVM;
payload.recipient = payload.sender;
_fillOriginalMetadata(payload, originalToken);
}
function _fillOriginalMetadata(TokenPayload memory payload, address originalToken) internal view {
bool hasOwner;
address contractOwner;
(
payload.tokenName,
payload.tokenSymbol,
payload.tokenDecimals,
payload.contractURI,
hasOwner,
contractOwner
) = metadataReader.readOriginal(originalToken);
payload.hasContractOwner = hasOwner;
if (hasOwner) {
payload.contractOwnerAddressType = ADDRESS_TYPE_EVM;
payload.contractOwner = _addressToBytes32(contractOwner);
}
}
function _payloadFromOFT(
address representation,
uint256 amount,
uint8 recipientAddressType,
bytes32 recipient,
Hook memory hook
) internal view returns (TokenPayload memory payload) {
if (amount == 0) revert InvalidAmount();
if (recipientAddressType == 0 || recipient == bytes32(0)) revert InvalidDestination();
OriginalToken memory original = oftToOriginal[representation];
if (!original.exists) revert NotRepresentation();
OFT oft = OFT(representation);
payload.payloadVersion = PAYLOAD_VERSION;
payload.messageKind = MessageKind.Transfer;
payload.originalChainId = original.originalChainId;
payload.originalTokenAddressType = original.originalTokenAddressType;
payload.originalToken = original.originalToken;
payload.amount = amount;
payload.senderAddressType = ADDRESS_TYPE_EVM;
payload.sender = _addressToBytes32(msg.sender);
payload.recipientAddressType = recipientAddressType;
payload.recipient = recipient;
payload.tokenName = oft.name();
payload.tokenSymbol = oft.symbol();
payload.tokenDecimals = oft.decimals();
payload.contractURI = oft.contractURI();
if (oft.hasContractOwner()) {
payload.hasContractOwner = true;
payload.contractOwnerAddressType = ADDRESS_TYPE_EVM;
payload.contractOwner = _addressToBytes32(oft.owner());
}
payload.hook = hook;
}
function _validatePayload(TokenPayload memory payload) internal pure {
if (
payload.payloadVersion != PAYLOAD_VERSION ||
payload.originalChainId == 0 ||
payload.originalTokenAddressType == 0 ||
payload.originalToken == bytes32(0) ||
payload.senderAddressType == 0 ||
payload.sender == bytes32(0) ||
payload.recipientAddressType == 0 ||
payload.recipient == bytes32(0)
) {
revert InvalidOriginal();
}
if (payload.messageKind == MessageKind.OwnerSync) {
if (payload.amount != 0) revert InvalidAmount();
} else if (payload.amount == 0) {
revert InvalidAmount();
}
_validateAddressType(payload.originalTokenAddressType);
_validateAddressType(payload.senderAddressType);
_validateAddressType(payload.recipientAddressType);
_validateContractOwner(payload.hasContractOwner, payload.contractOwnerAddressType, payload.contractOwner);
if (payload.originalTokenAddressType == ADDRESS_TYPE_EVM) {
_validateCanonicalEvmAddress(payload.originalToken);
if (_bytes32ToAddress(payload.originalToken) == address(0)) revert InvalidOriginal();
}
if (payload.senderAddressType == ADDRESS_TYPE_EVM) {
_validateCanonicalEvmAddress(payload.sender);
if (_bytes32ToAddress(payload.sender) == address(0)) revert InvalidOriginal();
}
if (payload.recipientAddressType == ADDRESS_TYPE_EVM) _validateCanonicalEvmAddress(payload.recipient);
if (payload.messageKind == MessageKind.Restore || payload.messageKind == MessageKind.OwnerSync) {
if (payload.recipientAddressType != payload.senderAddressType || payload.recipient != payload.sender) {
revert InvalidDestination();
}
}
if (payload.messageKind == MessageKind.OwnerSync && payload.hook.target != address(0)) revert InvalidHook();
if (payload.hook.target != address(0) && payload.hook.gasLimit == 0) revert InvalidHook();
if (payload.hook.target == address(0) && (payload.hook.gasLimit != 0 || payload.hook.payload.length != 0)) {
revert InvalidHook();
}
}
function _validateContractOwner(bool hasContractOwner, uint8 addressType, bytes32 account) internal pure {
if (!hasContractOwner) {
if (addressType != 0 || account != bytes32(0)) revert InvalidOriginal();
return;
}
if (addressType != ADDRESS_TYPE_EVM) {
revert InvalidOriginal();
}
if (account != bytes32(0)) {
_validateCanonicalEvmAddress(account);
}
}
function _validateAddressType(uint8 addressType) internal pure {
if (addressType != ADDRESS_TYPE_EVM && addressType != ADDRESS_TYPE_SOLANA) {
revert UnsupportedAddressType(addressType);
}
}
function _validateMessageSize(uint256 size) internal pure {
if (size > MAX_BRIDGE_MESSAGE_BYTES) revert MessageTooLarge();
}
function _validateCanonicalEvmAddress(bytes32 value) internal pure {
if (uint256(value) >> 160 != 0) revert InvalidAddress();
}
function _restorePayload(TokenPayload memory payload) internal pure returns (TokenPayload memory restorePayload) {
restorePayload = payload;
restorePayload.messageKind = MessageKind.Restore;
restorePayload.recipientAddressType = payload.senderAddressType;
restorePayload.recipient = payload.sender;
delete restorePayload.hook;
}
function _addressToBytes32(address value) internal pure returns (bytes32) {
return bytes32(uint256(uint160(value)));
}
function _bytes32ToAddress(bytes32 value) internal pure returns (address) {
return address(uint160(uint256(value)));
}
function _bytes32ToAddressOrZero(uint8 addressType, bytes32 value) internal pure returns (address) {
return addressType == ADDRESS_TYPE_EVM ? _bytes32ToAddress(value) : address(0);
}
function _requireEvmAddress(uint8 addressType, bytes32 value) internal pure returns (address) {
if (addressType != ADDRESS_TYPE_EVM) revert UnsupportedRecipientAddressType(addressType);
_validateCanonicalEvmAddress(value);
address account = _bytes32ToAddress(value);
if (account == address(0)) revert InvalidDestination();
return account;
}
function _isSameAddressPeer(bytes32 peer) internal view returns (bool) {
return peer == _addressToBytes32(address(this));
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "endpoint_",
"type": "address",
"internalType": "address"
},
{
"name": "localEndpointId_",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "localChainId_",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "oftImplementation_",
"type": "address",
"internalType": "address"
},
{
"name": "fixedProtocolFee_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "fixedFeeTokenProtocolFee_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "maxProtocolFee_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "maxFeeTokenProtocolFee_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "initialOwner_",
"type": "address",
"internalType": "address"
},
{
"name": "feesManager_",
"type": "address",
"internalType": "address"
},
{
"name": "metadataReader_",
"type": "address",
"internalType": "address"
},
{
"name": "optionsValidator_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "FailedDeployment",
"type": "error",
"inputs": []
},
{
"name": "FailedMessageHashMismatch",
"type": "error",
"inputs": []
},
{
"name": "FailedMessageNotFound",
"type": "error",
"inputs": [
{
"name": "guid",
"type": "bytes32",
"internalType": "bytes32"
}
]
},
{
"name": "InsufficientBalance",
"type": "error",
"inputs": [
{
"name": "balance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "InsufficientLayerZeroGas",
"type": "error",
"inputs": [
{
"name": "providedGas",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "requiredGas",
"type": "uint128",
"internalType": "uint128"
}
]
},
{
"name": "InvalidAddress",
"type": "error",
"inputs": []
},
{
"name": "InvalidAmount",
"type": "error",
"inputs": []
},
{
"name": "InvalidDestination",
"type": "error",
"inputs": []
},
{
"name": "InvalidEndpoint",
"type": "error",
"inputs": []
},
{
"name": "InvalidFee",
"type": "error",
"inputs": []
},
{
"name": "InvalidHook",
"type": "error",
"inputs": []
},
{
"name": "InvalidOriginal",
"type": "error",
"inputs": []
},
{
"name": "InvalidPeer",
"type": "error",
"inputs": [
{
"name": "eid",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "peer",
"type": "bytes32",
"internalType": "bytes32"
}
]
},
{
"name": "InvalidSender",
"type": "error",
"inputs": []
},
{
"name": "MessageAlreadyConsumed",
"type": "error",
"inputs": [
{
"name": "guid",
"type": "bytes32",
"internalType": "bytes32"
}
]
},
{
"name": "MessageTooLarge",
"type": "error",
"inputs": []
},
{
"name": "NotRepresentation",
"type": "error",
"inputs": []
},
{
"name": "OwnableInvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "OwnableUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "PeerAlreadySet",
"type": "error",
"inputs": [
{
"name": "eid",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "currentPeer",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "newPeer",
"type": "bytes32",
"internalType": "bytes32"
}
]
},
{
"name": "ProtocolFeeTooHigh",
"type": "error",
"inputs": [
{
"name": "fee",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "maxFee",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "RepresentationMustUseSendOFT",
"type": "error",
"inputs": []
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "UnsupportedAddressType",
"type": "error",
"inputs": [
{
"name": "addressType",
"type": "uint8",
"internalType": "uint8"
}
]
},
{
"name": "UnsupportedRecipientAddressType",
"type": "error",
"inputs": [
{
"name": "addressType",
"type": "uint8",
"internalType": "uint8"
}
]
},
{
"name": "WithdrawFailed",
"type": "error",
"inputs": []
},
{
"name": "AssetMetadataSynced",
"type": "event",
"inputs": [
{
"name": "originalChainId",
"type": "uint32",
"indexed": true,
"internalType": "uint32"
},
{
"name": "originalTokenAddressType",
"type": "uint8",
"indexed": true,
"internalType": "uint8"
},
{
"name": "originalToken",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "tokenName",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "tokenSymbol",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "tokenDecimals",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
}
],
"anonymous": false
},
{
"name": "BridgeMessageReceived",
"type": "event",
"inputs": [
{
"name": "guid",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "srcEid",
"type": "uint32",
"indexed": true,
"internalType": "uint32"
},
{
"name": "originalChainId",
"type": "uint32",
"indexed": true,
"internalType": "uint32"
},
{
"name": "originalTokenAddressType",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
},
{
"name": "originalToken",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "recipientAddressType",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
},
{
"name": "recipient",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "BridgeMessageSent",
"type": "event",
"inputs": [
{
"name": "guid",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "dstEid",
"type": "uint32",
"indexed": true,
"internalType": "uint32"
},
{
"name": "originalChainId",
"type": "uint32",
"indexed": true,
"internalType": "uint32"
},
{
"name": "originalTokenAddressType",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
},
{
"name": "originalToken",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "recipientAddressType",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
},
{
"name": "recipient",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "nativeFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "protocolFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "FailedMessageRestored",
"type": "event",
"inputs": [
{
"name": "guid",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "restoreGuid",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "dstEid",
"type": "uint32",
"indexed": true,
"internalType": "uint32"
},
{
"name": "refundRecipientAddressType",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
},
{
"name": "refundRecipient",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "nativeFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "FailedMessageRetried",
"type": "event",
"inputs": [
{
"name": "guid",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "srcEid",
"type": "uint32",
"indexed": true,
"internalType": "uint32"
}
],
"anonymous": false
},
{
"name": "FeeTokenProtocolFeesWithdrawn",
"type": "event",
"inputs": [
{
"name": "feeToken",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "recipient",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "FixedFeeTokenProtocolFeeChanged",
"type": "event",
"inputs": [
{
"name": "previousFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "newFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "FixedProtocolFeeChanged",
"type": "event",
"inputs": [
{
"name": "previousFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "newFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "HookFailed",
"type": "event",
"inputs": [
{
"name": "guid",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "target",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "localToken",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "recipient",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "gasLimit",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "payloadHash",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "reasonHash",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
}
],
"anonymous": false
},
{
"name": "HookSucceeded",
"type": "event",
"inputs": [
{
"name": "guid",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "target",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "localToken",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "recipient",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "gasLimit",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "payloadHash",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "returnDataHash",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
}
],
"anonymous": false
},
{
"name": "IssuerFeeTokenProtocolFeesWithdrawn",
"type": "event",
"inputs": [
{
"name": "feeToken",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "issuer",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "recipient",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "IssuerProtocolFeesWithdrawn",
"type": "event",
"inputs": [
{
"name": "issuer",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "recipient",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "LayerZeroDelegateSet",
"type": "event",
"inputs": [
{
"name": "delegate",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "MessageFailed",
"type": "event",
"inputs": [
{
"name": "guid",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "srcEid",
"type": "uint32",
"indexed": true,
"internalType": "uint32"
},
{
"name": "originalChainId",
"type": "uint32",
"indexed": true,
"internalType": "uint32"
},
{
"name": "originalTokenAddressType",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
},
{
"name": "originalToken",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "recipientAddressType",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
},
{
"name": "recipient",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "reasonHash",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
}
],
"anonymous": false
},
{
"name": "MinCreationGasChanged",
"type": "event",
"inputs": [
{
"name": "previousGas",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "newGas",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
}
],
"anonymous": false
},
{
"name": "MinTransferGasChanged",
"type": "event",
"inputs": [
{
"name": "previousGas",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "newGas",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
}
],
"anonymous": false
},
{
"name": "OFTStateChanged",
"type": "event",
"inputs": [
{
"name": "representation",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "action",
"type": "uint8",
"indexed": true,
"internalType": "uint8"
},
{
"name": "feature",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
},
{
"name": "account",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "flag",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "OriginalLocked",
"type": "event",
"inputs": [
{
"name": "originalToken",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "requestedAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "actualAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OriginalUnlocked",
"type": "event",
"inputs": [
{
"name": "originalToken",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "recipient",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "PeerSet",
"type": "event",
"inputs": [
{
"name": "eid",
"type": "uint32",
"indexed": true,
"internalType": "uint32"
},
{
"name": "peer",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "setAt",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
},
{
"name": "activationTime",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
},
{
"name": "sameAddressPeer",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "ProtocolFeeDistributed",
"type": "event",
"inputs": [
{
"name": "feeToken",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "protocolFeeReceiver",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "issuer",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "protocolAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "issuerAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "protocolPaid",
"type": "bool",
"indexed": false,
"internalType": "bool"
},
{
"name": "issuerPaid",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "ProtocolFeeReceiverChanged",
"type": "event",
"inputs": [
{
"name": "previousReceiver",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newReceiver",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "ProtocolFeesWithdrawn",
"type": "event",
"inputs": [
{
"name": "recipient",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "RepresentationBurned",
"type": "event",
"inputs": [
{
"name": "representation",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "originalChainId",
"type": "uint32",
"indexed": true,
"internalType": "uint32"
},
{
"name": "originalTokenAddressType",
"type": "uint8",
"indexed": true,
"internalType": "uint8"
},
{
"name": "originalToken",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "owner",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "RepresentationDeployed",
"type": "event",
"inputs": [
{
"name": "originalChainId",
"type": "uint32",
"indexed": true,
"internalType": "uint32"
},
{
"name": "originalTokenAddressType",
"type": "uint8",
"indexed": true,
"internalType": "uint8"
},
{
"name": "originalToken",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "representation",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "RepresentationMinted",
"type": "event",
"inputs": [
{
"name": "representation",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "originalChainId",
"type": "uint32",
"indexed": true,
"internalType": "uint32"
},
{
"name": "originalTokenAddressType",
"type": "uint8",
"indexed": true,
"internalType": "uint8"
},
{
"name": "originalToken",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "recipient",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "TokenIssuerSet",
"type": "event",
"inputs": [
{
"name": "chainId",
"type": "uint32",
"indexed": true,
"internalType": "uint32"
},
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "issuer",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "ADDRESS_TYPE_EVM",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "ADDRESS_TYPE_SOLANA",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "ASSET_KIND_ERC20",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "MAX_BRIDGE_MESSAGE_BYTES",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "PAYLOAD_VERSION",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "allowInitializePath",
"type": "function",
"inputs": [
{
"name": "origin",
"type": "tuple",
"components": [
{
"name": "srcEid",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "sender",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "nonce",
"type": "uint64",
"internalType": "uint64"
}
],
"internalType": "struct Origin"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "authorizeOftFeature",
"type": "function",
"inputs": [
{
"name": "representation",
"type": "address",
"internalType": "address"
},
{
"name": "feature",
"type": "uint8",
"internalType": "enum OFT.Feature"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "chainIdForEid",
"type": "function",
"inputs": [
{
"name": "eid",
"type": "uint32",
"internalType": "uint32"
}
],
"outputs": [
{
"name": "chainId",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "view"
},
{
"name": "collectedFeeTokenProtocolFees",
"type": "function",
"inputs": [
{
"name": "feeToken",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "collectedProtocolFees",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "consumedMessages",
"type": "function",
"inputs": [
{
"name": "guid",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "consumed",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "endpoint",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract ILayerZeroEndpointV2"
}
],
"stateMutability": "view"
},
{
"name": "endpointNativeToken",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "executeLzMessage",
"type": "function",
"inputs": [
{
"name": "origin",
"type": "tuple",
"components": [
{
"name": "srcEid",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "sender",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "nonce",
"type": "uint64",
"internalType": "uint64"
}
],
"internalType": "struct Origin"
},
{
"name": "guid",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "payload",
"type": "tuple",
"components": [
{
"name": "payloadVersion",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "messageKind",
"type": "uint8",
"internalType": "enum Omnisea.MessageKind"
},
{
"name": "originalChainId",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "originalTokenAddressType",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "originalToken",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "senderAddressType",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "sender",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "recipientAddressType",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "recipient",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "tokenName",
"type": "string",
"internalType": "string"
},
{
"name": "tokenSymbol",
"type": "string",
"internalType": "string"
},
{
"name": "tokenDecimals",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "contractURI",
"type": "string",
"internalType": "string"
},
{
"name": "hasContractOwner",
"type": "bool",
"internalType": "bool"
},
{
"name": "contractOwnerAddressType",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "contractOwner",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "hook",
"type": "tuple",
"components": [
{
"name": "target",
"type": "address",
"internalType": "address"
},
{
"name": "gasLimit",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "payload",
"type": "bytes",
"internalType": "bytes"
}
],
"internalType": "struct Omnisea.Hook"
}
],
"internalType": "struct Omnisea.TokenPayload"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "failedMessages",
"type": "function",
"inputs": [
{
"name": "guid",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "exists",
"type": "bool",
"internalType": "bool"
},
{
"name": "srcEid",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "sender",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "nonce",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "message",
"type": "bytes",
"internalType": "bytes"
},
{
"name": "messageHash",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "reasonHash",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "failedAt",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "feesManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract OmniseaFeesManager"
}
],
"stateMutability": "view"
},
{
"name": "fixedFeeTokenProtocolFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "fixedProtocolFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "isPeerActive",
"type": "function",
"inputs": [
{
"name": "eid",
"type": "uint32",
"internalType": "uint32"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "isTrustedPeer",
"type": "function",
"inputs": [
{
"name": "eid",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "peer",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "localChainId",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "view"
},
{
"name": "localEndpointId",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "view"
},
{
"name": "lockedBalance",
"type": "function",
"inputs": [
{
"name": "originalToken",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "lzReceive",
"type": "function",
"inputs": [
{
"name": "origin",
"type": "tuple",
"components": [
{
"name": "srcEid",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "sender",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "nonce",
"type": "uint64",
"internalType": "uint64"
}
],
"internalType": "struct Origin"
},
{
"name": "guid",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "message",
"type": "bytes",
"internalType": "bytes"
},
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "metadataReader",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract OmniseaMetadataReader"
}
],
"stateMutability": "view"
},
{
"name": "minCreationGas",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint128",
"internalType": "uint128"
}
],
"stateMutability": "view"
},
{
"name": "minTransferGas",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint128",
"internalType": "uint128"
}
],
"stateMutability": "view"
},
{
"name": "nextNonce",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "pure"
},
{
"name": "notifyOftStateChanged",
"type": "function",
"inputs": [
{
"name": "action",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "feature",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "account",
"type": "address",
"internalType": "address"
},
{
"name": "flag",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "oftImplementation",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "oftToOriginal",
"type": "function",
"inputs": [
{
"name": "representation",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "originalChainId",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "originalTokenAddressType",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "originalToken",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "exists",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "optionsValidator",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract OmniseaOptionsValidator"
}
],
"stateMutability": "view"
},
{
"name": "originalToOFT",
"type": "function",
"inputs": [
{
"name": "originalTokenKey",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "representation",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "peerActivationTime",
"type": "function",
"inputs": [
{
"name": "eid",
"type": "uint32",
"internalType": "uint32"
}
],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "peerSetAt",
"type": "function",
"inputs": [
{
"name": "eid",
"type": "uint32",
"internalType": "uint32"
}
],
"outputs": [
{
"name": "setAt",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "peers",
"type": "function",
"inputs": [
{
"name": "eid",
"type": "uint32",
"internalType": "uint32"
}
],
"outputs": [
{
"name": "peer",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "predictRepresentation",
"type": "function",
"inputs": [
{
"name": "originalChainId",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "originalTokenAddressType",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "originalToken",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "quoteRestore",
"type": "function",
"inputs": [
{
"name": "guid",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "options",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "nativeFee",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "quoteSendOFTTo",
"type": "function",
"inputs": [
{
"name": "dstEid",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "representation",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "recipientAddressType",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "recipient",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "isFirstTransfer",
"type": "bool",
"internalType": "bool"
},
{
"name": "hook",
"type": "tuple",
"components": [
{
"name": "target",
"type": "address",
"internalType": "address"
},
{
"name": "gasLimit",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "payload",
"type": "bytes",
"internalType": "bytes"
}
],
"internalType": "struct Omnisea.Hook"
},
{
"name": "options",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "totalFee",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "quoteSendOriginalTo",
"type": "function",
"inputs": [
{
"name": "dstEid",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "originalToken",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "recipientAddressType",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "recipient",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "isFirstTransfer",
"type": "bool",
"internalType": "bool"
},
{
"name": "hook",
"type": "tuple",
"components": [
{
"name": "target",
"type": "address",
"internalType": "address"
},
{
"name": "gasLimit",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "payload",
"type": "bytes",
"internalType": "bytes"
}
],
"internalType": "struct Omnisea.Hook"
},
{
"name": "options",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "totalFee",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "quoteSyncOriginalOwnerTo",
"type": "function",
"inputs": [
{
"name": "dstEid",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "originalToken",
"type": "address",
"internalType": "address"
},
{
"name": "options",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "totalFee",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "representationFor",
"type": "function",
"inputs": [
{
"name": "originalChainId",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "originalTokenAddressType",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "originalToken",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "restoreFailedMessage",
"type": "function",
"inputs": [
{
"name": "guid",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "options",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "receipt",
"type": "tuple",
"components": [
{
"name": "guid",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "nonce",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "fee",
"type": "tuple",
"components": [
{
"name": "nativeFee",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "lzTokenFee",
"type": "uint256",
"internalType": "uint256"
}
],
"internalType": "struct MessagingFee"
}
],
"internalType": "struct MessagingReceipt"
}
],
"stateMutability": "payable"
},
{
"name": "retryFailedMessage",
"type": "function",
"inputs": [
{
"name": "guid",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "sendOFTTo",
"type": "function",
"inputs": [
{
"name": "dstEid",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "representation",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "recipientAddressType",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "recipient",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "isFirstTransfer",
"type": "bool",
"internalType": "bool"
},
{
"name": "hook",
"type": "tuple",
"components": [
{
"name": "target",
"type": "address",
"internalType": "address"
},
{
"name": "gasLimit",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "payload",
"type": "bytes",
"internalType": "bytes"
}
],
"internalType": "struct Omnisea.Hook"
},
{
"name": "options",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "receipt",
"type": "tuple",
"components": [
{
"name": "guid",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "nonce",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "fee",
"type": "tuple",
"components": [
{
"name": "nativeFee",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "lzTokenFee",
"type": "uint256",
"internalType": "uint256"
}
],
"internalType": "struct MessagingFee"
}
],
"internalType": "struct MessagingReceipt"
}
],
"stateMutability": "payable"
},
{
"name": "sendOriginalTo",
"type": "function",
"inputs": [
{
"name": "dstEid",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "originalToken",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "recipientAddressType",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "recipient",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "isFirstTransfer",
"type": "bool",
"internalType": "bool"
},
{
"name": "hook",
"type": "tuple",
"components": [
{
"name": "target",
"type": "address",
"internalType": "address"
},
{
"name": "gasLimit",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "payload",
"type": "bytes",
"internalType": "bytes"
}
],
"internalType": "struct Omnisea.Hook"
},
{
"name": "options",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "receipt",
"type": "tuple",
"components": [
{
"name": "guid",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "nonce",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "fee",
"type": "tuple",
"components": [
{
"name": "nativeFee",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "lzTokenFee",
"type": "uint256",
"internalType": "uint256"
}
],
"internalType": "struct MessagingFee"
}
],
"internalType": "struct MessagingReceipt"
}
],
"stateMutability": "payable"
},
{
"name": "setChainIdForEid",
"type": "function",
"inputs": [
{
"name": "eid",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "chainId",
"type": "uint32",
"internalType": "uint32"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setFixedFeeTokenProtocolFee",
"type": "function",
"inputs": [
{
"name": "newFee",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setFixedProtocolFee",
"type": "function",
"inputs": [
{
"name": "newFee",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setLayerZeroDelegate",
"type": "function",
"inputs": [
{
"name": "delegate",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMinCreationGas",
"type": "function",
"inputs": [
{
"name": "newGas",
"type": "uint128",
"internalType": "uint128"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMinTransferGas",
"type": "function",
"inputs": [
{
"name": "newGas",
"type": "uint128",
"internalType": "uint128"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setPeer",
"type": "function",
"inputs": [
{
"name": "eid",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "peer",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setProtocolFeeReceiver",
"type": "function",
"inputs": [
{
"name": "newReceiver",
"type": "address",
"internalType": "address payable"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTokenIssuer",
"type": "function",
"inputs": [
{
"name": "chainId",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "issuer",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "syncOriginalOwnerTo",
"type": "function",
"inputs": [
{
"name": "dstEid",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "originalToken",
"type": "address",
"internalType": "address"
},
{
"name": "options",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "receipt",
"type": "tuple",
"components": [
{
"name": "guid",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "nonce",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "fee",
"type": "tuple",
"components": [
{
"name": "nativeFee",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "lzTokenFee",
"type": "uint256",
"internalType": "uint256"
}
],
"internalType": "struct MessagingFee"
}
],
"internalType": "struct MessagingReceipt"
}
],
"stateMutability": "payable"
},
{
"name": "tokenKey",
"type": "function",
"inputs": [
{
"name": "originalChainId",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "originalTokenAddressType",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "originalToken",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "pure"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "withdrawFeeTokenProtocolFees",
"type": "function",
"inputs": [
{
"name": "feeToken",
"type": "address",
"internalType": "address"
},
{
"name": "recipient",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "withdrawIssuerFeeTokenProtocolFees",
"type": "function",
"inputs": [
{
"name": "feeToken",
"type": "address",
"internalType": "address"
},
{
"name": "issuer",
"type": "address",
"internalType": "address"
},
{
"name": "recipient",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "withdrawIssuerProtocolFees",
"type": "function",
"inputs": [
{
"name": "issuer",
"type": "address",
"internalType": "address"
},
{
"name": "recipient",
"type": "address",
"internalType": "address payable"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "withdrawProtocolFees",
"type": "function",
"inputs": [
{
"name": "recipient",
"type": "address",
"internalType": "address payable"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
}
]0x60806040526004361015610011575f80fd5b5f3560e01c8062c0a1eb1461040e57806305a9e0731461040957806307d92686146103825780630df38adc1461040457806311994210146103ff57806313137d65146103fa57806317e1813d146103f55780631a7a73c2146103f05780631ca1395a146103eb5780631fd79a97146103e6578063225ad49d146103e157806325c2cd4a146103dc57806325c47dbe146103d7578063319dc8bf146103d25780633225e9d5146103cd5780633400288b146103c8578063364f677d146103c357806336aca176146103be578063391d6f7d146103b957806339bc3c81146103b45780633db58263146103af578063416610c4146103aa57806341c0c52a146103a557806346877b1a146103a05780634cc5b1171461039b5780635265ece61461039657806353ab0b46146103915780635b056da51461038c5780635e280f111461038757806361cd4d691461038257806367743d191461037d578063715018a6146103785780637703a478146103735780637d25a05e1461036e5780638076ac891461036957806383d80cbf14610364578063848a37d81461035f5780638da5cb5b1461035a578063997d53ab1461035557806399955243146103505780639ae697bf1461034b5780639b1dd4e6146103465780639e1fcc3c14610341578063a2f2c50a1461033c578063a3da76f514610337578063a4e7f8bd14610332578063add1b7c31461032d578063b0448d2e14610328578063b1274cfd14610323578063b5138f941461031e578063b666151814610319578063b678780914610314578063bb0b6a531461030f578063c06868641461030a578063c695a9a914610305578063c7c073bd14610300578063cd3387a0146102fb578063d0ba57bb146102f6578063de0cb755146102f1578063e4ca8754146102ec578063f2566240146102e7578063f2fde38b146102e2578063fa82de30146102dd5763ff7bd03d146102d8575f80fd5b612809565b612719565b6126a3565b612600565b6124fd565b6124be565b6124a3565b61243b565b612337565b6122e9565b6122be565b612285565b61221f565b611fca565b611ef0565b611e3a565b611df6565b611d98565b611d29565b611a59565b611a15565b6119ad565b611969565b61192e565b61188c565b611810565b6117e9565b6117a8565b61175b565b611684565b61165e565b61163e565b6115fa565b6115d2565b61067b565b61158e565b61154e565b6114d9565b6114ad565b611481565b61139f565b611300565b611205565b61119c565b61113b565b6110fb565b6110ca565b611062565b611031565b610fff565b610fd0565b610fb4565b610eb6565b610cba565b610be9565b610aaf565b6109b5565b61092d565b610866565b6107e2565b610696565b610637565b6104a8565b9181601f84011215610440578235916001600160401b038311610440576020838186019501011161044057565b5f80fd5b9060406003198301126104405760043591602435906001600160401b0382116104405761047391600401610413565b9091565b919091606060206040608084019580518552600180831b038382015116838601520151805160408501520151910152565b6104b136610444565b906104ba61287b565b506104c3613976565b6104d46104cf84610fe3565b6128ad565b906104e66104e28351151590565b1590565b61060a57610606937fe71c3da129a5b6ba7710411ba7de3b548d06f0edc882fcc92960c4d85ccda40063ffffffff61058a60206105376105326080890151838082518301019101612a51565b613a77565b96019461055388828961054e8a5163ffffffff1690565b613aad565b978861055d613839565b916105688284613b38565b61057961057489610fe3565b612c13565b885163ffffffff16938a3395613cd7565b956105a461059785610ff1565b805460ff19166001179055565b6105ef6105b78851965163ffffffff1690565b916101206105ca6101008a015160ff1690565b98015160405194859416988460409194939260ff606083019616825260208201520152565b0390a46105fa6139ae565b60405191829182610477565b0390f35b6302e5218d60e21b5f52600484905260245ffd5b5ffd5b5f91031261044057565b6001600160a01b031690565b34610440575f366003190112610440576040517f000000000000000000000000c8856d6285d4ba3afd8eb9351e151e8b7d0414f36001600160a01b03168152602090f35b34610440575f36600319011261044057602060405160018152f35b34610440576020366003190112610440576004356106b2613e96565b60405163037ce2b760e21b815260048101829052906020826024815f7f000000000000000000000000c8856d6285d4ba3afd8eb9351e151e8b7d0414f36001600160a01b03165af1801561076d577f6d9a67166dc041b710874cecc7940221bcbe369f966aa53541079e8096f6b74b925f9161073e575b5061073960405192839283612cb3565b0390a1005b610760915060203d602011610766575b6107588183611bf2565b810190612c99565b5f610729565b503d61074e565b612ca8565b63ffffffff81160361044057565b359061078b82610772565b565b6001600160a01b0381160361044057565b6060600319820112610440576004356107b681610772565b916024356107c38161078d565b91604435906001600160401b0382116104405761047391600401610413565b34610440576107f03661079e565b9060018060a01b0383165f52600560205260ff600260405f200154166108465760209361081f61083e94613ebc565b9061083960ff61010084015116610120840151908361452b565b6150c4565b604051908152f35b6332f7727760e01b5f5260045ffd5b606090600319011261044057600490565b60e03660031901126104405761087b36610855565b6064356084356001600160401b0381116104405761089d903690600401610413565b916108a960a43561078d565b60c4356001600160401b038111610440576108c8903690600401610413565b50507f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b6001600160a01b0316330361091e5761090b93610906613976565b613340565b60015f80516020615f6c83398151915255005b63f1cbb56760e01b5f5260045ffd5b34610440575f366003190112610440576040516317e1813d60e01b81526020816004817f000000000000000000000000c8856d6285d4ba3afd8eb9351e151e8b7d0414f36001600160a01b03165afa90811561076d575f91610996575b50604051908152602090f35b6109af915060203d602011610766576107588183611bf2565b5f61098a565b34610440576040366003190112610440576004356109d28161078d565b602435906109de613e96565b6109e6613976565b7f000000000000000000000000c8856d6285d4ba3afd8eb9351e151e8b7d0414f36001600160a01b031691823b15610440575f8092604460405180958193630d3d39e160e11b835260018060a01b0316978860048401528660248401525af190811561076d577fa087657e3d85162090ffd700fbfdf5070d816f63aa5da00063f6ffd369c8a6db92610a8892610a95575b506040519081529081906020820190565b0390a2610a936139ae565b005b80610aa35f610aa993611bf2565b80610621565b5f610a77565b3461044057602036600319011261044057600435610acc8161078d565b610ad4613e96565b6001600160a01b038116908115610b85577f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b6001600160a01b0316803b156104405760405163ca5eb5e160e01b8152915f918391829084908290610b3b9060048301610bd6565b03925af1801561076d57610b71575b507f47681cb94af111f145fefdf74101234100cd4b0835d26f70396fe612e033740a5f80a2005b80610aa35f610b7f93611bf2565b5f610b4a565b63e6c4247b60e01b5f5260045ffd5b60ff81160361044057565b359061078b82610b94565b606090600319011261044057600435610bc281610772565b90602435610bcf81610b94565b9060443590565b6001600160a01b03909116815260200190565b3461044057610c00610bfa36610baa565b916136a4565b5f526004602052602060018060a01b0360405f205416604051908152f35b8015150361044057565b359061078b82610c1e565b9061010060031983011261044057600435610c4d81610772565b91602435610c5a8161078d565b9160443591606435610c6b81610b94565b916084359160a435610c7c81610c1e565b9160c4356001600160401b03811161044057600401606081840312610440579160e435906001600160401b0382116104405761047391600401610413565b610cc336610c33565b969294610cd498969492919861287b565b50610cdd613976565b610ce883828961452b565b8415610ea757610cff610cfa8561116a565b6135e5565b92610d106104e26060860151151590565b610e9857610d3189928b92610d29610d39963690612d3b565b91898961462d565b968789613f71565b92610d42613839565b96610d4c8861491a565b610d56868a613b64565b6001600160a01b038516803b1561044057604051632770a7eb60e21b8152945f8680610d86883360048401613635565b038183865af195861561076d578a5f80516020615f8c83398151915298610dd36106069f8f906105ef998f918f92610dd99863ffffffff9f610e84575b50610dcd85614990565b97614b14565b9d614bb2565b805163ffffffff16917f9a57bdb022cb57a63b2fb1a5344d3d7d04705dd106b9f3d9044583b3e3e9825660ff6040610e15602086015160ff1690565b94015193610e30898b60405194859416981696339084613650565b0390a4885195610e47604089015163ffffffff1690565b93610e5660608a015160ff1690565b98608081015191610120610e6f61010084015160ff1690565b9201519288604051998a99169d169b88613671565b80610aa35f610e9293611bf2565b5f610dc3565b63397a83e960e01b5f5260045ffd5b63162908e360e11b5f5260045ffd5b3461044057606036600319011261044057600435610ed381610772565b602435610edf8161078d565b60443590610eec8261078d565b610ef4613e96565b7f000000000000000000000000c8856d6285d4ba3afd8eb9351e151e8b7d0414f36001600160a01b031692833b15610440576040516312e166a560e11b815263ffffffff91909116600482018190526001600160a01b03928316602483018190529390921660448201819052935f908290606490829084905af1801561076d57610fa0575b507f2fe14a1e5fd9af4a8fcfb881d53bc37e22521888f82dde222dfa4ec57f23bf775f80a4005b80610aa35f610fae93611bf2565b5f610f79565b34610440575f3660031901126104405760206040516140008152f35b3461044057602061083e610bfa36610baa565b5f52600760205260405f2090565b5f52600860205260405f2090565b34610440576020366003190112610440576004355f526004602052602060018060a01b0360405f205416604051908152f35b3461044057604036600319011261044057610a9360043561105181610772565b6024359061105d613e96565b6136df565b34610440575f3660031901126104405760405163364f677d60e01b81526020816004817f000000000000000000000000c8856d6285d4ba3afd8eb9351e151e8b7d0414f36001600160a01b03165afa90811561076d575f916109965750604051908152602090f35b346104405760203660031901126104405760206110f16004356110ec81610772565b6137eb565b6040519015158152f35b34610440575f36600319011261044057602060405163ffffffff7f00000000000000000000000000000000000000000000000000000000000076d0168152f35b34610440576020366003190112610440576004355f526008602052602060ff60405f2054166040519015158152f35b6001600160a01b03165f90815260056020526040902090565b6001600160a01b03165f90815260066020526040902090565b34610440576020366003190112610440576004356111b98161078d565b60018060a01b03165f526005602052608060405f2080549060ff60026001830154920154169060ff6040519363ffffffff8116855260201c166020840152604083015215156060820152f35b34610440576060366003190112610440576004356112228161078d565b60243561122e8161078d565b6044359161123a613e96565b611242613976565b7f000000000000000000000000c8856d6285d4ba3afd8eb9351e151e8b7d0414f36001600160a01b031692833b1561044057604051631059843160e21b81526001600160a01b0392831660048201819052939092166024830181905260448301829052935f908390606490829084905af190811561076d577f1876b118a18957154d06221d5bfaf5448250124f74e23bcdb052be1ec56185b1926112f592610a9557506040519081529081906020820190565b0390a3610a936139ae565b6113093661079e565b929061131361287b565b5061131c613976565b6113263383614439565b6001600160a01b0383165f9081526005602052604090206002015460ff16610846576106069361135861139794613ebc565b9161137260ff61010085015116610120850151908661452b565b61137e828285876150c4565b92611387613839565b946113928587613b38565b614b14565b6105fa6139ae565b34610440576020366003190112610440576004356113bc8161078d565b6113c4613e96565b604051632343bd8d60e11b81526001600160a01b039182166004820181905291602090829060249082905f907f000000000000000000000000c8856d6285d4ba3afd8eb9351e151e8b7d0414f3165af190811561076d575f91611452575b506001600160a01b03167f6fffcf2a934e77003e46e1940b7df50d5ef8b6c60c08700ddea848b4c5c40bcb5f80a3005b611474915060203d60201161147a575b61146c8183611bf2565b810190613824565b5f611422565b503d611462565b34610440575f36600319011261044057602061149b613839565b6040516001600160a01b039091168152f35b34610440575f36600319011261044057602060405160038152f35b6001600160801b0381160361044057565b34610440576020366003190112610440577f55fee4fb02d50b9e71b7d67a0f7538a308a571ad02ad0bd008332cf0daf5226f600435611517816114c8565b61151f613e96565b600980546001600160801b038381166001600160801b03198316179092556040519283926107399216836138a2565b34610440575f36600319011261044057602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000001237168152f35b34610440575f366003190112610440576040517f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b6001600160a01b03168152602090f35b34610440575f366003190112610440576009546040516001600160801b039091168152602090f35b34610440575f36600319011261044057611612613e96565b5f80546001600160a01b0319811682556001600160a01b03165f80516020615f4c8339815191528280a3005b34610440575f36600319011261044057602060095460801c604051908152f35b346104405760403660031901126104405761167a600435610772565b60206040515f8152f35b34610440576080366003190112610440576004356116a181610b94565b6024356116ad81610b94565b6044356116b98161078d565b606435926116c684610c1e565b6116df6104e260026116d73361116a565b015460ff1690565b610e985760ff169283158015611751575b8015611747575b611738576040805160ff90941684526001600160a01b03909216602084015215159082015233905f80516020615f2c8339815191529080606081015b0390a3005b636edaef2f60e11b5f5260045ffd5b50600684116116f7565b50600284146116f0565b3461044057602036600319011261044057602061178260043561177d81610772565b6138bc565b6040516001600160401b039091168152f35b63ffffffff165f52600160205260405f2090565b346104405760203660031901126104405763ffffffff6004356117ca81610772565b165f526002602052602060018060401b0360405f205416604051908152f35b34610440575f366003190112610440575f546040516001600160a01b039091168152602090f35b34610440576020366003190112610440577fa957901ae5f51776792e340333f0f0ff8ce59b3a09b1471f7ff29f099d2fc6fa60043561184e816114c8565b611856613e96565b600980546001600160801b038116608084811b6001600160801b0319169190911790925560405192839261073992901c836138a2565b34610440576020366003190112610440576004356118a8613e96565b604051639995524360e01b815260048101829052906020826024815f7f000000000000000000000000c8856d6285d4ba3afd8eb9351e151e8b7d0414f36001600160a01b03165af1801561076d577f27c2f151a4b6f8cc994fe92f00d56b39b8ef468e8dc107d894d1ec6a85326fa0925f9161073e575061073960405192839283612cb3565b346104405760203660031901126104405760043561194b8161078d565b60018060a01b03165f526006602052602060405f2054604051908152f35b34610440575f366003190112610440576040517f0000000000000000000000006f4570e8c4cbe8c43cc0ac680a061a86e67c42f86001600160a01b03168152602090f35b34610440576040366003190112610440576004356119ca81610772565b63ffffffff602435916119dc83610772565b6119e4613e96565b169081158015611a07575b61091e57610a93915f52600360205260405f2061390e565b5063ffffffff8116156119ef565b34610440575f366003190112610440576040517f000000000000000000000000a796073d7d183fe01cf7a7c2af9355e225be93a86001600160a01b03168152602090f35b3461044057608036600319011261044057600435611a768161078d565b602435611a828161078d565b60443590611a8f8261078d565b60643592611a9b613e96565b611aa3613976565b7f000000000000000000000000c8856d6285d4ba3afd8eb9351e151e8b7d0414f36001600160a01b031693843b156104405760405163a3da76f560e01b81526001600160a01b039283166004820181905293831660248201819052949092166044830181905260648301829052945f908390608490829084905af190811561076d577f998905facf939806d0f1993975a2de66b2371a1d410053e743b230e5bf44d8d292611b6092610a9557506040519081529081906020820190565b0390a4610a936139ae565b90600182811c92168015611b99575b6020831014611b8557565b634e487b7160e01b5f52602260045260245ffd5b91607f1691611b7a565b634e487b7160e01b5f52604160045260245ffd5b606081019081106001600160401b03821117611bd257604052565b611ba3565b604081019081106001600160401b03821117611bd257604052565b601f909101601f19168101906001600160401b03821190821017611bd257604052565b9060405191825f825492611c2884611b6b565b8084529360018116908115611c915750600114611c4d575b5061078b92500383611bf2565b90505f9291925260205f20905f915b818310611c7557505090602061078b928201015f611c40565b6020919350806001915483858901015201910190918492611c5c565b90506020925061078b94915060ff191682840152151560051b8201015f611c40565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b94919263ffffffff611d1a9460e0989b9a99969315158852166020870152604086015260018060401b031660608501526101006080850152610100840190611cb3565b9560a083015260c08201520152565b34610440576020366003190112610440576004355f52600760205260405f20805461060660018301549260018060401b0360028201541690611d6d60038201611c15565b6004820154906006600584015493015493604051978760ff63ffffffff8b9a60081c16911689611cd7565b3461044057611dcd611dc7611dc1611daf36610c33565b99959198909897969492973690612d3b565b9361462d565b90613f71565b611ddd611dd8613839565b61491a565b8101809111611df157602090604051908152f35b612bff565b34610440575f366003190112610440576040517f000000000000000000000000e2dfd404e61c3228116fb97b5dabb0d492f0228e6001600160a01b03168152602090f35b3461044057611e4b610bfa36610baa565b604080513060388201526f5af43d82803e903d91602b57fd5bf3ff60248201527f000000000000000000000000a796073d7d183fe01cf7a7c2af9355e225be93a86014820152733d602d80600a3d3981f3363d3d373d3d3d363d73815260588101929092526037600c8301206078830152605560439092019190912090516001600160a01b039091168152602090f35b6003111561044057565b359061078b82611edb565b3461044057604036600319011261044057600435611f0d8161078d565b60243590611f1a82611edb565b611f22613e96565b611f336104e260026116d78461116a565b610e98576001600160a01b0316803b1561044057604051634b5a57c760e11b81525f8180611f648660048301613930565b038183865af1801561076d576002935f80516020615f2c8339815191529261173392611fb6575b50611f9581612f5c565b6040805160ff90921682523360208301526001908201529081906060820190565b80610aa35f611fc493611bf2565b5f611f8b565b611fd336610c33565b959293611fe498979895919561287b565b50611fed613976565b611ff881838a61452b565b61200660026116d78b61116a565b610846578315610ea75761202d87928792612025612035963690612d3b565b91878d614d53565b948589613f71565b9261203e613839565b6120478161491a565b926120528683613b64565b6040516370a0823160e01b81526001600160a01b038a1692906020818061207c3060048301610bd6565b0381875afa90811561076d575f91612200575b5061209c83303387614e09565b6040516370a0823160e01b815290602082806120bb3060048301610bd6565b0381885afa801561076d576120d7925f916121e1575b50613940565b978815610ea75789828989938c988f60a087019e8f526120f690611183565b8a81549061210391613923565b905561210e84614990565b9561211895614b14565b9a61212292614bb2565b604051809133946121339183612cb3565b037f08b32d13cb874c23e8b7558161d4a1f1b82d954ed73e283a85b2b6dd5f97545591a3855192604083015161216c9063ffffffff1690565b91606084015161217c9060ff1690565b9160808501519651946101008101516121959060ff1690565b906101200151906040519663ffffffff8897169a63ffffffff16996121ba9688613671565b035f80516020615f8c83398151915291a46121d36139ae565b604051610606819282610477565b6121fa915060203d602011610766576107588183611bf2565b5f6120d1565b612219915060203d602011610766576107588183611bf2565b5f61208f565b346104405760a03660031901126104405761223936610855565b6084356064356001600160401b038211610440576102406003198336030112610440573033036117385761227f610a9393359261227584610772565b3690600401612da8565b91614e97565b346104405760203660031901126104405763ffffffff6004356122a781610772565b165f526001602052602060405f2054604051908152f35b346104405760403660031901126104405760206110f16004356122e081610772565b6024359061394d565b34610440576122f736610c33565b9691929460018060a09a9693989a1b0383165f52600560205260ff600260405f2001541661084657611dcd98612331611dc7953690612d3b565b93614d53565b346104405761234536610444565b91805f52600760205260405f2061235a61283d565b916123e76104e261238584546123796123738260ff1690565b15158852565b60081c63ffffffff1690565b63ffffffff1660208601908152946001850154604082015260028501546001600160401b0316606082015260066123be60038701611c15565b9560808301968752600481015460a0840152600581015460c0840152015460e082015251151590565b6124295761060661241986868661054e61240e610532895160208082518301019101612a51565b915163ffffffff1690565b6040519081529081906020820190565b6302e5218d60e21b5f5260045260245ffd5b34610440575f366003190112610440576040516306699c3d60e51b81526020816004817f000000000000000000000000c8856d6285d4ba3afd8eb9351e151e8b7d0414f36001600160a01b03165afa90811561076d575f916109965750604051908152602090f35b34610440575f36600319011261044057602060405160028152f35b346104405760203660031901126104405763ffffffff6004356124e081610772565b165f526003602052602063ffffffff60405f205416604051908152f35b3461044057602036600319011261044057600435612519613976565b6125256104cf82610fe3565b6125326104e28251151590565b6125ec5761254961254283610ff1565b5460ff1690565b6125d8576125aa816125886020612571608063ffffffff960151828082518301019101612a51565b92019185612583845163ffffffff1690565b615013565b61259461057485610fe3565b6125a061059785610ff1565b5163ffffffff1690565b16907ff815f19c4760a03cebaf8d39c593b92bdcf282542e035482071450db37f82d505f80a3610a936139ae565b633bc6e1d360e21b5f52600482905260245ffd5b6302e5218d60e21b5f52600482905260245ffd5b346104405760203660031901126104405760043561261d8161078d565b6040516303c9598960e61b81526001600160a01b03918216600482015290602090829060249082907f000000000000000000000000c8856d6285d4ba3afd8eb9351e151e8b7d0414f3165afa801561076d57610606915f9161268a57506040519081529081906020820190565b610aa9915060203d602011610766576107588183611bf2565b34610440576020366003190112610440576004356126c08161078d565b6126c8613e96565b6001600160a01b03168015612706575f80546001600160a01b03198116831782556001600160a01b0316905f80516020615f4c8339815191529080a3005b631e4fbdf760e01b5f525f60045260245ffd5b34610440576060366003190112610440576004356127368161078d565b6024356127428161078d565b6044359161274e613e96565b612756613976565b7f000000000000000000000000c8856d6285d4ba3afd8eb9351e151e8b7d0414f36001600160a01b031692833b1561044057604051630fa82de360e41b81526001600160a01b0392831660048201819052939092166024830181905260448301829052935f908390606490829084905af190811561076d577f5d7658e80e799c7dd43d61ecf54dcef69351a8ca3319e15002072bca76d07faf926112f592610a9557506040519081529081906020820190565b346104405760603660031901126104405760206110f161282836610855565b8281359161283583610772565b01359061394d565b6040519061078b61010083611bf2565b6040519061078b61024083611bf2565b6040519061078b60a083611bf2565b6040519061078b608083611bf2565b6040519061288882611bb7565b815f81525f602082015260408051916128a083611bd7565b5f83525f60208401520152565b906040516128bd61010082611bf2565b60e0600682946128e56128d882546123796123738260ff1690565b63ffffffff166020860152565b6001810154604085015260028101546001600160401b0316606085015261290e60038201611c15565b6080850152600481015460a0850152600581015460c08501520154910152565b61ffff81160361044057565b519061078b8261292e565b519061078b82611edb565b519061078b82610772565b519061078b82610b94565b6001600160401b038111611bd257601f01601f191660200190565b92919261298d82612966565b9161299b6040519384611bf2565b829481845281830111610440578281602093845f96015e010152565b9080601f830112156104405781516129d192602001612981565b90565b519061078b82610c1e565b919060608382031261044057604051906129f882611bb7565b81938051612a058161078d565b83526020810151612a15816114c8565b60208401526040810151906001600160401b038211610440570181601f8201121561044057604091816020612a4c93519101612981565b910152565b602081830312610440578051906001600160401b03821161044057016102408183031261044057612a8061284d565b91612a8a8261293a565b8352612a9860208301612945565b6020840152612aa960408301612950565b6040840152612aba6060830161295b565b60608401526080820151608084015260a082015160a0840152612adf60c0830161295b565b60c084015260e082015160e0840152612afb610100830161295b565b61010084015261012082810151908401526101408201516001600160401b0381116104405781612b2c9184016129b7565b6101408401526101608201516001600160401b0381116104405781612b529184016129b7565b610160840152612b65610180830161295b565b6101808401526101a08201516001600160401b0381116104405781612b8b9184016129b7565b6101a0840152612b9e6101c083016129d4565b6101c0840152612bb16101e0830161295b565b6101e084015261020082810151908401526102208201516001600160401b03811161044057612be092016129df565b61022082015290565b818110612bf4575050565b5f8155600101612be9565b634e487b7160e01b5f52601160045260245ffd5b60065f9182815582600182015582600282015560038101612c348154611b6b565b9081612c4d575b50508260048201558260058201550155565b601f8211600114612c6457849055505b5f80612c3b565b612c84612c94928287526001601f60208920920160051c82019101612be9565b5f81815260208120918190559055565b612c5d565b90816020910312610440575190565b6040513d5f823e3d90fd5b908152602081019190915260400190565b356129d181610772565b63ffffffff16600452602452604490565b929192612ceb82612966565b91612cf96040519384611bf2565b829481845281830111610440578281602093845f960137010152565b359061078b8261292e565b9080601f83011215610440578160206129d193359101612cdf565b91906060838203126104405760405190612d5482611bb7565b81938035612d618161078d565b83526020810135612d71816114c8565b60208401526040810135906001600160401b038211610440570181601f8201121561044057604091816020612a4c93359101612cdf565b9190916102408184031261044057612dbe61284d565b92612dc882612d15565b8452612dd660208301611ee5565b6020850152612de760408301610780565b6040850152612df860608301610b9f565b60608501526080820135608085015260a082013560a0850152612e1d60c08301610b9f565b60c085015260e082013560e0850152612e396101008301610b9f565b61010085015261012082810135908501526101408201356001600160401b0381116104405781612e6a918401612d20565b6101408501526101608201356001600160401b0381116104405781612e90918401612d20565b610160850152612ea36101808301610b9f565b6101808501526101a08201356001600160401b0381116104405781612ec9918401612d20565b6101a0850152612edc6101c08301610c28565b6101c0850152612eef6101e08301610b9f565b6101e085015261020082810135908501526102208201356001600160401b03811161044057612f1e9201612d3b565b610220830152565b906020828203126104405781356001600160401b038111610440576129d19201612da8565b6001600160401b0381160361044057565b60031115612f6657565b634e487b7160e01b5f52602160045260245ffd5b90612f8482612f5c565b52565b80516001600160a01b031682526020808201516001600160801b03169083015260409081015160609183018290526129d1929190910190611cb3565b805161ffff1682526129d191612fe160208301516020830190612f7a565b60408281015163ffffffff169082015260608281015160ff16908201526080820151608082015260a082015160a082015261302660c083015160c083019060ff169052565b60e082015160e082015261304661010083015161010083019060ff169052565b6101208201516101208201526102206130ae61308c613078610140860151610240610140870152610240860190611cb3565b610160860151858203610160870152611cb3565b6101808581015160ff16908501526101a08501518482036101a0860152611cb3565b6101c080850151151590840152926101e08181015160ff1690840152610200810151610200840152015190610220818403910152612f87565b6129d19392604060a09363ffffffff813561310181610772565b16845260208101356020850152013561311981612f4b565b6001600160401b031660408301526060820152608081018290520190612fc3565b3d15613164573d9061314b82612966565b916131596040519384611bf2565b82523d5f602084013e565b606090565b356129d181612f4b565b80546001600160401b0319166001600160401b03909216919091179055565b9190601f81116131a157505050565b61078b925f5260205f20906020601f840160051c830193106131cb575b601f0160051c0190612be9565b90915081906131be565b81519192916001600160401b038111611bd2576131fc816131f68454611b6b565b84613192565b6020601f821160011461323b57819061322c9394955f92613230575b50508160011b915f199060031b1c19161790565b9055565b015190505f80613218565b601f1982169061324e845f5260205f2090565b915f5b81811061328857509583600195969710613270575b505050811b019055565b01515f1960f88460031b161c191690555f8080613266565b9192602060018192868b015181550194019201613251565b9060e06006916132bf81511515859060ff801983541691151516179055565b6132ef6132d3602083015163ffffffff1690565b855464ffffffff00191660089190911b64ffffffff0016178555565b604081015160018501556060810151613314906001600160401b031660028601613173565b6133256080820151600386016131d5565b60a0810151600485015560c081015160058501550151910155565b61334981612cc4565b61335b6104e26020840135809361394d565b6135ca5761336b61254284610ff1565b6135b6576133788561408a565b613383368686612cdf565b6020815191012061339384610fe3565b8161339f825460ff1690565b91826135a7575b5050613598576133b886860186612f26565b946133c2866140a3565b303b156104405760405163b678780960e01b81525f81806133e88a8a8a600485016130e7565b038183305af19081613584575b506135655761340261313a565b6001602088015161341281612f5c565b61341b81612f5c565b1461355d5763ffffffff936134d8936134af7f08391ae7c063e3aec00eaf689b744e880677e7c0a82e2dceb5363069c54d47bb97948460206134d396519101209b6134a861346888612cc4565b9561347560408a01613169565b9061349361348161283d565b600181529863ffffffff1660208a0152565b60408801526001600160401b03166060870152565b3691612cdf565b608083015260a08201528860c08201524260e08201526134ce87610fe3565b6132a0565b612cc4565b946135586134ed604087015163ffffffff1690565b916134fc606088015160ff1690565b9660808101519061351261010082015160ff1690565b60a06101208301519201519287604051988998169c169a879260ff9060a09592989796938260c087019a1686526020860152166040840152606083015260808201520152565b0390a4565b602081519101fd5b5050505061078b9250610574915061357f61059782610ff1565b610fe3565b80610aa35f61359293611bf2565b5f6133f5565b635529e15560e11b5f5260045ffd5b6004015414159050815f6133a6565b633bc6e1d360e21b5f52600483905260245ffd5b6135d661061e92612cc4565b6315b66a8f60e21b5f52612cce565b604051909190608081016001600160401b03811182821017611bd257604052606060ff6002839582815463ffffffff8116875260201c166020860152600181015460408601520154161515910152565b6001600160a01b039091168152602081019190915260400190565b9081526001600160a01b039091166020820152604081019190915260600190565b9360ff919897969360c096938360e088019b16875260208701526040860152166060840152608083015260a08201520152565b9160ff6040519263ffffffff6020850195600287521660408501521660608301526080820152608081526136d960a082611bf2565b51902090565b81156137d7576136ee81611794565b54806137ab57507f058c6c1fc087884ea8f1d20e36604c271aea9907d86a43d38834651654e7f13f9063ffffffff906137a6426001600160401b03168561373484611794565b55613756816137518563ffffffff165f52600260205260405f2090565b613173565b61375f836138bc565b61377061376b3061062b565b61062b565b604080518981526001600160401b0394851660208201529290931692820192909252951460608601529116929081906080820190565b0390a2565b908282036137b857505050565b63ffffffff90637c2dc58f60e11b5f521660045260245260445260645ffd5b6315b66a8f60e21b5f5261061e9250612cce565b63ffffffff81165f52600160205260405f20541515908161380a575090565b6001600160401b03915061381d906138bc565b1642101590565b9081602091031261044057516129d18161078d565b604051631c2eb17b60e31b81526020816004817f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b6001600160a01b03165afa90811561076d575f91613889575090565b6129d1915060203d60201161147a5761146c8183611bf2565b6001600160801b0391821681529116602082015260400190565b63ffffffff165f908152600160209081526040808320546002909252909120546001600160401b03169080156139085730146129d15762093a80016001600160401b038111611df15790565b50505f90565b9063ffffffff1663ffffffff19825416179055565b91908201809211611df157565b91906020830192612f8482612f5c565b91908203918211611df157565b9063ffffffff82165f52600160205260405f205414908161396c575090565b6129d191506137eb565b60025f80516020615f6c833981519152541461399f5760025f80516020615f6c83398151915255565b633ee5aeb560e01b5f5260045ffd5b60015f80516020615f6c83398151915255565b604051906139ce82611bb7565b60606040835f81525f60208201520152565b6139e861284d565b905f82525f60208301525f60408301525f60608301525f60808301525f60a08301525f60c08301525f60e08301525f6101008301525f610120830152606061014083015260606101608301525f61018083015260606101a08301525f6101c08301525f6101e08301525f610200830152612f1e6139c1565b600290612f8482612f5c565b5f90612f8482612f5c565b90613a806139e0565b50816001602082015260ff60c08201511661010082015260e0810151610120820152610220612a4c6139c1565b9392919063ffffffff85169485158015613b09575b613afa57855f52600160205260405f205415613ae3576129d19495506150c4565b856315b66a8f60e21b5f526004525f60245260445ffd5b63ac6b05f560e01b5f5260045ffd5b5063ffffffff7f00000000000000000000000000000000000000000000000000000000000076d0168614613ac2565b6001600160a01b0316613b5c573403613b4d57565b6358d620b360e01b5f5260045ffd5b5034613b4d57565b6001600160a01b0316613b5c576040516317e1813d60e01b8152906020826004817f000000000000000000000000c8856d6285d4ba3afd8eb9351e151e8b7d0414f36001600160a01b03165afa90811561076d57613bc9925f92613bd1575b50613923565b3403613b4d57565b613beb91925060203d602011610766576107588183611bf2565b905f613bc3565b9060206129d1928181520190612fc3565b919082604091031261044057604051613c1b81611bd7565b6020808294805184520151910152565b9060808282031261044057613c65906040805193613c4885611bb7565b805185526020810151613c5a81612f4b565b602086015201613c03565b604082015290565b90602090939293604083526040830163ffffffff82511681528282015183820152608080613cbf613cad604086015160a0604087015260a0860190611cb3565b60608601518582036060870152611cb3565b93015115159101526001600160a01b03909416910152565b939492613cfd613d0b613d479493613ced61287b565b5060405192839160208301613bf2565b03601f198101835282611bf2565b613d15815161408a565b613d1e86611794565b54613d36613d2a61285d565b63ffffffff9098168852565b602087015260408601523691612cdf565b60608301525f60808301526001600160a01b031680613ded575091608091613d85936040518095819482936302637a4560e41b845260048401613c6d565b03917f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b6001600160a01b03165af190811561076d575f91613dc4575090565b6129d1915060803d608011613de6575b613dde8183611bf2565b810190613c2b565b503d613dd4565b90613e19939183608094613e59575b50506040516302637a4560e41b8152938492839260048401613c6d565b03815f7f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b6001600160a01b03165af190811561076d575f91613dc4575090565b613e8f917f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b6001600160a01b0316903390614e09565b5f80613dfc565b5f546001600160a01b03163303613ea957565b63118cdaa760e01b5f523360045260245ffd5b90613ec56139e0565b916001600160a01b03811615613f6257803b15613f62576003835261078b90613ef060208501613a60565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000123716604085015260016060850152613f2f61376b8261062b565b6080850152600160c0850152613f4761376b3361062b565b60e0850181905260016101008601526101208501528361517c565b6329712f5760e21b5f5260045ffd5b919261401d94613cfd613fbc613ff794613fae604098613fa060ff61010085015116610120850151908b61452b565b6102208301519086886158cf565b875192839160208301613bf2565b613fc6815161408a565b613fcf85611794565b54613fe7613fdb61285d565b63ffffffff9097168752565b6020860152858501523691612cdf565b60608201525f6080820152815180938192631bb8518b60e31b8352309060048401613c6d565b03817f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b6001600160a01b03165afa90811561076d575f9161405d57505190565b61407f915060403d604011614083575b6140778183611bf2565b8101906150b0565b5190565b503d61406d565b6140001061409457565b636ceaf82160e01b5f5260045ffd5b600361ffff6140b4835161ffff1690565b161480159061441b575b8015614403575b80156143f7575b80156143df575b80156143d3575b80156143ba575b80156143ad575b613f625760208101600281516140fd81612f5c565b61410681612f5c565b036143955760a0820151610ea7575b6060820161412c614127825160ff1690565b615258565b60c083019061413f614127835160ff1690565b600160ff61418761010087019361415a614127865160ff1690565b61418061416b6101c08a0151151590565b6101e08a015160ff166102008b01519161528a565b5160ff1690565b1614614360575b60016141a461419e845160ff1690565b60ff1690565b1461432b575b60016141ba61419e835160ff1690565b14614318575b600183516141cd81612f5c565b6141d681612f5c565b1480156142fb575b6142b7575b5050600290516141f281612f5c565b6141fb81612f5c565b148061429f575b61424c5761022001805180516001600160a01b03906142209061062b565b1615159081614289575b5061424c575161423d61376b825161062b565b15908161425b575b5061424c57565b639c9d882360e01b5f5260045ffd5b60208101516001600160801b0316158015925061427a575b505f614245565b6040915001515115155f614273565b602001516001600160801b03161590505f61422a565b50610220810151516001600160a01b03161515614202565b6142d261419e6142ca60ff935160ff1690565b935160ff1690565b9116148015906142e8575b613afa575f806141e3565b5061012082015160e083015114156142dd565b506002835161430981612f5c565b61431281612f5c565b146141de565b6143266101208501516152c9565b6141c0565b60e0840161433981516152c9565b516001600160a01b039061434c9061062b565b166141aa576329712f5760e21b5f5260045ffd5b6080840161436e81516152c9565b516001600160a01b03906143819061062b565b1661418e576329712f5760e21b5f5260045ffd5b60a08201516141155763162908e360e11b5f5260045ffd5b50610120810151156140e8565b5060ff6143cc61010083015160ff1690565b16156140e1565b5060e0810151156140da565b5060ff6143f060c083015160ff1690565b16156140d3565b506080810151156140cc565b5060ff614414606083015160ff1690565b16156140c5565b5063ffffffff614432604083015163ffffffff1690565b16156140be565b9063ffffffff821680159081156144fb575b5080156144f4575b80156144ec575b613afa576144686001615258565b614471816152c9565b6001600160a01b03906144879061376b9061062b565b1615613afa5761449681611794565b54156144cd576144a86104e2826137eb565b6144af5750565b806144bc61061e92611794565b546315b66a8f60e21b5f5290612cce565b6315b66a8f60e21b5f90815263ffffffff90911660045260245260445ffd5b50801561445a565b505f614453565b905063ffffffff7f00000000000000000000000000000000000000000000000000000000000076d016145f61444b565b919063ffffffff831680159081156145ae575b5080156145a3575b801561459b575b613afa5760ff8161455f600193615258565b1614614570575b5061449681611794565b614579816152c9565b6001600160a01b039061458f9061376b9061062b565b1615613afa575f614566565b50811561454d565b5060ff811615614546565b905063ffffffff7f00000000000000000000000000000000000000000000000000000000000076d016145f61453e565b906020828203126104405781516001600160401b038111610440576129d192016129b7565b9081602091031261044057516129d181610b94565b9081602091031261044057516129d181610c1e565b94939290919461463b6139e0565b958315610ea75760ff8116158015614912575b613afa5761465e610cfa8361116a565b9361466f6104e26060870151151590565b610e9857600388526001600160a01b03909216936146fe929060409061469760208b01613a6c565b6146b46146a8825163ffffffff1690565b63ffffffff168b840152565b6146cf6146c5602083015160ff1690565b60ff1660608c0152565b0151608089015260a0880152600160c08801526146ee61376b3361062b565b60e088015260ff16610100870152565b6101208501526040516306fdde0360e01b81525f81600481855afa90811561076d575f916148f8575b506101408501526040516395d89b4160e01b81525f81600481855afa90811561076d575f916148de575b5061016085015260405163313ce56760e01b8152602081600481855afa801561076d5761478b915f916148af575b5060ff16610180860152565b60405163e8a3d48560e01b81525f81600481855afa90811561076d575f9161488d575b506101a0850152604051633b17cdcf60e01b8152602081600481855afa90811561076d575f9161485e575b506147e8575b50610220830152565b60206004916147fb6101c0870160019052565b60016101e0870152604051638da5cb5b60e01b815292839182905afa90811561076d576148339161376b915f9161483f575b5061062b565b6102008401525f6147df565b614858915060203d60201161147a5761146c8183611bf2565b5f61482d565b614880915060203d602011614886575b6148788183611bf2565b810190614618565b5f6147d9565b503d61486e565b6148a991503d805f833e6148a18183611bf2565b8101906145de565b5f6147ae565b6148d1915060203d6020116148d7575b6148c98183611bf2565b810190614603565b5f61477f565b503d6148bf565b6148f291503d805f833e6148a18183611bf2565b5f614751565b61490c91503d805f833e6148a18183611bf2565b5f614727565b50821561464e565b604051632d8acc7960e21b81526001600160a01b03918216600482015290602090829060249082907f000000000000000000000000c8856d6285d4ba3afd8eb9351e151e8b7d0414f3165afa90811561076d575f91614977575090565b6129d1915060203d602011610766576107588183611bf2565b5f91906001600160a01b03168015614ac05760405163364f677d60e01b81527f000000000000000000000000c8856d6285d4ba3afd8eb9351e151e8b7d0414f36001600160a01b031691602082600481865afa91821561076d575f92614a9f575b50816149fc57505050565b6040516370a0823160e01b8152939450909160208480614a1f8460048301610bd6565b0381855afa91821561076d57614a61945f93614a7b575b50614a4660209394833384614e09565b60405180809681946370a0823160e01b835260048301610bd6565b03915afa801561076d576129d1925f916121e15750613940565b60209350614a98614a4691853d8711610766576107588183611bf2565b9350614a36565b614ab991925060203d602011610766576107588183611bf2565b905f6149f1565b506040516317e1813d60e01b81529091506020816004817f000000000000000000000000c8856d6285d4ba3afd8eb9351e151e8b7d0414f36001600160a01b03165afa90811561076d575f91614977575090565b93916129d1959391614b2461287b565b503395613cd7565b908160c0910312610440576040519060c08201906001600160401b03821183831017611bd25760a0916040528051614b638161078d565b83526020810151614b738161078d565b602084015260408101516040840152606081015160608401526080810151614b9a81610c1e565b60808401520151614baa81610c1e565b60a082015290565b9190918115614d4e576001600160a01b03811692614c3f9260c092909185614d475782915b6040516303c75da760e61b81526001600160a01b03918216600482015263ffffffff7f00000000000000000000000000000000000000000000000000000000000012371660248201529116604482015260648101929092529092839190829081906084820190565b03917f000000000000000000000000c8856d6285d4ba3afd8eb9351e151e8b7d0414f36001600160a01b03165af190811561076d575f91614d18575b50614c86815161062b565b917f7aa7e54a30b0cb51ee7013c7be4b16a220d624019a60f7a0a0ce6614234267e5614cb5602084015161062b565b92604081015193613558606083015192614cdf60a0614cd76080840151151590565b920151151590565b6040805198895260208901959095529015159387019390935291151560608601526001600160a01b039081169516939081906080820190565b614d3a915060c03d60c011614d40575b614d328183611bf2565b810190614b2c565b5f614c7b565b503d614d28565b5f91614bd7565b505050565b9091949392614d606139e0565b956001600160a01b038316908115613f62578415610ea75760ff8116158015614e01575b613afa5760038852612f1e94614de99263ffffffff7f00000000000000000000000000000000000000000000000000000000000012371660408b0152600160608b015260808a015260a0890152600160c08901523360e089015260ff16610100880152565b610120860152614dfb60208601613a6c565b8461517c565b508215614d84565b6040516323b872dd60e01b5f9081526001600160a01b039384166004529290931660245260449390935260209060648180865af160015f5114811615614e78575b6040919091525f606052155b614e5d5750565b635274afe760e01b5f526001600160a01b031660045260245ffd5b6001811516614e8e573d15833b15151616614e4a565b503d5f823e3d90fd5b9091602081019160028351614eab81612f5c565b614eb481612f5c565b03614f9e576002614ec76001848461553f565b935b82614edb604086015163ffffffff1690565b877fe6808f3a2ad2101abaff2363aa209cfabf76e7d542f3c1ebe7ea731371c1b39063ffffffff614f1060608a015160ff1690565b93614f6a60808b01518b614f2961010082015160ff1690565b60a06101208301519201519286604051978897169b1699869160809360ff9197969592978260a0860199168552602085015216604083015260608201520152565b0390a451614f7781612f5c565b614f8081612f5c565b03614f8c575b50505050565b614f9593615680565b5f808080614f86565b60408201517f000000000000000000000000000000000000000000000000000000000000123763ffffffff90811691161480614ff9575b15614feb576002614fe583615493565b93614ec9565b6002614fe560018484615305565b50600160ff61500c606085015160ff1690565b1614614fd5565b909160208101916002835161502781612f5c565b61503081612f5c565b03615042576002614ec75f848461553f565b60408201517f000000000000000000000000000000000000000000000000000000000000123763ffffffff90811691161480615096575b15615089576002614fe583615493565b6002614fe55f8484615305565b50600160ff6150a9606085015160ff1690565b1614615079565b90604082820312610440576129d191613c03565b9060409261401d94613cfd613fbc613ff794613fae6102208201515f86886158cf565b9060c0828203126104405781516001600160401b038111610440578161510e9184016129b7565b60208301519093906001600160401b03811161044057826151309185016129b7565b92604081015161513f81610b94565b606082015190936001600160401b0382116104405761515f9183016129b7565b9160a0608083015161517081610c1e565b9201516129d18161078d565b905f61519c9160405180938192636f0583bd60e11b835260048301610bd6565b03817f0000000000000000000000006f4570e8c4cbe8c43cc0ac680a061a86e67c42f86001600160a01b03165afa90811561076d575f805f805f945f96615226575b506101a087015260ff166101808601525b6101608501526101408401528015156101c084015261520c575050565b60016101e0830152610200906001600160a01b0316910152565b93505050506151ef925061524c91503d805f833e6152448183611bf2565b8101906150e7565b959094939291906151de565b60ff1660018114158061527f575b61526d5750565b63399b52cb60e11b5f5260045260245ffd5b506002811415615266565b156152ab5760ff6001911603613f6257806152a25750565b61078b906152c9565b60ff1615908115916152bf575b50613f6257565b905015155f6152b8565b60a01c610b8557565b916152fe60ff916152f0604094979697606087526060870190611cb3565b908582036020870152611cb3565b9416910152565b9061532461531861010083015160ff1690565b61012083015190615971565b91816153308183615a8e565b9095869291811561548a575b50615479575b50505060a0810180516001600160a01b0385169291833b15610440575f61537e92604051809481926340c10f1960e01b83528960048401613635565b038183885af191821561076d5761541f60ff92615427925f80516020615f0c83398151915295615465575b5060408601906153bd825163ffffffff1690565b9060608801987ff5e00b4a7c2bfe1fc5774acc09f7e1ce47a5755fffbee543c10d6aca1f71ec72876153f08c5160ff1690565b61541260808d019e8f5196519063ffffffff6040519586951699169784613650565b0390a45163ffffffff1690565b945160ff1690565b94519461545f6101408501519461544961018061016083015192015160ff1690565b9063ffffffff60405195869516981696846152d2565b0390a490565b80610aa35f61547393611bf2565b5f6153a9565b61548292615d16565b5f8382615342565b9050155f61533c565b60018060a01b03608082015116906154b960ff6101008301511661012083015190615971565b9060a06154c584611183565b54910190815111610ea75780516154db84611183565b8054918203918211611df15784927f6c6d9eb3abc8d0523fdb62fffca4ff884ce65e9185b354eee635609006833a0892615539925561551c81518686615e15565b516040519081526001600160a01b03909416939081906020820190565b0390a390565b6040820180517f000000000000000000000000000000000000000000000000000000000000123763ffffffff90811691161480615601575b613afa57818361558a816155a995615a8e565b909687929181156155f8575b506155e7575b5050505163ffffffff1690565b606082015160ff16915f80516020615f0c83398151915260ff60808301519461545f6101408501519461544961018061016083015192015160ff1690565b6155f092615d16565b5f848461559c565b9050155f615596565b50600160ff615614606086015160ff1690565b1614615577565b90815263ffffffff918216602082015260016040820152911660608201526001600160a01b03918216608082015291811660a083015291821660c0820152911660e082015261010081019190915261014061012082018190526129d192910190611cb3565b909291926102208401519060018060a01b0361569c835161062b565b16156158515761010085015160ff166101208601516156ba91615971565b9360608601516156ca9060ff1690565b60808701516156d891615e6b565b9260c08701516156e89060ff1690565b60e08801516156f691615e6b565b9381516157029061062b565b60208301805160408b0151919692936001600160801b03909116929163ffffffff169a60a0019a898c5199604088019a8d8c51928b604051978897602089019a632da1a26560e11b8c5260248a019861575a9961561b565b03601f198101825261576c9082611bf2565b51905f80948194f19061577d61313a565b911561581e5793613558916157c66157b67f60dd459167be9294c47eff5c00778e9647a3da53f7ab6bd9a6352710133d1d0e975161062b565b995195516001600160801b031690565b91518051602091820120825192820192909220604080516001600160a01b039b8c168152928301979097526001600160801b0390931695810195909552606085015260808401529085169590941693819060a0820190565b93613558916157c66157b67fab15520721f06d30b2f28af6d11bdcc85168a69da3302d86f7042ca7e23eaef4975161062b565b5050505050565b9693908260c097949a9996936101009260e08b528160e08c0152838b01375f89820183015299151560208901526001600160a01b039190911660408801526001600160801b039182166060880152608087019290925291821660a0860152911691830191909152601f909301601f19160190910190565b83516020850151604090950151516009546001600160a01b03928316969195947f000000000000000000000000e2dfd404e61c3228116fb97b5dabb0d492f0228e90931693916001600160801b0390811691608081901c9116853b15610440575f97615952936040519a8b998a988998639c9bb9ab60e01b8a5260048a01615858565b03915afa801561076d576159635750565b80610aa35f61078b93611bf2565b60ff16600181036159985750615986816152c9565b6001600160a01b03168015613afa5790565b630fc4070960e31b5f5260045260245ffd5b956159fb615a1d96610120999660ff61078b9d9f9e9c9763ffffffff82988d615a099960018060a01b031690521660208d01521660408b015260608a015261014060808a0152610140890190611cb3565b9087820360a0890152611cb3565b921660c085015283820360e0850152611cb3565b9515156101008201526001600160a01b03909216910152565b6002606061078b93615a4f63ffffffff8251168561390e565b602081810151855460ff60201b1916911b60ff60201b161784556040810151600185015501519101805491151560ff1660ff1992909216919091179055565b90915f916040840190615aa5825163ffffffff1690565b916060860191615ac7615ab9845160ff1690565b9460808901958651916136a4565b90615aea615add835f52600460205260405f2090565b546001600160a01b031690565b6001600160a01b038116615cf0575087615b0391615e86565b91615b2e827f000000000000000000000000a796073d7d183fe01cf7a7c2af9355e225be93a8615ea8565b815190986001600160a01b038a1694909163ffffffff1694615b51875160ff1690565b88519261014085015197610160860151615b7061018088015160ff1690565b926101a088015197818092615cda575b15615cd25780610200615b9b6101e0615ba494015160ff1690565b91015190615e6b565b905b863b15610440575f988995615bd3946040519e8f9b8c9a8b996387634b7360e01b8b523060048c016159aa565b03925af191821561076d5788615c02615c2192615c8096615c7896615cbe575b505f52600460205260405f2090565b80546001600160a01b0319166001600160a01b03909216919091179055565b6125a0615c32825163ffffffff1690565b855160ff16615c5e885191615c54615c4861286c565b63ffffffff9095168552565b60ff166020840152565b604082015260016060820152615c738a61116a565b615a36565b915160ff1690565b9151917fc6fae5d65daa4e39b6a7f86f0373025c3ff8c8100e0cc0d5637af1fe49247d8763ffffffff60ff6040519316931691806135588982610bd6565b80610aa35f615ccc93611bf2565b5f615bf3565b505f90615ba6565b9150615cea6101c0820151151590565b91615b80565b9750600196505050505050565b919082604091031261044057602082516151708161078d565b6104e282615d2692949394615e86565b615e115760018060a01b0316615d8b60406101c0840193615d5d615d4a8651151590565b91610200615b9b6101e083015160ff1690565b825163f750d6a760e01b815291151560048301526001600160a01b0316602482015291829081906044820190565b03815f865af1801561076d576007935f80516020615f2c833981519152925f92615dda575b505115155b604080515f81526001600160a01b0393909316602084015290151590820152606090a3565b615db5919250615e019060403d604011615e0a575b615df98183611bf2565b810190615cfd565b90509190615db0565b503d615def565b5050565b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af160015f5114811615615e55575b60409190915215614e56565b6001811516614e8e573d15833b15151616615e49565b60ff16600103615e81576001600160a01b031690565b505f90565b63ffffffff165f52600360205263ffffffff604081815f205416920151161490565b6e5af43d82803e903d91602b57fd5bf390763d602d80600a3d3981f3363d3d373d3d3d363d7300000062ffffff8260881c16175f5260781b17602052603760095ff5906001600160a01b03821615615efc57565b63b06ebf3d60e01b5f5260045ffdfe2ade7442393c4df6cb014452552eec2609dacd91c303a1adee60d5b639dedba4d6a1eca088f11af13683bd3647b5244aa82ccbbd8d50191a7312ff825bed4e328be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00b70cb5a5c21af3ede1cc37fb9cb460d62505d6d97e70c21aaab2bd6ff7ebefdba164736f6c634300081a000a
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
Tesla • Robinhood Token (TSLA) | TSLA | 0.021433 | $342.54 | $7.34 |
Apple • Robinhood Token (AAPL) | AAPL | 0.010556 | $305.28 | $3.22 |
NVIDIA • Robinhood Token (NVDA) | NVDA | 0.000019 | $224.64 | $0 |
| DIH | 1 | $0.0000102 | $0 | |
Space Exploration Technologies Corp. Class A Common Stock • Robinhood Token (SPCX) | SPCX | 0.01 | — | — |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x7c7fd0…70142f | 12 days agoTue, 04 Aug 2026 18:52:32 UTC | 0xb70cb5…efdb | [0] 0xe2d335777b92…0354ca3f [1] 0x000000000000…000075e8 [2] 0x000000000000…00000038 data: 0x000000000000000000…af767000 |
| 0x7c7fd0…70142f | 12 days agoTue, 04 Aug 2026 18:52:32 UTC | 0x9a57bd…8256 | [0] 0x000000000000…31c56bcd [1] 0x000000000000…00000038 [2] 0x000000000000…00000001 data: 0x000000000000000000…6e5e9e1e |
| 0x7c7fd0…70142f | 12 days agoTue, 04 Aug 2026 18:52:32 UTC | 0x7aa7e5…67e5 | [0] 0x000000000000…00000000 [1] 0x000000000000…78501a27 [2] 0x000000000000…00000000 data: 0x000000000000000000…00000001 |
| 0x120d9b…7d3a06 | 12 days agoTue, 04 Aug 2026 18:43:43 UTC | 0xe6808f…b390 | [0] 0xa605616c3b1c…2b82b925 [1] 0x000000000000…00007596 [2] 0x000000000000…00000038 data: 0x000000000000000000…6e5e9e1e |
| 0x120d9b…7d3a06 | 12 days agoTue, 04 Aug 2026 18:43:43 UTC | 0x2ade74…dba4 | [0] 0x000000000000…00000038 [1] 0x000000000000…00000001 [2] 0x000000000000…ba016f75 data: 0x000000000000000000…00000000 |
| 0x120d9b…7d3a06 | 12 days agoTue, 04 Aug 2026 18:43:43 UTC | 0xf5e00b…ec72 | [0] 0x000000000000…31c56bcd [1] 0x000000000000…00000038 [2] 0x000000000000…00000001 data: 0x000000000000000000…6e5e9e1e |
| 0x120d9b…7d3a06 | 12 days agoTue, 04 Aug 2026 18:43:43 UTC | 0xd6a1ec…4e32 | [0] 0x000000000000…31c56bcd [1] 0x000000000000…00000007 data: 0x000000000000000000…00000000 |
| 0x120d9b…7d3a06 | 12 days agoTue, 04 Aug 2026 18:43:43 UTC | 0xc6fae5…7d87 | [0] 0x000000000000…00000038 [1] 0x000000000000…00000001 [2] 0x000000000000…ba016f75 data: 0x000000000000000000…31c56bcd |
| 0x1a006d…4414a2 | 13 days agoSun, 02 Aug 2026 21:28:53 UTC | 0xb70cb5…efdb | [0] 0x7f06ad973feb…7b4f1e69 [1] 0x000000000000…0000759d [2] 0x000000000000…00000089 data: 0x000000000000000000…af767000 |
| 0x1a006d…4414a2 | 13 days agoSun, 02 Aug 2026 21:28:53 UTC | 0x9a57bd…8256 | [0] 0x000000000000…62cabce9 [1] 0x000000000000…00000089 [2] 0x000000000000…00000001 data: 0x000000000000000000…00061a80 |
| 0x1a006d…4414a2 | 13 days agoSun, 02 Aug 2026 21:28:53 UTC | 0x7aa7e5…67e5 | [0] 0x000000000000…00000000 [1] 0x000000000000…78501a27 [2] 0x000000000000…00000000 data: 0x000000000000000000…00000001 |
| 0xb91786…b64973 | 13 days agoSun, 02 Aug 2026 21:27:52 UTC | 0xe6808f…b390 | [0] 0x9409ca176ec0…a727a8a0 [1] 0x000000000000…0000759d [2] 0x000000000000…00000089 data: 0x000000000000000000…000f4240 |
| 0xb91786…b64973 | 13 days agoSun, 02 Aug 2026 21:27:52 UTC | 0x2ade74…dba4 | [0] 0x000000000000…00000089 [1] 0x000000000000…00000001 [2] 0x000000000000…42e82dfb data: 0x000000000000000000…00000000 |
| 0xb91786…b64973 | 13 days agoSun, 02 Aug 2026 21:27:52 UTC | 0xf5e00b…ec72 | [0] 0x000000000000…62cabce9 [1] 0x000000000000…00000089 [2] 0x000000000000…00000001 data: 0x000000000000000000…000f4240 |
| 0xb91786…b64973 | 13 days agoSun, 02 Aug 2026 21:27:52 UTC | 0xd6a1ec…4e32 | [0] 0x000000000000…62cabce9 [1] 0x000000000000…00000007 data: 0x000000000000000000…00000001 |
| 0xb91786…b64973 | 13 days agoSun, 02 Aug 2026 21:27:52 UTC | 0xc6fae5…7d87 | [0] 0x000000000000…00000089 [1] 0x000000000000…00000001 [2] 0x000000000000…42e82dfb data: 0x000000000000000000…62cabce9 |
| 0xd4eca7…4a171f | 15 days agoSat, 01 Aug 2026 14:56:49 UTC | 0xe6808f…b390 | [0] 0x8e4c20a8ced0…d5e9ae59 [1] 0x000000000000…00007595 [2] 0x000000000000…00000001 data: 0x000000000000000000…a7640000 |
| 0xd4eca7…4a171f | 15 days agoSat, 01 Aug 2026 14:56:49 UTC | 0x2ade74…dba4 | [0] 0x000000000000…00000001 [1] 0x000000000000…00000001 [2] 0x000000000000…e5bd2df7 data: 0x000000000000000000…00000000 |
| 0xd4eca7…4a171f | 15 days agoSat, 01 Aug 2026 14:56:49 UTC | 0xf5e00b…ec72 | [0] 0x000000000000…cc2b44a3 [1] 0x000000000000…00000001 [2] 0x000000000000…00000001 data: 0x000000000000000000…a7640000 |
| 0xd4eca7…4a171f | 15 days agoSat, 01 Aug 2026 14:56:49 UTC | 0xd6a1ec…4e32 | [0] 0x000000000000…cc2b44a3 [1] 0x000000000000…00000007 data: 0x000000000000000000…00000000 |
| 0xd4eca7…4a171f | 15 days agoSat, 01 Aug 2026 14:56:49 UTC | 0xc6fae5…7d87 | [0] 0x000000000000…00000001 [1] 0x000000000000…00000001 [2] 0x000000000000…e5bd2df7 data: 0x000000000000000000…cc2b44a3 |
| 0xade805…be9237 | 18 days agoWed, 29 Jul 2026 19:18:26 UTC | 0xe6808f…b390 | [0] 0xa72aa6a9876f…ff8b3db3 [1] 0x000000000000…000075e8 [2] 0x000000000000…00001237 data: 0x000000000000000000…52634000 |
| 0xade805…be9237 | 18 days agoWed, 29 Jul 2026 19:18:26 UTC | 0x6c6d9e…3a08 | [0] 0x000000000000…320d9eec [1] 0x000000000000…78501a27 data: 0x000000000000000000…52634000 |
| 0x606f04…6f231d | 18 days agoWed, 29 Jul 2026 19:15:55 UTC | 0xb70cb5…efdb | [0] 0x7e9daa85d059…7bfa8e49 [1] 0x000000000000…000075e8 [2] 0x000000000000…00001237 data: 0x000000000000000000…af767000 |
| 0x606f04…6f231d | 18 days agoWed, 29 Jul 2026 19:15:55 UTC | 0x08b32d…5455 | [0] 0x000000000000…320d9eec [1] 0x000000000000…78501a27 data: 0x000000000000000000…52be51e9 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x7c7fd0…70142f | sendOFTTo | 27,854,161 | 12 days agoTue, 04 Aug 2026 18:52:32 UTC | 0xc5a6…ad8d | IN | Omnisea | $0.170.00008 ETH | 0.00000922 | |
| 0x1a006d…4414a2 | sendOFTTo | 26,223,938 | 13 days agoSun, 02 Aug 2026 21:28:53 UTC | 0xc455…1a27 | IN | Omnisea | $0.170.00008 ETH | 0.00000898 | |
| 0x606f04…6f231d | sendOriginalTo | 22,697,603 | 18 days agoWed, 29 Jul 2026 19:15:55 UTC | 0xc455…1a27 | IN | Omnisea | $0.160.00008 ETH | 0.00001006 | |
| 0x458084…ba47d8 | sendOriginalTo | 22,564,388 | 18 days agoWed, 29 Jul 2026 15:33:31 UTC | 0xc455…1a27 | IN | Omnisea | $0.170.00008 ETH | 0.00001103 | |
| 0xf16f1b…1325eb | setFixedProtocolFee | 13,970,204 | 28 days agoSun, 19 Jul 2026 16:05:12 UTC | 0xc455…1a27 | IN | Omnisea | $0.000 ETH | 0.00000197 | |
| 0x0fe881…6abcf1 | setChainIdForEid | 6,241,539 | 37 days agoFri, 10 Jul 2026 16:58:17 UTC | 0xc455…1a27 | IN | Omnisea | $0.000 ETH | 0.00001517 | |
| 0x45fb6e…5ce50b | setPeer | 6,241,530 | 37 days agoFri, 10 Jul 2026 16:58:16 UTC | 0xc455…1a27 | IN | Omnisea | $0.000 ETH | 0.00002294 | |
| 0x54bb72…5d22ed | sendOriginalTo | 3,271,339 | 41 days agoMon, 06 Jul 2026 18:33:41 UTC | 0xc455…1a27 | IN | Omnisea | $0.160.00008 ETH | 0.00000962 | |
| 0xe3f843…327e67 | sendOriginalTo | 3,271,103 | 41 days agoMon, 06 Jul 2026 18:33:10 UTC | 0xc455…1a27 | IN | Omnisea | $0.100.00005 ETH | 0.00000993 | |
| 0x76bfcd…3ab6ff | sendOriginalTo | 3,270,975 | 41 days agoMon, 06 Jul 2026 18:32:55 UTC | 0xc455…1a27 | IN | Omnisea | $0.150.00008 ETH | 0.00000952 | |
| 0xf21b3f…b20816 | sendOriginalTo | 3,255,144 | 41 days agoMon, 06 Jul 2026 17:54:15 UTC | 0xc455…1a27 | IN | Omnisea | $0.130.00006 ETH | 0.00001028 | |
| 0x123675…91081d | sendOriginalTo | 2,822,093 | 42 days agoSun, 05 Jul 2026 16:43:19 UTC | 0xd222…937b | IN | Omnisea | $0.140.00007 ETH | 0.00001015 | |
| 0xfd6fc5…957a87 | sendOriginalTo | 2,479,593 | 43 days agoSat, 04 Jul 2026 17:38:38 UTC | 0xd49b…cdb0 | IN | Omnisea | $0.110.00005 ETH | 0.00000939 | |
| 0x48d9db…fdc641 | sendOriginalTo | 1,762,465 | 44 days agoFri, 03 Jul 2026 07:10:38 UTC | 0xd222…937b | IN | Omnisea | $0.160.00008 ETH | 0.00001048 | |
| 0xe99d08…6dfb7c | sendOriginalTo | 1,441,715 | 45 days agoThu, 02 Jul 2026 18:44:16 UTC | 0xc455…1a27 | IN | Omnisea | $0.120.00006 ETH | 0.00001018 | |
| 0x1994eb…7e9288 | setChainIdForEid | 922,774 | 45 days agoWed, 01 Jul 2026 22:35:11 UTC | 0xc455…1a27 | IN | Omnisea | $0.000 ETH | 0.00000094 | |
| 0x877070…1ad75d | setPeer | 922,769 | 45 days agoWed, 01 Jul 2026 22:35:11 UTC | 0xc455…1a27 | IN | Omnisea | $0.000 ETH | 0.00000143 | |
| 0x19c88b…8061ba | setChainIdForEid | 922,761 | 45 days agoWed, 01 Jul 2026 22:35:10 UTC | 0xc455…1a27 | IN | Omnisea | $0.000 ETH | 0.00000094 | |
| 0x607c8b…ee2823 | setPeer | 922,757 | 45 days agoWed, 01 Jul 2026 22:35:09 UTC | 0xc455…1a27 | IN | Omnisea | $0.000 ETH | 0.00000144 | |
| 0x15679a…a1f225 | setChainIdForEid | 922,750 | 45 days agoWed, 01 Jul 2026 22:35:08 UTC | 0xc455…1a27 | IN | Omnisea | $0.000 ETH | 0.00000094 | |
| 0x36255c…6dd397 | setPeer | 922,742 | 45 days agoWed, 01 Jul 2026 22:35:08 UTC | 0xc455…1a27 | IN | Omnisea | $0.000 ETH | 0.00000143 | |
| 0x27904f…8b46d1 | setChainIdForEid | 922,737 | 45 days agoWed, 01 Jul 2026 22:35:07 UTC | 0xc455…1a27 | IN | Omnisea | $0.000 ETH | 0.00000094 | |
| 0xda560b…868ab2 | setPeer | 922,730 | 45 days agoWed, 01 Jul 2026 22:35:06 UTC | 0xc455…1a27 | IN | Omnisea | $0.000 ETH | 0.00000144 | |
| 0xd4f5a1…0b7b86 | setChainIdForEid | 922,723 | 45 days agoWed, 01 Jul 2026 22:35:05 UTC | 0xc455…1a27 | IN | Omnisea | $0.000 ETH | 0.00000094 | |
| 0x419ee1…a08778 | setPeer | 922,716 | 45 days agoWed, 01 Jul 2026 22:35:05 UTC | 0xc455…1a27 | IN | Omnisea | $0.000 ETH | 0.00000143 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 27,854,161 | 12 days agoTue, 04 Aug 2026 18:52:32 UTC | 0x7c7fd0…70142f | CALL | sendOFTTo | 0x240c…592d | OUT | 0xc885…14f3 | 0.00005 ETH |
| 27,854,161 | 12 days agoTue, 04 Aug 2026 18:52:32 UTC | 0x7c7fd0…70142f | CALL | sendOFTTo | 0x240c…592d | OUT | 0x6f47…dd5b | 0.00003 ETH |
| 27,848,888 | 12 days agoTue, 04 Aug 2026 18:43:43 UTC | 0x120d9b…7d3a06 | CREATE2 | execute302 | 0x240c…592d | OUT | 0x8167…6bcd | 0 ETH |
| 26,223,938 | 13 days agoSun, 02 Aug 2026 21:28:53 UTC | 0x1a006d…4414a2 | CALL | sendOFTTo | 0x240c…592d | OUT | 0xc885…14f3 | 0.00005 ETH |
| 26,223,938 | 13 days agoSun, 02 Aug 2026 21:28:53 UTC | 0x1a006d…4414a2 | CALL | sendOFTTo | 0x240c…592d | OUT | 0x6f47…dd5b | 0.00003 ETH |
| 26,223,333 | 13 days agoSun, 02 Aug 2026 21:27:52 UTC | 0xb91786…b64973 | CREATE2 | execute302 | 0x240c…592d | OUT | 0x6061…bce9 | 0 ETH |
| 25,127,794 | 15 days agoSat, 01 Aug 2026 14:56:49 UTC | 0xd4eca7…4a171f | CREATE2 | execute302 | 0x240c…592d | OUT | 0x2868…44a3 | 0 ETH |
| 22,697,603 | 18 days agoWed, 29 Jul 2026 19:15:55 UTC | 0x606f04…6f231d | CALL | sendOriginalTo | 0x240c…592d | OUT | 0xc885…14f3 | 0.00005 ETH |
| 22,697,603 | 18 days agoWed, 29 Jul 2026 19:15:55 UTC | 0x606f04…6f231d | CALL | sendOriginalTo | 0x240c…592d | OUT | 0x6f47…dd5b | 0.00003 ETH |
| 22,564,388 | 18 days agoWed, 29 Jul 2026 15:33:31 UTC | 0x458084…ba47d8 | CALL | sendOriginalTo | 0x240c…592d | OUT | 0xc885…14f3 | 0.00005 ETH |
| 22,564,388 | 18 days agoWed, 29 Jul 2026 15:33:31 UTC | 0x458084…ba47d8 | CALL | sendOriginalTo | 0x240c…592d | OUT | 0x6f47…dd5b | 0.00003 ETH |
| 15,768,514 | 26 days agoTue, 21 Jul 2026 18:11:24 UTC | 0x633f0e…34de99 | CREATE2 | execute302 | 0x240c…592d | OUT | 0x7611…f634 | 0 ETH |
| 15,730,607 | 26 days agoTue, 21 Jul 2026 17:08:05 UTC | 0x0cf091…7b31a0 | CREATE2 | execute302 | 0x240c…592d | OUT | 0x06c4…82c6 | 0 ETH |
| 14,824,843 | 27 days agoMon, 20 Jul 2026 15:55:08 UTC | 0xb56b40…4be41f | CREATE2 | execute302 | 0x240c…592d | OUT | 0xa446…0682 | 0 ETH |
| 12,288,290 | 30 days agoFri, 17 Jul 2026 17:10:58 UTC | 0x9cc84e…402709 | CREATE2 | execute302 | 0x240c…592d | OUT | 0xc914…0747 | 0 ETH |
| 3,271,339 | 41 days agoMon, 06 Jul 2026 18:33:41 UTC | 0x54bb72…5d22ed | CALL | sendOriginalTo | 0x240c…592d | OUT | 0xc885…14f3 | 0.00002 ETH |
| 3,271,339 | 41 days agoMon, 06 Jul 2026 18:33:41 UTC | 0x54bb72…5d22ed | CALL | sendOriginalTo | 0x240c…592d | OUT | 0x6f47…dd5b | 0.00005 ETH |
| 3,271,103 | 41 days agoMon, 06 Jul 2026 18:33:10 UTC | 0xe3f843…327e67 | CALL | sendOriginalTo | 0x240c…592d | OUT | 0xc885…14f3 | 0.00002 ETH |
| 3,271,103 | 41 days agoMon, 06 Jul 2026 18:33:10 UTC | 0xe3f843…327e67 | CALL | sendOriginalTo | 0x240c…592d | OUT | 0x6f47…dd5b | 0.00002 ETH |
| 3,270,975 | 41 days agoMon, 06 Jul 2026 18:32:55 UTC | 0x76bfcd…3ab6ff | CALL | sendOriginalTo | 0x240c…592d | OUT | 0xc885…14f3 | 0.00002 ETH |
| 3,270,975 | 41 days agoMon, 06 Jul 2026 18:32:55 UTC | 0x76bfcd…3ab6ff | CALL | sendOriginalTo | 0x240c…592d | OUT | 0x6f47…dd5b | 0.00005 ETH |
| 3,255,144 | 41 days agoMon, 06 Jul 2026 17:54:15 UTC | 0xf21b3f…b20816 | CALL | sendOriginalTo | 0x240c…592d | OUT | 0xc885…14f3 | 0.00002 ETH |
| 3,255,144 | 41 days agoMon, 06 Jul 2026 17:54:15 UTC | 0xf21b3f…b20816 | CALL | sendOriginalTo | 0x240c…592d | OUT | 0x6f47…dd5b | 0.00004 ETH |
| 2,822,093 | 42 days agoSun, 05 Jul 2026 16:43:19 UTC | 0x123675…91081d | CALL | sendOriginalTo | 0x240c…592d | OUT | 0xc885…14f3 | 0.00002 ETH |
| 2,822,093 | 42 days agoSun, 05 Jul 2026 16:43:19 UTC | 0x123675…91081d | CALL | sendOriginalTo | 0x240c…592d | OUT | 0x6f47…dd5b | 0.00004 ETH |