编译器
0.8.18+commit.87f61d96
文件 1 的 11:Context.sol
pragma solidity ^0.8.0;
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;
}
}
文件 2 的 11:GlacisAccessControlClient.sol
pragma solidity 0.8.18;
import {GlacisCommons} from "../commons/GlacisCommons.sol";
import {IGlacisAccessControlClient} from "../interfaces/IGlacisAccessControlClient.sol";
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);
function _addAllowedRoute(
GlacisRoute memory route
) internal {
allowedRoutes[route.fromChainId][route.fromAddress][route.fromAdapter] = true;
}
function _removeAllowedRoute(
GlacisRoute calldata route
) internal {
allowedRoutes[route.fromChainId][route.fromAddress][route.fromAdapter] = false;
}
function isAllowedRoute(
GlacisRoute memory route_,
bytes memory
) 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]
));
}
}
文件 3 的 11:GlacisClient.sol
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();
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
);
constructor(
address _glacisRouter,
uint256 _quorum
) GlacisAccessControlClient() IGlacisClient(_quorum) {
if (_glacisRouter == address(0))
revert GlacisClient__InvalidRouterAddress();
GLACIS_ROUTER = _glacisRouter;
}
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;
}
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;
}
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);
}
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;
}
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);
}
function _receiveMessage(
address[] memory fromAdapters,
uint256 fromChainId,
bytes32 fromAddress,
bytes memory payload
) internal virtual {}
}
文件 4 的 11:GlacisClientOwnable.sol
pragma solidity 0.8.18;
import {GlacisClient} from "./GlacisClient.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {GlacisCommons} from "../commons/GlacisCommons.sol";
abstract contract GlacisClientOwnable is GlacisClient, Ownable {
constructor(
address _glacisRouter,
uint256 _quorum,
address _owner
) GlacisClient(_glacisRouter, _quorum) {
_transferOwnership(_owner);
}
function addAllowedRoute(
GlacisCommons.GlacisRoute memory allowedRoute
) external onlyOwner {
_addAllowedRoute(allowedRoute);
}
function removeAllowedRoute(
GlacisCommons.GlacisRoute calldata route
) external onlyOwner {
_removeAllowedRoute(route);
}
}
文件 5 的 11:GlacisClientSample.sol
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,
uint256,
bytes32,
bytes memory payload
) internal override {
if (payload.length > 0) (value) += abi.decode(payload, (uint256));
}
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;
}
}
文件 6 的 11:GlacisClientTextSample.sol
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,
uint256,
bytes32,
bytes memory payload
) internal override {
(value) = abi.decode(payload, (string));
}
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;
}
}
文件 7 的 11:GlacisCommons.sol
pragma solidity 0.8.18;
contract GlacisCommons {
struct GlacisData {
bytes32 messageId;
uint256 nonce;
bytes32 originalFrom;
bytes32 originalTo;
}
struct GlacisTokenData {
address glacisToken;
uint256 glacisTokenAmount;
}
struct GlacisRoute {
uint256 fromChainId;
bytes32 fromAddress;
address fromAdapter;
}
struct CrossChainGas {
uint128 gasLimit;
uint128 nativeCurrencyValue;
}
uint160 constant public WILDCARD = type(uint160).max;
uint256 constant public GLACIS_RESERVED_IDS = 248;
}
文件 8 的 11:IGlacisAccessControlClient.sol
pragma solidity 0.8.18;
import {GlacisCommons} from "../commons/GlacisCommons.sol";
interface IGlacisAccessControlClient {
function isAllowedRoute(
GlacisCommons.GlacisRoute memory route,
bytes memory payload
) external view returns (bool);
}
文件 9 的 11:IGlacisClient.sol
pragma solidity 0.8.18;
import {GlacisCommons} from "../commons/GlacisCommons.sol";
import {IGlacisAccessControlClient} from "../interfaces/IGlacisAccessControlClient.sol";
abstract contract IGlacisClient is IGlacisAccessControlClient {
uint256 private immutable DEFAULT_QUORUM;
constructor(uint256 _defaultQuorum) {
DEFAULT_QUORUM = _defaultQuorum;
}
function receiveMessage(
address[] calldata fromAdapters,
uint256 fromChainId,
bytes32 fromAddress,
bytes calldata payload
) external virtual;
function getQuorum(
GlacisCommons.GlacisData memory,
bytes memory,
uint256
) public view virtual returns (uint256) {
return DEFAULT_QUORUM;
}
}
文件 10 的 11:IGlacisRouter.sol
pragma solidity 0.8.18;
import {GlacisCommons} from "../commons/GlacisCommons.sol";
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
);
}
interface IGlacisRouter {
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);
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);
function receiveMessage(
uint256 fromChainId,
bytes memory glacisPayload
) external;
}
文件 11 的 11:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
{
"compilationTarget": {
"test/contracts/samples/GlacisClientSample.sol": "GlacisClientSample"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"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"}]