// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.28;
import {ILendingRouter} from "../interfaces/ILendingRouter.sol";
import {IProtocolRegistry} from "../interfaces/IProtocolRegistry.sol";
import {IAaveV3Pool} from "../interfaces/external/IAaveV3Pool.sol";
import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
/// @title LendingRouter — Multi-reserve deposit/withdraw router for aToken vaults
/// @notice Single router instance that fronts one lending pool exposing the
/// {IAaveV3Pool} supply/withdraw interface — either a canonical Aave V3
/// deployment or the protocol's in-house {OwnLendingPool} on chains where
/// Aave is unavailable. It converts a plain underlying (wstETH, WETH, USDG,
/// …) into aToken vault shares in one call: pull underlying → `pool.supply`
/// → deposit the received aToken into the matching OwnVault (and the reverse
/// on withdraw). The pool is venue-agnostic; only the `pool` address chosen
/// at construction determines the funding source.
///
/// Handles any number of reserves. Reserves are registered by the protocol
/// admin; once registered, the `(underlying, aToken)` pair is immutable.
/// Admin can toggle a reserve's `enabled` flag to pause or resume routing
/// without changing the mapping.
///
/// The router holds no state other than the reserve registry and no
/// tokens between transactions.
contract LendingRouter is ILendingRouter, ReentrancyGuard {
using SafeERC20 for IERC20;
/// @inheritdoc ILendingRouter
address public immutable override pool;
/// @notice ProtocolRegistry used to resolve ADMIN / OPERATOR roles.
IProtocolRegistry public immutable registry;
/// @dev Per-underlying reserve metadata.
mapping(address => ReserveInfo) private _reserves;
bytes32 private constant ADMIN = keccak256("ADMIN");
bytes32 private constant OPERATOR = keccak256("OPERATOR");
modifier onlyAdmin() {
if (!registry.hasRole(ADMIN, msg.sender)) revert OnlyAdmin();
_;
}
modifier onlyOperator() {
if (!registry.hasRole(OPERATOR, msg.sender)) revert OnlyOperator();
_;
}
constructor(address pool_, address registry_) {
if (pool_ == address(0) || registry_ == address(0)) revert ZeroAddress();
pool = pool_;
registry = IProtocolRegistry(registry_);
}
// ──────────────────────────────────────────────────────────
// Reserve management
// ──────────────────────────────────────────────────────────
/// @inheritdoc ILendingRouter
function registerReserve(address underlying, address aToken) external onlyAdmin {
if (underlying == address(0) || aToken == address(0)) revert ZeroAddress();
if (_reserves[underlying].aToken != address(0)) revert ReserveAlreadyRegistered(underlying);
_reserves[underlying] = ReserveInfo({aToken: aToken, enabled: true});
// Pre-approve the pool to pull the underlying on supply.
IERC20(underlying).forceApprove(pool, type(uint256).max);
emit ReserveRegistered(underlying, aToken);
emit ReserveEnabledChanged(underlying, true);
}
/// @inheritdoc ILendingRouter
function setReserveEnabled(address underlying, bool enabled) external onlyOperator {
ReserveInfo storage info = _reserves[underlying];
if (info.aToken == address(0)) revert ReserveNotRegistered(underlying);
info.enabled = enabled;
emit ReserveEnabledChanged(underlying, enabled);
}
/// @inheritdoc ILendingRouter
function reserves(
address underlying
) external view returns (address aToken, bool enabled) {
ReserveInfo memory info = _reserves[underlying];
return (info.aToken, info.enabled);
}
// ──────────────────────────────────────────────────────────
// Deposit / withdraw
// ──────────────────────────────────────────────────────────
/// @inheritdoc ILendingRouter
function deposit(
address underlying,
IERC4626 vault,
uint256 underlyingAmount,
address receiver,
uint256 minSharesOut
) external nonReentrant returns (uint256 shares) {
if (underlyingAmount == 0) revert ZeroAmount();
if (receiver == address(0)) revert ZeroAddress();
address aToken = _requireEnabled(underlying);
if (vault.asset() != aToken) revert VaultAssetMismatch(aToken, vault.asset());
// Pull underlying from caller.
IERC20(underlying).safeTransferFrom(msg.sender, address(this), underlyingAmount);
// Supply to Aave on the router's behalf — aToken lands here 1:1.
uint256 aTokenBefore = IERC20(aToken).balanceOf(address(this));
IAaveV3Pool(pool).supply(underlying, underlyingAmount, address(this), 0);
uint256 aTokenReceived = IERC20(aToken).balanceOf(address(this)) - aTokenBefore;
// Approve vault and deposit via standard ERC-4626 path.
IERC20(aToken).forceApprove(address(vault), aTokenReceived);
shares = vault.deposit(aTokenReceived, receiver);
if (shares < minSharesOut) revert MinSharesError(shares, minSharesOut);
emit Deposit(address(vault), msg.sender, receiver, underlying, aTokenReceived, shares);
}
/// @inheritdoc ILendingRouter
function withdraw(
address underlying,
uint256 aTokenAmount,
address receiver
) external nonReentrant returns (uint256 underlyingAmount) {
if (aTokenAmount == 0) revert ZeroAmount();
if (receiver == address(0)) revert ZeroAddress();
address aToken = _requireEnabled(underlying);
// Pull aToken from caller.
IERC20(aToken).safeTransferFrom(msg.sender, address(this), aTokenAmount);
// Aave burns the aToken and sends the underlying directly to `receiver`.
underlyingAmount = IAaveV3Pool(pool).withdraw(underlying, aTokenAmount, receiver);
emit Withdraw(msg.sender, receiver, underlying, aTokenAmount, underlyingAmount);
}
// ──────────────────────────────────────────────────────────
// Internal
// ──────────────────────────────────────────────────────────
/// @dev Resolve the reserve's aToken and assert the reserve is enabled.
function _requireEnabled(
address underlying
) private view returns (address aToken) {
ReserveInfo memory info = _reserves[underlying];
if (info.aToken == address(0)) revert ReserveNotRegistered(underlying);
if (!info.enabled) revert ReserveDisabled(underlying);
return info.aToken;
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "pool_",
"type": "address",
"internalType": "address"
},
{
"name": "registry_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "MinSharesError",
"type": "error",
"inputs": [
{
"name": "shares",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "minSharesOut",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "OnlyAdmin",
"type": "error",
"inputs": []
},
{
"name": "OnlyOperator",
"type": "error",
"inputs": []
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "ReserveAlreadyRegistered",
"type": "error",
"inputs": [
{
"name": "underlying",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ReserveDisabled",
"type": "error",
"inputs": [
{
"name": "underlying",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ReserveNotRegistered",
"type": "error",
"inputs": [
{
"name": "underlying",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "VaultAssetMismatch",
"type": "error",
"inputs": [
{
"name": "expected",
"type": "address",
"internalType": "address"
},
{
"name": "actual",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "ZeroAmount",
"type": "error",
"inputs": []
},
{
"name": "Deposit",
"type": "event",
"inputs": [
{
"name": "vault",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "sender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "receiver",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "underlying",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "underlyingAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "shares",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ReserveEnabledChanged",
"type": "event",
"inputs": [
{
"name": "underlying",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "enabled",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "ReserveRegistered",
"type": "event",
"inputs": [
{
"name": "underlying",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "aToken",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Withdraw",
"type": "event",
"inputs": [
{
"name": "sender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "receiver",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "underlying",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "aTokenAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "underlyingAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "deposit",
"type": "function",
"inputs": [
{
"name": "underlying",
"type": "address",
"internalType": "address"
},
{
"name": "vault",
"type": "address",
"internalType": "contract IERC4626"
},
{
"name": "underlyingAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "receiver",
"type": "address",
"internalType": "address"
},
{
"name": "minSharesOut",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "shares",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "pool",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "registerReserve",
"type": "function",
"inputs": [
{
"name": "underlying",
"type": "address",
"internalType": "address"
},
{
"name": "aToken",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "registry",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IProtocolRegistry"
}
],
"stateMutability": "view"
},
{
"name": "reserves",
"type": "function",
"inputs": [
{
"name": "underlying",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "aToken",
"type": "address",
"internalType": "address"
},
{
"name": "enabled",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "setReserveEnabled",
"type": "function",
"inputs": [
{
"name": "underlying",
"type": "address",
"internalType": "address"
},
{
"name": "enabled",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "withdraw",
"type": "function",
"inputs": [
{
"name": "underlying",
"type": "address",
"internalType": "address"
},
{
"name": "aTokenAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "receiver",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "underlyingAmount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
}
]0x60c060405234801561000f575f5ffd5b5060405161109e38038061109e83398101604081905261002e916100bf565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556001600160a01b038216158061006f57506001600160a01b038116155b1561008d5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b039182166080521660a0526100f0565b80516001600160a01b03811681146100ba575f5ffd5b919050565b5f5f604083850312156100d0575f5ffd5b6100d9836100a4565b91506100e7602084016100a4565b90509250929050565b60805160a051610f6b6101335f395f81816101100152818161078401526108ef01525f81816083015281816103c90152818161065f0152610a520152610f6b5ff3fe608060405234801561000f575f5ffd5b506004361061007a575f3560e01c806372f978551161005857806372f97855146100f65780637b1039991461010b578063d4eec72914610132578063d66bd52414610145575f5ffd5b806316f0115b1461007e5780635f2fede7146100c257806369328dec146100e3575b5f5ffd5b6100a57f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6100d56100d0366004610d82565b6101b1565b6040519081526020016100b9565b6100d56100f1366004610dd9565b6105c0565b610109610104366004610e25565b610749565b005b6100a57f000000000000000000000000000000000000000000000000000000000000000081565b610109610140366004610e5c565b6108b4565b610192610153366004610e88565b6001600160a01b039081165f9081526020818152604091829020825180840190935254928316808352600160a01b90930460ff16151591018190529091565b604080516001600160a01b0390931683529015156020830152016100b9565b5f6101ba610afb565b835f036101da57604051631f2a200560e01b815260040160405180910390fd5b6001600160a01b0383166102015760405163d92e233d60e01b815260040160405180910390fd5b5f61020b87610b16565b9050806001600160a01b0316866001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610253573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102779190610ea3565b6001600160a01b0316146103175780866001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102c2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102e69190610ea3565b60405163dd72360360e01b81526001600160a01b039283166004820152911660248201526044015b60405180910390fd5b61032c6001600160a01b038816333088610bb0565b6040516370a0823160e01b81523060048201525f906001600160a01b038316906370a0823190602401602060405180830381865afa158015610370573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103949190610ebe565b60405163617ba03760e01b81526001600160a01b038a81166004830152602482018990523060448301525f60648301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063617ba037906084015f604051808303815f87803b15801561040c575f5ffd5b505af115801561041e573d5f5f3e3d5ffd5b50506040516370a0823160e01b81523060048201525f92508391506001600160a01b038516906370a0823190602401602060405180830381865afa158015610468573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061048c9190610ebe565b6104969190610ed5565b90506104ac6001600160a01b0384168983610bec565b604051636e553f6560e01b8152600481018290526001600160a01b038781166024830152891690636e553f65906044016020604051808303815f875af11580156104f8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051c9190610ebe565b93508484101561054957604051630a5e1beb60e11b8152600481018590526024810186905260440161030e565b604080516001600160a01b038b8116825260208201849052918101869052818816913391908b16907fe354026b0ea4d7022834b4903ab420cdc10b109a8506dc68061124854cd353c89060600160405180910390a45050506105b760015f516020610f165f395f51905f5255565b95945050505050565b5f6105c9610afb565b825f036105e957604051631f2a200560e01b815260040160405180910390fd5b6001600160a01b0382166106105760405163d92e233d60e01b815260040160405180910390fd5b5f61061a85610b16565b90506106316001600160a01b038216333087610bb0565b604051631a4ca37b60e21b81526001600160a01b0386811660048301526024820186905284811660448301527f000000000000000000000000000000000000000000000000000000000000000016906369328dec906064016020604051808303815f875af11580156106a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c99190610ebe565b9150846001600160a01b0316836001600160a01b0316336001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8786604051610723929190918252602082015260400190565b60405180910390a45061074260015f516020610f165f395f51905f5255565b9392505050565b604051632474521560e21b81527f523a704056dcd17bcf83bed8b68c59416dac1119be77755efe3bde0a64e46e0c60048201523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391d1485490604401602060405180830381865afa1580156107d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f59190610efa565b610812576040516327e1f1e560e01b815260040160405180910390fd5b6001600160a01b038083165f908152602081905260409020805490911661085757604051634e49f1e560e11b81526001600160a01b038416600482015260240161030e565b805460ff60a01b1916600160a01b8315159081029190911782556040519081526001600160a01b038416907fb853ae7a99d9c6e33b465c0af538b6778d5fc62bc4bdce187374684eb3a2ed039060200160405180910390a2505050565b604051632474521560e21b81527fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4260048201523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391d1485490604401602060405180830381865afa15801561093c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109609190610efa565b61097d57604051634755657960e01b815260040160405180910390fd5b6001600160a01b038216158061099a57506001600160a01b038116155b156109b85760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038281165f9081526020819052604090205416156109fb57604051632817addd60e01b81526001600160a01b038316600482015260240161030e565b6040805180820182526001600160a01b038084168252600160208084019182528683165f818152918290529490209251835491511515600160a01b026001600160a81b0319909216921691909117179055610a78907f00000000000000000000000000000000000000000000000000000000000000005f19610bec565b806001600160a01b0316826001600160a01b03167f5db3ad55b7ae635d25c0fab6e59901181eabbd35bff2c04b54f970af2279673660405160405180910390a3604051600181526001600160a01b038316907fb853ae7a99d9c6e33b465c0af538b6778d5fc62bc4bdce187374684eb3a2ed039060200160405180910390a25050565b610b03610c6b565b60025f516020610f165f395f51905f5255565b6001600160a01b038181165f90815260208181526040808320815180830190925254938416808252600160a01b90940460ff161515918101919091529091610b7c57604051634e49f1e560e11b81526001600160a01b038416600482015260240161030e565b8060200151610ba9576040516332488e2d60e21b81526001600160a01b038416600482015260240161030e565b5192915050565b610bbe848484846001610c9c565b610be657604051635274afe760e01b81526001600160a01b038516600482015260240161030e565b50505050565b610bf88383835f610d09565b610c6657610c0983835f6001610d09565b610c3157604051635274afe760e01b81526001600160a01b038416600482015260240161030e565b610c3e8383836001610d09565b610c6657604051635274afe760e01b81526001600160a01b038416600482015260240161030e565b505050565b5f516020610f165f395f51905f5254600203610c9a57604051633ee5aeb560e01b815260040160405180910390fd5b565b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f51148316610cf8578383151615610cec573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610d5f578383151615610d53573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b6001600160a01b0381168114610d7f575f5ffd5b50565b5f5f5f5f5f60a08688031215610d96575f5ffd5b8535610da181610d6b565b94506020860135610db181610d6b565b9350604086013592506060860135610dc881610d6b565b949793965091946080013592915050565b5f5f5f60608486031215610deb575f5ffd5b8335610df681610d6b565b9250602084013591506040840135610e0d81610d6b565b809150509250925092565b8015158114610d7f575f5ffd5b5f5f60408385031215610e36575f5ffd5b8235610e4181610d6b565b91506020830135610e5181610e18565b809150509250929050565b5f5f60408385031215610e6d575f5ffd5b8235610e7881610d6b565b91506020830135610e5181610d6b565b5f60208284031215610e98575f5ffd5b813561074281610d6b565b5f60208284031215610eb3575f5ffd5b815161074281610d6b565b5f60208284031215610ece575f5ffd5b5051919050565b81810381811115610ef457634e487b7160e01b5f52601160045260245ffd5b92915050565b5f60208284031215610f0a575f5ffd5b815161074281610e1856fe9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a26469706673582212209eb36811fe4c91f08148c301d81458c6980264906afe517fb896657a33d6198164736f6c634300081c0033000000000000000000000000ada84daebd59053cdbc49740e1f06f039bb4fbba00000000000000000000000093e08ca467046737f75aad4c936356c196aaa36f
0x608060405234801561000f575f5ffd5b506004361061007a575f3560e01c806372f978551161005857806372f97855146100f65780637b1039991461010b578063d4eec72914610132578063d66bd52414610145575f5ffd5b806316f0115b1461007e5780635f2fede7146100c257806369328dec146100e3575b5f5ffd5b6100a57f000000000000000000000000ada84daebd59053cdbc49740e1f06f039bb4fbba81565b6040516001600160a01b0390911681526020015b60405180910390f35b6100d56100d0366004610d82565b6101b1565b6040519081526020016100b9565b6100d56100f1366004610dd9565b6105c0565b610109610104366004610e25565b610749565b005b6100a57f00000000000000000000000093e08ca467046737f75aad4c936356c196aaa36f81565b610109610140366004610e5c565b6108b4565b610192610153366004610e88565b6001600160a01b039081165f9081526020818152604091829020825180840190935254928316808352600160a01b90930460ff16151591018190529091565b604080516001600160a01b0390931683529015156020830152016100b9565b5f6101ba610afb565b835f036101da57604051631f2a200560e01b815260040160405180910390fd5b6001600160a01b0383166102015760405163d92e233d60e01b815260040160405180910390fd5b5f61020b87610b16565b9050806001600160a01b0316866001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610253573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102779190610ea3565b6001600160a01b0316146103175780866001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102c2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102e69190610ea3565b60405163dd72360360e01b81526001600160a01b039283166004820152911660248201526044015b60405180910390fd5b61032c6001600160a01b038816333088610bb0565b6040516370a0823160e01b81523060048201525f906001600160a01b038316906370a0823190602401602060405180830381865afa158015610370573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103949190610ebe565b60405163617ba03760e01b81526001600160a01b038a81166004830152602482018990523060448301525f60648301529192507f000000000000000000000000ada84daebd59053cdbc49740e1f06f039bb4fbba9091169063617ba037906084015f604051808303815f87803b15801561040c575f5ffd5b505af115801561041e573d5f5f3e3d5ffd5b50506040516370a0823160e01b81523060048201525f92508391506001600160a01b038516906370a0823190602401602060405180830381865afa158015610468573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061048c9190610ebe565b6104969190610ed5565b90506104ac6001600160a01b0384168983610bec565b604051636e553f6560e01b8152600481018290526001600160a01b038781166024830152891690636e553f65906044016020604051808303815f875af11580156104f8573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051c9190610ebe565b93508484101561054957604051630a5e1beb60e11b8152600481018590526024810186905260440161030e565b604080516001600160a01b038b8116825260208201849052918101869052818816913391908b16907fe354026b0ea4d7022834b4903ab420cdc10b109a8506dc68061124854cd353c89060600160405180910390a45050506105b760015f516020610f165f395f51905f5255565b95945050505050565b5f6105c9610afb565b825f036105e957604051631f2a200560e01b815260040160405180910390fd5b6001600160a01b0382166106105760405163d92e233d60e01b815260040160405180910390fd5b5f61061a85610b16565b90506106316001600160a01b038216333087610bb0565b604051631a4ca37b60e21b81526001600160a01b0386811660048301526024820186905284811660448301527f000000000000000000000000ada84daebd59053cdbc49740e1f06f039bb4fbba16906369328dec906064016020604051808303815f875af11580156106a5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c99190610ebe565b9150846001600160a01b0316836001600160a01b0316336001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8786604051610723929190918252602082015260400190565b60405180910390a45061074260015f516020610f165f395f51905f5255565b9392505050565b604051632474521560e21b81527f523a704056dcd17bcf83bed8b68c59416dac1119be77755efe3bde0a64e46e0c60048201523360248201527f00000000000000000000000093e08ca467046737f75aad4c936356c196aaa36f6001600160a01b0316906391d1485490604401602060405180830381865afa1580156107d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f59190610efa565b610812576040516327e1f1e560e01b815260040160405180910390fd5b6001600160a01b038083165f908152602081905260409020805490911661085757604051634e49f1e560e11b81526001600160a01b038416600482015260240161030e565b805460ff60a01b1916600160a01b8315159081029190911782556040519081526001600160a01b038416907fb853ae7a99d9c6e33b465c0af538b6778d5fc62bc4bdce187374684eb3a2ed039060200160405180910390a2505050565b604051632474521560e21b81527fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec4260048201523360248201527f00000000000000000000000093e08ca467046737f75aad4c936356c196aaa36f6001600160a01b0316906391d1485490604401602060405180830381865afa15801561093c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109609190610efa565b61097d57604051634755657960e01b815260040160405180910390fd5b6001600160a01b038216158061099a57506001600160a01b038116155b156109b85760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038281165f9081526020819052604090205416156109fb57604051632817addd60e01b81526001600160a01b038316600482015260240161030e565b6040805180820182526001600160a01b038084168252600160208084019182528683165f818152918290529490209251835491511515600160a01b026001600160a81b0319909216921691909117179055610a78907f000000000000000000000000ada84daebd59053cdbc49740e1f06f039bb4fbba5f19610bec565b806001600160a01b0316826001600160a01b03167f5db3ad55b7ae635d25c0fab6e59901181eabbd35bff2c04b54f970af2279673660405160405180910390a3604051600181526001600160a01b038316907fb853ae7a99d9c6e33b465c0af538b6778d5fc62bc4bdce187374684eb3a2ed039060200160405180910390a25050565b610b03610c6b565b60025f516020610f165f395f51905f5255565b6001600160a01b038181165f90815260208181526040808320815180830190925254938416808252600160a01b90940460ff161515918101919091529091610b7c57604051634e49f1e560e11b81526001600160a01b038416600482015260240161030e565b8060200151610ba9576040516332488e2d60e21b81526001600160a01b038416600482015260240161030e565b5192915050565b610bbe848484846001610c9c565b610be657604051635274afe760e01b81526001600160a01b038516600482015260240161030e565b50505050565b610bf88383835f610d09565b610c6657610c0983835f6001610d09565b610c3157604051635274afe760e01b81526001600160a01b038416600482015260240161030e565b610c3e8383836001610d09565b610c6657604051635274afe760e01b81526001600160a01b038416600482015260240161030e565b505050565b5f516020610f165f395f51905f5254600203610c9a57604051633ee5aeb560e01b815260040160405180910390fd5b565b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f51148316610cf8578383151615610cec573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610d5f578383151615610d53573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b6001600160a01b0381168114610d7f575f5ffd5b50565b5f5f5f5f5f60a08688031215610d96575f5ffd5b8535610da181610d6b565b94506020860135610db181610d6b565b9350604086013592506060860135610dc881610d6b565b949793965091946080013592915050565b5f5f5f60608486031215610deb575f5ffd5b8335610df681610d6b565b9250602084013591506040840135610e0d81610d6b565b809150509250925092565b8015158114610d7f575f5ffd5b5f5f60408385031215610e36575f5ffd5b8235610e4181610d6b565b91506020830135610e5181610e18565b809150509250929050565b5f5f60408385031215610e6d575f5ffd5b8235610e7881610d6b565b91506020830135610e5181610d6b565b5f60208284031215610e98575f5ffd5b813561074281610d6b565b5f60208284031215610eb3575f5ffd5b815161074281610d6b565b5f60208284031215610ece575f5ffd5b5051919050565b81810381811115610ef457634e487b7160e01b5f52601160045260245ffd5b92915050565b5f60208284031215610f0a575f5ffd5b815161074281610e1856fe9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a26469706673582212209eb36811fe4c91f08148c301d81458c6980264906afe517fb896657a33d6198164736f6c634300081c0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| global dollar (USDG) | USDG | 69 | $1 | $69 |
| Global Dollar (USDG) | USDG | 37.475 | $1 | $37.48 |
| Globals Dollars (USDG) | USDG | 23 | $1 | $23 |
| United States Global Dollars (USDG) | USDG | 12 | $1 | $12 |
| Global Dollar (USDG) | USDG | 8 | $1 | $8 |
| Global Dollar (USDG) | USDG | 1 | $1 | $1 |
| Global Dollar (USDG) | USDG | 1 | $1 | $1 |
| DIH | 1 | $0.0000102 | $0 | |
| Ravenhood (RVHOOD) | RVHOOD | 90 | — | — |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xcc59e1…23bff9 | 20 days agoTue, 28 Jul 2026 12:44:09 UTC | 0xfbde79…c8db | [0] 0x000000000000…9dd8fba4 [1] 0x000000000000…9dd8fba4 [2] 0x000000000000…16f1d168 data: 0x000000000000000000…02631580 |
| 0x738fa7…6c57c4 | 21 days agoMon, 27 Jul 2026 21:27:55 UTC | 0xe35402…53c8 | [0] 0x000000000000…230557fc [1] 0x000000000000…a9563ed6 [2] 0x000000000000…a9563ed6 data: 0x000000000000000000…e4923000 |
| 0x637c2b…212c5d | 21 days agoMon, 27 Jul 2026 18:57:51 UTC | 0xe35402…53c8 | [0] 0x000000000000…230557fc [1] 0x000000000000…a9563ed6 [2] 0x000000000000…a9563ed6 data: 0x000000000000000000…587a0000 |
| 0xdc86c9…daff71 | 21 days agoMon, 27 Jul 2026 18:51:08 UTC | 0xe35402…53c8 | [0] 0x000000000000…230557fc [1] 0x000000000000…a9563ed6 [2] 0x000000000000…a9563ed6 data: 0x000000000000000000…d3480c00 |
| 0x6ae9b0…a27562 | 21 days agoMon, 27 Jul 2026 18:42:00 UTC | 0xe35402…53c8 | [0] 0x000000000000…230557fc [1] 0x000000000000…a9563ed6 [2] 0x000000000000…a9563ed6 data: 0x000000000000000000…8a8d1c00 |
| 0xa336b4…242980 | 25 days agoFri, 24 Jul 2026 02:17:16 UTC | 0xfbde79…c8db | [0] 0x000000000000…9dd8fba4 [1] 0x000000000000…9dd8fba4 [2] 0x000000000000…16f1d168 data: 0x000000000000000000…02faf080 |
| 0xb01667…a47a16 | 25 days agoThu, 23 Jul 2026 13:17:04 UTC | 0xe35402…53c8 | [0] 0x000000000000…230557fc [1] 0x000000000000…9dd8fba4 [2] 0x000000000000…9dd8fba4 data: 0x000000000000000000…3ce78980 |
| 0x5553e1…0f1650 | 26 days agoWed, 22 Jul 2026 12:47:19 UTC | 0xe35402…53c8 | [0] 0x000000000000…230557fc [1] 0x000000000000…c81e2a63 [2] 0x000000000000…c81e2a63 data: 0x000000000000000000…4e72a000 |
| 0xbfe22b…c096c6 | 28 days agoTue, 21 Jul 2026 05:08:45 UTC | 0xe35402…53c8 | [0] 0x000000000000…230557fc [1] 0x000000000000…e3355701 [2] 0x000000000000…e3355701 data: 0x000000000000000000…941c4e80 |
| 0x856f45…30e9db | 28 days agoTue, 21 Jul 2026 04:26:07 UTC | 0xe35402…53c8 | [0] 0x000000000000…230557fc [1] 0x000000000000…f1d6ef66 [2] 0x000000000000…f1d6ef66 data: 0x000000000000000000…20f48000 |
| 0x10cc4e…8f6aaf | 28 days agoMon, 20 Jul 2026 15:08:43 UTC | 0xfbde79…c8db | [0] 0x000000000000…c81e2a63 [1] 0x000000000000…c81e2a63 [2] 0x000000000000…16f1d168 data: 0x000000000000000000…02faf080 |
| 0xe9604b…5bf033 | 28 days agoMon, 20 Jul 2026 15:08:13 UTC | 0xe35402…53c8 | [0] 0x000000000000…230557fc [1] 0x000000000000…c81e2a63 [2] 0x000000000000…c81e2a63 data: 0x000000000000000000…6a23a000 |
| 0x7dcbdb…bcde09 | 29 days agoSun, 19 Jul 2026 13:24:38 UTC | 0xe35402…53c8 | [0] 0x000000000000…230557fc [1] 0x000000000000…86c5b44c [2] 0x000000000000…86c5b44c data: 0x000000000000000000…fa0e7480 |
| 0xee7c1e…07e38d | 29 days agoSun, 19 Jul 2026 12:38:34 UTC | 0xfbde79…c8db | [0] 0x000000000000…c81e2a63 [1] 0x000000000000…c81e2a63 [2] 0x000000000000…16f1d168 data: 0x000000000000000000…05e69ec0 |
| 0xb63660…3152d8 | 29 days agoSun, 19 Jul 2026 12:35:41 UTC | 0xfbde79…c8db | [0] 0x000000000000…c81e2a63 [1] 0x000000000000…c81e2a63 [2] 0x000000000000…16f1d168 data: 0x000000000000000000…000f4240 |
| 0x8aadbf…3f463b | 29 days agoSun, 19 Jul 2026 12:27:03 UTC | 0xe35402…53c8 | [0] 0x000000000000…230557fc [1] 0x000000000000…c81e2a63 [2] 0x000000000000…c81e2a63 data: 0x000000000000000000…c5bb0000 |
| 0xca2819…9d473f | 35 days agoTue, 14 Jul 2026 07:47:41 UTC | 0xe35402…53c8 | [0] 0x000000000000…230557fc [1] 0x000000000000…c81e2a63 [2] 0x000000000000…c81e2a63 data: 0x000000000000000000…107a4000 |
| 0x8a97bb…adc874 | 35 days agoTue, 14 Jul 2026 07:29:56 UTC | 0xb853ae…ed03 | [0] 0x000000000000…16f1d168 data: 0x000000000000000000…00000001 |
| 0x8a97bb…adc874 | 35 days agoTue, 14 Jul 2026 07:29:56 UTC | 0x5db3ad…6736 | [0] 0x000000000000…16f1d168 [1] 0x000000000000…42290143 |
| 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 ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xcc59e1…23bff9 | withdraw | 21,601,334 | 20 days agoTue, 28 Jul 2026 12:44:09 UTC | 0xf400…fba4 | IN | LendingRouter | $0.000 ETH | 0.00000291 | |
| 0x738fa7…6c57c4 | deposit | 21,053,761 | 21 days agoMon, 27 Jul 2026 21:27:55 UTC | 0x133d…3ed6 | IN | LendingRouter | $0.000 ETH | 0.00000685 | |
| 0x637c2b…212c5d | deposit | 20,963,926 | 21 days agoMon, 27 Jul 2026 18:57:51 UTC | 0x133d…3ed6 | IN | LendingRouter | $0.000 ETH | 0.00000684 | |
| 0xdc86c9…daff71 | deposit | 20,959,903 | 21 days agoMon, 27 Jul 2026 18:51:08 UTC | 0x133d…3ed6 | IN | LendingRouter | $0.000 ETH | 0.00000700 | |
| 0x6ae9b0…a27562 | deposit | 20,954,419 | 21 days agoMon, 27 Jul 2026 18:42:00 UTC | 0x133d…3ed6 | IN | LendingRouter | $0.000 ETH | 0.00000732 | |
| 0xa336b4…242980 | withdraw | 17,783,510 | 25 days agoFri, 24 Jul 2026 02:17:16 UTC | 0xf400…fba4 | IN | LendingRouter | $0.000 ETH | 0.00001212 | |
| 0xb01667…a47a16 | deposit | 17,316,527 | 25 days agoThu, 23 Jul 2026 13:17:04 UTC | 0xf400…fba4 | IN | LendingRouter | $0.000 ETH | 0.00002110 | |
| 0x5553e1…0f1650 | deposit | 16,436,626 | 26 days agoWed, 22 Jul 2026 12:47:19 UTC | 0x0e3d…2a63 | IN | LendingRouter | $0.000 ETH | 0.00001427 | |
| 0xbfe22b…c096c6 | deposit | 15,300,029 | 28 days agoTue, 21 Jul 2026 05:08:45 UTC | 0x23cb…5701 | IN | LendingRouter | $0.000 ETH | 0.00001140 | |
| 0x856f45…30e9db | deposit | 15,274,514 | 28 days agoTue, 21 Jul 2026 04:26:07 UTC | 0xa38a…ef66 | IN | LendingRouter | $0.000 ETH | 0.00001144 | |
| 0x10cc4e…8f6aaf | withdraw | 14,797,051 | 28 days agoMon, 20 Jul 2026 15:08:43 UTC | 0x0e3d…2a63 | IN | LendingRouter | $0.000 ETH | 0.00000510 | |
| 0xe9604b…5bf033 | deposit | 14,796,750 | 28 days agoMon, 20 Jul 2026 15:08:13 UTC | 0x0e3d…2a63 | IN | LendingRouter | $0.000 ETH | 0.00000926 | |
| 0x7dcbdb…bcde09 | deposit | 13,874,192 | 29 days agoSun, 19 Jul 2026 13:24:38 UTC | 0x6204…b44c | IN | LendingRouter | $0.000 ETH | 0.00001071 | |
| 0xee7c1e…07e38d | withdraw | 13,846,664 | 29 days agoSun, 19 Jul 2026 12:38:34 UTC | 0x0e3d…2a63 | IN | LendingRouter | $0.000 ETH | 0.00000558 | |
| 0xb63660…3152d8 | withdraw | 13,844,941 | 29 days agoSun, 19 Jul 2026 12:35:41 UTC | 0x0e3d…2a63 | IN | LendingRouter | $0.000 ETH | 0.00000550 | |
| 0x8aadbf…3f463b | deposit | 13,839,791 | 29 days agoSun, 19 Jul 2026 12:27:03 UTC | 0x0e3d…2a63 | IN | LendingRouter | $0.000 ETH | 0.00001006 | |
| 0xca2819…9d473f | deposit | 9,361,157 | 35 days agoTue, 14 Jul 2026 07:47:41 UTC | 0x0e3d…2a63 | IN | LendingRouter | $0.000 ETH | 0.00001162 | |
| 0x8a97bb…adc874 | registerReserve | 9,350,538 | 35 days agoTue, 14 Jul 2026 07:29:56 UTC | 0xd9ea…5bd1 | IN | LendingRouter | $0.000 ETH | 0.00000437 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xcc59e143…23bff9 | Transfer | 21,601,334 | 20 days agoTue, 28 Jul 2026 12:44:09 UTC | 0xf3f1…74f1 | OUT | 0x0000…0000 | 40.048 oUSDG | Own USDG (oUSDG) | |
| 0xcc59e143…23bff9 | Transfer | 21,601,334 | 20 days agoTue, 28 Jul 2026 12:44:09 UTC | 0xf400…fba4 | IN | 0xf3f1…74f1 | 40.048 oUSDG | Own USDG (oUSDG) | |
| 0x738fa743…6c57c4 | Transfer | 21,053,761 | 21 days agoMon, 27 Jul 2026 21:27:55 UTC | 0xf3f1…74f1 | OUT | 0x2467…57fc | 245.56 oUSDG | Own USDG (oUSDG) | |
| 0x738fa743…6c57c4 | Transfer | 21,053,761 | 21 days agoMon, 27 Jul 2026 21:27:55 UTC | 0x0000…0000 | IN | 0xf3f1…74f1 | 245.56 oUSDG | Own USDG (oUSDG) | |
| 0x738fa743…6c57c4 | Transfer | 21,053,761 | 21 days agoMon, 27 Jul 2026 21:27:55 UTC | 0xf3f1…74f1 | OUT | 0xada8…fbba | $246.35245.56 USDG | Global Dollar (USDG) | |
| 0x738fa743…6c57c4 | Transfer | 21,053,761 | 21 days agoMon, 27 Jul 2026 21:27:55 UTC | 0x133d…3ed6 | IN | 0xf3f1…74f1 | $246.35245.56 USDG | Global Dollar (USDG) | |
| 0x637c2b91…212c5d | Transfer | 20,963,926 | 21 days agoMon, 27 Jul 2026 18:57:51 UTC | 0xf3f1…74f1 | OUT | 0x2467…57fc | 129.28 oUSDG | Own USDG (oUSDG) | |
| 0x637c2b91…212c5d | Transfer | 20,963,926 | 21 days agoMon, 27 Jul 2026 18:57:51 UTC | 0x0000…0000 | IN | 0xf3f1…74f1 | 129.28 oUSDG | Own USDG (oUSDG) | |
| 0x637c2b91…212c5d | Transfer | 20,963,926 | 21 days agoMon, 27 Jul 2026 18:57:51 UTC | 0xf3f1…74f1 | OUT | 0xada8…fbba | $129.70129.28 USDG | Global Dollar (USDG) | |
| 0x637c2b91…212c5d | Transfer | 20,963,926 | 21 days agoMon, 27 Jul 2026 18:57:51 UTC | 0x133d…3ed6 | IN | 0xf3f1…74f1 | $129.70129.28 USDG | Global Dollar (USDG) | |
| 0xdc86c9b9…daff71 | Transfer | 20,959,903 | 21 days agoMon, 27 Jul 2026 18:51:08 UTC | 0xf3f1…74f1 | OUT | 0x2467…57fc | 163.47 oUSDG | Own USDG (oUSDG) | |
| 0xdc86c9b9…daff71 | Transfer | 20,959,903 | 21 days agoMon, 27 Jul 2026 18:51:08 UTC | 0x0000…0000 | IN | 0xf3f1…74f1 | 163.47 oUSDG | Own USDG (oUSDG) | |
| 0xdc86c9b9…daff71 | Transfer | 20,959,903 | 21 days agoMon, 27 Jul 2026 18:51:08 UTC | 0xf3f1…74f1 | OUT | 0xada8…fbba | $164.00163.47 USDG | Global Dollar (USDG) | |
| 0xdc86c9b9…daff71 | Transfer | 20,959,903 | 21 days agoMon, 27 Jul 2026 18:51:08 UTC | 0x133d…3ed6 | IN | 0xf3f1…74f1 | $164.00163.47 USDG | Global Dollar (USDG) | |
| 0x6ae9b049…a27562 | Transfer | 20,954,419 | 21 days agoMon, 27 Jul 2026 18:42:00 UTC | 0xf3f1…74f1 | OUT | 0x2467…57fc | 103.03 oUSDG | Own USDG (oUSDG) | |
| 0x6ae9b049…a27562 | Transfer | 20,954,419 | 21 days agoMon, 27 Jul 2026 18:42:00 UTC | 0x0000…0000 | IN | 0xf3f1…74f1 | 103.03 oUSDG | Own USDG (oUSDG) | |
| 0x6ae9b049…a27562 | Transfer | 20,954,419 | 21 days agoMon, 27 Jul 2026 18:42:00 UTC | 0xf3f1…74f1 | OUT | 0xada8…fbba | $103.36103.03 USDG | Global Dollar (USDG) | |
| 0x6ae9b049…a27562 | Transfer | 20,954,419 | 21 days agoMon, 27 Jul 2026 18:42:00 UTC | 0x133d…3ed6 | IN | 0xf3f1…74f1 | $103.36103.03 USDG | Global Dollar (USDG) | |
| 0x79e1f381…8c2fcf | Transfer | 20,092,810 | 22 days agoSun, 26 Jul 2026 18:39:22 UTC | 0xaebe…5b3d | IN | 0xf3f1…74f1 | 90 RVHOOD | Ravenhood (RVHOOD) | |
| 0x2942eb1a…416480 | Transfer | 19,846,238 | 22 days agoSun, 26 Jul 2026 11:47:38 UTC | 0xcaf7…5d11 | IN | 0xf3f1…74f1 | $0.001 DIH | ||
| 0xa336b43a…242980 | Transfer | 17,783,510 | 25 days agoFri, 24 Jul 2026 02:17:16 UTC | 0xf3f1…74f1 | OUT | 0x0000…0000 | 50 oUSDG | Own USDG (oUSDG) | |
| 0xa336b43a…242980 | Transfer | 17,783,510 | 25 days agoFri, 24 Jul 2026 02:17:16 UTC | 0xf400…fba4 | IN | 0xf3f1…74f1 | 50 oUSDG | Own USDG (oUSDG) | |
| 0xd2d02aff…28300a | Transfer | 17,525,940 | 25 days agoThu, 23 Jul 2026 19:06:40 UTC | 0x3d2b…6bfc | IN | 0xf3f1…74f1 | 1 USDG | Global Dollar (USDG) | |
| 0xa835ef9d…9af1cf | Transfer | 17,501,804 | 25 days agoThu, 23 Jul 2026 18:26:23 UTC | 0x3d2b…6bfc | IN | 0xf3f1…74f1 | 69 USDG | global dollar (USDG) | |
| 0x8b0caf6d…d81aad | Transfer | 17,392,937 | 25 days agoThu, 23 Jul 2026 15:24:41 UTC | 0xd2e4…b70c | IN | 0xf3f1…74f1 | 2 USDG | Global Dollar (USDG) |