| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
contract OmniseaFeesManager {
using SafeERC20 for IERC20;
uint256 public constant ISSUER_PROTOCOL_FEE_SHARE_DENOMINATOR = 4;
uint256 private constant FEE_PAYOUT_GAS = 30_000;
error InvalidAddress();
error InvalidFee();
error OnlyBridge();
error BridgeAlreadyBound();
error ProtocolFeeTooHigh();
error WithdrawFailed();
address public immutable expectedBridge;
address public bridge;
uint256 public immutable maxProtocolFee;
uint256 public immutable maxFeeTokenProtocolFee;
uint256 public fixedProtocolFee;
uint256 public fixedFeeTokenProtocolFee;
uint256 public collectedProtocolFees;
mapping(address feeToken => uint256 amount) public collectedFeeTokenProtocolFees;
address payable public protocolFeeReceiver;
mapping(uint32 chainId => mapping(address token => address issuer)) public tokenIssuers;
mapping(address issuer => uint256 amount) public collectedIssuerProtocolFees;
mapping(address feeToken => mapping(address issuer => uint256 amount)) public collectedIssuerFeeTokenProtocolFees;
struct DistributionResult {
address protocolFeeReceiver;
address issuer;
uint256 protocolAmount;
uint256 issuerAmount;
bool protocolPaid;
bool issuerPaid;
}
modifier onlyBridge() {
if (msg.sender != bridge) revert OnlyBridge();
_;
}
constructor(
address expectedBridge_,
uint256 fixedProtocolFee_,
uint256 fixedFeeTokenProtocolFee_,
uint256 maxProtocolFee_,
uint256 maxFeeTokenProtocolFee_,
address payable protocolFeeReceiver_
) {
if (protocolFeeReceiver_ == address(0)) revert InvalidAddress();
if (fixedProtocolFee_ > maxProtocolFee_) revert ProtocolFeeTooHigh();
if (fixedFeeTokenProtocolFee_ > maxFeeTokenProtocolFee_) revert ProtocolFeeTooHigh();
expectedBridge = expectedBridge_;
fixedProtocolFee = fixedProtocolFee_;
fixedFeeTokenProtocolFee = fixedFeeTokenProtocolFee_;
maxProtocolFee = maxProtocolFee_;
maxFeeTokenProtocolFee = maxFeeTokenProtocolFee_;
protocolFeeReceiver = protocolFeeReceiver_;
}
receive() external payable {}
function bindBridge() external {
if (bridge != address(0)) revert BridgeAlreadyBound();
if (expectedBridge != address(0) && msg.sender != expectedBridge) revert OnlyBridge();
bridge = msg.sender;
}
function setProtocolFeeReceiver(address payable newReceiver) external onlyBridge returns (address previousReceiver) {
if (newReceiver == address(0)) revert InvalidAddress();
previousReceiver = protocolFeeReceiver;
protocolFeeReceiver = newReceiver;
}
function setTokenIssuer(uint32 chainId, address token, address issuer) external onlyBridge {
if (chainId == 0 || token == address(0)) revert InvalidAddress();
tokenIssuers[chainId][token] = issuer;
}
function setFixedProtocolFee(uint256 newFee) external onlyBridge returns (uint256 previousFee) {
if (newFee > maxProtocolFee) revert ProtocolFeeTooHigh();
previousFee = fixedProtocolFee;
fixedProtocolFee = newFee;
}
function setFixedFeeTokenProtocolFee(uint256 newFee) external onlyBridge returns (uint256 previousFee) {
if (newFee > maxFeeTokenProtocolFee) revert ProtocolFeeTooHigh();
previousFee = fixedFeeTokenProtocolFee;
fixedFeeTokenProtocolFee = newFee;
}
function withdrawProtocolFees(address payable recipient, uint256 amount) external onlyBridge {
if (recipient == address(0)) revert InvalidAddress();
if (amount > collectedProtocolFees) revert WithdrawFailed();
collectedProtocolFees -= amount;
(bool paid, ) = recipient.call{value: amount}("");
if (!paid) revert WithdrawFailed();
}
function withdrawFeeTokenProtocolFees(address feeToken, address recipient, uint256 amount) external onlyBridge {
if (feeToken == address(0) || recipient == address(0)) revert InvalidAddress();
if (amount > collectedFeeTokenProtocolFees[feeToken]) revert WithdrawFailed();
collectedFeeTokenProtocolFees[feeToken] -= amount;
IERC20(feeToken).safeTransfer(recipient, amount);
}
function withdrawIssuerProtocolFees(address issuer, address payable recipient, uint256 amount) external onlyBridge {
if (issuer == address(0) || recipient == address(0)) revert InvalidAddress();
if (amount > collectedIssuerProtocolFees[issuer]) revert WithdrawFailed();
collectedIssuerProtocolFees[issuer] -= amount;
(bool paid, ) = recipient.call{value: amount}("");
if (!paid) revert WithdrawFailed();
}
function withdrawIssuerFeeTokenProtocolFees(
address feeToken,
address issuer,
address recipient,
uint256 amount
) external onlyBridge {
if (feeToken == address(0) || issuer == address(0) || recipient == address(0)) revert InvalidAddress();
if (amount > collectedIssuerFeeTokenProtocolFees[feeToken][issuer]) revert WithdrawFailed();
collectedIssuerFeeTokenProtocolFees[feeToken][issuer] -= amount;
IERC20(feeToken).safeTransfer(recipient, amount);
}
function protocolFee(address feeToken) external view returns (uint256) {
return feeToken == address(0) ? fixedProtocolFee : fixedFeeTokenProtocolFee;
}
function distributeProtocolFee(
address feeToken,
uint32 localChainId,
address sourceToken,
uint256 totalFee
) external payable onlyBridge returns (DistributionResult memory result) {
if (feeToken == address(0)) {
if (msg.value != totalFee) revert InvalidFee();
} else if (msg.value != 0) {
revert InvalidFee();
}
result.protocolFeeReceiver = protocolFeeReceiver;
if (totalFee == 0) {
result.protocolPaid = true;
result.issuerPaid = true;
return result;
}
result.issuer = tokenIssuers[localChainId][sourceToken];
result.issuerAmount = result.issuer == address(0) ? 0 : totalFee / ISSUER_PROTOCOL_FEE_SHARE_DENOMINATOR;
result.protocolAmount = totalFee - result.issuerAmount;
result.protocolPaid = _tryPayProtocolFee(feeToken, result.protocolFeeReceiver, result.protocolAmount);
if (!result.protocolPaid) {
_storeProtocolFee(feeToken, result.protocolAmount);
}
result.issuerPaid = true;
if (result.issuerAmount > 0) {
result.issuerPaid = _tryPayProtocolFee(feeToken, result.issuer, result.issuerAmount);
if (!result.issuerPaid) {
_storeIssuerProtocolFee(feeToken, result.issuer, result.issuerAmount);
}
}
}
function _tryPayProtocolFee(address feeToken, address recipient, uint256 amount) internal returns (bool) {
if (amount == 0) return true;
if (recipient == address(0)) return false;
if (feeToken == address(0)) {
(bool nativePaid, ) = payable(recipient).call{value: amount, gas: FEE_PAYOUT_GAS}("");
return nativePaid;
}
(bool tokenPaid, bytes memory data) = feeToken.call(abi.encodeCall(IERC20.transfer, (recipient, amount)));
if (!tokenPaid) return false;
if (data.length == 0) return true;
if (data.length < 32) return false;
return abi.decode(data, (bool));
}
function _storeProtocolFee(address feeToken, uint256 amount) internal {
if (amount == 0) return;
if (feeToken == address(0)) {
collectedProtocolFees += amount;
} else {
collectedFeeTokenProtocolFees[feeToken] += amount;
}
}
function _storeIssuerProtocolFee(address feeToken, address issuer, uint256 amount) internal {
if (amount == 0) return;
if (feeToken == address(0)) {
collectedIssuerProtocolFees[issuer] += amount;
} else {
collectedIssuerFeeTokenProtocolFees[feeToken][issuer] += amount;
}
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "expectedBridge_",
"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": "protocolFeeReceiver_",
"type": "address",
"internalType": "address payable"
}
],
"stateMutability": "nonpayable"
},
{
"name": "BridgeAlreadyBound",
"type": "error",
"inputs": []
},
{
"name": "InvalidAddress",
"type": "error",
"inputs": []
},
{
"name": "InvalidFee",
"type": "error",
"inputs": []
},
{
"name": "OnlyBridge",
"type": "error",
"inputs": []
},
{
"name": "ProtocolFeeTooHigh",
"type": "error",
"inputs": []
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "WithdrawFailed",
"type": "error",
"inputs": []
},
{
"name": "ISSUER_PROTOCOL_FEE_SHARE_DENOMINATOR",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "bindBridge",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "bridge",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "collectedFeeTokenProtocolFees",
"type": "function",
"inputs": [
{
"name": "feeToken",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "collectedIssuerFeeTokenProtocolFees",
"type": "function",
"inputs": [
{
"name": "feeToken",
"type": "address",
"internalType": "address"
},
{
"name": "issuer",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "collectedIssuerProtocolFees",
"type": "function",
"inputs": [
{
"name": "issuer",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "collectedProtocolFees",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "distributeProtocolFee",
"type": "function",
"inputs": [
{
"name": "feeToken",
"type": "address",
"internalType": "address"
},
{
"name": "localChainId",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "sourceToken",
"type": "address",
"internalType": "address"
},
{
"name": "totalFee",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "result",
"type": "tuple",
"components": [
{
"name": "protocolFeeReceiver",
"type": "address",
"internalType": "address"
},
{
"name": "issuer",
"type": "address",
"internalType": "address"
},
{
"name": "protocolAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "issuerAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "protocolPaid",
"type": "bool",
"internalType": "bool"
},
{
"name": "issuerPaid",
"type": "bool",
"internalType": "bool"
}
],
"internalType": "struct OmniseaFeesManager.DistributionResult"
}
],
"stateMutability": "payable"
},
{
"name": "expectedBridge",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"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": "maxFeeTokenProtocolFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "maxProtocolFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "protocolFee",
"type": "function",
"inputs": [
{
"name": "feeToken",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "protocolFeeReceiver",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address payable"
}
],
"stateMutability": "view"
},
{
"name": "setFixedFeeTokenProtocolFee",
"type": "function",
"inputs": [
{
"name": "newFee",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "previousFee",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "setFixedProtocolFee",
"type": "function",
"inputs": [
{
"name": "newFee",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "previousFee",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "setProtocolFeeReceiver",
"type": "function",
"inputs": [
{
"name": "newReceiver",
"type": "address",
"internalType": "address payable"
}
],
"outputs": [
{
"name": "previousReceiver",
"type": "address",
"internalType": "address"
}
],
"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": "tokenIssuers",
"type": "function",
"inputs": [
{
"name": "chainId",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "issuer",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"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"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x608080604052600436101561001c575b50361561001a575f80fd5b005b5f3560e01c9081630df38adc14610982575080631337c2a31461093257806317e1813d146109155780631a7a73c2146108ae57806325c2cd4a14610813578063364f677d146107f657806339a51be5146107ce578063416610c4146107215780634336451a146106dd57806346877b1a1461067b578063576d3637146106255780635ee31c7c146105eb5780637a96cd72146105685780637c22808a1461054d5780638ff9a5091461051357806399955243146104a5578063a3da76f5146103d4578063b62b31e414610396578063c886181f1461035e578063cd3387a014610341578063e78cea921461031a578063f1d769c01461022e578063f2566240146101f65763fa82de3014610130575f61000f565b346101f25760603660031901126101f2576101496109de565b6101516109f4565b5f549091604435916001600160a01b031633036101e3576001600160a01b031691821580156101d2575b6101c357825f52600460205260405f205482116101b4578261001a935f52600460205260405f206101ad848254610a33565b9055610c10565b631d42c86760e21b5f5260045ffd5b63e6c4247b60e01b5f5260045ffd5b506001600160a01b0381161561017b565b6338da3b1560e01b5f5260045ffd5b5f80fd5b346101f25760203660031901126101f2576001600160a01b036102176109de565b165f526004602052602060405f2054604051908152f35b60803660031901126101f2576102426109de565b6024359063ffffffff821682036101f25761025b610a0a565b6040519060c082016001600160401b03811183821017610306576040525f82525f60208301525f60408301525f60608301525f60808301525f60a083015260018060a01b035f541633036101e35760c0936102b99360643593610ab5565b60a060405191600180831b038151168352600180831b03602082015116602084015260408101516040840152606081015160608401526080810151151560808401520151151560a0820152f35b634e487b7160e01b5f52604160045260245ffd5b346101f2575f3660031901126101f2575f546040516001600160a01b039091168152602090f35b346101f2575f3660031901126101f2576020600354604051908152f35b346101f25760203660031901126101f2576001600160a01b0361037f6109de565b165f526007602052602060405f2054604051908152f35b346101f25760203660031901126101f2576001600160a01b036103b76109de565b166103ca5760206001545b604051908152f35b60206002546103c2565b346101f25760803660031901126101f2576103ed6109de565b6103f56109f4565b906103fe610a0a565b5f5460643592906001600160a01b031633036101e3576001600160a01b031680158015610494575b8015610483575b6101c357805f52600860205260405f2060018060a01b0385165f5260205260405f205483116101b45761001a93815f52600860205260405f209060018060a01b03165f5260205260405f206101ad848254610a33565b506001600160a01b0382161561042d565b506001600160a01b03841615610426565b346101f25760203660031901126101f2575f54600435906001600160a01b031633036101e3577f00000000000000000000000000000000000000000000000000000000002dc6c081116105045760209060025490600255604051908152f35b63499fddb160e01b5f5260045ffd5b346101f2575f3660031901126101f25760206040517f00000000000000000000000000000000000000000000000000000000002dc6c08152f35b346101f2575f3660031901126101f257602060405160048152f35b346101f2575f3660031901126101f2575f546001600160a01b0381166105dc577f000000000000000000000000240c56cc15de82e4f52f57b3f15bc2297a4f592d6001600160a01b031680151590816105d1575b506101e3576001600160a01b03191633175f55005b9050331415826105bc565b630dc1e10f60e31b5f5260045ffd5b346101f2575f3660031901126101f25760206040517f00000000000000000000000000000000000000000000000000071afd498d00008152f35b346101f25760403660031901126101f25761063e610a20565b63ffffffff61064b6109f4565b91165f9081526006602090815260408083206001600160a01b039485168452825291829020549151919092168152f35b346101f25760203660031901126101f2576106946109de565b5f546001600160a01b031633036101e3576001600160a01b031680156101c357600580546001600160a01b0319811690921790556040516001600160a01b039091168152602090f35b346101f2575f3660031901126101f2576040517f000000000000000000000000240c56cc15de82e4f52f57b3f15bc2297a4f592d6001600160a01b03168152602090f35b346101f25760603660031901126101f25761073a6109de565b6107426109f4565b5f549091604435916001600160a01b031633036101e3576001600160a01b031691821580156107bd575b6101c357825f52600760205260405f205482116101b4575f80809381938683526007602052604083206107a0838254610a33565b90556001600160a01b03165af16107b5610a77565b50156101b457005b506001600160a01b0381161561076c565b346101f2575f3660031901126101f2576005546040516001600160a01b039091168152602090f35b346101f2575f3660031901126101f2576020600254604051908152f35b346101f25760603660031901126101f25761082c610a20565b6108346109f4565b61083c610a0a565b5f549092906001600160a01b031633036101e35763ffffffff168015801561089d575b6101c3575f9081526006602090815260408083206001600160a01b039485168452909152902080546001600160a01b03191692909116919091179055005b506001600160a01b0382161561085f565b346101f25760403660031901126101f2576108c76109de565b5f5460243591906001600160a01b031633036101e3576001600160a01b03169081156101c357600354918282116101b4575f80808481946109088289610a33565b6003555af16107b5610a77565b346101f2575f3660031901126101f2576020600154604051908152f35b346101f25760403660031901126101f25761094b6109de565b6109536109f4565b6001600160a01b039182165f908152600860209081526040808320949093168252928352819020549051908152f35b346101f25760203660031901126101f2575f5460043591906001600160a01b031633036101e3577f00000000000000000000000000000000000000000000000000071afd498d0000821161050457602091600154906001558152f35b600435906001600160a01b03821682036101f257565b602435906001600160a01b03821682036101f257565b604435906001600160a01b03821682036101f257565b6004359063ffffffff821682036101f257565b91908203918211610a4057565b634e487b7160e01b5f52601160045260245ffd5b601f909101601f19168101906001600160401b0382119082101761030657604052565b3d15610ab0573d906001600160401b0382116103065760405191610aa5601f8201601f191660200184610a54565b82523d5f602084013e565b606090565b9493929091856001600160a01b038416610bfb57843403610bec575b6005546001600160a01b031681528415610bd6575063ffffffff165f9081526006602090815260408083206001600160a01b0394851684528252909120549091169085018181529290610bca57610b305f5b6060870192818452610a33565b6040860181815286519091610b4e916001600160a01b031685610c91565b1580156080880152610bb9575b5060a0850160018152815180610b73575b5050505050565b8451610b8991906001600160a01b031685610c91565b159081159052610b9b575b8080610b6c565b610bb19260018060a01b03905116905191610daf565b5f8080610b94565b610bc4905183610d6b565b5f610b5b565b610b308160021c610b23565b60016080820181905260a0820152955050505050565b6358d620b360e01b5f5260045ffd5b3415610ad1576358d620b360e01b5f5260045ffd5b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f5114821615610c70575b60405215610c505750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b906001811516610c8857823b15153d15161690610c45565b503d5f823e3d90fd5b91908115610d56576001600160a01b0316918215610d4f575f9283926001600160a01b03831615610d3a57839060405190602082019363a9059cbb60e01b85526024830152604482015260448152610cea606482610a54565b51925af1610cf6610a77565b9015610d355780518015610d2e5760208110610d285781602091810103126101f2576020015180151581036101f25790565b50505f90565b5050600190565b505f90565b8392508291617530f1610d4b610a77565b5090565b5050505f90565b505050600190565b91908201809211610a4057565b8115610dab576001600160a01b031680610d915750610d8c90600354610d5e565b600355565b5f526004602052610da760405f20918254610d5e565b9055565b5050565b8215610e0a576001600160a01b031680610de2575060018060a01b03165f526007602052610da760405f20918254610d5e565b5f52600860205260405f209060018060a01b03165f52602052610da760405f20918254610d5e565b50505056fea164736f6c634300081a000a
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| no event logs emitted by this address | |||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| 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 | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| No direct transactions — this address is only ever reached via internal calls (common for a contract only invoked through a router or proxy). View Internal Transactions → | |||||||||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 27,854,161 | 13 days agoTue, 04 Aug 2026 18:52:32 UTC | 0x7c7fd0…70142f | CALL | sendOFTTo | 0xc885…14f3 | OUT | 0xc455…1a27 | 0.00005 ETH |
| 27,854,161 | 13 days agoTue, 04 Aug 2026 18:52:32 UTC | 0x7c7fd0…70142f | CALL | sendOFTTo | 0x240c…592d | IN | 0xc885…14f3 | 0.00005 ETH |
| 26,223,938 | 15 days agoSun, 02 Aug 2026 21:28:53 UTC | 0x1a006d…4414a2 | CALL | sendOFTTo | 0xc885…14f3 | OUT | 0xc455…1a27 | 0.00005 ETH |
| 26,223,938 | 15 days agoSun, 02 Aug 2026 21:28:53 UTC | 0x1a006d…4414a2 | CALL | sendOFTTo | 0x240c…592d | IN | 0xc885…14f3 | 0.00005 ETH |
| 22,697,603 | 19 days agoWed, 29 Jul 2026 19:15:55 UTC | 0x606f04…6f231d | CALL | sendOriginalTo | 0xc885…14f3 | OUT | 0xc455…1a27 | 0.00005 ETH |
| 22,697,603 | 19 days agoWed, 29 Jul 2026 19:15:55 UTC | 0x606f04…6f231d | CALL | sendOriginalTo | 0x240c…592d | IN | 0xc885…14f3 | 0.00005 ETH |
| 22,564,388 | 19 days agoWed, 29 Jul 2026 15:33:31 UTC | 0x458084…ba47d8 | CALL | sendOriginalTo | 0xc885…14f3 | OUT | 0xc455…1a27 | 0.00005 ETH |
| 22,564,388 | 19 days agoWed, 29 Jul 2026 15:33:31 UTC | 0x458084…ba47d8 | CALL | sendOriginalTo | 0x240c…592d | IN | 0xc885…14f3 | 0.00005 ETH |
| 3,271,339 | 42 days agoMon, 06 Jul 2026 18:33:41 UTC | 0x54bb72…5d22ed | CALL | sendOriginalTo | 0xc885…14f3 | OUT | 0xc455…1a27 | 0.00002 ETH |
| 3,271,339 | 42 days agoMon, 06 Jul 2026 18:33:41 UTC | 0x54bb72…5d22ed | CALL | sendOriginalTo | 0x240c…592d | IN | 0xc885…14f3 | 0.00002 ETH |
| 3,271,103 | 42 days agoMon, 06 Jul 2026 18:33:10 UTC | 0xe3f843…327e67 | CALL | sendOriginalTo | 0xc885…14f3 | OUT | 0xc455…1a27 | 0.00002 ETH |
| 3,271,103 | 42 days agoMon, 06 Jul 2026 18:33:10 UTC | 0xe3f843…327e67 | CALL | sendOriginalTo | 0x240c…592d | IN | 0xc885…14f3 | 0.00002 ETH |
| 3,270,975 | 42 days agoMon, 06 Jul 2026 18:32:55 UTC | 0x76bfcd…3ab6ff | CALL | sendOriginalTo | 0xc885…14f3 | OUT | 0xc455…1a27 | 0.00002 ETH |
| 3,270,975 | 42 days agoMon, 06 Jul 2026 18:32:55 UTC | 0x76bfcd…3ab6ff | CALL | sendOriginalTo | 0x240c…592d | IN | 0xc885…14f3 | 0.00002 ETH |
| 3,255,144 | 42 days agoMon, 06 Jul 2026 17:54:15 UTC | 0xf21b3f…b20816 | CALL | sendOriginalTo | 0xc885…14f3 | OUT | 0xc455…1a27 | 0.00002 ETH |
| 3,255,144 | 42 days agoMon, 06 Jul 2026 17:54:15 UTC | 0xf21b3f…b20816 | CALL | sendOriginalTo | 0x240c…592d | IN | 0xc885…14f3 | 0.00002 ETH |
| 2,822,093 | 43 days agoSun, 05 Jul 2026 16:43:19 UTC | 0x123675…91081d | CALL | sendOriginalTo | 0xc885…14f3 | OUT | 0xc455…1a27 | 0.00002 ETH |
| 2,822,093 | 43 days agoSun, 05 Jul 2026 16:43:19 UTC | 0x123675…91081d | CALL | sendOriginalTo | 0x240c…592d | IN | 0xc885…14f3 | 0.00002 ETH |
| 2,479,593 | 44 days agoSat, 04 Jul 2026 17:38:38 UTC | 0xfd6fc5…957a87 | CALL | sendOriginalTo | 0xc885…14f3 | OUT | 0xc455…1a27 | 0.00002 ETH |
| 2,479,593 | 44 days agoSat, 04 Jul 2026 17:38:38 UTC | 0xfd6fc5…957a87 | CALL | sendOriginalTo | 0x240c…592d | IN | 0xc885…14f3 | 0.00002 ETH |
| 1,762,465 | 45 days agoFri, 03 Jul 2026 07:10:38 UTC | 0x48d9db…fdc641 | CALL | sendOriginalTo | 0xc885…14f3 | OUT | 0xc455…1a27 | 0.00002 ETH |
| 1,762,465 | 45 days agoFri, 03 Jul 2026 07:10:38 UTC | 0x48d9db…fdc641 | CALL | sendOriginalTo | 0x240c…592d | IN | 0xc885…14f3 | 0.00002 ETH |
| 1,441,715 | 46 days agoThu, 02 Jul 2026 18:44:16 UTC | 0xe99d08…6dfb7c | CALL | sendOriginalTo | 0xc885…14f3 | OUT | 0xc455…1a27 | 0.00002 ETH |
| 1,441,715 | 46 days agoThu, 02 Jul 2026 18:44:16 UTC | 0xe99d08…6dfb7c | CALL | sendOriginalTo | 0x240c…592d | IN | 0xc885…14f3 | 0.00002 ETH |
| 896,032 | 47 days agoWed, 01 Jul 2026 21:34:35 UTC | 0x77821b…b37d75 | CREATE | deploy | 0x0941…dfec | IN | 0xc885…14f3 | 0 ETH |