ETH Price: $2,020.46 (+3.98%)

Contract

0x0f31dFF4e960ceB2AbD5e3d616680aA57EE7BdB3
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Add Allowed Rout...208213642024-09-24 15:30:23530 days ago1727191823IN
0x0f31dFF4...57EE7BdB3
0 ETH0.0010609822.41621564
Set Remote Value...206350602024-08-29 15:13:35556 days ago1724944415IN
0x0f31dFF4...57EE7BdB3
0.005 ETH0.00111194.30325101
Set Remote Value...206340992024-08-29 12:00:11557 days ago1724932811IN
0x0f31dFF4...57EE7BdB3
0.005 ETH0.000795742.67245664
Set Remote Value...206340992024-08-29 12:00:11557 days ago1724932811IN
0x0f31dFF4...57EE7BdB3
0.005 ETH0.000717272.67245664
Set Remote Value...206340862024-08-29 11:57:35557 days ago1724932655IN
0x0f31dFF4...57EE7BdB3
0.005 ETH0.000304742.49774876
Set Remote Value...206340322024-08-29 11:46:47557 days ago1724932007IN
0x0f31dFF4...57EE7BdB3
0.005 ETH0.000601272.01933374
Set Remote Value...206339992024-08-29 11:39:59557 days ago1724931599IN
0x0f31dFF4...57EE7BdB3
0.005 ETH0.000571611.91972466
Set Remote Value...206339932024-08-29 11:38:47557 days ago1724931527IN
0x0f31dFF4...57EE7BdB3
0.005 ETH0.000481051.87994077
Set Remote Value...206339682024-08-29 11:33:47557 days ago1724931227IN
0x0f31dFF4...57EE7BdB3
0.005 ETH0.000167291.37115168
Set Remote Value...206339642024-08-29 11:32:59557 days ago1724931179IN
0x0f31dFF4...57EE7BdB3
0.005 ETH0.000326441.27572124
Set Remote Value...206339182024-08-29 11:23:47557 days ago1724930627IN
0x0f31dFF4...57EE7BdB3
0.001 ETH0.000335861.41342044
Set Remote Value...206339182024-08-29 11:23:47557 days ago1724930627IN
0x0f31dFF4...57EE7BdB3
0.001 ETH0.000285281.41342044
Set Remote Value...206339182024-08-29 11:23:47557 days ago1724930627IN
0x0f31dFF4...57EE7BdB3
0.001 ETH0.000420851.41342044
Set Remote Value...206338382024-08-29 11:07:35557 days ago1724929655IN
0x0f31dFF4...57EE7BdB3
0.001 ETH0.000248951.23345044
Set Remote Value...206337912024-08-29 10:58:11557 days ago1724929091IN
0x0f31dFF4...57EE7BdB3
0.001 ETH0.000355041.1923923
Set Remote Value...206337912024-08-29 10:58:11557 days ago1724929091IN
0x0f31dFF4...57EE7BdB3
0.001 ETH0.000303641.1923923
Set Remote Value...206337902024-08-29 10:57:59557 days ago1724929079IN
0x0f31dFF4...57EE7BdB3
0.001 ETH0.000236581.17214777
Set Remote Value...206337902024-08-29 10:57:59557 days ago1724929079IN
0x0f31dFF4...57EE7BdB3
0.001 ETH0.000369061.17214777
Set Remote Value...206275672024-08-28 14:04:59558 days ago1724853899IN
0x0f31dFF4...57EE7BdB3
0.001 ETH0.000452933.71232296
Set Remote Value...206275612024-08-28 14:03:47558 days ago1724853827IN
0x0f31dFF4...57EE7BdB3
0.001 ETH0.000422943.4665222
Set Remote Value...206274332024-08-28 13:37:35558 days ago1724852255IN
0x0f31dFF4...57EE7BdB3
0.001 ETH0.000193431.58545115
Set Remote Value...206274012024-08-28 13:31:11558 days ago1724851871IN
0x0f31dFF4...57EE7BdB3
0.001 ETH0.000380221.60011227
Set Remote Value...206273102024-08-28 13:12:59558 days ago1724850779IN
0x0f31dFF4...57EE7BdB3
0.001 ETH0.000510632.52988726
Set Remote Value...206271842024-08-28 12:47:47558 days ago1724849267IN
0x0f31dFF4...57EE7BdB3
0.001 ETH0.000844282.68147325
Set Remote Value...206270852024-08-28 12:27:59558 days ago1724848079IN
0x0f31dFF4...57EE7BdB3
0.001 ETH0.000382433.13451607
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Route206350602024-08-29 15:13:35556 days ago1724944415
0x0f31dFF4...57EE7BdB3
0.005 ETH
Route206340992024-08-29 12:00:11557 days ago1724932811
0x0f31dFF4...57EE7BdB3
0.005 ETH
Route206340992024-08-29 12:00:11557 days ago1724932811
0x0f31dFF4...57EE7BdB3
0.005 ETH
Route206340862024-08-29 11:57:35557 days ago1724932655
0x0f31dFF4...57EE7BdB3
0.005 ETH
Route206340322024-08-29 11:46:47557 days ago1724932007
0x0f31dFF4...57EE7BdB3
0.005 ETH
Route206339992024-08-29 11:39:59557 days ago1724931599
0x0f31dFF4...57EE7BdB3
0.005 ETH
Route206339932024-08-29 11:38:47557 days ago1724931527
0x0f31dFF4...57EE7BdB3
0.005 ETH
Route206339682024-08-29 11:33:47557 days ago1724931227
0x0f31dFF4...57EE7BdB3
0.005 ETH
Route206339642024-08-29 11:32:59557 days ago1724931179
0x0f31dFF4...57EE7BdB3
0.005 ETH
Route206339182024-08-29 11:23:47557 days ago1724930627
0x0f31dFF4...57EE7BdB3
0.001 ETH
Route206339182024-08-29 11:23:47557 days ago1724930627
0x0f31dFF4...57EE7BdB3
0.001 ETH
Route206339182024-08-29 11:23:47557 days ago1724930627
0x0f31dFF4...57EE7BdB3
0.001 ETH
Route206338382024-08-29 11:07:35557 days ago1724929655
0x0f31dFF4...57EE7BdB3
0.001 ETH
Route206337912024-08-29 10:58:11557 days ago1724929091
0x0f31dFF4...57EE7BdB3
0.001 ETH
Route206337912024-08-29 10:58:11557 days ago1724929091
0x0f31dFF4...57EE7BdB3
0.001 ETH
Route206337902024-08-29 10:57:59557 days ago1724929079
0x0f31dFF4...57EE7BdB3
0.001 ETH
Route206337902024-08-29 10:57:59557 days ago1724929079
0x0f31dFF4...57EE7BdB3
0.001 ETH
Route206275672024-08-28 14:04:59558 days ago1724853899
0x0f31dFF4...57EE7BdB3
0.001 ETH
Route206275612024-08-28 14:03:47558 days ago1724853827
0x0f31dFF4...57EE7BdB3
0.001 ETH
Route206274332024-08-28 13:37:35558 days ago1724852255
0x0f31dFF4...57EE7BdB3
0.001 ETH
Route206274012024-08-28 13:31:11558 days ago1724851871
0x0f31dFF4...57EE7BdB3
0.001 ETH
Route206273102024-08-28 13:12:59558 days ago1724850779
0x0f31dFF4...57EE7BdB3
0.001 ETH
Route206271842024-08-28 12:47:47558 days ago1724849267
0x0f31dFF4...57EE7BdB3
0.001 ETH
Route206270852024-08-28 12:27:59558 days ago1724848079
0x0f31dFF4...57EE7BdB3
0.001 ETH
Route206268932024-08-28 11:49:23558 days ago1724845763
0x0f31dFF4...57EE7BdB3
0.001 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GlacisClientSample

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
// 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);
    }
}

File 7 of 11 : GlacisCommons.sol
// 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;
}

File 8 of 11 : IGlacisAccessControlClient.sol
// 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;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "viaIR": false,
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

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"}]

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


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
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.