Transaction Hash:
Block:
23815831 at Nov-17-2025 02:11:11 AM +UTC
Transaction Fee:
0.000008521070010525 ETH
$0.02
Gas Used:
130,805 Gas / 0.065143305 Gwei
Emitted Events:
| 912 |
GatewayProxy.0x617fdb0cb78f01551a192a3673208ec5eb09f20a90acf673c63a0dcb11745a7a( 0x617fdb0cb78f01551a192a3673208ec5eb09f20a90acf673c63a0dcb11745a7a, 0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539, 0xcbe4ebce104fd254858210091466bd3961e5190b59489d6d8069ca2349d0a455, 0000000000000000000000000000000000000000000000000000000000001638, 0000000000000000000000000000000000000000000000000000000000000001 )
|
Account State Difference:
| Address | Before | After | State Difference | ||
|---|---|---|---|---|---|
| 0x1F1819C3...a818D693E | (Snowbridge: AssetHub Parachain Relay) |
0.27940349721597919 Eth
Nonce: 3301
|
0.27965461898369129 Eth
Nonce: 3302
| 0.0002511217677121 | |
| 0x27ca963C...f407d68e7 | (Snowbridge: Gateway) | 0.210869520990758134 Eth | 0.210609878153035509 Eth | 0.000259642837722625 | |
| 0x82E8936b...6e9DEFF1C | 0.242336527176941511 Eth | 56.242336527176941511 Eth | 56 | ||
| 0xd803472c...191B846a8 | (Snowbridge: AssetHub Sovereign) | 1,443.350984967650075376 Eth | 1,387.350984967650075376 Eth | 56 | |
|
0xdadB0d80...24f783711
Miner
| (BuilderNet) | 166.882995870086332367 Eth | 166.882995870090387322 Eth | 0.000000000004054955 |
Execution Trace
GatewayProxy.df4ed829( )
0x8a887783e945233d51881e06835ec78a8b575ece.df4ed829( )0x4058be4f048f55f1e9c88da09738070c0a7f1593.2db72616( )-
0x1817874feab3ce053d0f40abc23870db35c2affc.a401662b( )
-
GatewayProxy.46cd2751( )0x8a887783e945233d51881e06835ec78a8b575ece.46cd2751( )0x5db326a97b95d81ae843c23be0e30e5ea23699f1.65529675( )Agent.invoke( executor=0xdaEE2A2De90043b83759d0aeEfd233a221A51e28, data=0x05B1137B00000000000000000000000082E8936B187D83FD6EB2B7DAB5B19556E9DEFF1C0000000000000000000000000000000000000000000000030927F74C9DE00000 ) => ( True, 0x )-
0xdaee2a2de90043b83759d0aeefd233a221a51e28.05b1137b( )
-
- ETH 0.000259642837722625
Snowbridge: AssetHub Parachain Relay.CALL( )
File 1 of 2: GatewayProxy
File 2 of 2: Agent
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: 2023 Snowfork <hello@snowfork.com>
pragma solidity 0.8.23;
import {ERC1967} from "./utils/ERC1967.sol";
import {Call} from "./utils/Call.sol";
import {IInitializable} from "./interfaces/IInitializable.sol";
contract GatewayProxy is IInitializable {
error Unauthorized();
error NativeCurrencyNotAccepted();
constructor(address implementation, bytes memory params) {
// Store the address of the implementation contract
ERC1967.store(implementation);
// Initialize storage by calling the implementation's `initialize(bytes)` function
// using `delegatecall`.
(bool success, bytes memory returndata) =
implementation.delegatecall(abi.encodeCall(IInitializable.initialize, params));
Call.verifyResult(success, returndata);
}
// Prevent fallback() from calling `IInitializable.initialize(bytes)` on the implementation contract
function initialize(bytes calldata) external pure {
revert Unauthorized();
}
fallback() external payable {
address implementation = ERC1967.load();
assembly {
calldatacopy(0, 0, calldatasize())
let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)
returndatacopy(0, 0, returndatasize())
switch result
case 0 { revert(0, returndatasize()) }
default { return(0, returndatasize()) }
}
}
// Prevent users from unwittingly sending ether to the gateway, as these funds
// would otherwise be lost forever.
receive() external payable {
revert NativeCurrencyNotAccepted();
}
}
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: 2023 Snowfork <hello@snowfork.com>
pragma solidity 0.8.23;
/// @title Minimal implementation of ERC1967 storage slot
library ERC1967 {
// bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)
bytes32 public constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
function load() internal view returns (address implementation) {
assembly {
implementation := sload(_IMPLEMENTATION_SLOT)
}
}
function store(address implementation) internal {
assembly {
sstore(_IMPLEMENTATION_SLOT, implementation)
}
}
}
// SPDX-License-Identifier: MIT
// SPDX-FileCopyrightText: 2023 OpenZeppelin
// SPDX-FileCopyrightText: 2023 Snowfork <hello@snowfork.com>
pragma solidity 0.8.23;
// Derived from OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
library Call {
function verifyResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert();
}
}
}
}
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: 2023 Snowfork <hello@snowfork.com>
pragma solidity 0.8.23;
/**
* @title Initialization of gateway logic contracts
*/
interface IInitializable {
function initialize(bytes calldata data) external;
}
File 2 of 2: Agent
// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: 2023 Snowfork <hello@snowfork.com>
pragma solidity 0.8.25;
/// @title An agent contract that acts on behalf of a consensus system on Polkadot
/// @dev Instances of this contract act as an agents for arbitrary consensus systems on Polkadot. These consensus systems
/// can include toplevel parachains as as well as nested consensus systems within a parachain.
contract Agent {
error Unauthorized();
/// @dev The unique ID for this agent, derived from the MultiLocation of the corresponding consensus system on Polkadot
bytes32 public immutable AGENT_ID;
/// @dev The gateway contract controlling this agent
address public immutable GATEWAY;
constructor(bytes32 agentID) {
AGENT_ID = agentID;
GATEWAY = msg.sender;
}
/// @dev Agents can receive ether permissionlessly.
/// This is important, as agents for top-level parachains also act as sovereign accounts from which message relayers
/// are rewarded.
receive() external payable {}
/// @dev Allow the gateway to invoke some code within the context of this agent
/// using `delegatecall`. Typically this code will be provided by `AgentExecutor.sol`.
function invoke(address executor, bytes calldata data) external returns (bool, bytes memory) {
if (msg.sender != GATEWAY) {
revert Unauthorized();
}
return executor.delegatecall(data);
}
}