Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 31 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Add Allowed Rout... | 20821364 | 530 days ago | IN | 0 ETH | 0.00106098 | ||||
| Set Remote Value... | 20635060 | 556 days ago | IN | 0.005 ETH | 0.0011119 | ||||
| Set Remote Value... | 20634099 | 557 days ago | IN | 0.005 ETH | 0.00079574 | ||||
| Set Remote Value... | 20634099 | 557 days ago | IN | 0.005 ETH | 0.00071727 | ||||
| Set Remote Value... | 20634086 | 557 days ago | IN | 0.005 ETH | 0.00030474 | ||||
| Set Remote Value... | 20634032 | 557 days ago | IN | 0.005 ETH | 0.00060127 | ||||
| Set Remote Value... | 20633999 | 557 days ago | IN | 0.005 ETH | 0.00057161 | ||||
| Set Remote Value... | 20633993 | 557 days ago | IN | 0.005 ETH | 0.00048105 | ||||
| Set Remote Value... | 20633968 | 557 days ago | IN | 0.005 ETH | 0.00016729 | ||||
| Set Remote Value... | 20633964 | 557 days ago | IN | 0.005 ETH | 0.00032644 | ||||
| Set Remote Value... | 20633918 | 557 days ago | IN | 0.001 ETH | 0.00033586 | ||||
| Set Remote Value... | 20633918 | 557 days ago | IN | 0.001 ETH | 0.00028528 | ||||
| Set Remote Value... | 20633918 | 557 days ago | IN | 0.001 ETH | 0.00042085 | ||||
| Set Remote Value... | 20633838 | 557 days ago | IN | 0.001 ETH | 0.00024895 | ||||
| Set Remote Value... | 20633791 | 557 days ago | IN | 0.001 ETH | 0.00035504 | ||||
| Set Remote Value... | 20633791 | 557 days ago | IN | 0.001 ETH | 0.00030364 | ||||
| Set Remote Value... | 20633790 | 557 days ago | IN | 0.001 ETH | 0.00023658 | ||||
| Set Remote Value... | 20633790 | 557 days ago | IN | 0.001 ETH | 0.00036906 | ||||
| Set Remote Value... | 20627567 | 558 days ago | IN | 0.001 ETH | 0.00045293 | ||||
| Set Remote Value... | 20627561 | 558 days ago | IN | 0.001 ETH | 0.00042294 | ||||
| Set Remote Value... | 20627433 | 558 days ago | IN | 0.001 ETH | 0.00019343 | ||||
| Set Remote Value... | 20627401 | 558 days ago | IN | 0.001 ETH | 0.00038022 | ||||
| Set Remote Value... | 20627310 | 558 days ago | IN | 0.001 ETH | 0.00051063 | ||||
| Set Remote Value... | 20627184 | 558 days ago | IN | 0.001 ETH | 0.00084428 | ||||
| Set Remote Value... | 20627085 | 558 days ago | IN | 0.001 ETH | 0.00038243 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Route | 20635060 | 556 days ago | 0.005 ETH | ||||
| Route | 20634099 | 557 days ago | 0.005 ETH | ||||
| Route | 20634099 | 557 days ago | 0.005 ETH | ||||
| Route | 20634086 | 557 days ago | 0.005 ETH | ||||
| Route | 20634032 | 557 days ago | 0.005 ETH | ||||
| Route | 20633999 | 557 days ago | 0.005 ETH | ||||
| Route | 20633993 | 557 days ago | 0.005 ETH | ||||
| Route | 20633968 | 557 days ago | 0.005 ETH | ||||
| Route | 20633964 | 557 days ago | 0.005 ETH | ||||
| Route | 20633918 | 557 days ago | 0.001 ETH | ||||
| Route | 20633918 | 557 days ago | 0.001 ETH | ||||
| Route | 20633918 | 557 days ago | 0.001 ETH | ||||
| Route | 20633838 | 557 days ago | 0.001 ETH | ||||
| Route | 20633791 | 557 days ago | 0.001 ETH | ||||
| Route | 20633791 | 557 days ago | 0.001 ETH | ||||
| Route | 20633790 | 557 days ago | 0.001 ETH | ||||
| Route | 20633790 | 557 days ago | 0.001 ETH | ||||
| Route | 20627567 | 558 days ago | 0.001 ETH | ||||
| Route | 20627561 | 558 days ago | 0.001 ETH | ||||
| Route | 20627433 | 558 days ago | 0.001 ETH | ||||
| Route | 20627401 | 558 days ago | 0.001 ETH | ||||
| Route | 20627310 | 558 days ago | 0.001 ETH | ||||
| Route | 20627184 | 558 days ago | 0.001 ETH | ||||
| Route | 20627085 | 558 days ago | 0.001 ETH | ||||
| Route | 20626893 | 558 days ago | 0.001 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
GlacisClientSample
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.18;
import {GlacisClientOwnable} from "../../../contracts/client/GlacisClientOwnable.sol";
import {GlacisCommons} from "../../../contracts/commons/GlacisCommons.sol";
contract GlacisClientSample is GlacisClientOwnable {
uint256 public value;
constructor(
address glacisRouter_,
address owner_
) GlacisClientOwnable(glacisRouter_, 1, owner_) {}
function setRemoteValue__execute(
uint256 toChainId,
bytes32 to,
address adapter,
bytes calldata payload
) external payable returns (bytes32) {
return _routeSingle(toChainId, to, payload, adapter, msg.sender, msg.value);
}
function setRemoteValue__redundancy(
uint256 toChainId,
bytes32 to,
address[] memory adapters,
CrossChainGas[] memory fees,
bytes calldata payload
) external payable returns (bytes32) {
return
_routeRedundant(
toChainId,
to,
payload,
adapters,
fees,
msg.sender,
msg.value
);
}
function setRemoteValue__retriable(
uint256 chainId,
bytes32 to,
address[] memory adapters,
CrossChainGas[] memory fees,
bytes memory payload
) external payable returns (bytes32,uint256) {
return
_route(
chainId,
to,
payload,
adapters,
fees,
msg.sender,
true,
msg.value
);
}
function setRemoteValue(
uint256 chainId,
bytes32 to,
bytes memory payload,
address[] memory adapters,
CrossChainGas[] memory fees,
address refundAddress,
bool retryable,
uint256 gasPayment
) external payable returns (bytes32,uint256 ) {
return
_route(
chainId,
to,
payload,
adapters,
fees,
refundAddress,
retryable,
gasPayment
);
}
function setRemoteValue__retry(
uint256 chainId,
bytes32 to,
address[] memory adapters,
CrossChainGas[] memory fees,
bytes memory payload,
bytes32 messageId,
uint256 nonce
) external payable returns (bytes32) {
return
_retryRoute(
chainId,
to,
payload,
adapters,
fees,
msg.sender,
messageId,
nonce,
msg.value
);
}
event ValueChanged(uint256 indexed value);
function _receiveMessage(
address[] memory, // fromGmpId,
uint256, // fromChainId,
bytes32, // fromAddress,
bytes memory payload
) internal override {
// NOTE: changed += to test for redundant messages
if (payload.length > 0) (value) += abi.decode(payload, (uint256));
}
// Setup of custom quorum (for testing purposes)
uint256 internal customQuorum = 1;
function setQuorum(uint256 q) external onlyOwner {
customQuorum = q;
}
function getQuorum(
GlacisCommons.GlacisData memory,
bytes memory,
uint256
) public view override returns (uint256) {
return customQuorum;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.18;
import {GlacisCommons} from "../commons/GlacisCommons.sol";
import {IGlacisAccessControlClient} from "../interfaces/IGlacisAccessControlClient.sol";
/// @title Glacis Access Control Client
/// @dev This contract encapsulates Glacis Access Control client logic. Contracts inheriting this will have access to
/// Glacis Access control features
abstract contract GlacisAccessControlClient is GlacisCommons, IGlacisAccessControlClient {
mapping(uint256 => mapping(bytes32 => mapping(address => bool))) public allowedRoutes;
bytes32 constant internal WILD_BYTES = bytes32(uint256(WILDCARD));
address constant internal WILD_ADDR = address(WILDCARD);
/// @notice Adds an allowed route for this client
/// @param route Route to be added
function _addAllowedRoute(
GlacisRoute memory route
) internal {
allowedRoutes[route.fromChainId][route.fromAddress][route.fromAdapter] = true;
}
/// @notice Removes an allowed route for this client
/// @param route Allowed route to be removed
function _removeAllowedRoute(
GlacisRoute calldata route
) internal {
allowedRoutes[route.fromChainId][route.fromAddress][route.fromAdapter] = false;
}
/// @notice Queries if a route from path GMP+Chain+Address is allowed for this client
/// @param route_ Incoming message route
/// @return True if route is allowed, false otherwise
function isAllowedRoute(
GlacisRoute memory route_,
bytes memory // payload
) public view override returns (bool) {
return
allowedRoutes[route_.fromChainId][route_.fromAddress][route_.fromAdapter] ||
allowedRoutes[WILDCARD][route_.fromAddress][route_.fromAdapter] ||
allowedRoutes[WILDCARD][WILD_BYTES][route_.fromAdapter] ||
allowedRoutes[route_.fromChainId][WILD_BYTES][route_.fromAdapter] ||
(uint160(route_.fromAdapter) <= GLACIS_RESERVED_IDS && (
allowedRoutes[route_.fromChainId][route_.fromAddress][WILD_ADDR] ||
allowedRoutes[route_.fromChainId][WILD_BYTES][WILD_ADDR] ||
allowedRoutes[WILDCARD][WILD_BYTES][WILD_ADDR]
));
}
}// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.18;
import {IGlacisRouter} from "../interfaces/IGlacisRouter.sol";
import {IGlacisClient} from "../interfaces/IGlacisClient.sol";
import {GlacisAccessControlClient} from "../client/GlacisAccessControlClient.sol";
error GlacisClient__CanOnlyBeCalledByRouter();
error GlacisClient__InvalidRouterAddress();
/// @title Glacis Client
/// @dev This contract encapsulates Glacis client side logic, contracts inheriting this will have access to all
/// Glacis features
abstract contract GlacisClient is GlacisAccessControlClient, IGlacisClient {
address public immutable GLACIS_ROUTER;
event GlacisClient__MessageRouted(
bytes32 indexed messageId,
uint256 toChainId,
bytes32 to
);
event GlacisClient__MessageArrived(
address[] fromAdapters,
uint256 fromChainId,
bytes32 fromAddress
);
/// @param _glacisRouter This chain's deployment of the GlacisRouter
/// @param _quorum The initial default quorum for this client. If dynamic quorum is to be implemented (depending on payload)
/// this value can be ignored and set to 0
constructor(
address _glacisRouter,
uint256 _quorum
) GlacisAccessControlClient() IGlacisClient(_quorum) {
if (_glacisRouter == address(0))
revert GlacisClient__InvalidRouterAddress();
GLACIS_ROUTER = _glacisRouter;
}
/// @notice Routes the payload to the specific address on destination chain through GlacisRouter using a single specified GMP
/// @param chainId Destination chain (Glacis chain ID)
/// @param to Destination address on remote chain
/// @param payload Payload to be routed
/// @param adapter Glacis ID of the GMP to be used for the routing
/// @param refundAddress Address to refund excess gas payment
/// @param gasPayment Amount of gas to cover source and destination gas fees (excess will be refunded)
function _routeSingle(
uint256 chainId,
bytes32 to,
bytes memory payload,
address adapter,
address refundAddress,
uint256 gasPayment
) internal returns (bytes32) {
address[] memory adapters = new address[](1);
adapters[0] = adapter;
CrossChainGas[] memory fees = new CrossChainGas[](1);
fees[0] = CrossChainGas({
gasLimit: 0,
nativeCurrencyValue: uint128(gasPayment)
});
(bytes32 messageId,) = IGlacisRouter(GLACIS_ROUTER).route{
value: gasPayment
}(chainId, to, payload, adapters, fees, refundAddress, false);
emit GlacisClient__MessageRouted(messageId, chainId, to);
return messageId;
}
/// @notice Routes the payload to the specific address on destination chain through GlacisRouter using
/// specified GMPs.
/// @param chainId Destination chain (Glacis chain ID)
/// @param to Destination address on remote chain
/// @param payload Payload to be routed
/// @param adapters The adapters to use for redundant routing
/// @param fees Payment for each GMP to cover source and destination gas fees (excess will be refunded)
/// @param refundAddress Address to refund excess gas payment
/// @param gasPayment Amount of gas to cover source and destination gas fees (excess will be refunded)
function _routeRedundant(
uint256 chainId,
bytes32 to,
bytes memory payload,
address[] memory adapters,
CrossChainGas[] memory fees,
address refundAddress,
uint256 gasPayment
) internal returns (bytes32) {
(bytes32 messageId,) = IGlacisRouter(GLACIS_ROUTER).route{
value: gasPayment
}(chainId, to, payload, adapters, fees, refundAddress, false);
emit GlacisClient__MessageRouted(messageId, chainId, to);
return messageId;
}
/// @notice Routes the payload to the specific address on destination chain through GlacisRouter using GMPs
/// specified in gmps array
/// @param chainId Destination chain (Glacis chain ID)
/// @param to Destination address on remote chain
/// @param payload Payload to be routed
/// @param adapters An array of custom adapters to be used for the routing
/// @param fees Payment for each GMP to cover source and destination gas fees (excess will be refunded)
/// @param refundAddress Address to refund excess gas payment
/// @param retryable True to enable retry feature for this message
/// @param gasPayment Amount of gas to cover source and destination gas fees (excess will be refunded)
function _route(
uint256 chainId,
bytes32 to,
bytes memory payload,
address[] memory adapters,
CrossChainGas[] memory fees,
address refundAddress,
bool retryable,
uint256 gasPayment
) internal returns (bytes32,uint256) {
(bytes32 messageId,uint256 nonce) = IGlacisRouter(GLACIS_ROUTER).route{
value: gasPayment
}(chainId, to, payload, adapters, fees, refundAddress, retryable);
emit GlacisClient__MessageRouted(messageId, chainId, to);
return (messageId,nonce);
}
/// @notice Routes the payload to the specific address on destination chain through GlacisRouter using GMPs
/// specified in gmps array
/// @param chainId Destination chain (Glacis chain ID)
/// @param to Destination address on remote chain
/// @param payload Payload to be routed
/// @param adapters An array of adapters to be used for the routing
/// @param fees Payment for each GMP to cover source and destination gas fees (excess will be refunded)
/// @param refundAddress Address to refund excess gas payment
/// @param messageId The message ID of the message to retry
/// @param nonce The nonce emitted by the original sent message
/// @param gasPayment Amount of gas to cover source and destination gas fees (excess will be refunded)
function _retryRoute(
uint256 chainId,
bytes32 to,
bytes memory payload,
address[] memory adapters,
CrossChainGas[] memory fees,
address refundAddress,
bytes32 messageId,
uint256 nonce,
uint256 gasPayment
) internal returns (bytes32) {
IGlacisRouter(GLACIS_ROUTER).routeRetry{value: gasPayment}(
chainId,
to,
payload,
adapters,
fees,
refundAddress,
messageId,
nonce
);
emit GlacisClient__MessageRouted(messageId, chainId, to);
return messageId;
}
/// @notice Receives message from GMP(s) through GlacisRouter
/// @param fromAdapters addresses of the adapters sent this message (that reached quorum requirements)
/// @param fromChainId Source chain (Glacis chain ID)
/// @param fromAddress Source address on source chain
/// @param payload Routed payload
function receiveMessage(
address[] memory fromAdapters,
uint256 fromChainId,
bytes32 fromAddress,
bytes memory payload
) external virtual override {
if (msg.sender != GLACIS_ROUTER)
revert GlacisClient__CanOnlyBeCalledByRouter();
_receiveMessage(fromAdapters, fromChainId, fromAddress, payload);
emit GlacisClient__MessageArrived(fromAdapters, fromChainId, fromAddress);
}
/// @notice Receives message from GMP(s) through GlacisRouter
/// @param fromAdapters Adapter addresses
/// @param fromChainId Source chain (Glacis chain ID)
/// @param fromAddress Source address on source chain
/// @param payload Routed payload
function _receiveMessage(
address[] memory fromAdapters,
uint256 fromChainId,
bytes32 fromAddress,
bytes memory payload
) internal virtual {}
}// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.18;
import {GlacisClient} from "./GlacisClient.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {GlacisCommons} from "../commons/GlacisCommons.sol";
/// @title Glacis Ownable Client
/// @dev This contract encapsulates Glacis client side logic, contracts inheriting this will have access to all
/// Glacis features
/// @notice This contract is ownable
abstract contract GlacisClientOwnable is GlacisClient, Ownable {
/// @param _glacisRouter This chain's deployment of the GlacisRouter
/// @param _quorum The default quorum that you would like. If you implement dynamic quorum, this value can be ignored and
/// set to 0
/// @param _owner The owner of this contract
constructor(
address _glacisRouter,
uint256 _quorum,
address _owner
) GlacisClient(_glacisRouter, _quorum) {
_transferOwnership(_owner);
}
/// @notice Add an allowed route for this client
/// @param allowedRoute Route to be added
function addAllowedRoute(
GlacisCommons.GlacisRoute memory allowedRoute
) external onlyOwner {
_addAllowedRoute(allowedRoute);
}
/// @notice Removes an allowed route for this client
/// @param route Allowed route to be removed
function removeAllowedRoute(
GlacisCommons.GlacisRoute calldata route
) external onlyOwner {
_removeAllowedRoute(route);
}
}// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.18;
/// @title Glacis Commons
/// @dev Contract for utility functions and structures common to Glacis Client and Infrastructure
contract GlacisCommons {
struct GlacisData {
bytes32 messageId;
uint256 nonce;
bytes32 originalFrom;
bytes32 originalTo;
}
struct GlacisTokenData {
address glacisToken;
uint256 glacisTokenAmount;
}
struct GlacisRoute {
uint256 fromChainId; // WILDCARD means any chain
bytes32 fromAddress; // WILDCARD means any address
address fromAdapter; // WILDCARD means any GMP, can also hold address
}
struct CrossChainGas {
uint128 gasLimit;
uint128 nativeCurrencyValue;
}
uint160 constant public WILDCARD = type(uint160).max;
uint256 constant public GLACIS_RESERVED_IDS = 248;
}// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.18;
import {GlacisCommons} from "../commons/GlacisCommons.sol";
/// @title IGlacisAccessControlClient
/// @notice An interface that determines Glacis' required access control
interface IGlacisAccessControlClient {
/// @notice Adds an allowed route for this client
/// @notice Queries if a route from path GMP+Chain+Address is allowed for this client
/// @param route The origin route for the message
/// @param payload The payload of a message
/// @return True if route is allowed, false otherwise
function isAllowedRoute(
GlacisCommons.GlacisRoute memory route,
bytes memory payload
) external view returns (bool);
}// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.18;
import {GlacisCommons} from "../commons/GlacisCommons.sol";
import {IGlacisAccessControlClient} from "../interfaces/IGlacisAccessControlClient.sol";
/// @title IGlacisClient
/// @notice An interface that defines the GMP modules (adapters) that the GlacisRouter interacts with.
abstract contract IGlacisClient is IGlacisAccessControlClient {
uint256 private immutable DEFAULT_QUORUM;
/// @param _defaultQuorum The default quorum that you would like. If you implement dynamic quorum, this value can be ignored
/// and set to 0
constructor(uint256 _defaultQuorum) {
DEFAULT_QUORUM = _defaultQuorum;
}
/// @notice Receives message from GMP(s) through GlacisRouter
/// @param fromAdapters Used adapters that sent this message (that reached quorum requirements)
/// @param fromChainId Source chain (Glacis chain ID)
/// @param fromAddress Source address on source chain
/// @param payload Routed payload
function receiveMessage(
address[] calldata fromAdapters,
uint256 fromChainId,
bytes32 fromAddress,
bytes calldata payload
) external virtual;
/// @notice The quorum of messages that the contract expects with a specific message
function getQuorum(
GlacisCommons.GlacisData memory, // glacis data
bytes memory, // payload
uint256 // unique messages received so far (for dynamic quorum, usually unused)
) public view virtual returns (uint256) {
return DEFAULT_QUORUM;
}
}// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.18;
import {GlacisCommons} from "../commons/GlacisCommons.sol";
/// @title IGlacisRouterEvents
/// @notice An interface that defines a GlacisRouter's events
abstract contract IGlacisRouterEvents is GlacisCommons
{
event GlacisAbstractRouter__MessageIdCreated(
bytes32 indexed messageId,
bytes32 indexed sender,
uint256 nonce
);
event GlacisAbstractRouter__AdapterRegistered(
uint8 indexed gmpId,
address indexed adapterAddress,
address indexed previousAddress
);
event GlacisAbstractRouter__AdapterUnregistered(
uint8 indexed gmpId,
address indexed adapterAddress
);
event GlacisRouter__ReceivedMessage(
bytes32 indexed messageId,
bytes32 indexed from,
uint256 indexed fromChainId,
address adapter,
bytes32 to
);
event GlacisRouter__ExecutedMessage(
bytes32 indexed messageId,
bytes32 indexed from,
uint256 indexed fromChainId,
address adapter,
bytes32 to
);
event GlacisRouter__MessageDispatched(
bytes32 indexed messageId,
bytes32 indexed from,
uint256 indexed toChainId,
bytes32 to,
bytes data,
address[] adapters,
CrossChainGas[] fees,
address refundAddress,
bool retryable
);
event GlacisRouter__MessageRetried(
bytes32 indexed messageId,
bytes32 indexed from,
uint256 indexed toChainId,
bytes32 to,
bytes data,
address[] adapters,
CrossChainGas[] fees,
address refundAddress
);
}
/// @title IGlacisRouter
/// @notice An interface that defines an interface that sends and receives messages across chains
interface IGlacisRouter {
/// @notice Routes the payload to the specific address on the destination chain
/// using specified adapters
/// @param chainId Destination chain (EIP-155)
/// @param to Destination address on remote chain
/// @param payload Payload to be routed
/// @param adapters An array of adapters to be used for the routing (addresses 0x01-0xF8 for Glacis adapters
/// or specific addresses for custom adapters)
/// @param fees Array of fees to be sent to each GMP & custom adapter for routing (must be same length as gmps)
/// @param refundAddress An address for native currency to be sent to that are greater than fees charged. If it is a
/// contract it needs to support receive function, reverted otherwise
/// @param retryable True if this message could pottentially be retried
/// @return A tuple with a bytes32 messageId and a uint256 nonce
function route(
uint256 chainId,
bytes32 to,
bytes memory payload,
address[] memory adapters,
GlacisCommons.CrossChainGas[] memory fees,
address refundAddress,
bool retryable
) external payable returns (bytes32, uint256);
/// @notice Retries routing the payload to the specific address on destination chain
/// using specified GMPs and quorum
/// @param chainId Destination chain (EIP-155)
/// @param to Destination address on remote chain
/// @param payload Payload to be routed
/// @param adapters An array of adapters to be used for the routing (addresses 0x01-0xF8 for Glacis adapters
/// or specific addresses for custom adapters)
/// @param fees Array of fees to be sent to each GMP & custom adapter for routing (must be same length as gmps)
/// @param refundAddress An address for native currency to be sent to that are greater than fees charged. If it is a
/// contract it needs to support receive function, tx will revert otherwise
/// @param messageId The messageId to retry
/// @param nonce Unique value for this message routing
/// @return A tuple with a bytes32 messageId and a uint256 nonce
function routeRetry(
uint256 chainId,
bytes32 to,
bytes memory payload,
address[] memory adapters,
GlacisCommons.CrossChainGas[] memory fees,
address refundAddress,
bytes32 messageId,
uint256 nonce
) external payable returns (bytes32, uint256);
/// @notice Receives a cross chain message from an IGlacisAdapter.
/// @param fromChainId Source chain (EIP-155)
/// @param glacisPayload Received payload with embedded GlacisData
function receiveMessage(
uint256 fromChainId,
bytes memory glacisPayload
) external;
}// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.18;
import {GlacisClientOwnable} from "../../../contracts/client/GlacisClientOwnable.sol";
import {GlacisCommons} from "../../../contracts/commons/GlacisCommons.sol";
contract GlacisClientTextSample is GlacisClientOwnable {
string public value;
constructor(
address glacisRouter_,
address owner_
) GlacisClientOwnable(glacisRouter_, 0, owner_) {}
function setRemoteValue__execute(
uint256 toChainId,
bytes32 to,
address adapter,
bytes calldata payload
) external payable returns (bytes32) {
return _routeSingle(toChainId, to, payload, adapter, msg.sender, msg.value);
}
function setRemoteValue__redundancy(
uint256 toChainId,
bytes32 to,
address[] memory adapters,
CrossChainGas[] memory fees,
bytes calldata payload
) external payable returns (bytes32) {
return
_routeRedundant(
toChainId,
to,
payload,
adapters,
fees,
msg.sender,
msg.value
);
}
function setRemoteValue__retriable(
uint256 chainId,
bytes32 to,
address[] memory adapters,
CrossChainGas[] memory fees,
bytes memory payload
) external payable returns (bytes32,uint256) {
return
_route(
chainId,
to,
payload,
adapters,
fees,
msg.sender,
true,
msg.value
);
}
function setRemoteValue(
uint256 chainId,
bytes32 to,
bytes memory payload,
address[] memory adapters,
CrossChainGas[] memory fees,
address refundAddress,
bool retryable,
uint256 gasPayment
) external payable returns (bytes32,uint256) {
return
_route(
chainId,
to,
payload,
adapters,
fees,
refundAddress,
retryable,
gasPayment
);
}
function setRemoteValue__retry(
uint256 chainId,
bytes32 to,
address[] memory adapters,
CrossChainGas[] memory fees,
bytes memory payload,
bytes32 messageId,
uint256 nonce
) external payable returns (bytes32) {
return
_retryRoute(
chainId,
to,
payload,
adapters,
fees,
msg.sender,
messageId,
nonce,
msg.value
);
}
function _receiveMessage(
address[] memory, // fromGmpId,
uint256, // fromChainId,
bytes32, // fromAddress,
bytes memory payload
) internal override {
(value) = abi.decode(payload, (string));
}
// Setup of custom quorum (for testing purposes)
uint256 internal customQuorum = 1;
function setQuorum(uint256 q) external onlyOwner {
customQuorum = q;
}
function getQuorum(
GlacisCommons.GlacisData memory,
bytes memory,
uint256
) public view override returns (uint256) {
return customQuorum;
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"viaIR": false,
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"glacisRouter_","type":"address"},{"internalType":"address","name":"owner_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"GlacisClient__CanOnlyBeCalledByRouter","type":"error"},{"inputs":[],"name":"GlacisClient__InvalidRouterAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"fromAdapters","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"fromChainId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"fromAddress","type":"bytes32"}],"name":"GlacisClient__MessageArrived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"messageId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"toChainId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"to","type":"bytes32"}],"name":"GlacisClient__MessageRouted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"}],"name":"ValueChanged","type":"event"},{"inputs":[],"name":"GLACIS_RESERVED_IDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GLACIS_ROUTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WILDCARD","outputs":[{"internalType":"uint160","name":"","type":"uint160"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"fromChainId","type":"uint256"},{"internalType":"bytes32","name":"fromAddress","type":"bytes32"},{"internalType":"address","name":"fromAdapter","type":"address"}],"internalType":"struct GlacisCommons.GlacisRoute","name":"allowedRoute","type":"tuple"}],"name":"addAllowedRoute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"allowedRoutes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes32","name":"originalFrom","type":"bytes32"},{"internalType":"bytes32","name":"originalTo","type":"bytes32"}],"internalType":"struct GlacisCommons.GlacisData","name":"","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"getQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"fromChainId","type":"uint256"},{"internalType":"bytes32","name":"fromAddress","type":"bytes32"},{"internalType":"address","name":"fromAdapter","type":"address"}],"internalType":"struct GlacisCommons.GlacisRoute","name":"route_","type":"tuple"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"isAllowedRoute","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"fromAdapters","type":"address[]"},{"internalType":"uint256","name":"fromChainId","type":"uint256"},{"internalType":"bytes32","name":"fromAddress","type":"bytes32"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"receiveMessage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"fromChainId","type":"uint256"},{"internalType":"bytes32","name":"fromAddress","type":"bytes32"},{"internalType":"address","name":"fromAdapter","type":"address"}],"internalType":"struct GlacisCommons.GlacisRoute","name":"route","type":"tuple"}],"name":"removeAllowedRoute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"q","type":"uint256"}],"name":"setQuorum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"address[]","name":"adapters","type":"address[]"},{"components":[{"internalType":"uint128","name":"gasLimit","type":"uint128"},{"internalType":"uint128","name":"nativeCurrencyValue","type":"uint128"}],"internalType":"struct GlacisCommons.CrossChainGas[]","name":"fees","type":"tuple[]"},{"internalType":"address","name":"refundAddress","type":"address"},{"internalType":"bool","name":"retryable","type":"bool"},{"internalType":"uint256","name":"gasPayment","type":"uint256"}],"name":"setRemoteValue","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"toChainId","type":"uint256"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"address","name":"adapter","type":"address"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"setRemoteValue__execute","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"toChainId","type":"uint256"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"address[]","name":"adapters","type":"address[]"},{"components":[{"internalType":"uint128","name":"gasLimit","type":"uint128"},{"internalType":"uint128","name":"nativeCurrencyValue","type":"uint128"}],"internalType":"struct GlacisCommons.CrossChainGas[]","name":"fees","type":"tuple[]"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"setRemoteValue__redundancy","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"address[]","name":"adapters","type":"address[]"},{"components":[{"internalType":"uint128","name":"gasLimit","type":"uint128"},{"internalType":"uint128","name":"nativeCurrencyValue","type":"uint128"}],"internalType":"struct GlacisCommons.CrossChainGas[]","name":"fees","type":"tuple[]"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"setRemoteValue__retriable","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"bytes32","name":"to","type":"bytes32"},{"internalType":"address[]","name":"adapters","type":"address[]"},{"components":[{"internalType":"uint128","name":"gasLimit","type":"uint128"},{"internalType":"uint128","name":"nativeCurrencyValue","type":"uint128"}],"internalType":"struct GlacisCommons.CrossChainGas[]","name":"fees","type":"tuple[]"},{"internalType":"bytes","name":"payload","type":"bytes"},{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"setRemoteValue__retry","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"value","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60c060405260016003553480156200001657600080fd5b50604051620019fe380380620019fe83398101604081905262000039916200010a565b6001608081905282908282826001600160a01b0382166200006d57604051630f6d87b160e31b815260040160405180910390fd5b506001600160a01b031660a05262000085336200009b565b62000090816200009b565b505050505062000142565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80516001600160a01b03811681146200010557600080fd5b919050565b600080604083850312156200011e57600080fd5b6200012983620000ed565b91506200013960208401620000ed565b90509250929050565b60805160a0516118766200018860003960008181610247015281816106740152818161085301528181610a0e01528181610ae60152610ca30152600050506118766000f3fe6080604052600436106101145760003560e01c8063715018a6116100a0578063c1ba4e5911610064578063c1ba4e59146102fc578063d59f82231461031c578063f2fde38b14610341578063f35419b714610361578063fd6bc7231461038157600080fd5b8063715018a6146102815780638da5cb5b1461029657806395fa2979146102b45780639cb48cc6146102c9578063b2af006d146102dc57600080fd5b80633fa4f245116100e75780633fa4f245146101d757806350f19183146101ed5780635c88831114610200578063674510e21461021357806369ee26041461023557600080fd5b806314b131a8146101195780632c5ca4501461014657806330df852014610196578063319f186f146101b6575b600080fd5b61012c610127366004611013565b61039c565b604080519283526020830191909152015b60405180910390f35b34801561015257600080fd5b506101866101613660046110d9565b6000602081815293815260408082208552928152828120909352825290205460ff1681565b604051901515815260200161013d565b3480156101a257600080fd5b506101866101b1366004611170565b6103c0565b6101c96101c4366004611206565b6105d6565b60405190815260200161013d565b3480156101e357600080fd5b506101c960025481565b61012c6101fb36600461126d565b610628565b6101c961020e366004611308565b61064a565b34801561021f57600080fd5b5061023361022e3660046113b6565b610669565b005b34801561024157600080fd5b506102697f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161013d565b34801561028d57600080fd5b506102336106ff565b3480156102a257600080fd5b506001546001600160a01b0316610269565b3480156102c057600080fd5b506101c960f881565b6101c96102d736600461142c565b610713565b3480156102e857600080fd5b506102336102f73660046114cd565b610767565b34801561030857600080fd5b506102336103173660046114e5565b61077b565b34801561032857600080fd5b506101c96103373660046114fe565b6003549392505050565b34801561034d57600080fd5b5061023361035c3660046115a2565b610788565b34801561036d57600080fd5b5061023361037c3660046115bd565b610803565b34801561038d57600080fd5b506102696001600160a01b0381565b6000806103af8a8a8a8a8a8a8a8a61084b565b915091509850989650505050505050565b81516000908152602081815260408083208286015184528252808320818601516001600160a01b0316845290915281205460ff168061044c57506001600160a01b03600081815260208181528581015182527f50c7a3d1a23c7ff4a61d37c3f2c4aeb36cf60b43ee893723db201d3eb941cbad81526040808320878201519094168352929052205460ff165b806104b957506001600160a01b0360008181527f50c7a3d1a23c7ff4a61d37c3f2c4aeb36cf60b43ee893723db201d3eb941cbad602090815260408681015190931682527f6cf54fdcbe31578a067a9e0709c8e2e46a8619e4f029b9b130a04d0233b32bec9052205460ff165b806104f4575082516000908152602081815260408083206001600160a01b0380855290835281842082880151909116845290915290205460ff165b806105cd575060f883604001516001600160a01b0316111580156105cd5750825160009081526020818152604080832082870151845282528083206001600160a01b03845290915290205460ff1680610572575082516000908152602081815260408083206001600160a01b038452825280832090915290205460ff165b806105cd57506001600160a01b036000527f6cf54fdcbe31578a067a9e0709c8e2e46a8619e4f029b9b130a04d0233b32bec6020527f1370ba6b5068d687088888143148fa917c0117cd515113df0851536cad3e962c5460ff165b90505b92915050565b600061061e868685858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250339150349050610932565b9695505050505050565b60008061063c87878588883360013461084b565b915091509550959350505050565b600061065d888886898933898934610ae2565b98975050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106b257604051631c183e6760e21b815260040160405180910390fd5b6106be84848484610bba565b7f669134fd9bd8c3ff44cb489cd90088a9f947225586a6090d168d729622927bce8484846040516106f19392919061161d565b60405180910390a150505050565b610707610bf2565b6107116000610c4c565b565b600061075c878785858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b92508a915033905034610c9e565b979650505050505050565b61076f610bf2565b61077881610d76565b50565b610783610bf2565b600355565b610790610bf2565b6001600160a01b0381166107fa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61077881610c4c565b61080b610bf2565b6107788180516000908152602081815260408083208285015184528252808320938101516001600160a01b0316835292905220805460ff19166001179055565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636973e66f868e8e8e8e8e8e8e6040518963ffffffff1660e01b81526004016108aa97969594939291906116d0565b604080518083038185885af11580156108c7573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906108ec919061173a565b91509150816000805160206118218339815191528d8d604051610919929190918252602082015260400190565b60405180910390a2909b909a5098505050505050505050565b60408051600180825281830190925260009182919060208083019080368337019050509050848160008151811061096b5761096b61175e565b6001600160a01b039290921660209283029190910190910152604080516001808252818301909252600091816020015b604080518082019091526000808252602082015281526020019060019003908161099b579050509050604051806040016040528060006001600160801b03168152602001856001600160801b0316815250816000815181106109ff576109ff61175e565b602002602001018190525060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636973e66f868c8c8c88888d60006040518963ffffffff1660e01b8152600401610a6697969594939291906116d0565b604080518083038185885af1158015610a83573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610aa8919061173a565b50604080518c8152602081018c90529192508291600080516020611821833981519152910160405180910390a29998505050505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e3878e73838c8c8c8c8c8c8c8c6040518a63ffffffff1660e01b8152600401610b3f989796959493929190611774565b604080518083038185885af1158015610b5c573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610b81919061173a565b5050604080518b8152602081018b90528591600080516020611821833981519152910160405180910390a2509198975050505050505050565b805115610bec5780806020019051810190610bd591906117e6565b60026000828254610be691906117ff565b90915550505b50505050565b6001546001600160a01b031633146107115760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107f1565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636973e66f848b8b8b8b8b8b60006040518963ffffffff1660e01b8152600401610cfb97969594939291906116d0565b604080518083038185885af1158015610d18573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d3d919061173a565b50604080518b8152602081018b90529192508291600080516020611821833981519152910160405180910390a298975050505050505050565b8035600090815260208181526040808320828501358452909152808220908290610da690606086019086016115a2565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905550565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715610e0957610e09610dd1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610e3757610e37610dd1565b604052919050565b600082601f830112610e5057600080fd5b81356001600160401b03811115610e6957610e69610dd1565b610e7c601f8201601f1916602001610e0f565b818152846020838601011115610e9157600080fd5b816020850160208301376000918101602001919091529392505050565b60006001600160401b03821115610ec757610ec7610dd1565b5060051b60200190565b80356001600160a01b0381168114610ee857600080fd5b919050565b600082601f830112610efe57600080fd5b81356020610f13610f0e83610eae565b610e0f565b82815260059290921b84018101918181019086841115610f3257600080fd5b8286015b84811015610f5457610f4781610ed1565b8352918301918301610f36565b509695505050505050565b80356001600160801b0381168114610ee857600080fd5b600082601f830112610f8757600080fd5b81356020610f97610f0e83610eae565b82815260069290921b84018101918181019086841115610fb657600080fd5b8286015b84811015610f545760408189031215610fd35760008081fd5b610fdb610de7565b610fe482610f5f565b8152610ff1858301610f5f565b81860152835291830191604001610fba565b80358015158114610ee857600080fd5b600080600080600080600080610100898b03121561103057600080fd5b883597506020890135965060408901356001600160401b038082111561105557600080fd5b6110618c838d01610e3f565b975060608b013591508082111561107757600080fd5b6110838c838d01610eed565b965060808b013591508082111561109957600080fd5b506110a68b828c01610f76565b9450506110b560a08a01610ed1565b92506110c360c08a01611003565b915060e089013590509295985092959890939650565b6000806000606084860312156110ee57600080fd5b833592506020840135915061110560408501610ed1565b90509250925092565b60006060828403121561112057600080fd5b604051606081018181106001600160401b038211171561114257611142610dd1565b8060405250809150823581526020830135602082015261116460408401610ed1565b60408201525092915050565b6000806080838503121561118357600080fd5b61118d848461110e565b915060608301356001600160401b038111156111a857600080fd5b6111b485828601610e3f565b9150509250929050565b60008083601f8401126111d057600080fd5b5081356001600160401b038111156111e757600080fd5b6020830191508360208285010111156111ff57600080fd5b9250929050565b60008060008060006080868803121561121e57600080fd5b853594506020860135935061123560408701610ed1565b925060608601356001600160401b0381111561125057600080fd5b61125c888289016111be565b969995985093965092949392505050565b600080600080600060a0868803121561128557600080fd5b853594506020860135935060408601356001600160401b03808211156112aa57600080fd5b6112b689838a01610eed565b945060608801359150808211156112cc57600080fd5b6112d889838a01610f76565b935060808801359150808211156112ee57600080fd5b506112fb88828901610e3f565b9150509295509295909350565b600080600080600080600060e0888a03121561132357600080fd5b873596506020880135955060408801356001600160401b038082111561134857600080fd5b6113548b838c01610eed565b965060608a013591508082111561136a57600080fd5b6113768b838c01610f76565b955060808a013591508082111561138c57600080fd5b506113998a828b01610e3f565b93505060a0880135915060c0880135905092959891949750929550565b600080600080608085870312156113cc57600080fd5b84356001600160401b03808211156113e357600080fd5b6113ef88838901610eed565b95506020870135945060408701359350606087013591508082111561141357600080fd5b5061142087828801610e3f565b91505092959194509250565b60008060008060008060a0878903121561144557600080fd5b863595506020870135945060408701356001600160401b038082111561146a57600080fd5b6114768a838b01610eed565b9550606089013591508082111561148c57600080fd5b6114988a838b01610f76565b945060808901359150808211156114ae57600080fd5b506114bb89828a016111be565b979a9699509497509295939492505050565b6000606082840312156114df57600080fd5b50919050565b6000602082840312156114f757600080fd5b5035919050565b600080600083850360c081121561151457600080fd5b608081121561152257600080fd5b50604051608081016001600160401b03828210818311171561154657611546610dd1565b8160405286358352602087013560208401526040870135604084015260608701356060840152829550608087013592508083111561158357600080fd5b505061159186828701610e3f565b92505060a084013590509250925092565b6000602082840312156115b457600080fd5b6105cd82610ed1565b6000606082840312156115cf57600080fd5b6105cd838361110e565b600081518084526020808501945080840160005b838110156116125781516001600160a01b0316875295820195908201906001016115ed565b509495945050505050565b60608152600061163060608301866115d9565b60208301949094525060400152919050565b6000815180845260005b818110156116685760208185018101518683018201520161164c565b506000602082860101526020601f19601f83011685010191505092915050565b600081518084526020808501945080840160005b8381101561161257815180516001600160801b0390811689529084015116838801526040909601959082019060010161169c565b87815286602082015260e0604082015260006116ef60e0830188611642565b828103606084015261170181886115d9565b905082810360808401526117158187611688565b6001600160a01b039590951660a0840152505090151560c09091015295945050505050565b6000806040838503121561174d57600080fd5b505080516020909101519092909150565b634e487b7160e01b600052603260045260246000fd5b60006101008a83528960208401528060408401526117948184018a611642565b905082810360608401526117a881896115d9565b905082810360808401526117bc8188611688565b6001600160a01b039690961660a0840152505060c081019290925260e09091015295945050505050565b6000602082840312156117f857600080fd5b5051919050565b808201808211156105d057634e487b7160e01b600052601160045260246000fdfe13702cbb517a96264c518c574ec4e5e5c48d5e88f231810a7793f0572868e89ea2646970667358221220f0c8f771b38192f8c57752651c42d46a22e341df1de4cf9e8de83527b3f7f96964736f6c63430008120033000000000000000000000000a8e809b54cff39bca2ca75d49e13f9bfcea2864e000000000000000000000000d0f6c33de5ab51301845b75835a1ae0d9f6ad294
Deployed Bytecode
0x6080604052600436106101145760003560e01c8063715018a6116100a0578063c1ba4e5911610064578063c1ba4e59146102fc578063d59f82231461031c578063f2fde38b14610341578063f35419b714610361578063fd6bc7231461038157600080fd5b8063715018a6146102815780638da5cb5b1461029657806395fa2979146102b45780639cb48cc6146102c9578063b2af006d146102dc57600080fd5b80633fa4f245116100e75780633fa4f245146101d757806350f19183146101ed5780635c88831114610200578063674510e21461021357806369ee26041461023557600080fd5b806314b131a8146101195780632c5ca4501461014657806330df852014610196578063319f186f146101b6575b600080fd5b61012c610127366004611013565b61039c565b604080519283526020830191909152015b60405180910390f35b34801561015257600080fd5b506101866101613660046110d9565b6000602081815293815260408082208552928152828120909352825290205460ff1681565b604051901515815260200161013d565b3480156101a257600080fd5b506101866101b1366004611170565b6103c0565b6101c96101c4366004611206565b6105d6565b60405190815260200161013d565b3480156101e357600080fd5b506101c960025481565b61012c6101fb36600461126d565b610628565b6101c961020e366004611308565b61064a565b34801561021f57600080fd5b5061023361022e3660046113b6565b610669565b005b34801561024157600080fd5b506102697f000000000000000000000000a8e809b54cff39bca2ca75d49e13f9bfcea2864e81565b6040516001600160a01b03909116815260200161013d565b34801561028d57600080fd5b506102336106ff565b3480156102a257600080fd5b506001546001600160a01b0316610269565b3480156102c057600080fd5b506101c960f881565b6101c96102d736600461142c565b610713565b3480156102e857600080fd5b506102336102f73660046114cd565b610767565b34801561030857600080fd5b506102336103173660046114e5565b61077b565b34801561032857600080fd5b506101c96103373660046114fe565b6003549392505050565b34801561034d57600080fd5b5061023361035c3660046115a2565b610788565b34801561036d57600080fd5b5061023361037c3660046115bd565b610803565b34801561038d57600080fd5b506102696001600160a01b0381565b6000806103af8a8a8a8a8a8a8a8a61084b565b915091509850989650505050505050565b81516000908152602081815260408083208286015184528252808320818601516001600160a01b0316845290915281205460ff168061044c57506001600160a01b03600081815260208181528581015182527f50c7a3d1a23c7ff4a61d37c3f2c4aeb36cf60b43ee893723db201d3eb941cbad81526040808320878201519094168352929052205460ff165b806104b957506001600160a01b0360008181527f50c7a3d1a23c7ff4a61d37c3f2c4aeb36cf60b43ee893723db201d3eb941cbad602090815260408681015190931682527f6cf54fdcbe31578a067a9e0709c8e2e46a8619e4f029b9b130a04d0233b32bec9052205460ff165b806104f4575082516000908152602081815260408083206001600160a01b0380855290835281842082880151909116845290915290205460ff165b806105cd575060f883604001516001600160a01b0316111580156105cd5750825160009081526020818152604080832082870151845282528083206001600160a01b03845290915290205460ff1680610572575082516000908152602081815260408083206001600160a01b038452825280832090915290205460ff165b806105cd57506001600160a01b036000527f6cf54fdcbe31578a067a9e0709c8e2e46a8619e4f029b9b130a04d0233b32bec6020527f1370ba6b5068d687088888143148fa917c0117cd515113df0851536cad3e962c5460ff165b90505b92915050565b600061061e868685858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a9250339150349050610932565b9695505050505050565b60008061063c87878588883360013461084b565b915091509550959350505050565b600061065d888886898933898934610ae2565b98975050505050505050565b336001600160a01b037f000000000000000000000000a8e809b54cff39bca2ca75d49e13f9bfcea2864e16146106b257604051631c183e6760e21b815260040160405180910390fd5b6106be84848484610bba565b7f669134fd9bd8c3ff44cb489cd90088a9f947225586a6090d168d729622927bce8484846040516106f19392919061161d565b60405180910390a150505050565b610707610bf2565b6107116000610c4c565b565b600061075c878785858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b92508a915033905034610c9e565b979650505050505050565b61076f610bf2565b61077881610d76565b50565b610783610bf2565b600355565b610790610bf2565b6001600160a01b0381166107fa5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61077881610c4c565b61080b610bf2565b6107788180516000908152602081815260408083208285015184528252808320938101516001600160a01b0316835292905220805460ff19166001179055565b6000806000807f000000000000000000000000a8e809b54cff39bca2ca75d49e13f9bfcea2864e6001600160a01b0316636973e66f868e8e8e8e8e8e8e6040518963ffffffff1660e01b81526004016108aa97969594939291906116d0565b604080518083038185885af11580156108c7573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906108ec919061173a565b91509150816000805160206118218339815191528d8d604051610919929190918252602082015260400190565b60405180910390a2909b909a5098505050505050505050565b60408051600180825281830190925260009182919060208083019080368337019050509050848160008151811061096b5761096b61175e565b6001600160a01b039290921660209283029190910190910152604080516001808252818301909252600091816020015b604080518082019091526000808252602082015281526020019060019003908161099b579050509050604051806040016040528060006001600160801b03168152602001856001600160801b0316815250816000815181106109ff576109ff61175e565b602002602001018190525060007f000000000000000000000000a8e809b54cff39bca2ca75d49e13f9bfcea2864e6001600160a01b0316636973e66f868c8c8c88888d60006040518963ffffffff1660e01b8152600401610a6697969594939291906116d0565b604080518083038185885af1158015610a83573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610aa8919061173a565b50604080518c8152602081018c90529192508291600080516020611821833981519152910160405180910390a29998505050505050505050565b60007f000000000000000000000000a8e809b54cff39bca2ca75d49e13f9bfcea2864e6001600160a01b031663e3878e73838c8c8c8c8c8c8c8c6040518a63ffffffff1660e01b8152600401610b3f989796959493929190611774565b604080518083038185885af1158015610b5c573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610b81919061173a565b5050604080518b8152602081018b90528591600080516020611821833981519152910160405180910390a2509198975050505050505050565b805115610bec5780806020019051810190610bd591906117e6565b60026000828254610be691906117ff565b90915550505b50505050565b6001546001600160a01b031633146107115760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107f1565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000807f000000000000000000000000a8e809b54cff39bca2ca75d49e13f9bfcea2864e6001600160a01b0316636973e66f848b8b8b8b8b8b60006040518963ffffffff1660e01b8152600401610cfb97969594939291906116d0565b604080518083038185885af1158015610d18573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610d3d919061173a565b50604080518b8152602081018b90529192508291600080516020611821833981519152910160405180910390a298975050505050505050565b8035600090815260208181526040808320828501358452909152808220908290610da690606086019086016115a2565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905550565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b0381118282101715610e0957610e09610dd1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610e3757610e37610dd1565b604052919050565b600082601f830112610e5057600080fd5b81356001600160401b03811115610e6957610e69610dd1565b610e7c601f8201601f1916602001610e0f565b818152846020838601011115610e9157600080fd5b816020850160208301376000918101602001919091529392505050565b60006001600160401b03821115610ec757610ec7610dd1565b5060051b60200190565b80356001600160a01b0381168114610ee857600080fd5b919050565b600082601f830112610efe57600080fd5b81356020610f13610f0e83610eae565b610e0f565b82815260059290921b84018101918181019086841115610f3257600080fd5b8286015b84811015610f5457610f4781610ed1565b8352918301918301610f36565b509695505050505050565b80356001600160801b0381168114610ee857600080fd5b600082601f830112610f8757600080fd5b81356020610f97610f0e83610eae565b82815260069290921b84018101918181019086841115610fb657600080fd5b8286015b84811015610f545760408189031215610fd35760008081fd5b610fdb610de7565b610fe482610f5f565b8152610ff1858301610f5f565b81860152835291830191604001610fba565b80358015158114610ee857600080fd5b600080600080600080600080610100898b03121561103057600080fd5b883597506020890135965060408901356001600160401b038082111561105557600080fd5b6110618c838d01610e3f565b975060608b013591508082111561107757600080fd5b6110838c838d01610eed565b965060808b013591508082111561109957600080fd5b506110a68b828c01610f76565b9450506110b560a08a01610ed1565b92506110c360c08a01611003565b915060e089013590509295985092959890939650565b6000806000606084860312156110ee57600080fd5b833592506020840135915061110560408501610ed1565b90509250925092565b60006060828403121561112057600080fd5b604051606081018181106001600160401b038211171561114257611142610dd1565b8060405250809150823581526020830135602082015261116460408401610ed1565b60408201525092915050565b6000806080838503121561118357600080fd5b61118d848461110e565b915060608301356001600160401b038111156111a857600080fd5b6111b485828601610e3f565b9150509250929050565b60008083601f8401126111d057600080fd5b5081356001600160401b038111156111e757600080fd5b6020830191508360208285010111156111ff57600080fd5b9250929050565b60008060008060006080868803121561121e57600080fd5b853594506020860135935061123560408701610ed1565b925060608601356001600160401b0381111561125057600080fd5b61125c888289016111be565b969995985093965092949392505050565b600080600080600060a0868803121561128557600080fd5b853594506020860135935060408601356001600160401b03808211156112aa57600080fd5b6112b689838a01610eed565b945060608801359150808211156112cc57600080fd5b6112d889838a01610f76565b935060808801359150808211156112ee57600080fd5b506112fb88828901610e3f565b9150509295509295909350565b600080600080600080600060e0888a03121561132357600080fd5b873596506020880135955060408801356001600160401b038082111561134857600080fd5b6113548b838c01610eed565b965060608a013591508082111561136a57600080fd5b6113768b838c01610f76565b955060808a013591508082111561138c57600080fd5b506113998a828b01610e3f565b93505060a0880135915060c0880135905092959891949750929550565b600080600080608085870312156113cc57600080fd5b84356001600160401b03808211156113e357600080fd5b6113ef88838901610eed565b95506020870135945060408701359350606087013591508082111561141357600080fd5b5061142087828801610e3f565b91505092959194509250565b60008060008060008060a0878903121561144557600080fd5b863595506020870135945060408701356001600160401b038082111561146a57600080fd5b6114768a838b01610eed565b9550606089013591508082111561148c57600080fd5b6114988a838b01610f76565b945060808901359150808211156114ae57600080fd5b506114bb89828a016111be565b979a9699509497509295939492505050565b6000606082840312156114df57600080fd5b50919050565b6000602082840312156114f757600080fd5b5035919050565b600080600083850360c081121561151457600080fd5b608081121561152257600080fd5b50604051608081016001600160401b03828210818311171561154657611546610dd1565b8160405286358352602087013560208401526040870135604084015260608701356060840152829550608087013592508083111561158357600080fd5b505061159186828701610e3f565b92505060a084013590509250925092565b6000602082840312156115b457600080fd5b6105cd82610ed1565b6000606082840312156115cf57600080fd5b6105cd838361110e565b600081518084526020808501945080840160005b838110156116125781516001600160a01b0316875295820195908201906001016115ed565b509495945050505050565b60608152600061163060608301866115d9565b60208301949094525060400152919050565b6000815180845260005b818110156116685760208185018101518683018201520161164c565b506000602082860101526020601f19601f83011685010191505092915050565b600081518084526020808501945080840160005b8381101561161257815180516001600160801b0390811689529084015116838801526040909601959082019060010161169c565b87815286602082015260e0604082015260006116ef60e0830188611642565b828103606084015261170181886115d9565b905082810360808401526117158187611688565b6001600160a01b039590951660a0840152505090151560c09091015295945050505050565b6000806040838503121561174d57600080fd5b505080516020909101519092909150565b634e487b7160e01b600052603260045260246000fd5b60006101008a83528960208401528060408401526117948184018a611642565b905082810360608401526117a881896115d9565b905082810360808401526117bc8188611688565b6001600160a01b039690961660a0840152505060c081019290925260e09091015295945050505050565b6000602082840312156117f857600080fd5b5051919050565b808201808211156105d057634e487b7160e01b600052601160045260246000fdfe13702cbb517a96264c518c574ec4e5e5c48d5e88f231810a7793f0572868e89ea2646970667358221220f0c8f771b38192f8c57752651c42d46a22e341df1de4cf9e8de83527b3f7f96964736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a8e809b54cff39bca2ca75d49e13f9bfcea2864e000000000000000000000000d0f6c33de5ab51301845b75835a1ae0d9f6ad294
-----Decoded View---------------
Arg [0] : glacisRouter_ (address): 0xa8E809b54cff39bCA2ca75d49E13F9BfCEA2864e
Arg [1] : owner_ (address): 0xD0F6c33de5Ab51301845b75835A1AE0d9F6AD294
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000a8e809b54cff39bca2ca75d49e13f9bfcea2864e
Arg [1] : 000000000000000000000000d0f6c33de5ab51301845b75835a1ae0d9f6ad294
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.