From 31aad172295eebb5299819cbf285e6f8f6f3a89d Mon Sep 17 00:00:00 2001 From: srdtrk Date: Mon, 14 Apr 2025 18:03:44 +0300 Subject: [PATCH 01/79] feat: defined packet data --- contracts/msgs/IContractCallsMsgs.sol | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 contracts/msgs/IContractCallsMsgs.sol diff --git a/contracts/msgs/IContractCallsMsgs.sol b/contracts/msgs/IContractCallsMsgs.sol new file mode 100644 index 000000000..6ce804b76 --- /dev/null +++ b/contracts/msgs/IContractCallsMsgs.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +interface IContractCallsMsgs { + /// @notice ContractCallsPacketData is the payload for the contract call application. + /// @param sender The sender of the packet + /// @param receiver The receiver contract of the call + /// @param payload The payload of the call + /// @param memo Optional memo + struct ContractCallsPacketData { + string sender; + string receiver; + bytes payload; + string memo; + } +} From f56489b0c129c8f94bffac94fcc941b5dfa6b1b6 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Tue, 15 Apr 2025 12:16:29 +0300 Subject: [PATCH 02/79] imp: impprove packet data --- .../msgs/{IContractCallsMsgs.sol => IICS27GMPMsgs.sol} | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) rename contracts/msgs/{IContractCallsMsgs.sol => IICS27GMPMsgs.sol} (50%) diff --git a/contracts/msgs/IContractCallsMsgs.sol b/contracts/msgs/IICS27GMPMsgs.sol similarity index 50% rename from contracts/msgs/IContractCallsMsgs.sol rename to contracts/msgs/IICS27GMPMsgs.sol index 6ce804b76..33b5bb6e3 100644 --- a/contracts/msgs/IContractCallsMsgs.sol +++ b/contracts/msgs/IICS27GMPMsgs.sol @@ -1,15 +1,17 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.28; -interface IContractCallsMsgs { - /// @notice ContractCallsPacketData is the payload for the contract call application. +interface IICS27GMPMsgs { + /// @notice GMPPacketData is the payload for the GMP application. /// @param sender The sender of the packet - /// @param receiver The receiver contract of the call + /// @param receiver The receiver address of the contract call + /// @param salt The salt used to generate the caller account address /// @param payload The payload of the call /// @param memo Optional memo - struct ContractCallsPacketData { + struct GMPPacketData { string sender; string receiver; + bytes salt; bytes payload; string memo; } From 3da62a5faa21b0c18695595883dab3f8235fd35f Mon Sep 17 00:00:00 2001 From: srdtrk Date: Tue, 15 Apr 2025 12:30:29 +0300 Subject: [PATCH 03/79] imp: added ack --- contracts/msgs/IICS27GMPMsgs.sol | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/contracts/msgs/IICS27GMPMsgs.sol b/contracts/msgs/IICS27GMPMsgs.sol index 33b5bb6e3..52cc62e8e 100644 --- a/contracts/msgs/IICS27GMPMsgs.sol +++ b/contracts/msgs/IICS27GMPMsgs.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.28; interface IICS27GMPMsgs { - /// @notice GMPPacketData is the payload for the GMP application. + /// @notice GMPPacketData is the IBC payload for the GMP application. /// @param sender The sender of the packet /// @param receiver The receiver address of the contract call /// @param salt The salt used to generate the caller account address @@ -15,4 +15,10 @@ interface IICS27GMPMsgs { bytes payload; string memo; } + + /// @notice GMPAcknowledgement is the IBC acknowledgement of the GMP application. + /// @param result The result of the call + struct GMPAcknowledgement { + bytes result; + } } From 54233f5953ee1770a0975212217a6b77f184c94c Mon Sep 17 00:00:00 2001 From: srdtrk Date: Tue, 15 Apr 2025 15:01:10 +0300 Subject: [PATCH 04/79] imp: save progress --- contracts/ICS27GMP.sol | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 contracts/ICS27GMP.sol diff --git a/contracts/ICS27GMP.sol b/contracts/ICS27GMP.sol new file mode 100644 index 000000000..f4f488ab2 --- /dev/null +++ b/contracts/ICS27GMP.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +/// @title ICS27 General Message Passing +/// @notice This contract is the implementation of the ics27-2 IBC specification for general message passing. +contract ICS27GMP {} From f0e98973eb4e93b443808c40a9dfb5d37744d3e3 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Wed, 16 Apr 2025 13:16:56 +0300 Subject: [PATCH 05/79] imp: added SendPacketMsg --- contracts/msgs/IICS27GMPMsgs.sol | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/contracts/msgs/IICS27GMPMsgs.sol b/contracts/msgs/IICS27GMPMsgs.sol index 52cc62e8e..dc6d4b3de 100644 --- a/contracts/msgs/IICS27GMPMsgs.sol +++ b/contracts/msgs/IICS27GMPMsgs.sol @@ -2,6 +2,24 @@ pragma solidity ^0.8.28; interface IICS27GMPMsgs { + /// @notice Message for sending a GMP packet + /// @param sourceClient The source client identifier + /// @param destPort The destination port on the counterparty chain + /// @param timeoutTimestamp The absolute timeout timestamp in unix seconds + /// @param receiver The receiver address of the contract call + /// @param salt The salt used to generate the caller account address + /// @param payload The payload of the call + /// @param memo Optional memo + struct SendGMPPacketMsg { + string sourceClient; + string destPort; + uint64 timeoutTimestamp; + string receiver; + bytes salt; + bytes payload; + string memo; + } + /// @notice GMPPacketData is the IBC payload for the GMP application. /// @param sender The sender of the packet /// @param receiver The receiver address of the contract call From ee01fc14c106e2e2b159a2d83c43ef80f9cfaf8a Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 17 Apr 2025 12:33:56 +0300 Subject: [PATCH 06/79] feat: added send packet --- contracts/ICS27GMP.sol | 61 +++++++++++++++++++++++++++- contracts/errors/IICS27GMPErrors.sol | 8 ++++ contracts/interfaces/IICS27GMP.sol | 11 +++++ contracts/msgs/IICS27GMPMsgs.sol | 4 +- contracts/utils/ICS27Lib.sol | 20 +++++++++ 5 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 contracts/errors/IICS27GMPErrors.sol create mode 100644 contracts/interfaces/IICS27GMP.sol create mode 100644 contracts/utils/ICS27Lib.sol diff --git a/contracts/ICS27GMP.sol b/contracts/ICS27GMP.sol index f4f488ab2..d9c059dde 100644 --- a/contracts/ICS27GMP.sol +++ b/contracts/ICS27GMP.sol @@ -1,6 +1,65 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.28; +import { IICS26RouterMsgs } from "./msgs/IICS26RouterMsgs.sol"; +import { IICS27GMPMsgs } from "./msgs/IICS27GMPMsgs.sol"; + +import { IICS26Router } from "./interfaces/IICS26Router.sol"; +import { IICS27GMP } from "./interfaces/IICS27GMP.sol"; + +import { ReentrancyGuardTransientUpgradeable } from + "@openzeppelin-upgradeable/utils/ReentrancyGuardTransientUpgradeable.sol"; +import { MulticallUpgradeable } from "@openzeppelin-upgradeable/utils/MulticallUpgradeable.sol"; +import { Strings } from "@openzeppelin-contracts/utils/Strings.sol"; +import { ICS27Lib } from "./utils/ICS27Lib.sol"; + /// @title ICS27 General Message Passing /// @notice This contract is the implementation of the ics27-2 IBC specification for general message passing. -contract ICS27GMP {} +contract ICS27GMP is IICS27GMP, ReentrancyGuardTransientUpgradeable, MulticallUpgradeable { + /// @notice Storage of the ICS27GMP contract + /// @dev It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions when using with + /// upgradeable contracts. + /// @param _ics26 The ICS26Router contract address. Immutable. + /// @custom:storage-location erc7201:ibc.storage.ICS27GMP + struct ICS27GMPStorage { + IICS26Router _ics26; + } + + /// @notice ERC-7201 slot for the ICS27GMP storage + /// @dev keccak256(abi.encode(uint256(keccak256("ibc.storage.ICS27GMP")) - 1)) & ~bytes32(uint256(0xff)) + bytes32 private constant ICS27GMP_STORAGE_SLOT = + 0xe73deb02cd654f25b90ec94b434589ea350a706e2446d278b41c3a86dc8f4500; + + /// @inheritdoc IICS27GMP + function sendCall(IICS27GMPMsgs.SendCallMsg calldata msg_) external nonReentrant returns (uint64) { + IICS27GMPMsgs.GMPPacketData memory packetData = IICS27GMPMsgs.GMPPacketData({ + sender: Strings.toHexString(_msgSender()), + receiver: msg_.receiver, + salt: msg_.salt, + payload: msg_.payload, + memo: msg_.memo + }); + + return _getICS27GMPStorage()._ics26.sendPacket( + IICS26RouterMsgs.MsgSendPacket({ + sourceClient: msg_.sourceClient, + timeoutTimestamp: msg_.timeoutTimestamp, + payload: IICS26RouterMsgs.Payload({ + sourcePort: ICS27Lib.DEFAULT_PORT_ID, + destPort: ICS27Lib.DEFAULT_PORT_ID, + version: ICS27Lib.ICS27_VERSION, + encoding: ICS27Lib.ICS27_ENCODING, + value: abi.encode(packetData) + }) + }) + ); + } + + /// @notice Returns the storage of the ICS27GMP contract + function _getICS27GMPStorage() private pure returns (ICS27GMPStorage storage $) { + // solhint-disable-next-line no-inline-assembly + assembly { + $.slot := ICS27GMP_STORAGE_SLOT + } + } +} diff --git a/contracts/errors/IICS27GMPErrors.sol b/contracts/errors/IICS27GMPErrors.sol new file mode 100644 index 000000000..cb2b8ebc7 --- /dev/null +++ b/contracts/errors/IICS27GMPErrors.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.28; + +interface IICS27GMPErrors { + /// @notice Invalid address + /// @param addr Address of the sender or receiver + error InvalidAddress(string addr); +} diff --git a/contracts/interfaces/IICS27GMP.sol b/contracts/interfaces/IICS27GMP.sol new file mode 100644 index 000000000..d33cdd16c --- /dev/null +++ b/contracts/interfaces/IICS27GMP.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +import { IICS27GMPMsgs } from "../msgs/IICS27GMPMsgs.sol"; + +interface IICS27GMP { + /// @notice Send a GMP packet by calling IICS26Router.sendPacket + /// @param msg_ The message for sending a GMP packet + /// @return sequence The sequence number of the packet created + function sendCall(IICS27GMPMsgs.SendCallMsg calldata msg_) external returns (uint64 sequence); +} diff --git a/contracts/msgs/IICS27GMPMsgs.sol b/contracts/msgs/IICS27GMPMsgs.sol index dc6d4b3de..e56e7e440 100644 --- a/contracts/msgs/IICS27GMPMsgs.sol +++ b/contracts/msgs/IICS27GMPMsgs.sol @@ -4,15 +4,13 @@ pragma solidity ^0.8.28; interface IICS27GMPMsgs { /// @notice Message for sending a GMP packet /// @param sourceClient The source client identifier - /// @param destPort The destination port on the counterparty chain /// @param timeoutTimestamp The absolute timeout timestamp in unix seconds /// @param receiver The receiver address of the contract call /// @param salt The salt used to generate the caller account address /// @param payload The payload of the call /// @param memo Optional memo - struct SendGMPPacketMsg { + struct SendCallMsg { string sourceClient; - string destPort; uint64 timeoutTimestamp; string receiver; bytes salt; diff --git a/contracts/utils/ICS27Lib.sol b/contracts/utils/ICS27Lib.sol new file mode 100644 index 000000000..46b61e1f3 --- /dev/null +++ b/contracts/utils/ICS27Lib.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.28; + +library ICS27Lib { + /// @notice ICS27_VERSION is the version string for ICS27 packet data. + string internal constant ICS27_VERSION = "ics27-2"; + + /// @notice ICS27_ENCODING is the encoding string for ICS27 packet data. + string internal constant ICS27_ENCODING = "application/x-solidity-abi"; + + /// @notice DEFAULT_PORT_ID is the default port id for ICS27. + string internal constant DEFAULT_PORT_ID = "gmpport"; + + /// @notice KECCAK256_ICS27_VERSION is the keccak256 hash of the ICS27_VERSION. + bytes32 internal constant KECCAK256_ICS27_VERSION = keccak256(bytes(ICS27_VERSION)); + + /// @notice KECCAK256_ICS27_ENCODING is the keccak256 hash of the ICS27_ENCODING. + bytes32 internal constant KECCAK256_ICS27_ENCODING = keccak256(bytes(ICS27_ENCODING)); + +} From a5ab68a8a48e1764366c9515b319b325802dbcb0 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 17 Apr 2025 14:52:49 +0300 Subject: [PATCH 07/79] imp: added basic account impl --- contracts/ICS27GMP.sol | 19 +++++- contracts/errors/IICS27Errors.sol | 13 +++++ contracts/errors/IICS27GMPErrors.sol | 8 --- contracts/interfaces/IICS27Account.sol | 43 ++++++++++++++ contracts/utils/ICS27Account.sol | 81 ++++++++++++++++++++++++++ 5 files changed, 155 insertions(+), 9 deletions(-) create mode 100644 contracts/errors/IICS27Errors.sol delete mode 100644 contracts/errors/IICS27GMPErrors.sol create mode 100644 contracts/interfaces/IICS27Account.sol create mode 100644 contracts/utils/ICS27Account.sol diff --git a/contracts/ICS27GMP.sol b/contracts/ICS27GMP.sol index d9c059dde..26c130b40 100644 --- a/contracts/ICS27GMP.sol +++ b/contracts/ICS27GMP.sol @@ -3,8 +3,10 @@ pragma solidity ^0.8.28; import { IICS26RouterMsgs } from "./msgs/IICS26RouterMsgs.sol"; import { IICS27GMPMsgs } from "./msgs/IICS27GMPMsgs.sol"; +import { IIBCAppCallbacks } from "./msgs/IIBCAppCallbacks.sol"; import { IICS26Router } from "./interfaces/IICS26Router.sol"; +import { IIBCApp } from "./interfaces/IIBCApp.sol"; import { IICS27GMP } from "./interfaces/IICS27GMP.sol"; import { ReentrancyGuardTransientUpgradeable } from @@ -15,7 +17,7 @@ import { ICS27Lib } from "./utils/ICS27Lib.sol"; /// @title ICS27 General Message Passing /// @notice This contract is the implementation of the ics27-2 IBC specification for general message passing. -contract ICS27GMP is IICS27GMP, ReentrancyGuardTransientUpgradeable, MulticallUpgradeable { +contract ICS27GMP is IICS27GMP, IIBCApp, ReentrancyGuardTransientUpgradeable, MulticallUpgradeable { /// @notice Storage of the ICS27GMP contract /// @dev It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions when using with /// upgradeable contracts. @@ -55,6 +57,21 @@ contract ICS27GMP is IICS27GMP, ReentrancyGuardTransientUpgradeable, MulticallUp ); } + /// @inheritdoc IIBCApp + function onRecvPacket(IIBCAppCallbacks.OnRecvPacketCallback calldata msg_) external nonReentrant returns (bytes memory) { + revert("TODO: Not implemented"); + } + + /// @inheritdoc IIBCApp + function onAcknowledgementPacket(IIBCAppCallbacks.OnAcknowledgementPacketCallback calldata msg_) nonReentrant external { + revert("TODO: Not implemented"); + } + + /// @inheritdoc IIBCApp + function onTimeoutPacket(IIBCAppCallbacks.OnTimeoutPacketCallback calldata msg_) nonReentrant external { + revert("TODO: Not implemented"); + } + /// @notice Returns the storage of the ICS27GMP contract function _getICS27GMPStorage() private pure returns (ICS27GMPStorage storage $) { // solhint-disable-next-line no-inline-assembly diff --git a/contracts/errors/IICS27Errors.sol b/contracts/errors/IICS27Errors.sol new file mode 100644 index 000000000..f04a1303a --- /dev/null +++ b/contracts/errors/IICS27Errors.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.8.28; + +interface IICS27Errors { + /// @notice Invalid address + /// @param addr Address of the sender or receiver + error InvalidAddress(string addr); + + /// @notice Unauthorized function call + /// @param expected The expected address + /// @param caller The caller of the function + error Unauthorized(address expected, address caller); +} diff --git a/contracts/errors/IICS27GMPErrors.sol b/contracts/errors/IICS27GMPErrors.sol deleted file mode 100644 index cb2b8ebc7..000000000 --- a/contracts/errors/IICS27GMPErrors.sol +++ /dev/null @@ -1,8 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity ^0.8.28; - -interface IICS27GMPErrors { - /// @notice Invalid address - /// @param addr Address of the sender or receiver - error InvalidAddress(string addr); -} diff --git a/contracts/interfaces/IICS27Account.sol b/contracts/interfaces/IICS27Account.sol new file mode 100644 index 000000000..9529bc7c9 --- /dev/null +++ b/contracts/interfaces/IICS27Account.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +interface IICS27Account { + /// @notice This is a wrapper around openzeppelin's `Address.sendValue`. + /// @dev This function can only be called by self. + function sendValue(address payable recipient, uint256 amount) external; + + /// @notice Performs a Solidity function call using a low level `call`. + /// @dev This is a wrapper around openzeppelin's `Address.functionCall`. + /// @dev This function can only be called by ICS27. + /// @param target The target address to call + /// @param data The data to send to the target address + /// @return result The result of the call + function functionCall(address target, bytes memory data) external returns (bytes memory result); + + /// @notice Performs a Solidity function call using a low level `call`. + /// @dev This is a wrapper around openzeppelin's `Address.functionCallWithValue`. + /// @dev This function can only be called by self. + /// @param target The target address to call + /// @param data The data to send to the target address + /// @param value The value to send to the target address + /// @return result The result of the call + function functionCallWithValue(address target, bytes memory data, uint256 value) external returns (bytes memory result); + + /// @notice Performs a Solidity function call using a low level `delegatecall`. + /// @dev This is a wrapper around openzeppelin's `Address.functionDelegateCall`. + /// @dev This function can only be called by self. + /// @param target The target address to call + /// @param data The data to send to the target address + /// @return result The result of the call + function functionDelegateCall(address target, bytes calldata data) external returns (bytes memory result); + + + /// @notice Get the ICS27 contract address + /// @return The ICS27 contract address + function ics27() external view returns (address); + + /// @notice Initializes the ICS27Account contract + /// @dev This function is meant to be called by a proxy + /// @param ics27_ The ICS27GMP contract address + function initialize(address ics27_) external; +} diff --git a/contracts/utils/ICS27Account.sol b/contracts/utils/ICS27Account.sol new file mode 100644 index 000000000..be546dbd6 --- /dev/null +++ b/contracts/utils/ICS27Account.sol @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +import { IICS27Errors } from "../errors/IICS27Errors.sol"; +import { IICS27Account } from "../interfaces/IICS27Account.sol"; + +import { ContextUpgradeable } from "@openzeppelin-upgradeable/utils/ContextUpgradeable.sol"; +import { Address } from "@openzeppelin-contracts/utils/Address.sol"; + +contract ICS27Account is IICS27Errors, IICS27Account, ContextUpgradeable { + /// @notice Storage of the ICS27Account contract + /// @dev It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions when using with + /// upgradeable contracts. + /// @param _ics27 The ICS27GMP contract address. Immutable. + /// @custom:storage-location erc7201:ibc.storage.ICS27GMP + struct ICS27AccountStorage { + address _ics27; + } + + /// @notice ERC-7201 slot for the ICS27Account storage + /// @dev keccak256(abi.encode(uint256(keccak256("ibc.storage.ICS27Account")) - 1)) & ~bytes32(uint256(0xff)) + bytes32 private constant ICS27ACCOUNT_STORAGE_SLOT = + 0x319583b012a10c350515da7d8fdefe3c302490627bf79c0be5b739020ce32c00; + + /// @dev This contract is meant to be deployed by a proxy, so the constructor is not used + constructor() { + _disableInitializers(); + } + + /// @inheritdoc IICS27Account + function initialize(address ics27_) external initializer { + __Context_init(); + + ICS27AccountStorage storage $ = _getICS27AccountStorage(); + $._ics27 = ics27_; + } + + /// @inheritdoc IICS27Account + function sendValue(address payable recipient, uint256 amount) external onlySelf { + Address.sendValue(recipient, amount); + } + + /// @inheritdoc IICS27Account + function functionCall(address target, bytes memory data) external onlyICS27 returns (bytes memory) { + return Address.functionCall(target, data); + } + + /// @inheritdoc IICS27Account + function functionCallWithValue(address target, bytes memory data, uint256 value) external onlySelf returns (bytes memory) { + return Address.functionCallWithValue(target, data, value); + } + + /// @inheritdoc IICS27Account + function functionDelegateCall(address target, bytes calldata data) external onlySelf returns (bytes memory) { + return Address.functionDelegateCall(target, data); + } + + /// @inheritdoc IICS27Account + function ics27() external view returns (address) { + return _getICS27AccountStorage()._ics27; + } + + /// @notice Returns the storage of the ICS27Account contract + function _getICS27AccountStorage() private pure returns (ICS27AccountStorage storage $) { + // solhint-disable-next-line no-inline-assembly + assembly { + $.slot := ICS27ACCOUNT_STORAGE_SLOT + } + } + + modifier onlyICS27() { + address ics27_ = _getICS27AccountStorage()._ics27; + require(_msgSender() == ics27_, Unauthorized(ics27_, _msgSender())); + _; + } + + modifier onlySelf() { + require(_msgSender() == address(this), Unauthorized(address(this), _msgSender())); + _; + } +} From e4d2a429261ade408ee23b05c645118aabc57cf6 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 17 Apr 2025 15:23:13 +0300 Subject: [PATCH 08/79] imp: add more boilerplate --- contracts/ICS27GMP.sol | 28 ++++++++++++++++++++++++++++ contracts/interfaces/IICS27GMP.sol | 14 ++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/contracts/ICS27GMP.sol b/contracts/ICS27GMP.sol index 26c130b40..b4f89c4d8 100644 --- a/contracts/ICS27GMP.sol +++ b/contracts/ICS27GMP.sol @@ -13,6 +13,7 @@ import { ReentrancyGuardTransientUpgradeable } from "@openzeppelin-upgradeable/utils/ReentrancyGuardTransientUpgradeable.sol"; import { MulticallUpgradeable } from "@openzeppelin-upgradeable/utils/MulticallUpgradeable.sol"; import { Strings } from "@openzeppelin-contracts/utils/Strings.sol"; +import { UpgradeableBeacon } from "@openzeppelin-contracts/proxy/beacon/UpgradeableBeacon.sol"; import { ICS27Lib } from "./utils/ICS27Lib.sol"; /// @title ICS27 General Message Passing @@ -22,9 +23,11 @@ contract ICS27GMP is IICS27GMP, IIBCApp, ReentrancyGuardTransientUpgradeable, Mu /// @dev It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions when using with /// upgradeable contracts. /// @param _ics26 The ICS26Router contract address. Immutable. + /// @param _accountBeacon The address of the ICS27Account beacon contract. Immutable. /// @custom:storage-location erc7201:ibc.storage.ICS27GMP struct ICS27GMPStorage { IICS26Router _ics26; + UpgradeableBeacon _accountBeacon; } /// @notice ERC-7201 slot for the ICS27GMP storage @@ -32,6 +35,31 @@ contract ICS27GMP is IICS27GMP, IIBCApp, ReentrancyGuardTransientUpgradeable, Mu bytes32 private constant ICS27GMP_STORAGE_SLOT = 0xe73deb02cd654f25b90ec94b434589ea350a706e2446d278b41c3a86dc8f4500; + /// @dev This contract is meant to be deployed by a proxy, so the constructor is not used + constructor() { + _disableInitializers(); + } + + /// @inheritdoc IICS27GMP + function initialize(address ics26_, address accountLogic) external initializer { + __ReentrancyGuardTransient_init(); + __Multicall_init(); + + ICS27GMPStorage storage $ = _getICS27GMPStorage(); + $._ics26 = IICS26Router(ics26_); + $._accountBeacon = new UpgradeableBeacon(accountLogic, address(this)); + } + + /// @inheritdoc IICS27GMP + function ics26() external view returns (address) { + return address(_getICS27GMPStorage()._ics26); + } + + /// @inheritdoc IICS27GMP + function getAccountBeacon() external view returns (address) { + return address(_getICS27GMPStorage()._accountBeacon); + } + /// @inheritdoc IICS27GMP function sendCall(IICS27GMPMsgs.SendCallMsg calldata msg_) external nonReentrant returns (uint64) { IICS27GMPMsgs.GMPPacketData memory packetData = IICS27GMPMsgs.GMPPacketData({ diff --git a/contracts/interfaces/IICS27GMP.sol b/contracts/interfaces/IICS27GMP.sol index d33cdd16c..613211996 100644 --- a/contracts/interfaces/IICS27GMP.sol +++ b/contracts/interfaces/IICS27GMP.sol @@ -4,8 +4,22 @@ pragma solidity ^0.8.28; import { IICS27GMPMsgs } from "../msgs/IICS27GMPMsgs.sol"; interface IICS27GMP { + /// @notice The address of the ICS26Router contract + /// @return The address of the ICS26Router contract + function ics26() external view returns (address); + + /// @notice Retrieve the Account beacon contract address + /// @return The Escrow beacon contract address + function getAccountBeacon() external view returns (address); + /// @notice Send a GMP packet by calling IICS26Router.sendPacket /// @param msg_ The message for sending a GMP packet /// @return sequence The sequence number of the packet created function sendCall(IICS27GMPMsgs.SendCallMsg calldata msg_) external returns (uint64 sequence); + + /// @notice Initializes the contract instead of a constructor + /// @dev Meant to be called only once from the proxy + /// @param ics26_ The ICS26Router contract address + /// @param accountLogic The address of the ICS27Account logic contract + function initialize(address ics26_, address accountLogic) external; } From 3ad7f88e41eecc25e6015ea594aed4b51fb4d7dd Mon Sep 17 00:00:00 2001 From: srdtrk Date: Sat, 19 Apr 2025 12:18:50 +0300 Subject: [PATCH 09/79] imp: add account creation code --- contracts/ICS27GMP.sol | 54 ++++++++++++++++++++++++++++++ contracts/interfaces/IICS27GMP.sol | 8 +++++ contracts/msgs/IICS27GMPMsgs.sol | 11 ++++++ contracts/utils/ICS27Lib.sol | 28 ++++++++++++++++ 4 files changed, 101 insertions(+) diff --git a/contracts/ICS27GMP.sol b/contracts/ICS27GMP.sol index b4f89c4d8..75b0a1a71 100644 --- a/contracts/ICS27GMP.sol +++ b/contracts/ICS27GMP.sol @@ -8,11 +8,13 @@ import { IIBCAppCallbacks } from "./msgs/IIBCAppCallbacks.sol"; import { IICS26Router } from "./interfaces/IICS26Router.sol"; import { IIBCApp } from "./interfaces/IIBCApp.sol"; import { IICS27GMP } from "./interfaces/IICS27GMP.sol"; +import { IICS27Account } from "./interfaces/IICS27Account.sol"; import { ReentrancyGuardTransientUpgradeable } from "@openzeppelin-upgradeable/utils/ReentrancyGuardTransientUpgradeable.sol"; import { MulticallUpgradeable } from "@openzeppelin-upgradeable/utils/MulticallUpgradeable.sol"; import { Strings } from "@openzeppelin-contracts/utils/Strings.sol"; +import { Create2 } from "@openzeppelin-contracts/utils/Create2.sol"; import { UpgradeableBeacon } from "@openzeppelin-contracts/proxy/beacon/UpgradeableBeacon.sol"; import { ICS27Lib } from "./utils/ICS27Lib.sol"; @@ -22,10 +24,12 @@ contract ICS27GMP is IICS27GMP, IIBCApp, ReentrancyGuardTransientUpgradeable, Mu /// @notice Storage of the ICS27GMP contract /// @dev It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions when using with /// upgradeable contracts. + /// @param _accounts The mapping of account identifiers to account contracts. /// @param _ics26 The ICS26Router contract address. Immutable. /// @param _accountBeacon The address of the ICS27Account beacon contract. Immutable. /// @custom:storage-location erc7201:ibc.storage.ICS27GMP struct ICS27GMPStorage { + mapping(bytes32 accountIdHash => IICS27Account account) _accounts; IICS26Router _ics26; UpgradeableBeacon _accountBeacon; } @@ -100,6 +104,56 @@ contract ICS27GMP is IICS27GMP, IIBCApp, ReentrancyGuardTransientUpgradeable, Mu revert("TODO: Not implemented"); } + /// @notice Creates or retrieves an account contract for the given account identifier + /// @param accountId The account identifier + /// @return account The account contract address + function _getOrCreateAccount( + IICS27GMPMsgs.AccountIdentifier calldata accountId + ) private returns (IICS27Account) { + ICS27GMPStorage storage $ = _getICS27GMPStorage(); + + bytes32 accountIdHash = keccak256(abi.encode(accountId)); + IICS27Account account = $._accounts[accountIdHash]; + if (address(account) != address(0)) { + return account; + } + + bytes memory bytecode = ICS27Lib.getBeaconProxyBytecode( + address($._accountBeacon), + address(this) + ); + address accountAddress = Create2.deploy( + 0, + accountIdHash, + bytecode + ); + + $._accounts[accountIdHash] = IICS27Account(accountAddress); + return IICS27Account(accountAddress); + } + + /// @inheritdoc IICS27GMP + function getOrComputeAccountAddress( + IICS27GMPMsgs.AccountIdentifier calldata accountId + ) external view returns (address) { + ICS27GMPStorage storage $ = _getICS27GMPStorage(); + + bytes32 accountIdHash = keccak256(abi.encode(accountId)); + address account = address($._accounts[accountIdHash]); + if (account != address(0)) { + return account; + } + + bytes32 codeHash = ICS27Lib.getBeaconProxyCodeHash( + address($._accountBeacon), + address(this) + ); + return Create2.computeAddress( + accountIdHash, + codeHash + ); + } + /// @notice Returns the storage of the ICS27GMP contract function _getICS27GMPStorage() private pure returns (ICS27GMPStorage storage $) { // solhint-disable-next-line no-inline-assembly diff --git a/contracts/interfaces/IICS27GMP.sol b/contracts/interfaces/IICS27GMP.sol index 613211996..7cf8c41c1 100644 --- a/contracts/interfaces/IICS27GMP.sol +++ b/contracts/interfaces/IICS27GMP.sol @@ -12,6 +12,14 @@ interface IICS27GMP { /// @return The Escrow beacon contract address function getAccountBeacon() external view returns (address); + /// @notice Retrieve the Account (proxy) contract address + /// @dev This is view instead of pure in case we change the proxy bytecode + /// @param accountId The account identifier + /// @return The (proxy) Account contract address + function getOrComputeAccountAddress( + IICS27GMPMsgs.AccountIdentifier calldata accountId + ) external view returns (address); + /// @notice Send a GMP packet by calling IICS26Router.sendPacket /// @param msg_ The message for sending a GMP packet /// @return sequence The sequence number of the packet created diff --git a/contracts/msgs/IICS27GMPMsgs.sol b/contracts/msgs/IICS27GMPMsgs.sol index e56e7e440..19f730dfa 100644 --- a/contracts/msgs/IICS27GMPMsgs.sol +++ b/contracts/msgs/IICS27GMPMsgs.sol @@ -37,4 +37,15 @@ interface IICS27GMPMsgs { struct GMPAcknowledgement { bytes result; } + + /// @notice AccountIdentifier is used to identify a ICS27 account. + /// @dev The keccak256 hash of abi.encode(AccountIdentifier) is used as the create2 salt + /// @param clientId The (local) client identifier + /// @param sender The sender of the packet + /// @param salt The salt of the packet + struct AccountIdentifier { + string clientId; + string sender; + bytes salt; + } } diff --git a/contracts/utils/ICS27Lib.sol b/contracts/utils/ICS27Lib.sol index 46b61e1f3..93d6fd871 100644 --- a/contracts/utils/ICS27Lib.sol +++ b/contracts/utils/ICS27Lib.sol @@ -1,6 +1,9 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.28; +import { IICS27Account } from "../interfaces/IICS27Account.sol"; +import { BeaconProxy } from "@openzeppelin-contracts/proxy/beacon/BeaconProxy.sol"; + library ICS27Lib { /// @notice ICS27_VERSION is the version string for ICS27 packet data. string internal constant ICS27_VERSION = "ics27-2"; @@ -17,4 +20,29 @@ library ICS27Lib { /// @notice KECCAK256_ICS27_ENCODING is the keccak256 hash of the ICS27_ENCODING. bytes32 internal constant KECCAK256_ICS27_ENCODING = keccak256(bytes(ICS27_ENCODING)); + /// @notice Retrieve the deployment bytecode of the BeaconProxy contract. + /// @param beacon The address of the beacon contract. + /// @param ics27 The address of the ICS27 contract. + /// @return The deployment bytecode of the BeaconProxy contract. + function getBeaconProxyBytecode( + address beacon, + address ics27 + ) internal pure returns (bytes memory) { + return + abi.encodePacked( + type(BeaconProxy).creationCode, + abi.encode(beacon, abi.encodeCall(IICS27Account.initialize, (ics27))) + ); + } + + /// @notice Compute the code hash of the BeaconProxy contract. + /// @param beacon The address of the beacon contract. + /// @param ics27 The address of the ICS27 contract. + /// @return The code hash of the BeaconProxy contract. + function getBeaconProxyCodeHash( + address beacon, + address ics27 + ) internal pure returns (bytes32) { + return keccak256(getBeaconProxyBytecode(beacon, ics27)); + } } From 3ab2de99890feee04940c814cf57bc3c5e916dbf Mon Sep 17 00:00:00 2001 From: srdtrk Date: Sat, 19 Apr 2025 12:42:29 +0300 Subject: [PATCH 10/79] imp: added 'onRecvPacket' --- contracts/ICS27GMP.sol | 42 ++++++++++++++++++++++++++++--- contracts/errors/IICS27Errors.sol | 23 +++++++++++++++-- contracts/utils/ICS27Account.sol | 4 +-- contracts/utils/ICS27Lib.sol | 3 +++ 4 files changed, 65 insertions(+), 7 deletions(-) diff --git a/contracts/ICS27GMP.sol b/contracts/ICS27GMP.sol index 75b0a1a71..87c0603e6 100644 --- a/contracts/ICS27GMP.sol +++ b/contracts/ICS27GMP.sol @@ -9,6 +9,7 @@ import { IICS26Router } from "./interfaces/IICS26Router.sol"; import { IIBCApp } from "./interfaces/IIBCApp.sol"; import { IICS27GMP } from "./interfaces/IICS27GMP.sol"; import { IICS27Account } from "./interfaces/IICS27Account.sol"; +import { IICS27Errors } from "./errors/IICS27Errors.sol"; import { ReentrancyGuardTransientUpgradeable } from "@openzeppelin-upgradeable/utils/ReentrancyGuardTransientUpgradeable.sol"; @@ -20,7 +21,7 @@ import { ICS27Lib } from "./utils/ICS27Lib.sol"; /// @title ICS27 General Message Passing /// @notice This contract is the implementation of the ics27-2 IBC specification for general message passing. -contract ICS27GMP is IICS27GMP, IIBCApp, ReentrancyGuardTransientUpgradeable, MulticallUpgradeable { +contract ICS27GMP is IICS27Errors, IICS27GMP, IIBCApp, ReentrancyGuardTransientUpgradeable, MulticallUpgradeable { /// @notice Storage of the ICS27GMP contract /// @dev It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions when using with /// upgradeable contracts. @@ -91,7 +92,42 @@ contract ICS27GMP is IICS27GMP, IIBCApp, ReentrancyGuardTransientUpgradeable, Mu /// @inheritdoc IIBCApp function onRecvPacket(IIBCAppCallbacks.OnRecvPacketCallback calldata msg_) external nonReentrant returns (bytes memory) { - revert("TODO: Not implemented"); + require( + keccak256(bytes(msg_.payload.version)) == ICS27Lib.KECCAK256_ICS27_VERSION, + ICS27UnexpectedVersion(ICS27Lib.ICS27_VERSION, msg_.payload.version) + ); + require( + keccak256(bytes(msg_.payload.sourcePort)) == ICS27Lib.KECCAK256_DEFAULT_PORT_ID, + ICS27InvalidPort(ICS27Lib.DEFAULT_PORT_ID, msg_.payload.sourcePort) + ); + require( + keccak256(bytes(msg_.payload.encoding)) == ICS27Lib.KECCAK256_ICS27_ENCODING, + ICS27UnexpectedEncoding(ICS27Lib.ICS27_ENCODING, msg_.payload.encoding) + ); + require( + keccak256(bytes(msg_.payload.destPort)) == ICS27Lib.KECCAK256_DEFAULT_PORT_ID, + ICS27InvalidPort(ICS27Lib.DEFAULT_PORT_ID, msg_.payload.destPort) + ); + + IICS27GMPMsgs.GMPPacketData memory packetData = abi.decode( + msg_.payload.value, + (IICS27GMPMsgs.GMPPacketData) + ); + + IICS27GMPMsgs.AccountIdentifier memory accountId = IICS27GMPMsgs.AccountIdentifier({ + clientId: msg_.destinationClient, + sender: packetData.sender, + salt: packetData.salt + }); + IICS27Account account = _getOrCreateAccount(accountId); + + (bool success, address receiver) = Strings.tryParseAddress(packetData.receiver); + require(success, ICS27InvalidReceiver(packetData.receiver)); + + return account.functionCall( + receiver, + packetData.payload + ); } /// @inheritdoc IIBCApp @@ -108,7 +144,7 @@ contract ICS27GMP is IICS27GMP, IIBCApp, ReentrancyGuardTransientUpgradeable, Mu /// @param accountId The account identifier /// @return account The account contract address function _getOrCreateAccount( - IICS27GMPMsgs.AccountIdentifier calldata accountId + IICS27GMPMsgs.AccountIdentifier memory accountId ) private returns (IICS27Account) { ICS27GMPStorage storage $ = _getICS27GMPStorage(); diff --git a/contracts/errors/IICS27Errors.sol b/contracts/errors/IICS27Errors.sol index f04a1303a..91f70fa98 100644 --- a/contracts/errors/IICS27Errors.sol +++ b/contracts/errors/IICS27Errors.sol @@ -4,10 +4,29 @@ pragma solidity ^0.8.28; interface IICS27Errors { /// @notice Invalid address /// @param addr Address of the sender or receiver - error InvalidAddress(string addr); + error ICS27InvalidAddress(string addr); /// @notice Unauthorized function call /// @param expected The expected address /// @param caller The caller of the function - error Unauthorized(address expected, address caller); + error ICS27Unauthorized(address expected, address caller); + + /// @notice Unexpected packet data version + /// @param expected expected version of the packet data + /// @param version actual version of the packet data + error ICS27UnexpectedVersion(string expected, string version); + + /// @notice Unexpected packet data encoding + /// @param expected expected encoding of the packet data + /// @param actual actual encoding of the packet data + error ICS27UnexpectedEncoding(string expected, string actual); + + /// @notice Invalid port + /// @param expected Expected port + /// @param actual Actual port + error ICS27InvalidPort(string expected, string actual); + + /// @notice Invalid receiver + /// @param receiver The receiver address of the contract call + error ICS27InvalidReceiver(string receiver); } diff --git a/contracts/utils/ICS27Account.sol b/contracts/utils/ICS27Account.sol index be546dbd6..8652c98c0 100644 --- a/contracts/utils/ICS27Account.sol +++ b/contracts/utils/ICS27Account.sol @@ -70,12 +70,12 @@ contract ICS27Account is IICS27Errors, IICS27Account, ContextUpgradeable { modifier onlyICS27() { address ics27_ = _getICS27AccountStorage()._ics27; - require(_msgSender() == ics27_, Unauthorized(ics27_, _msgSender())); + require(_msgSender() == ics27_, ICS27Unauthorized(ics27_, _msgSender())); _; } modifier onlySelf() { - require(_msgSender() == address(this), Unauthorized(address(this), _msgSender())); + require(_msgSender() == address(this), ICS27Unauthorized(address(this), _msgSender())); _; } } diff --git a/contracts/utils/ICS27Lib.sol b/contracts/utils/ICS27Lib.sol index 93d6fd871..a3b7c1820 100644 --- a/contracts/utils/ICS27Lib.sol +++ b/contracts/utils/ICS27Lib.sol @@ -20,6 +20,9 @@ library ICS27Lib { /// @notice KECCAK256_ICS27_ENCODING is the keccak256 hash of the ICS27_ENCODING. bytes32 internal constant KECCAK256_ICS27_ENCODING = keccak256(bytes(ICS27_ENCODING)); + /// @notice KECCAK256_DEFAULT_PORT_ID is the keccak256 hash of the DEFAULT_PORT_ID. + bytes32 internal constant KECCAK256_DEFAULT_PORT_ID = keccak256(bytes(DEFAULT_PORT_ID)); + /// @notice Retrieve the deployment bytecode of the BeaconProxy contract. /// @param beacon The address of the beacon contract. /// @param ics27 The address of the ICS27 contract. From 042f55cfd4eb5bc1698ec6a3719d599f359d41fd Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 24 Apr 2025 08:26:08 +0300 Subject: [PATCH 11/79] feat: full impl --- contracts/ICS27GMP.sol | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/contracts/ICS27GMP.sol b/contracts/ICS27GMP.sol index 87c0603e6..9fcc36099 100644 --- a/contracts/ICS27GMP.sol +++ b/contracts/ICS27GMP.sol @@ -91,7 +91,7 @@ contract ICS27GMP is IICS27Errors, IICS27GMP, IIBCApp, ReentrancyGuardTransientU } /// @inheritdoc IIBCApp - function onRecvPacket(IIBCAppCallbacks.OnRecvPacketCallback calldata msg_) external nonReentrant returns (bytes memory) { + function onRecvPacket(IIBCAppCallbacks.OnRecvPacketCallback calldata msg_) external nonReentrant onlyRouter returns (bytes memory) { require( keccak256(bytes(msg_.payload.version)) == ICS27Lib.KECCAK256_ICS27_VERSION, ICS27UnexpectedVersion(ICS27Lib.ICS27_VERSION, msg_.payload.version) @@ -131,14 +131,12 @@ contract ICS27GMP is IICS27Errors, IICS27GMP, IIBCApp, ReentrancyGuardTransientU } /// @inheritdoc IIBCApp - function onAcknowledgementPacket(IIBCAppCallbacks.OnAcknowledgementPacketCallback calldata msg_) nonReentrant external { - revert("TODO: Not implemented"); - } + function onAcknowledgementPacket(IIBCAppCallbacks.OnAcknowledgementPacketCallback calldata msg_) nonReentrant onlyRouter external { } + // solhint-disable-previous-line no-empty-blocks /// @inheritdoc IIBCApp - function onTimeoutPacket(IIBCAppCallbacks.OnTimeoutPacketCallback calldata msg_) nonReentrant external { - revert("TODO: Not implemented"); - } + function onTimeoutPacket(IIBCAppCallbacks.OnTimeoutPacketCallback calldata msg_) nonReentrant onlyRouter external { } + // solhint-disable-previous-line no-empty-blocks /// @notice Creates or retrieves an account contract for the given account identifier /// @param accountId The account identifier @@ -197,4 +195,13 @@ contract ICS27GMP is IICS27Errors, IICS27GMP, IIBCApp, ReentrancyGuardTransientU $.slot := ICS27GMP_STORAGE_SLOT } } + + modifier onlyRouter() { + address router = address(_getICS27GMPStorage()._ics26); + require( + _msgSender() == router, + ICS27Unauthorized(router, _msgSender()) + ); + _; + } } From 6f2784766915638a5920cfc778eb4a1c9c8034cb Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 24 Apr 2025 08:29:28 +0300 Subject: [PATCH 12/79] imp: forge fmt --- contracts/ICS27GMP.sol | 66 ++++++++++---------------- contracts/interfaces/IICS27Account.sol | 9 +++- contracts/interfaces/IICS27GMP.sol | 7 +-- contracts/utils/ICS27Account.sol | 10 +++- contracts/utils/ICS27Lib.sol | 18 ++----- 5 files changed, 51 insertions(+), 59 deletions(-) diff --git a/contracts/ICS27GMP.sol b/contracts/ICS27GMP.sol index 9fcc36099..aeeac37d6 100644 --- a/contracts/ICS27GMP.sol +++ b/contracts/ICS27GMP.sol @@ -37,8 +37,7 @@ contract ICS27GMP is IICS27Errors, IICS27GMP, IIBCApp, ReentrancyGuardTransientU /// @notice ERC-7201 slot for the ICS27GMP storage /// @dev keccak256(abi.encode(uint256(keccak256("ibc.storage.ICS27GMP")) - 1)) & ~bytes32(uint256(0xff)) - bytes32 private constant ICS27GMP_STORAGE_SLOT = - 0xe73deb02cd654f25b90ec94b434589ea350a706e2446d278b41c3a86dc8f4500; + bytes32 private constant ICS27GMP_STORAGE_SLOT = 0xe73deb02cd654f25b90ec94b434589ea350a706e2446d278b41c3a86dc8f4500; /// @dev This contract is meant to be deployed by a proxy, so the constructor is not used constructor() { @@ -91,7 +90,12 @@ contract ICS27GMP is IICS27Errors, IICS27GMP, IIBCApp, ReentrancyGuardTransientU } /// @inheritdoc IIBCApp - function onRecvPacket(IIBCAppCallbacks.OnRecvPacketCallback calldata msg_) external nonReentrant onlyRouter returns (bytes memory) { + function onRecvPacket(IIBCAppCallbacks.OnRecvPacketCallback calldata msg_) + external + nonReentrant + onlyRouter + returns (bytes memory) + { require( keccak256(bytes(msg_.payload.version)) == ICS27Lib.KECCAK256_ICS27_VERSION, ICS27UnexpectedVersion(ICS27Lib.ICS27_VERSION, msg_.payload.version) @@ -109,10 +113,7 @@ contract ICS27GMP is IICS27Errors, IICS27GMP, IIBCApp, ReentrancyGuardTransientU ICS27InvalidPort(ICS27Lib.DEFAULT_PORT_ID, msg_.payload.destPort) ); - IICS27GMPMsgs.GMPPacketData memory packetData = abi.decode( - msg_.payload.value, - (IICS27GMPMsgs.GMPPacketData) - ); + IICS27GMPMsgs.GMPPacketData memory packetData = abi.decode(msg_.payload.value, (IICS27GMPMsgs.GMPPacketData)); IICS27GMPMsgs.AccountIdentifier memory accountId = IICS27GMPMsgs.AccountIdentifier({ clientId: msg_.destinationClient, @@ -124,26 +125,25 @@ contract ICS27GMP is IICS27Errors, IICS27GMP, IIBCApp, ReentrancyGuardTransientU (bool success, address receiver) = Strings.tryParseAddress(packetData.receiver); require(success, ICS27InvalidReceiver(packetData.receiver)); - return account.functionCall( - receiver, - packetData.payload - ); + return account.functionCall(receiver, packetData.payload); } /// @inheritdoc IIBCApp - function onAcknowledgementPacket(IIBCAppCallbacks.OnAcknowledgementPacketCallback calldata msg_) nonReentrant onlyRouter external { } + function onAcknowledgementPacket(IIBCAppCallbacks.OnAcknowledgementPacketCallback calldata msg_) + external + nonReentrant + onlyRouter + { } // solhint-disable-previous-line no-empty-blocks /// @inheritdoc IIBCApp - function onTimeoutPacket(IIBCAppCallbacks.OnTimeoutPacketCallback calldata msg_) nonReentrant onlyRouter external { } + function onTimeoutPacket(IIBCAppCallbacks.OnTimeoutPacketCallback calldata msg_) external nonReentrant onlyRouter { } // solhint-disable-previous-line no-empty-blocks /// @notice Creates or retrieves an account contract for the given account identifier /// @param accountId The account identifier /// @return account The account contract address - function _getOrCreateAccount( - IICS27GMPMsgs.AccountIdentifier memory accountId - ) private returns (IICS27Account) { + function _getOrCreateAccount(IICS27GMPMsgs.AccountIdentifier memory accountId) private returns (IICS27Account) { ICS27GMPStorage storage $ = _getICS27GMPStorage(); bytes32 accountIdHash = keccak256(abi.encode(accountId)); @@ -152,24 +152,19 @@ contract ICS27GMP is IICS27Errors, IICS27GMP, IIBCApp, ReentrancyGuardTransientU return account; } - bytes memory bytecode = ICS27Lib.getBeaconProxyBytecode( - address($._accountBeacon), - address(this) - ); - address accountAddress = Create2.deploy( - 0, - accountIdHash, - bytecode - ); + bytes memory bytecode = ICS27Lib.getBeaconProxyBytecode(address($._accountBeacon), address(this)); + address accountAddress = Create2.deploy(0, accountIdHash, bytecode); $._accounts[accountIdHash] = IICS27Account(accountAddress); return IICS27Account(accountAddress); } /// @inheritdoc IICS27GMP - function getOrComputeAccountAddress( - IICS27GMPMsgs.AccountIdentifier calldata accountId - ) external view returns (address) { + function getOrComputeAccountAddress(IICS27GMPMsgs.AccountIdentifier calldata accountId) + external + view + returns (address) + { ICS27GMPStorage storage $ = _getICS27GMPStorage(); bytes32 accountIdHash = keccak256(abi.encode(accountId)); @@ -178,14 +173,8 @@ contract ICS27GMP is IICS27Errors, IICS27GMP, IIBCApp, ReentrancyGuardTransientU return account; } - bytes32 codeHash = ICS27Lib.getBeaconProxyCodeHash( - address($._accountBeacon), - address(this) - ); - return Create2.computeAddress( - accountIdHash, - codeHash - ); + bytes32 codeHash = ICS27Lib.getBeaconProxyCodeHash(address($._accountBeacon), address(this)); + return Create2.computeAddress(accountIdHash, codeHash); } /// @notice Returns the storage of the ICS27GMP contract @@ -198,10 +187,7 @@ contract ICS27GMP is IICS27Errors, IICS27GMP, IIBCApp, ReentrancyGuardTransientU modifier onlyRouter() { address router = address(_getICS27GMPStorage()._ics26); - require( - _msgSender() == router, - ICS27Unauthorized(router, _msgSender()) - ); + require(_msgSender() == router, ICS27Unauthorized(router, _msgSender())); _; } } diff --git a/contracts/interfaces/IICS27Account.sol b/contracts/interfaces/IICS27Account.sol index 9529bc7c9..33c1ab2a9 100644 --- a/contracts/interfaces/IICS27Account.sol +++ b/contracts/interfaces/IICS27Account.sol @@ -21,7 +21,13 @@ interface IICS27Account { /// @param data The data to send to the target address /// @param value The value to send to the target address /// @return result The result of the call - function functionCallWithValue(address target, bytes memory data, uint256 value) external returns (bytes memory result); + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) + external + returns (bytes memory result); /// @notice Performs a Solidity function call using a low level `delegatecall`. /// @dev This is a wrapper around openzeppelin's `Address.functionDelegateCall`. @@ -31,7 +37,6 @@ interface IICS27Account { /// @return result The result of the call function functionDelegateCall(address target, bytes calldata data) external returns (bytes memory result); - /// @notice Get the ICS27 contract address /// @return The ICS27 contract address function ics27() external view returns (address); diff --git a/contracts/interfaces/IICS27GMP.sol b/contracts/interfaces/IICS27GMP.sol index 7cf8c41c1..a2e65fa4d 100644 --- a/contracts/interfaces/IICS27GMP.sol +++ b/contracts/interfaces/IICS27GMP.sol @@ -16,9 +16,10 @@ interface IICS27GMP { /// @dev This is view instead of pure in case we change the proxy bytecode /// @param accountId The account identifier /// @return The (proxy) Account contract address - function getOrComputeAccountAddress( - IICS27GMPMsgs.AccountIdentifier calldata accountId - ) external view returns (address); + function getOrComputeAccountAddress(IICS27GMPMsgs.AccountIdentifier calldata accountId) + external + view + returns (address); /// @notice Send a GMP packet by calling IICS26Router.sendPacket /// @param msg_ The message for sending a GMP packet diff --git a/contracts/utils/ICS27Account.sol b/contracts/utils/ICS27Account.sol index 8652c98c0..c408d6749 100644 --- a/contracts/utils/ICS27Account.sol +++ b/contracts/utils/ICS27Account.sol @@ -46,7 +46,15 @@ contract ICS27Account is IICS27Errors, IICS27Account, ContextUpgradeable { } /// @inheritdoc IICS27Account - function functionCallWithValue(address target, bytes memory data, uint256 value) external onlySelf returns (bytes memory) { + function functionCallWithValue( + address target, + bytes memory data, + uint256 value + ) + external + onlySelf + returns (bytes memory) + { return Address.functionCallWithValue(target, data, value); } diff --git a/contracts/utils/ICS27Lib.sol b/contracts/utils/ICS27Lib.sol index a3b7c1820..855b2a0d4 100644 --- a/contracts/utils/ICS27Lib.sol +++ b/contracts/utils/ICS27Lib.sol @@ -27,25 +27,17 @@ library ICS27Lib { /// @param beacon The address of the beacon contract. /// @param ics27 The address of the ICS27 contract. /// @return The deployment bytecode of the BeaconProxy contract. - function getBeaconProxyBytecode( - address beacon, - address ics27 - ) internal pure returns (bytes memory) { - return - abi.encodePacked( - type(BeaconProxy).creationCode, - abi.encode(beacon, abi.encodeCall(IICS27Account.initialize, (ics27))) - ); + function getBeaconProxyBytecode(address beacon, address ics27) internal pure returns (bytes memory) { + return abi.encodePacked( + type(BeaconProxy).creationCode, abi.encode(beacon, abi.encodeCall(IICS27Account.initialize, (ics27))) + ); } /// @notice Compute the code hash of the BeaconProxy contract. /// @param beacon The address of the beacon contract. /// @param ics27 The address of the ICS27 contract. /// @return The code hash of the BeaconProxy contract. - function getBeaconProxyCodeHash( - address beacon, - address ics27 - ) internal pure returns (bytes32) { + function getBeaconProxyCodeHash(address beacon, address ics27) internal pure returns (bytes32) { return keccak256(getBeaconProxyBytecode(beacon, ics27)); } } From f0e65ece049e98a75d41d56c73a280bb4499d405 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 24 Apr 2025 13:47:44 +0300 Subject: [PATCH 13/79] imp: removed unused test --- test/solidity-ibc/Integration3Test.t.sol | 37 ------------------------ 1 file changed, 37 deletions(-) diff --git a/test/solidity-ibc/Integration3Test.t.sol b/test/solidity-ibc/Integration3Test.t.sol index 5b575306f..53a915f40 100644 --- a/test/solidity-ibc/Integration3Test.t.sol +++ b/test/solidity-ibc/Integration3Test.t.sol @@ -68,43 +68,6 @@ contract Integration3Test is Test { ); } - function setup_createForeignDenomOnImplA(address receiver, uint256 amount) public returns (IERC20) { - return setup_createForeignDenomOnImplA(receiver, amount, th.FIRST_CLIENT_ID()); - } - /// @notice Create a foreign ibc denom on ibcImplA and client on a specified user - /// @dev We do this by transferring the native erc20 from the counterparty chain - - function setup_createForeignDenomOnImplA( - address receiver, - uint256 amount, - string memory clientId - ) - public - returns (IERC20) - { - address user = integrationEnv.createAndFundUser(amount); - - IICS26RouterMsgs.Packet memory sentPacket = - ibcImplB.sendTransferAsUser(integrationEnv.erc20(), user, Strings.toHexString(receiver), amount, clientId); - - bytes[] memory acks = ibcImplA.recvPacket(sentPacket); - assertEq(acks.length, 1, "ack length mismatch"); - assertEq(acks, th.SINGLE_SUCCESS_ACK(), "ack mismatch"); - - ibcImplB.ackPacket(sentPacket, acks); - - string memory expDenomPath = string.concat( - ICS20Lib.DEFAULT_PORT_ID, - "/", - th.FIRST_CLIENT_ID(), - "/", - Strings.toHexString(address(integrationEnv.erc20())) - ); - address ibcERC20 = ibcImplA.ics20Transfer().ibcERC20Contract(expDenomPath); - - return IERC20(ibcERC20); - } - function testFuzz_success_forwardAndBack(uint256 amount) public { // There are three chains in this scenario: A -> B -> C vm.assume(amount > 0); From eff51afba0032828f775b0a729cfca636e25782c Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 24 Apr 2025 13:51:53 +0300 Subject: [PATCH 14/79] imp: added upgradability --- contracts/ICS27GMP.sol | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/contracts/ICS27GMP.sol b/contracts/ICS27GMP.sol index aeeac37d6..04a2c52bf 100644 --- a/contracts/ICS27GMP.sol +++ b/contracts/ICS27GMP.sol @@ -10,18 +10,20 @@ import { IIBCApp } from "./interfaces/IIBCApp.sol"; import { IICS27GMP } from "./interfaces/IICS27GMP.sol"; import { IICS27Account } from "./interfaces/IICS27Account.sol"; import { IICS27Errors } from "./errors/IICS27Errors.sol"; +import { IIBCUUPSUpgradeable } from "./interfaces/IIBCUUPSUpgradeable.sol"; import { ReentrancyGuardTransientUpgradeable } from "@openzeppelin-upgradeable/utils/ReentrancyGuardTransientUpgradeable.sol"; import { MulticallUpgradeable } from "@openzeppelin-upgradeable/utils/MulticallUpgradeable.sol"; import { Strings } from "@openzeppelin-contracts/utils/Strings.sol"; import { Create2 } from "@openzeppelin-contracts/utils/Create2.sol"; +import { UUPSUpgradeable } from "@openzeppelin-contracts/proxy/utils/UUPSUpgradeable.sol"; import { UpgradeableBeacon } from "@openzeppelin-contracts/proxy/beacon/UpgradeableBeacon.sol"; import { ICS27Lib } from "./utils/ICS27Lib.sol"; /// @title ICS27 General Message Passing /// @notice This contract is the implementation of the ics27-2 IBC specification for general message passing. -contract ICS27GMP is IICS27Errors, IICS27GMP, IIBCApp, ReentrancyGuardTransientUpgradeable, MulticallUpgradeable { +contract ICS27GMP is IICS27Errors, IICS27GMP, IIBCApp, ReentrancyGuardTransientUpgradeable, MulticallUpgradeable, UUPSUpgradeable { /// @notice Storage of the ICS27GMP contract /// @dev It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions when using with /// upgradeable contracts. @@ -185,9 +187,20 @@ contract ICS27GMP is IICS27Errors, IICS27GMP, IIBCApp, ReentrancyGuardTransientU } } + /// @inheritdoc UUPSUpgradeable + function _authorizeUpgrade(address) internal view override onlyAdmin { } + // solhint-disable-previous-line no-empty-blocks + modifier onlyRouter() { address router = address(_getICS27GMPStorage()._ics26); require(_msgSender() == router, ICS27Unauthorized(router, _msgSender())); _; } + + /// @notice Modifier to check if the caller is an admin via the ICS26Router contract + modifier onlyAdmin() { + address router = address(_getICS27GMPStorage()._ics26); + require(IIBCUUPSUpgradeable(router).isAdmin(_msgSender()), ICS27Unauthorized(router, _msgSender())); + _; + } } From 8fbc49e7feb7784e8ca6e68816eb41bba963ca9c Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 24 Apr 2025 13:54:26 +0300 Subject: [PATCH 15/79] doc: add item --- contracts/ICS27GMP.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/ICS27GMP.sol b/contracts/ICS27GMP.sol index 04a2c52bf..b74743072 100644 --- a/contracts/ICS27GMP.sol +++ b/contracts/ICS27GMP.sol @@ -191,6 +191,7 @@ contract ICS27GMP is IICS27Errors, IICS27GMP, IIBCApp, ReentrancyGuardTransientU function _authorizeUpgrade(address) internal view override onlyAdmin { } // solhint-disable-previous-line no-empty-blocks + /// @notice Modifier to check if the caller is the ICS26Router contract modifier onlyRouter() { address router = address(_getICS27GMPStorage()._ics26); require(_msgSender() == router, ICS27Unauthorized(router, _msgSender())); From bd9e59967cbd6a4042a9d94cbfe50b08149f4992 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 24 Apr 2025 14:02:17 +0300 Subject: [PATCH 16/79] imp: upgrade --- contracts/ICS27GMP.sol | 5 +++++ contracts/interfaces/IICS27GMP.sol | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/contracts/ICS27GMP.sol b/contracts/ICS27GMP.sol index b74743072..abdd0d707 100644 --- a/contracts/ICS27GMP.sol +++ b/contracts/ICS27GMP.sol @@ -187,6 +187,11 @@ contract ICS27GMP is IICS27Errors, IICS27GMP, IIBCApp, ReentrancyGuardTransientU } } + /// @inheritdoc IICS27GMP + function upgradeAccountTo(address newEscrowLogic) external onlyAdmin { + _getICS27GMPStorage()._accountBeacon.upgradeTo(newEscrowLogic); + } + /// @inheritdoc UUPSUpgradeable function _authorizeUpgrade(address) internal view override onlyAdmin { } // solhint-disable-previous-line no-empty-blocks diff --git a/contracts/interfaces/IICS27GMP.sol b/contracts/interfaces/IICS27GMP.sol index a2e65fa4d..e491adbcd 100644 --- a/contracts/interfaces/IICS27GMP.sol +++ b/contracts/interfaces/IICS27GMP.sol @@ -9,7 +9,7 @@ interface IICS27GMP { function ics26() external view returns (address); /// @notice Retrieve the Account beacon contract address - /// @return The Escrow beacon contract address + /// @return The account beacon contract address function getAccountBeacon() external view returns (address); /// @notice Retrieve the Account (proxy) contract address @@ -31,4 +31,9 @@ interface IICS27GMP { /// @param ics26_ The ICS26Router contract address /// @param accountLogic The address of the ICS27Account logic contract function initialize(address ics26_, address accountLogic) external; + + /// @notice Upgrades the implementation of the account beacon contract + /// @dev The caller must be the ICS26Router admin + /// @param newAccountLogic The address of the new account logic contract + function upgradeAccountTo(address newAccountLogic) external; } From 344007b48dccd5d6b04b385e019a77a652742581 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 24 Apr 2025 15:23:43 +0300 Subject: [PATCH 17/79] imp: adding helpers --- contracts/ICS27GMP.sol | 9 ++- test/solidity-ibc/utils/IbcImpl.sol | 100 ++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+), 1 deletion(-) diff --git a/contracts/ICS27GMP.sol b/contracts/ICS27GMP.sol index abdd0d707..19dca10f1 100644 --- a/contracts/ICS27GMP.sol +++ b/contracts/ICS27GMP.sol @@ -23,7 +23,14 @@ import { ICS27Lib } from "./utils/ICS27Lib.sol"; /// @title ICS27 General Message Passing /// @notice This contract is the implementation of the ics27-2 IBC specification for general message passing. -contract ICS27GMP is IICS27Errors, IICS27GMP, IIBCApp, ReentrancyGuardTransientUpgradeable, MulticallUpgradeable, UUPSUpgradeable { +contract ICS27GMP is + IICS27Errors, + IICS27GMP, + IIBCApp, + ReentrancyGuardTransientUpgradeable, + MulticallUpgradeable, + UUPSUpgradeable +{ /// @notice Storage of the ICS27GMP contract /// @dev It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions when using with /// upgradeable contracts. diff --git a/test/solidity-ibc/utils/IbcImpl.sol b/test/solidity-ibc/utils/IbcImpl.sol index a63e8caf2..3871b849c 100644 --- a/test/solidity-ibc/utils/IbcImpl.sol +++ b/test/solidity-ibc/utils/IbcImpl.sol @@ -10,6 +10,7 @@ import { Test } from "forge-std/Test.sol"; import { IICS02ClientMsgs } from "../../../contracts/msgs/IICS02ClientMsgs.sol"; import { IICS26RouterMsgs } from "../../../contracts/msgs/IICS26RouterMsgs.sol"; import { IICS20TransferMsgs } from "../../../contracts/msgs/IICS20TransferMsgs.sol"; +import { IICS27GMPMsgs } from "../../../contracts/msgs/IICS27GMPMsgs.sol"; import { IERC20 } from "@openzeppelin-contracts/token/ERC20/IERC20.sol"; import { IICS26Router } from "../../../contracts/interfaces/IICS26Router.sol"; @@ -19,6 +20,9 @@ import { ICS26Router } from "../../../contracts/ICS26Router.sol"; import { IBCERC20 } from "../../../contracts/utils/IBCERC20.sol"; import { Escrow } from "../../../contracts/utils/Escrow.sol"; import { ICS20Transfer } from "../../../contracts/ICS20Transfer.sol"; +import { ICS27Lib } from "../../../contracts/utils/ICS27Lib.sol"; +import { ICS27GMP } from "../../../contracts/ICS27GMP.sol"; +import { ICS27Account } from "../../../contracts/utils/ICS27Account.sol"; import { TestHelper } from "./TestHelper.sol"; import { SolidityLightClient } from "../utils/SolidityLightClient.sol"; import { ICS20Lib } from "../../../contracts/utils/ICS20Lib.sol"; @@ -29,6 +33,7 @@ import { RelayerHelper } from "../../../contracts/utils/RelayerHelper.sol"; contract IbcImpl is Test { ICS26Router public immutable ics26Router; ICS20Transfer public immutable ics20Transfer; + ICS27GMP public immutable ics27Gmp; RelayerHelper public immutable relayerHelper; mapping(string counterpartyId => IbcImpl ibcImpl) public counterpartyImpls; @@ -39,8 +44,10 @@ contract IbcImpl is Test { // ============ Step 1: Deploy the logic contracts ============== address escrowLogic = address(new Escrow()); address ibcERC20Logic = address(new IBCERC20()); + address ics27AccountLogic = address(new ICS27Account()); ICS26Router ics26RouterLogic = new ICS26Router(); ICS20Transfer ics20TransferLogic = new ICS20Transfer(); + ICS27GMP ics27GmpLogic = new ICS27GMP(); // ============== Step 2: Deploy ERC1967 Proxies ============== ERC1967Proxy routerProxy = @@ -53,8 +60,14 @@ contract IbcImpl is Test { ) ); + ERC1967Proxy gmpProxy = new ERC1967Proxy( + address(ics27GmpLogic), + abi.encodeCall(ICS27GMP.initialize, (address(routerProxy), address(ics27AccountLogic))) + ); + ics26Router = ICS26Router(address(routerProxy)); ics20Transfer = ICS20Transfer(address(transferProxy)); + ics27Gmp = ICS27GMP(address(gmpProxy)); relayerHelper = new RelayerHelper(address(ics26Router)); // ============== Step 3: Wire up the contracts ============== @@ -63,6 +76,7 @@ contract IbcImpl is Test { ics26Router.grantRole(ics26Router.PORT_CUSTOMIZER_ROLE(), msg.sender); ics26Router.grantRole(ics26Router.CLIENT_ID_CUSTOMIZER_ROLE(), msg.sender); ics26Router.addIBCApp(ICS20Lib.DEFAULT_PORT_ID, address(ics20Transfer)); + ics26Router.addIBCApp(ICS27Lib.DEFAULT_PORT_ID, address(ics27Gmp)); vm.stopPrank(); } @@ -195,6 +209,92 @@ contract IbcImpl is Test { return abi.decode(packetBz, (IICS26RouterMsgs.Packet)); } + function sendGmpAsUser( + address sender, + string calldata receiver, + bytes calldata payload + ) + external + returns (IICS26RouterMsgs.Packet memory) + { + return sendGmpAsUser( + sender, receiver, payload, "", "", uint64(block.timestamp + 10 minutes), _testHelper.FIRST_CLIENT_ID() + ); + } + + function sendGmpAsUser( + address sender, + string calldata receiver, + bytes calldata payload, + bytes memory salt + ) + external + returns (IICS26RouterMsgs.Packet memory) + { + return sendGmpAsUser( + sender, receiver, payload, salt, "", uint64(block.timestamp + 10 minutes), _testHelper.FIRST_CLIENT_ID() + ); + } + + function sendGmpAsUser( + address sender, + string calldata receiver, + bytes calldata payload, + bytes memory salt, + string memory memo + ) + external + returns (IICS26RouterMsgs.Packet memory) + { + return sendGmpAsUser( + sender, receiver, payload, salt, memo, uint64(block.timestamp + 10 minutes), _testHelper.FIRST_CLIENT_ID() + ); + } + + function sendGmpAsUser( + address sender, + string calldata receiver, + bytes calldata payload, + bytes memory salt, + string memory memo, + uint64 timeoutTimestamp + ) + public + returns (IICS26RouterMsgs.Packet memory) + { + return sendGmpAsUser(sender, receiver, payload, salt, memo, timeoutTimestamp, _testHelper.FIRST_CLIENT_ID()); + } + + function sendGmpAsUser( + address sender, + string calldata receiver, + bytes calldata payload, + bytes memory salt, + string memory memo, + uint64 timeoutTimestamp, + string memory sourceClient + ) + public + returns (IICS26RouterMsgs.Packet memory) + { + vm.startPrank(sender); + vm.recordLogs(); + ics27Gmp.sendCall( + IICS27GMPMsgs.SendCallMsg({ + receiver: receiver, + payload: payload, + salt: salt, + memo: memo, + timeoutTimestamp: timeoutTimestamp, + sourceClient: sourceClient + }) + ); + vm.stopPrank(); + + bytes memory packetBz = _testHelper.getValueFromEvent(IICS26Router.SendPacket.selector); + return abi.decode(packetBz, (IICS26RouterMsgs.Packet)); + } + function recvPacket(IICS26RouterMsgs.Packet calldata packet) external returns (bytes[] memory acks) { IICS26RouterMsgs.MsgRecvPacket memory msgRecvPacket; msgRecvPacket.packet = packet; From b53de5bc6cdd26269ef138d098ef88a816a940c9 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 24 Apr 2025 15:32:19 +0300 Subject: [PATCH 18/79] test: skeleton --- test/solidity-ibc/Integration2Test.t.sol | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/solidity-ibc/Integration2Test.t.sol b/test/solidity-ibc/Integration2Test.t.sol index 1dc8ff1ad..577594bf5 100644 --- a/test/solidity-ibc/Integration2Test.t.sol +++ b/test/solidity-ibc/Integration2Test.t.sol @@ -493,4 +493,20 @@ contract Integration2Test is Test { emit IICS26Router.Noop(); ibcImplA.timeoutPacket(sentPacket); } + + function test_success_sendGmp() public { + address user = integrationEnv.createUser(); + string memory receiver = th.randomString(); + + IICS26RouterMsgs.Packet memory sentPacket = + ibcImplA.sendGmpAsUser(user, receiver, bytes("mock")); + + // TODO: check the fields of the packet + + // check that the packet was committed correctly + bytes32 path = ICS24Host.packetCommitmentKeyCalldata(sentPacket.sourceClient, sentPacket.sequence); + bytes32 expCommitment = ICS24Host.packetCommitmentBytes32(sentPacket); + bytes32 storedCommitment = ibcImplA.ics26Router().getCommitment(path); + assertEq(storedCommitment, expCommitment, "packet commitment mismatch"); + } } From 0671098a507b5a3069aaa905bdeb9db7b5b12900 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 24 Apr 2025 15:48:22 +0300 Subject: [PATCH 19/79] imp: check send --- test/solidity-ibc/Integration2Test.t.sol | 26 ++++++++++++--- test/solidity-ibc/utils/IbcImpl.sol | 41 +++++++++++------------- test/solidity-ibc/utils/TestHelper.sol | 9 +++++- 3 files changed, 49 insertions(+), 27 deletions(-) diff --git a/test/solidity-ibc/Integration2Test.t.sol b/test/solidity-ibc/Integration2Test.t.sol index 577594bf5..72c5659f4 100644 --- a/test/solidity-ibc/Integration2Test.t.sol +++ b/test/solidity-ibc/Integration2Test.t.sol @@ -11,6 +11,7 @@ import { IERC20 } from "@openzeppelin-contracts/token/ERC20/IERC20.sol"; import { ISignatureTransfer } from "@uniswap/permit2/src/interfaces/ISignatureTransfer.sol"; import { IICS26Router } from "../../contracts/interfaces/IICS26Router.sol"; import { IICS26RouterErrors } from "../../contracts/errors/IICS26RouterErrors.sol"; +import { IICS27GMPMsgs } from "../../contracts/msgs/IICS27GMPMsgs.sol"; import { IbcImpl } from "./utils/IbcImpl.sol"; import { TestHelper } from "./utils/TestHelper.sol"; @@ -18,6 +19,7 @@ import { IntegrationEnv } from "./utils/IntegrationEnv.sol"; import { Strings } from "@openzeppelin-contracts/utils/Strings.sol"; import { ICS24Host } from "../../contracts/utils/ICS24Host.sol"; import { ICS20Lib } from "../../contracts/utils/ICS20Lib.sol"; +import { ICS27Lib } from "../../contracts/utils/ICS27Lib.sol"; contract Integration2Test is Test { IbcImpl public ibcImplA; @@ -498,10 +500,26 @@ contract Integration2Test is Test { address user = integrationEnv.createUser(); string memory receiver = th.randomString(); - IICS26RouterMsgs.Packet memory sentPacket = - ibcImplA.sendGmpAsUser(user, receiver, bytes("mock")); - - // TODO: check the fields of the packet + bytes memory mockPayload = bytes("mock"); + IICS26RouterMsgs.Packet memory sentPacket = ibcImplA.sendGmpAsUser(user, receiver, mockPayload); + + // check the fields of the packet + assertEq(sentPacket.sourceClient, th.FIRST_CLIENT_ID(), "source client mismatch"); + assertEq(sentPacket.destClient, th.FIRST_CLIENT_ID(), "dest client mismatch"); + assertEq(sentPacket.timeoutTimestamp, th.DEFAULT_TIMEOUT_TIMESTAMP(), "timeout timestamp mismatch"); + assertEq(sentPacket.payloads.length, 1, "payload length mismatch"); + assertEq(sentPacket.payloads[0].sourcePort, ICS27Lib.DEFAULT_PORT_ID, "source port mismatch"); + assertEq(sentPacket.payloads[0].destPort, ICS27Lib.DEFAULT_PORT_ID, "dest port mismatch"); + assertEq(sentPacket.payloads[0].version, ICS27Lib.ICS27_VERSION, "version mismatch"); + assertEq(sentPacket.payloads[0].encoding, ICS27Lib.ICS27_ENCODING, "encoding mismatch"); + + IICS27GMPMsgs.GMPPacketData memory gmpPacketData = + abi.decode(sentPacket.payloads[0].value, (IICS27GMPMsgs.GMPPacketData)); + assertEq(gmpPacketData.sender, Strings.toHexString(user), "sender mismatch"); + assertEq(gmpPacketData.receiver, receiver, "receiver mismatch"); + assertEq(gmpPacketData.payload, mockPayload, "payload mismatch"); + assertEq(gmpPacketData.salt, bytes(""), "salt mismatch"); + assertEq(gmpPacketData.memo, "", "memo mismatch"); // check that the packet was committed correctly bytes32 path = ICS24Host.packetCommitmentKeyCalldata(sentPacket.sourceClient, sentPacket.sequence); diff --git a/test/solidity-ibc/utils/IbcImpl.sol b/test/solidity-ibc/utils/IbcImpl.sol index 3871b849c..297e983af 100644 --- a/test/solidity-ibc/utils/IbcImpl.sol +++ b/test/solidity-ibc/utils/IbcImpl.sol @@ -38,7 +38,7 @@ contract IbcImpl is Test { mapping(string counterpartyId => IbcImpl ibcImpl) public counterpartyImpls; - TestHelper private _testHelper = new TestHelper(); + TestHelper private _th = new TestHelper(); constructor(address permit2) { // ============ Step 1: Deploy the logic contracts ============== @@ -91,7 +91,7 @@ contract IbcImpl is Test { counterpartyImpls[counterpartyId] = counterparty; return ics26Router.addClient( - IICS02ClientMsgs.CounterpartyInfo(counterpartyId, _testHelper.EMPTY_MERKLE_PREFIX()), address(lightClient) + IICS02ClientMsgs.CounterpartyInfo(counterpartyId, _th.EMPTY_MERKLE_PREFIX()), address(lightClient) ); } @@ -104,7 +104,8 @@ contract IbcImpl is Test { external returns (IICS26RouterMsgs.Packet memory) { - return sendTransferAsUser(token, sender, receiver, amount, _testHelper.FIRST_CLIENT_ID()); + return + sendTransferAsUser(token, sender, receiver, amount, _th.DEFAULT_TIMEOUT_TIMESTAMP(), _th.FIRST_CLIENT_ID()); } function sendTransferAsUser( @@ -117,7 +118,7 @@ contract IbcImpl is Test { external returns (IICS26RouterMsgs.Packet memory) { - return sendTransferAsUser(token, sender, receiver, amount, timeoutTimestamp, _testHelper.FIRST_CLIENT_ID()); + return sendTransferAsUser(token, sender, receiver, amount, timeoutTimestamp, _th.FIRST_CLIENT_ID()); } function sendTransferAsUser( @@ -130,7 +131,7 @@ contract IbcImpl is Test { public returns (IICS26RouterMsgs.Packet memory) { - return sendTransferAsUser(token, sender, receiver, amount, uint64(block.timestamp + 10 minutes), sourceClient); + return sendTransferAsUser(token, sender, receiver, amount, _th.DEFAULT_TIMEOUT_TIMESTAMP(), sourceClient); } function sendTransferAsUser( @@ -155,12 +156,12 @@ contract IbcImpl is Test { sourceClient: sourceClient, destPort: ICS20Lib.DEFAULT_PORT_ID, timeoutTimestamp: timeoutTimestamp, - memo: _testHelper.randomString() + memo: _th.randomString() }) ); vm.stopPrank(); - bytes memory packetBz = _testHelper.getValueFromEvent(IICS26Router.SendPacket.selector); + bytes memory packetBz = _th.getValueFromEvent(IICS26Router.SendPacket.selector); return abi.decode(packetBz, (IICS26RouterMsgs.Packet)); } @@ -174,7 +175,7 @@ contract IbcImpl is Test { public returns (IICS26RouterMsgs.Packet memory) { - return sendTransferAsUser(token, sender, receiver, _testHelper.FIRST_CLIENT_ID(), permit, signature); + return sendTransferAsUser(token, sender, receiver, _th.FIRST_CLIENT_ID(), permit, signature); } function sendTransferAsUser( @@ -197,7 +198,7 @@ contract IbcImpl is Test { receiver: receiver, sourceClient: sourceClient, destPort: ICS20Lib.DEFAULT_PORT_ID, - timeoutTimestamp: uint64(block.timestamp + 10 minutes), + timeoutTimestamp: _th.DEFAULT_TIMEOUT_TIMESTAMP(), memo: "" }), permit, @@ -205,7 +206,7 @@ contract IbcImpl is Test { ); vm.stopPrank(); - bytes memory packetBz = _testHelper.getValueFromEvent(IICS26Router.SendPacket.selector); + bytes memory packetBz = _th.getValueFromEvent(IICS26Router.SendPacket.selector); return abi.decode(packetBz, (IICS26RouterMsgs.Packet)); } @@ -217,9 +218,7 @@ contract IbcImpl is Test { external returns (IICS26RouterMsgs.Packet memory) { - return sendGmpAsUser( - sender, receiver, payload, "", "", uint64(block.timestamp + 10 minutes), _testHelper.FIRST_CLIENT_ID() - ); + return sendGmpAsUser(sender, receiver, payload, "", "", _th.DEFAULT_TIMEOUT_TIMESTAMP(), _th.FIRST_CLIENT_ID()); } function sendGmpAsUser( @@ -231,9 +230,8 @@ contract IbcImpl is Test { external returns (IICS26RouterMsgs.Packet memory) { - return sendGmpAsUser( - sender, receiver, payload, salt, "", uint64(block.timestamp + 10 minutes), _testHelper.FIRST_CLIENT_ID() - ); + return + sendGmpAsUser(sender, receiver, payload, salt, "", _th.DEFAULT_TIMEOUT_TIMESTAMP(), _th.FIRST_CLIENT_ID()); } function sendGmpAsUser( @@ -246,9 +244,8 @@ contract IbcImpl is Test { external returns (IICS26RouterMsgs.Packet memory) { - return sendGmpAsUser( - sender, receiver, payload, salt, memo, uint64(block.timestamp + 10 minutes), _testHelper.FIRST_CLIENT_ID() - ); + return + sendGmpAsUser(sender, receiver, payload, salt, memo, _th.DEFAULT_TIMEOUT_TIMESTAMP(), _th.FIRST_CLIENT_ID()); } function sendGmpAsUser( @@ -262,7 +259,7 @@ contract IbcImpl is Test { public returns (IICS26RouterMsgs.Packet memory) { - return sendGmpAsUser(sender, receiver, payload, salt, memo, timeoutTimestamp, _testHelper.FIRST_CLIENT_ID()); + return sendGmpAsUser(sender, receiver, payload, salt, memo, timeoutTimestamp, _th.FIRST_CLIENT_ID()); } function sendGmpAsUser( @@ -291,7 +288,7 @@ contract IbcImpl is Test { ); vm.stopPrank(); - bytes memory packetBz = _testHelper.getValueFromEvent(IICS26Router.SendPacket.selector); + bytes memory packetBz = _th.getValueFromEvent(IICS26Router.SendPacket.selector); return abi.decode(packetBz, (IICS26RouterMsgs.Packet)); } @@ -301,7 +298,7 @@ contract IbcImpl is Test { vm.recordLogs(); ics26Router.recvPacket(msgRecvPacket); - bytes memory ackBz = _testHelper.getValueFromEvent(IICS26Router.WriteAcknowledgement.selector); + bytes memory ackBz = _th.getValueFromEvent(IICS26Router.WriteAcknowledgement.selector); (, acks) = abi.decode(ackBz, (IICS26RouterMsgs.Packet, bytes[])); return acks; } diff --git a/test/solidity-ibc/utils/TestHelper.sol b/test/solidity-ibc/utils/TestHelper.sol index a125e1468..9fb545e36 100644 --- a/test/solidity-ibc/utils/TestHelper.sol +++ b/test/solidity-ibc/utils/TestHelper.sol @@ -24,16 +24,18 @@ contract TestHelper is Test { /// @notice The default merkle prefix used in cosmos chains bytes[] private _cosmosMerklePrefix = [bytes("ibc"), bytes("")]; - /// @notice Empty merkle prefix used in the test + /// @notice Empty merkle prefix used for testing bytes[] private _emptyMerklePrefix = [bytes("")]; bytes[] private _singleSuccessAck = [ICS20Lib.SUCCESSFUL_ACKNOWLEDGEMENT_JSON]; bytes[] private _singleErrorAck = [ICS24Host.UNIVERSAL_ERROR_ACK]; + /// @notice The default merkle prefix used in cosmos chains function COSMOS_MERKLE_PREFIX() external view returns (bytes[] memory) { return _cosmosMerklePrefix; } + /// @notice Empty merkle prefix used for testing function EMPTY_MERKLE_PREFIX() external view returns (bytes[] memory) { return _emptyMerklePrefix; } @@ -46,6 +48,11 @@ contract TestHelper is Test { return _singleErrorAck; } + /// @notice The default timeout timestamp for testing + function DEFAULT_TIMEOUT_TIMESTAMP() external view returns (uint64) { + return uint64(block.timestamp + 1000); + } + /// @dev retuns a random base64 string function randomString() public returns (string memory) { uint256 randomNum = vm.randomUint(); From d7e9f9359191e642da68fd873308a9a69b28cf5c Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 24 Apr 2025 23:27:35 +0300 Subject: [PATCH 20/79] imp: added test --- contracts/ICS27GMP.sol | 3 +- contracts/utils/ICS27Lib.sol | 9 +++++ test/solidity-ibc/Integration2Test.t.sol | 48 +++++++++++++++++++++++- 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/contracts/ICS27GMP.sol b/contracts/ICS27GMP.sol index 19dca10f1..8a205b312 100644 --- a/contracts/ICS27GMP.sol +++ b/contracts/ICS27GMP.sol @@ -134,7 +134,8 @@ contract ICS27GMP is (bool success, address receiver) = Strings.tryParseAddress(packetData.receiver); require(success, ICS27InvalidReceiver(packetData.receiver)); - return account.functionCall(receiver, packetData.payload); + bytes memory result = account.functionCall(receiver, packetData.payload); + return ICS27Lib.acknowledgement(result); } /// @inheritdoc IIBCApp diff --git a/contracts/utils/ICS27Lib.sol b/contracts/utils/ICS27Lib.sol index 855b2a0d4..16c467ddd 100644 --- a/contracts/utils/ICS27Lib.sol +++ b/contracts/utils/ICS27Lib.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.28; +import { IICS27GMPMsgs } from "../msgs/IICS27GMPMsgs.sol"; import { IICS27Account } from "../interfaces/IICS27Account.sol"; import { BeaconProxy } from "@openzeppelin-contracts/proxy/beacon/BeaconProxy.sol"; @@ -23,6 +24,14 @@ library ICS27Lib { /// @notice KECCAK256_DEFAULT_PORT_ID is the keccak256 hash of the DEFAULT_PORT_ID. bytes32 internal constant KECCAK256_DEFAULT_PORT_ID = keccak256(bytes(DEFAULT_PORT_ID)); + + /// @notice Create a GMP acknowledgement from a call result. + /// @param result The result of the call + /// @return The GMP acknowledgement message + function acknowledgement(bytes memory result) internal pure returns (bytes memory) { + return abi.encode(IICS27GMPMsgs.GMPAcknowledgement({ result: result })); + } + /// @notice Retrieve the deployment bytecode of the BeaconProxy contract. /// @param beacon The address of the beacon contract. /// @param ics27 The address of the ICS27 contract. diff --git a/test/solidity-ibc/Integration2Test.t.sol b/test/solidity-ibc/Integration2Test.t.sol index 72c5659f4..ee2b02121 100644 --- a/test/solidity-ibc/Integration2Test.t.sol +++ b/test/solidity-ibc/Integration2Test.t.sol @@ -6,12 +6,14 @@ pragma solidity ^0.8.28; import { Test } from "forge-std/Test.sol"; import { IICS26RouterMsgs } from "../../contracts/msgs/IICS26RouterMsgs.sol"; +import { IICS27GMPMsgs } from "../../contracts/msgs/IICS27GMPMsgs.sol"; import { IERC20 } from "@openzeppelin-contracts/token/ERC20/IERC20.sol"; import { ISignatureTransfer } from "@uniswap/permit2/src/interfaces/ISignatureTransfer.sol"; import { IICS26Router } from "../../contracts/interfaces/IICS26Router.sol"; import { IICS26RouterErrors } from "../../contracts/errors/IICS26RouterErrors.sol"; -import { IICS27GMPMsgs } from "../../contracts/msgs/IICS27GMPMsgs.sol"; +import { ILightClient } from "../../contracts/interfaces/ILightClient.sol"; +import { IICS27Account } from "../../contracts/interfaces/IICS27Account.sol"; import { IbcImpl } from "./utils/IbcImpl.sol"; import { TestHelper } from "./utils/TestHelper.sol"; @@ -527,4 +529,48 @@ contract Integration2Test is Test { bytes32 storedCommitment = ibcImplA.ics26Router().getCommitment(path); assertEq(storedCommitment, expCommitment, "packet commitment mismatch"); } + + function testFuzz_success_fullGmp(uint16 saltLen) public { + address user = integrationEnv.createUser(); + address receiver = makeAddr("receiver"); + + // any function call as payload + bytes memory payload = abi.encodeCall(ILightClient.misbehaviour, (bytes("any"))); + bytes memory callResp = bytes("any response"); + vm.mockCall(receiver, payload, callResp); + + // precompute account address + IICS27GMPMsgs.AccountIdentifier memory accountId = IICS27GMPMsgs.AccountIdentifier({ + clientId: th.FIRST_CLIENT_ID(), + sender: Strings.toHexString(user), + salt: vm.randomBytes(saltLen) + }); + address computedAccount = ibcImplB.ics27Gmp().getOrComputeAccountAddress(accountId); + + // send packet + IICS26RouterMsgs.Packet memory sentPacket = ibcImplA.sendGmpAsUser(user, Strings.toHexString(receiver), payload, accountId.salt); + + // Receive the packet on B + vm.expectCall(receiver, 0, payload); + bytes[] memory acks = ibcImplB.recvPacket(sentPacket); + assertEq(acks.length, 1, "ack length mismatch"); + assertEq(acks[0], ICS27Lib.acknowledgement(callResp), "ack mismatch"); + + // run the receive packet queries + assert(ibcImplB.relayerHelper().isPacketReceived(sentPacket)); + assert(ibcImplB.relayerHelper().isPacketReceiveSuccessful(sentPacket)); + + // Verify that the account has been created + address storedAccount = ibcImplB.ics27Gmp().getOrComputeAccountAddress(accountId); + assertEq(storedAccount, address(computedAccount), "account address mismatch"); + assertEq(IICS27Account(computedAccount).ics27(), address(ibcImplB.ics27Gmp()), "account nor deployed"); + + // Acknowledge the packet on A + ibcImplA.ackPacket(sentPacket, acks); + + // commitment should be deleted + bytes32 storedCommitment = + ibcImplA.relayerHelper().queryPacketCommitment(sentPacket.sourceClient, sentPacket.sequence); + assertEq(storedCommitment, 0); + } } From f0923a9c2297d0e3ded5802f813ef680073a5c93 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Fri, 25 Apr 2025 11:13:21 +0300 Subject: [PATCH 21/79] imp: added integration tests for contract calls --- test/solidity-ibc/Integration2Test.t.sol | 82 ++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/test/solidity-ibc/Integration2Test.t.sol b/test/solidity-ibc/Integration2Test.t.sol index ee2b02121..c06862809 100644 --- a/test/solidity-ibc/Integration2Test.t.sol +++ b/test/solidity-ibc/Integration2Test.t.sol @@ -573,4 +573,86 @@ contract Integration2Test is Test { ibcImplA.relayerHelper().queryPacketCommitment(sentPacket.sourceClient, sentPacket.sequence); assertEq(storedCommitment, 0); } + + function testFuzz_success_errorGmp(uint16 saltLen) public { + address user = integrationEnv.createUser(); + address receiver = makeAddr("receiver"); + + // any function call as payload + bytes memory payload = abi.encodeCall(ILightClient.misbehaviour, (bytes("any"))); + bytes memory callResp = bytes("any response"); + vm.mockCallRevert(receiver, payload, callResp); + + // precompute account address + IICS27GMPMsgs.AccountIdentifier memory accountId = IICS27GMPMsgs.AccountIdentifier({ + clientId: th.FIRST_CLIENT_ID(), + sender: Strings.toHexString(user), + salt: vm.randomBytes(saltLen) + }); + + // send packet + IICS26RouterMsgs.Packet memory sentPacket = ibcImplA.sendGmpAsUser(user, Strings.toHexString(receiver), payload, accountId.salt); + + // Receive the packet on B + vm.expectCall(receiver, 0, payload); + bytes[] memory acks = ibcImplB.recvPacket(sentPacket); + assertEq(acks.length, 1, "ack length mismatch"); + assertEq(acks, th.SINGLE_ERROR_ACK(), "ack mismatch"); + + // run the receive packet queries + assert(ibcImplB.relayerHelper().isPacketReceived(sentPacket)); + assertFalse(ibcImplB.relayerHelper().isPacketReceiveSuccessful(sentPacket)); + + // Acknowledge the packet on A + ibcImplA.ackPacket(sentPacket, acks); + + // commitment should be deleted + bytes32 storedCommitment = + ibcImplA.relayerHelper().queryPacketCommitment(sentPacket.sourceClient, sentPacket.sequence); + assertEq(storedCommitment, 0); + } + + function testFuzz_success_timeoutGmp(uint16 saltLen) public { + address user = integrationEnv.createUser(); + address receiver = makeAddr("receiver"); + + // any function call as payload + bytes memory payload = abi.encodeCall(ILightClient.misbehaviour, (bytes("any"))); + bytes memory callResp = bytes("any response"); + vm.mockCallRevert(receiver, payload, callResp); + + // precompute account address + IICS27GMPMsgs.AccountIdentifier memory accountId = IICS27GMPMsgs.AccountIdentifier({ + clientId: th.FIRST_CLIENT_ID(), + sender: Strings.toHexString(user), + salt: vm.randomBytes(saltLen) + }); + + // send packet + uint64 timeoutTimestamp = uint64(block.timestamp + 10 seconds); + IICS26RouterMsgs.Packet memory sentPacket = ibcImplA.sendGmpAsUser(user, Strings.toHexString(receiver), payload, accountId.salt, "", timeoutTimestamp); + + // Set the block timestamp to the timeout + vm.warp(block.timestamp + 30 seconds); + + // Fail to receive the packet on Chain B + vm.expectRevert( + abi.encodeWithSelector( + IICS26RouterErrors.IBCInvalidTimeoutTimestamp.selector, sentPacket.timeoutTimestamp, block.timestamp + ) + ); + ibcImplB.recvPacket(sentPacket); + + // run the receive packet queries + assertFalse(ibcImplB.relayerHelper().isPacketReceived(sentPacket)); + assertFalse(ibcImplB.relayerHelper().isPacketReceiveSuccessful(sentPacket)); + + // Timeout the packet on Chain A + ibcImplA.timeoutPacket(sentPacket); + + // commitment should be deleted + bytes32 storedCommitment = + ibcImplA.relayerHelper().queryPacketCommitment(sentPacket.sourceClient, sentPacket.sequence); + assertEq(storedCommitment, 0); + } } From d6fb7373d272c2bf9255e0f7fbe10e13270056c7 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Fri, 25 Apr 2025 11:25:11 +0300 Subject: [PATCH 22/79] imp: regen abi --- abi/ICS27Account.json | 269 +++++++ abi/ICS27GMP.json | 643 +++++++++++++++ contracts/utils/ICS27Account.sol | 2 +- justfile | 4 + packages/go-abigen/ics27account/contract.go | 451 +++++++++++ packages/go-abigen/ics27gmp/contract.go | 836 ++++++++++++++++++++ packages/solidity/src/msgs.rs | 1 + 7 files changed, 2205 insertions(+), 1 deletion(-) create mode 100644 abi/ICS27Account.json create mode 100644 abi/ICS27GMP.json create mode 100644 packages/go-abigen/ics27account/contract.go create mode 100644 packages/go-abigen/ics27gmp/contract.go diff --git a/abi/ICS27Account.json b/abi/ICS27Account.json new file mode 100644 index 000000000..bb57f4241 --- /dev/null +++ b/abi/ICS27Account.json @@ -0,0 +1,269 @@ +[ + { + "type": "constructor", + "inputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "functionCall", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "functionCallWithValue", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "value", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "functionDelegateCall", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "ics27", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "ics27_", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "sendValue", + "inputs": [ + { + "name": "recipient", + "type": "address", + "internalType": "address payable" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "FailedCall", + "inputs": [] + }, + { + "type": "error", + "name": "ICS27InvalidAddress", + "inputs": [ + { + "name": "addr", + "type": "string", + "internalType": "string" + } + ] + }, + { + "type": "error", + "name": "ICS27InvalidPort", + "inputs": [ + { + "name": "expected", + "type": "string", + "internalType": "string" + }, + { + "name": "actual", + "type": "string", + "internalType": "string" + } + ] + }, + { + "type": "error", + "name": "ICS27InvalidReceiver", + "inputs": [ + { + "name": "receiver", + "type": "string", + "internalType": "string" + } + ] + }, + { + "type": "error", + "name": "ICS27Unauthorized", + "inputs": [ + { + "name": "expected", + "type": "address", + "internalType": "address" + }, + { + "name": "caller", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ICS27UnexpectedEncoding", + "inputs": [ + { + "name": "expected", + "type": "string", + "internalType": "string" + }, + { + "name": "actual", + "type": "string", + "internalType": "string" + } + ] + }, + { + "type": "error", + "name": "ICS27UnexpectedVersion", + "inputs": [ + { + "name": "expected", + "type": "string", + "internalType": "string" + }, + { + "name": "version", + "type": "string", + "internalType": "string" + } + ] + }, + { + "type": "error", + "name": "InsufficientBalance", + "inputs": [ + { + "name": "balance", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "needed", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidInitialization", + "inputs": [] + }, + { + "type": "error", + "name": "NotInitializing", + "inputs": [] + } +] diff --git a/abi/ICS27GMP.json b/abi/ICS27GMP.json new file mode 100644 index 000000000..a83c63755 --- /dev/null +++ b/abi/ICS27GMP.json @@ -0,0 +1,643 @@ +[ + { + "type": "constructor", + "inputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "UPGRADE_INTERFACE_VERSION", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAccountBeacon", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getOrComputeAccountAddress", + "inputs": [ + { + "name": "accountId", + "type": "tuple", + "internalType": "struct IICS27GMPMsgs.AccountIdentifier", + "components": [ + { + "name": "clientId", + "type": "string", + "internalType": "string" + }, + { + "name": "sender", + "type": "string", + "internalType": "string" + }, + { + "name": "salt", + "type": "bytes", + "internalType": "bytes" + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "ics26", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "ics26_", + "type": "address", + "internalType": "address" + }, + { + "name": "accountLogic", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "multicall", + "inputs": [ + { + "name": "data", + "type": "bytes[]", + "internalType": "bytes[]" + } + ], + "outputs": [ + { + "name": "results", + "type": "bytes[]", + "internalType": "bytes[]" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "onAcknowledgementPacket", + "inputs": [ + { + "name": "msg_", + "type": "tuple", + "internalType": "struct IIBCAppCallbacks.OnAcknowledgementPacketCallback", + "components": [ + { + "name": "sourceClient", + "type": "string", + "internalType": "string" + }, + { + "name": "destinationClient", + "type": "string", + "internalType": "string" + }, + { + "name": "sequence", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "payload", + "type": "tuple", + "internalType": "struct IICS26RouterMsgs.Payload", + "components": [ + { + "name": "sourcePort", + "type": "string", + "internalType": "string" + }, + { + "name": "destPort", + "type": "string", + "internalType": "string" + }, + { + "name": "version", + "type": "string", + "internalType": "string" + }, + { + "name": "encoding", + "type": "string", + "internalType": "string" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "acknowledgement", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "relayer", + "type": "address", + "internalType": "address" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "onRecvPacket", + "inputs": [ + { + "name": "msg_", + "type": "tuple", + "internalType": "struct IIBCAppCallbacks.OnRecvPacketCallback", + "components": [ + { + "name": "sourceClient", + "type": "string", + "internalType": "string" + }, + { + "name": "destinationClient", + "type": "string", + "internalType": "string" + }, + { + "name": "sequence", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "payload", + "type": "tuple", + "internalType": "struct IICS26RouterMsgs.Payload", + "components": [ + { + "name": "sourcePort", + "type": "string", + "internalType": "string" + }, + { + "name": "destPort", + "type": "string", + "internalType": "string" + }, + { + "name": "version", + "type": "string", + "internalType": "string" + }, + { + "name": "encoding", + "type": "string", + "internalType": "string" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "relayer", + "type": "address", + "internalType": "address" + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "onTimeoutPacket", + "inputs": [ + { + "name": "msg_", + "type": "tuple", + "internalType": "struct IIBCAppCallbacks.OnTimeoutPacketCallback", + "components": [ + { + "name": "sourceClient", + "type": "string", + "internalType": "string" + }, + { + "name": "destinationClient", + "type": "string", + "internalType": "string" + }, + { + "name": "sequence", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "payload", + "type": "tuple", + "internalType": "struct IICS26RouterMsgs.Payload", + "components": [ + { + "name": "sourcePort", + "type": "string", + "internalType": "string" + }, + { + "name": "destPort", + "type": "string", + "internalType": "string" + }, + { + "name": "version", + "type": "string", + "internalType": "string" + }, + { + "name": "encoding", + "type": "string", + "internalType": "string" + }, + { + "name": "value", + "type": "bytes", + "internalType": "bytes" + } + ] + }, + { + "name": "relayer", + "type": "address", + "internalType": "address" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "proxiableUUID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "sendCall", + "inputs": [ + { + "name": "msg_", + "type": "tuple", + "internalType": "struct IICS27GMPMsgs.SendCallMsg", + "components": [ + { + "name": "sourceClient", + "type": "string", + "internalType": "string" + }, + { + "name": "timeoutTimestamp", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "receiver", + "type": "string", + "internalType": "string" + }, + { + "name": "salt", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "payload", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "memo", + "type": "string", + "internalType": "string" + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "uint64", + "internalType": "uint64" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "upgradeAccountTo", + "inputs": [ + { + "name": "newEscrowLogic", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "upgradeToAndCall", + "inputs": [ + { + "name": "newImplementation", + "type": "address", + "internalType": "address" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Upgraded", + "inputs": [ + { + "name": "implementation", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "Create2EmptyBytecode", + "inputs": [] + }, + { + "type": "error", + "name": "ERC1967InvalidImplementation", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC1967NonPayable", + "inputs": [] + }, + { + "type": "error", + "name": "FailedCall", + "inputs": [] + }, + { + "type": "error", + "name": "FailedDeployment", + "inputs": [] + }, + { + "type": "error", + "name": "ICS27InvalidAddress", + "inputs": [ + { + "name": "addr", + "type": "string", + "internalType": "string" + } + ] + }, + { + "type": "error", + "name": "ICS27InvalidPort", + "inputs": [ + { + "name": "expected", + "type": "string", + "internalType": "string" + }, + { + "name": "actual", + "type": "string", + "internalType": "string" + } + ] + }, + { + "type": "error", + "name": "ICS27InvalidReceiver", + "inputs": [ + { + "name": "receiver", + "type": "string", + "internalType": "string" + } + ] + }, + { + "type": "error", + "name": "ICS27Unauthorized", + "inputs": [ + { + "name": "expected", + "type": "address", + "internalType": "address" + }, + { + "name": "caller", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ICS27UnexpectedEncoding", + "inputs": [ + { + "name": "expected", + "type": "string", + "internalType": "string" + }, + { + "name": "actual", + "type": "string", + "internalType": "string" + } + ] + }, + { + "type": "error", + "name": "ICS27UnexpectedVersion", + "inputs": [ + { + "name": "expected", + "type": "string", + "internalType": "string" + }, + { + "name": "version", + "type": "string", + "internalType": "string" + } + ] + }, + { + "type": "error", + "name": "InsufficientBalance", + "inputs": [ + { + "name": "balance", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "needed", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "InvalidInitialization", + "inputs": [] + }, + { + "type": "error", + "name": "NotInitializing", + "inputs": [] + }, + { + "type": "error", + "name": "ReentrancyGuardReentrantCall", + "inputs": [] + }, + { + "type": "error", + "name": "StringsInsufficientHexLength", + "inputs": [ + { + "name": "value", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "length", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "type": "error", + "name": "UUPSUnauthorizedCallContext", + "inputs": [] + }, + { + "type": "error", + "name": "UUPSUnsupportedProxiableUUID", + "inputs": [ + { + "name": "slot", + "type": "bytes32", + "internalType": "bytes32" + } + ] + } +] diff --git a/contracts/utils/ICS27Account.sol b/contracts/utils/ICS27Account.sol index c408d6749..884ac701a 100644 --- a/contracts/utils/ICS27Account.sol +++ b/contracts/utils/ICS27Account.sol @@ -12,7 +12,7 @@ contract ICS27Account is IICS27Errors, IICS27Account, ContextUpgradeable { /// @dev It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions when using with /// upgradeable contracts. /// @param _ics27 The ICS27GMP contract address. Immutable. - /// @custom:storage-location erc7201:ibc.storage.ICS27GMP + /// @custom:storage-location erc7201:ibc.storage.ICS27Account struct ICS27AccountStorage { address _ics27; } diff --git a/justfile b/justfile index d5ebb0936..01f6d7cc4 100644 --- a/justfile +++ b/justfile @@ -74,6 +74,8 @@ generate-abi: build-contracts jq '.abi' out/SP1ICS07Tendermint.sol/SP1ICS07Tendermint.json > abi/SP1ICS07Tendermint.json jq '.abi' out/ERC20.sol/ERC20.json > abi/ERC20.json jq '.abi' out/IBCERC20.sol/IBCERC20.json > abi/IBCERC20.json + jq '.abi' out/ICS27Account.sol/ICS27Account.json > abi/ICS27Account.json + jq '.abi' out/ICS27GMP.sol/ICS27GMP.json > abi/ICS27GMP.json jq '.abi' out/RelayerHelper.sol/RelayerHelper.json > abi/RelayerHelper.json cp out/SP1ICS07Tendermint.sol/SP1ICS07Tendermint.json abi/bytecode abigen --abi abi/ERC20.json --pkg erc20 --type Contract --out e2e/interchaintestv8/types/erc20/contract.go @@ -81,6 +83,8 @@ generate-abi: build-contracts abigen --abi abi/ICS20Transfer.json --pkg ics20transfer --type Contract --out packages/go-abigen/ics20transfer/contract.go abigen --abi abi/ICS26Router.json --pkg ics26router --type Contract --out packages/go-abigen/ics26router/contract.go abigen --abi abi/IBCERC20.json --pkg ibcerc20 --type Contract --out packages/go-abigen/ibcerc20/contract.go + abigen --abi abi/ICS27Account.json --pkg ics27account --type Contract --out packages/go-abigen/ics27account/contract.go + abigen --abi abi/ICS27GMP.json --pkg ics27gmp --type Contract --out packages/go-abigen/ics27gmp/contract.go abigen --abi abi/RelayerHelper.json --pkg relayerhelper --type Contract --out packages/go-abigen/relayerhelper/contract.go # Generate the fixtures for the wasm tests using the e2e tests diff --git a/packages/go-abigen/ics27account/contract.go b/packages/go-abigen/ics27account/contract.go new file mode 100644 index 000000000..4a2801420 --- /dev/null +++ b/packages/go-abigen/ics27account/contract.go @@ -0,0 +1,451 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package ics27account + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ContractMetaData contains all meta data concerning the Contract contract. +var ContractMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"functionCall\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"functionCallWithValue\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"functionDelegateCall\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ics27\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"ics27_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendValue\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS27InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidPort\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27Unauthorized\",\"inputs\":[{\"name\":\"expected\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedEncoding\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"InsufficientBalance\",\"inputs\":[{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]}]", +} + +// ContractABI is the input ABI used to generate the binding from. +// Deprecated: Use ContractMetaData.ABI instead. +var ContractABI = ContractMetaData.ABI + +// Contract is an auto generated Go binding around an Ethereum contract. +type Contract struct { + ContractCaller // Read-only binding to the contract + ContractTransactor // Write-only binding to the contract + ContractFilterer // Log filterer for contract events +} + +// ContractCaller is an auto generated read-only Go binding around an Ethereum contract. +type ContractCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ContractTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ContractFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ContractSession struct { + Contract *Contract // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ContractCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ContractCallerSession struct { + Contract *ContractCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ContractTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ContractTransactorSession struct { + Contract *ContractTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ContractRaw is an auto generated low-level Go binding around an Ethereum contract. +type ContractRaw struct { + Contract *Contract // Generic contract binding to access the raw methods on +} + +// ContractCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ContractCallerRaw struct { + Contract *ContractCaller // Generic read-only contract binding to access the raw methods on +} + +// ContractTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ContractTransactorRaw struct { + Contract *ContractTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewContract creates a new instance of Contract, bound to a specific deployed contract. +func NewContract(address common.Address, backend bind.ContractBackend) (*Contract, error) { + contract, err := bindContract(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Contract{ContractCaller: ContractCaller{contract: contract}, ContractTransactor: ContractTransactor{contract: contract}, ContractFilterer: ContractFilterer{contract: contract}}, nil +} + +// NewContractCaller creates a new read-only instance of Contract, bound to a specific deployed contract. +func NewContractCaller(address common.Address, caller bind.ContractCaller) (*ContractCaller, error) { + contract, err := bindContract(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ContractCaller{contract: contract}, nil +} + +// NewContractTransactor creates a new write-only instance of Contract, bound to a specific deployed contract. +func NewContractTransactor(address common.Address, transactor bind.ContractTransactor) (*ContractTransactor, error) { + contract, err := bindContract(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ContractTransactor{contract: contract}, nil +} + +// NewContractFilterer creates a new log filterer instance of Contract, bound to a specific deployed contract. +func NewContractFilterer(address common.Address, filterer bind.ContractFilterer) (*ContractFilterer, error) { + contract, err := bindContract(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ContractFilterer{contract: contract}, nil +} + +// bindContract binds a generic wrapper to an already deployed contract. +func bindContract(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ContractMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Contract *ContractRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Contract.Contract.ContractCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Contract *ContractRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Contract.Contract.ContractTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Contract *ContractRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Contract.Contract.ContractTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Contract *ContractCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Contract.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Contract *ContractTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Contract.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Contract *ContractTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Contract.Contract.contract.Transact(opts, method, params...) +} + +// Ics27 is a free data retrieval call binding the contract method 0x599deb48. +// +// Solidity: function ics27() view returns(address) +func (_Contract *ContractCaller) Ics27(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "ics27") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Ics27 is a free data retrieval call binding the contract method 0x599deb48. +// +// Solidity: function ics27() view returns(address) +func (_Contract *ContractSession) Ics27() (common.Address, error) { + return _Contract.Contract.Ics27(&_Contract.CallOpts) +} + +// Ics27 is a free data retrieval call binding the contract method 0x599deb48. +// +// Solidity: function ics27() view returns(address) +func (_Contract *ContractCallerSession) Ics27() (common.Address, error) { + return _Contract.Contract.Ics27(&_Contract.CallOpts) +} + +// FunctionCall is a paid mutator transaction binding the contract method 0xa0b5ffb0. +// +// Solidity: function functionCall(address target, bytes data) returns(bytes) +func (_Contract *ContractTransactor) FunctionCall(opts *bind.TransactOpts, target common.Address, data []byte) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "functionCall", target, data) +} + +// FunctionCall is a paid mutator transaction binding the contract method 0xa0b5ffb0. +// +// Solidity: function functionCall(address target, bytes data) returns(bytes) +func (_Contract *ContractSession) FunctionCall(target common.Address, data []byte) (*types.Transaction, error) { + return _Contract.Contract.FunctionCall(&_Contract.TransactOpts, target, data) +} + +// FunctionCall is a paid mutator transaction binding the contract method 0xa0b5ffb0. +// +// Solidity: function functionCall(address target, bytes data) returns(bytes) +func (_Contract *ContractTransactorSession) FunctionCall(target common.Address, data []byte) (*types.Transaction, error) { + return _Contract.Contract.FunctionCall(&_Contract.TransactOpts, target, data) +} + +// FunctionCallWithValue is a paid mutator transaction binding the contract method 0x2a011594. +// +// Solidity: function functionCallWithValue(address target, bytes data, uint256 value) returns(bytes) +func (_Contract *ContractTransactor) FunctionCallWithValue(opts *bind.TransactOpts, target common.Address, data []byte, value *big.Int) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "functionCallWithValue", target, data, value) +} + +// FunctionCallWithValue is a paid mutator transaction binding the contract method 0x2a011594. +// +// Solidity: function functionCallWithValue(address target, bytes data, uint256 value) returns(bytes) +func (_Contract *ContractSession) FunctionCallWithValue(target common.Address, data []byte, value *big.Int) (*types.Transaction, error) { + return _Contract.Contract.FunctionCallWithValue(&_Contract.TransactOpts, target, data, value) +} + +// FunctionCallWithValue is a paid mutator transaction binding the contract method 0x2a011594. +// +// Solidity: function functionCallWithValue(address target, bytes data, uint256 value) returns(bytes) +func (_Contract *ContractTransactorSession) FunctionCallWithValue(target common.Address, data []byte, value *big.Int) (*types.Transaction, error) { + return _Contract.Contract.FunctionCallWithValue(&_Contract.TransactOpts, target, data, value) +} + +// FunctionDelegateCall is a paid mutator transaction binding the contract method 0xee33b7e2. +// +// Solidity: function functionDelegateCall(address target, bytes data) returns(bytes) +func (_Contract *ContractTransactor) FunctionDelegateCall(opts *bind.TransactOpts, target common.Address, data []byte) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "functionDelegateCall", target, data) +} + +// FunctionDelegateCall is a paid mutator transaction binding the contract method 0xee33b7e2. +// +// Solidity: function functionDelegateCall(address target, bytes data) returns(bytes) +func (_Contract *ContractSession) FunctionDelegateCall(target common.Address, data []byte) (*types.Transaction, error) { + return _Contract.Contract.FunctionDelegateCall(&_Contract.TransactOpts, target, data) +} + +// FunctionDelegateCall is a paid mutator transaction binding the contract method 0xee33b7e2. +// +// Solidity: function functionDelegateCall(address target, bytes data) returns(bytes) +func (_Contract *ContractTransactorSession) FunctionDelegateCall(target common.Address, data []byte) (*types.Transaction, error) { + return _Contract.Contract.FunctionDelegateCall(&_Contract.TransactOpts, target, data) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address ics27_) returns() +func (_Contract *ContractTransactor) Initialize(opts *bind.TransactOpts, ics27_ common.Address) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "initialize", ics27_) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address ics27_) returns() +func (_Contract *ContractSession) Initialize(ics27_ common.Address) (*types.Transaction, error) { + return _Contract.Contract.Initialize(&_Contract.TransactOpts, ics27_) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address ics27_) returns() +func (_Contract *ContractTransactorSession) Initialize(ics27_ common.Address) (*types.Transaction, error) { + return _Contract.Contract.Initialize(&_Contract.TransactOpts, ics27_) +} + +// SendValue is a paid mutator transaction binding the contract method 0x24a084df. +// +// Solidity: function sendValue(address recipient, uint256 amount) returns() +func (_Contract *ContractTransactor) SendValue(opts *bind.TransactOpts, recipient common.Address, amount *big.Int) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "sendValue", recipient, amount) +} + +// SendValue is a paid mutator transaction binding the contract method 0x24a084df. +// +// Solidity: function sendValue(address recipient, uint256 amount) returns() +func (_Contract *ContractSession) SendValue(recipient common.Address, amount *big.Int) (*types.Transaction, error) { + return _Contract.Contract.SendValue(&_Contract.TransactOpts, recipient, amount) +} + +// SendValue is a paid mutator transaction binding the contract method 0x24a084df. +// +// Solidity: function sendValue(address recipient, uint256 amount) returns() +func (_Contract *ContractTransactorSession) SendValue(recipient common.Address, amount *big.Int) (*types.Transaction, error) { + return _Contract.Contract.SendValue(&_Contract.TransactOpts, recipient, amount) +} + +// ContractInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the Contract contract. +type ContractInitializedIterator struct { + Event *ContractInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ContractInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ContractInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ContractInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ContractInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractInitialized represents a Initialized event raised by the Contract contract. +type ContractInitialized struct { + Version uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_Contract *ContractFilterer) FilterInitialized(opts *bind.FilterOpts) (*ContractInitializedIterator, error) { + + logs, sub, err := _Contract.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &ContractInitializedIterator{contract: _Contract.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_Contract *ContractFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *ContractInitialized) (event.Subscription, error) { + + logs, sub, err := _Contract.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ContractInitialized) + if err := _Contract.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_Contract *ContractFilterer) ParseInitialized(log types.Log) (*ContractInitialized, error) { + event := new(ContractInitialized) + if err := _Contract.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/packages/go-abigen/ics27gmp/contract.go b/packages/go-abigen/ics27gmp/contract.go new file mode 100644 index 000000000..9b146391b --- /dev/null +++ b/packages/go-abigen/ics27gmp/contract.go @@ -0,0 +1,836 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package ics27gmp + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// IIBCAppCallbacksOnAcknowledgementPacketCallback is an auto generated low-level Go binding around an user-defined struct. +type IIBCAppCallbacksOnAcknowledgementPacketCallback struct { + SourceClient string + DestinationClient string + Sequence uint64 + Payload IICS26RouterMsgsPayload + Acknowledgement []byte + Relayer common.Address +} + +// IIBCAppCallbacksOnRecvPacketCallback is an auto generated low-level Go binding around an user-defined struct. +type IIBCAppCallbacksOnRecvPacketCallback struct { + SourceClient string + DestinationClient string + Sequence uint64 + Payload IICS26RouterMsgsPayload + Relayer common.Address +} + +// IIBCAppCallbacksOnTimeoutPacketCallback is an auto generated low-level Go binding around an user-defined struct. +type IIBCAppCallbacksOnTimeoutPacketCallback struct { + SourceClient string + DestinationClient string + Sequence uint64 + Payload IICS26RouterMsgsPayload + Relayer common.Address +} + +// IICS26RouterMsgsPayload is an auto generated low-level Go binding around an user-defined struct. +type IICS26RouterMsgsPayload struct { + SourcePort string + DestPort string + Version string + Encoding string + Value []byte +} + +// IICS27GMPMsgsAccountIdentifier is an auto generated low-level Go binding around an user-defined struct. +type IICS27GMPMsgsAccountIdentifier struct { + ClientId string + Sender string + Salt []byte +} + +// IICS27GMPMsgsSendCallMsg is an auto generated low-level Go binding around an user-defined struct. +type IICS27GMPMsgsSendCallMsg struct { + SourceClient string + TimeoutTimestamp uint64 + Receiver string + Salt []byte + Payload []byte + Memo string +} + +// ContractMetaData contains all meta data concerning the Contract contract. +var ContractMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccountBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOrComputeAccountAddress\",\"inputs\":[{\"name\":\"accountId\",\"type\":\"tuple\",\"internalType\":\"structIICS27GMPMsgs.AccountIdentifier\",\"components\":[{\"name\":\"clientId\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"salt\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ics26\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"ics26_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accountLogic\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"multicall\",\"inputs\":[{\"name\":\"data\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[{\"name\":\"results\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onAcknowledgementPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnAcknowledgementPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"acknowledgement\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onRecvPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnRecvPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sendCall\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS27GMPMsgs.SendCallMsg\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"salt\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeAccountTo\",\"inputs\":[{\"name\":\"newEscrowLogic\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Create2EmptyBytecode\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedDeployment\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS27InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidPort\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27Unauthorized\",\"inputs\":[{\"name\":\"expected\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedEncoding\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"InsufficientBalance\",\"inputs\":[{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", +} + +// ContractABI is the input ABI used to generate the binding from. +// Deprecated: Use ContractMetaData.ABI instead. +var ContractABI = ContractMetaData.ABI + +// Contract is an auto generated Go binding around an Ethereum contract. +type Contract struct { + ContractCaller // Read-only binding to the contract + ContractTransactor // Write-only binding to the contract + ContractFilterer // Log filterer for contract events +} + +// ContractCaller is an auto generated read-only Go binding around an Ethereum contract. +type ContractCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ContractTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ContractFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ContractSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ContractSession struct { + Contract *Contract // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ContractCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ContractCallerSession struct { + Contract *ContractCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ContractTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ContractTransactorSession struct { + Contract *ContractTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ContractRaw is an auto generated low-level Go binding around an Ethereum contract. +type ContractRaw struct { + Contract *Contract // Generic contract binding to access the raw methods on +} + +// ContractCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ContractCallerRaw struct { + Contract *ContractCaller // Generic read-only contract binding to access the raw methods on +} + +// ContractTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ContractTransactorRaw struct { + Contract *ContractTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewContract creates a new instance of Contract, bound to a specific deployed contract. +func NewContract(address common.Address, backend bind.ContractBackend) (*Contract, error) { + contract, err := bindContract(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Contract{ContractCaller: ContractCaller{contract: contract}, ContractTransactor: ContractTransactor{contract: contract}, ContractFilterer: ContractFilterer{contract: contract}}, nil +} + +// NewContractCaller creates a new read-only instance of Contract, bound to a specific deployed contract. +func NewContractCaller(address common.Address, caller bind.ContractCaller) (*ContractCaller, error) { + contract, err := bindContract(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ContractCaller{contract: contract}, nil +} + +// NewContractTransactor creates a new write-only instance of Contract, bound to a specific deployed contract. +func NewContractTransactor(address common.Address, transactor bind.ContractTransactor) (*ContractTransactor, error) { + contract, err := bindContract(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ContractTransactor{contract: contract}, nil +} + +// NewContractFilterer creates a new log filterer instance of Contract, bound to a specific deployed contract. +func NewContractFilterer(address common.Address, filterer bind.ContractFilterer) (*ContractFilterer, error) { + contract, err := bindContract(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ContractFilterer{contract: contract}, nil +} + +// bindContract binds a generic wrapper to an already deployed contract. +func bindContract(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ContractMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Contract *ContractRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Contract.Contract.ContractCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Contract *ContractRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Contract.Contract.ContractTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Contract *ContractRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Contract.Contract.ContractTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Contract *ContractCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Contract.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Contract *ContractTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Contract.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Contract *ContractTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Contract.Contract.contract.Transact(opts, method, params...) +} + +// UPGRADEINTERFACEVERSION is a free data retrieval call binding the contract method 0xad3cb1cc. +// +// Solidity: function UPGRADE_INTERFACE_VERSION() view returns(string) +func (_Contract *ContractCaller) UPGRADEINTERFACEVERSION(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "UPGRADE_INTERFACE_VERSION") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// UPGRADEINTERFACEVERSION is a free data retrieval call binding the contract method 0xad3cb1cc. +// +// Solidity: function UPGRADE_INTERFACE_VERSION() view returns(string) +func (_Contract *ContractSession) UPGRADEINTERFACEVERSION() (string, error) { + return _Contract.Contract.UPGRADEINTERFACEVERSION(&_Contract.CallOpts) +} + +// UPGRADEINTERFACEVERSION is a free data retrieval call binding the contract method 0xad3cb1cc. +// +// Solidity: function UPGRADE_INTERFACE_VERSION() view returns(string) +func (_Contract *ContractCallerSession) UPGRADEINTERFACEVERSION() (string, error) { + return _Contract.Contract.UPGRADEINTERFACEVERSION(&_Contract.CallOpts) +} + +// GetAccountBeacon is a free data retrieval call binding the contract method 0xf78c6a9b. +// +// Solidity: function getAccountBeacon() view returns(address) +func (_Contract *ContractCaller) GetAccountBeacon(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "getAccountBeacon") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetAccountBeacon is a free data retrieval call binding the contract method 0xf78c6a9b. +// +// Solidity: function getAccountBeacon() view returns(address) +func (_Contract *ContractSession) GetAccountBeacon() (common.Address, error) { + return _Contract.Contract.GetAccountBeacon(&_Contract.CallOpts) +} + +// GetAccountBeacon is a free data retrieval call binding the contract method 0xf78c6a9b. +// +// Solidity: function getAccountBeacon() view returns(address) +func (_Contract *ContractCallerSession) GetAccountBeacon() (common.Address, error) { + return _Contract.Contract.GetAccountBeacon(&_Contract.CallOpts) +} + +// GetOrComputeAccountAddress is a free data retrieval call binding the contract method 0x8746a243. +// +// Solidity: function getOrComputeAccountAddress((string,string,bytes) accountId) view returns(address) +func (_Contract *ContractCaller) GetOrComputeAccountAddress(opts *bind.CallOpts, accountId IICS27GMPMsgsAccountIdentifier) (common.Address, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "getOrComputeAccountAddress", accountId) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetOrComputeAccountAddress is a free data retrieval call binding the contract method 0x8746a243. +// +// Solidity: function getOrComputeAccountAddress((string,string,bytes) accountId) view returns(address) +func (_Contract *ContractSession) GetOrComputeAccountAddress(accountId IICS27GMPMsgsAccountIdentifier) (common.Address, error) { + return _Contract.Contract.GetOrComputeAccountAddress(&_Contract.CallOpts, accountId) +} + +// GetOrComputeAccountAddress is a free data retrieval call binding the contract method 0x8746a243. +// +// Solidity: function getOrComputeAccountAddress((string,string,bytes) accountId) view returns(address) +func (_Contract *ContractCallerSession) GetOrComputeAccountAddress(accountId IICS27GMPMsgsAccountIdentifier) (common.Address, error) { + return _Contract.Contract.GetOrComputeAccountAddress(&_Contract.CallOpts, accountId) +} + +// Ics26 is a free data retrieval call binding the contract method 0xd413227d. +// +// Solidity: function ics26() view returns(address) +func (_Contract *ContractCaller) Ics26(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "ics26") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Ics26 is a free data retrieval call binding the contract method 0xd413227d. +// +// Solidity: function ics26() view returns(address) +func (_Contract *ContractSession) Ics26() (common.Address, error) { + return _Contract.Contract.Ics26(&_Contract.CallOpts) +} + +// Ics26 is a free data retrieval call binding the contract method 0xd413227d. +// +// Solidity: function ics26() view returns(address) +func (_Contract *ContractCallerSession) Ics26() (common.Address, error) { + return _Contract.Contract.Ics26(&_Contract.CallOpts) +} + +// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. +// +// Solidity: function proxiableUUID() view returns(bytes32) +func (_Contract *ContractCaller) ProxiableUUID(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "proxiableUUID") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. +// +// Solidity: function proxiableUUID() view returns(bytes32) +func (_Contract *ContractSession) ProxiableUUID() ([32]byte, error) { + return _Contract.Contract.ProxiableUUID(&_Contract.CallOpts) +} + +// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. +// +// Solidity: function proxiableUUID() view returns(bytes32) +func (_Contract *ContractCallerSession) ProxiableUUID() ([32]byte, error) { + return _Contract.Contract.ProxiableUUID(&_Contract.CallOpts) +} + +// Initialize is a paid mutator transaction binding the contract method 0x485cc955. +// +// Solidity: function initialize(address ics26_, address accountLogic) returns() +func (_Contract *ContractTransactor) Initialize(opts *bind.TransactOpts, ics26_ common.Address, accountLogic common.Address) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "initialize", ics26_, accountLogic) +} + +// Initialize is a paid mutator transaction binding the contract method 0x485cc955. +// +// Solidity: function initialize(address ics26_, address accountLogic) returns() +func (_Contract *ContractSession) Initialize(ics26_ common.Address, accountLogic common.Address) (*types.Transaction, error) { + return _Contract.Contract.Initialize(&_Contract.TransactOpts, ics26_, accountLogic) +} + +// Initialize is a paid mutator transaction binding the contract method 0x485cc955. +// +// Solidity: function initialize(address ics26_, address accountLogic) returns() +func (_Contract *ContractTransactorSession) Initialize(ics26_ common.Address, accountLogic common.Address) (*types.Transaction, error) { + return _Contract.Contract.Initialize(&_Contract.TransactOpts, ics26_, accountLogic) +} + +// Multicall is a paid mutator transaction binding the contract method 0xac9650d8. +// +// Solidity: function multicall(bytes[] data) returns(bytes[] results) +func (_Contract *ContractTransactor) Multicall(opts *bind.TransactOpts, data [][]byte) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "multicall", data) +} + +// Multicall is a paid mutator transaction binding the contract method 0xac9650d8. +// +// Solidity: function multicall(bytes[] data) returns(bytes[] results) +func (_Contract *ContractSession) Multicall(data [][]byte) (*types.Transaction, error) { + return _Contract.Contract.Multicall(&_Contract.TransactOpts, data) +} + +// Multicall is a paid mutator transaction binding the contract method 0xac9650d8. +// +// Solidity: function multicall(bytes[] data) returns(bytes[] results) +func (_Contract *ContractTransactorSession) Multicall(data [][]byte) (*types.Transaction, error) { + return _Contract.Contract.Multicall(&_Contract.TransactOpts, data) +} + +// OnAcknowledgementPacket is a paid mutator transaction binding the contract method 0x428e4e17. +// +// Solidity: function onAcknowledgementPacket((string,string,uint64,(string,string,string,string,bytes),bytes,address) msg_) returns() +func (_Contract *ContractTransactor) OnAcknowledgementPacket(opts *bind.TransactOpts, msg_ IIBCAppCallbacksOnAcknowledgementPacketCallback) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "onAcknowledgementPacket", msg_) +} + +// OnAcknowledgementPacket is a paid mutator transaction binding the contract method 0x428e4e17. +// +// Solidity: function onAcknowledgementPacket((string,string,uint64,(string,string,string,string,bytes),bytes,address) msg_) returns() +func (_Contract *ContractSession) OnAcknowledgementPacket(msg_ IIBCAppCallbacksOnAcknowledgementPacketCallback) (*types.Transaction, error) { + return _Contract.Contract.OnAcknowledgementPacket(&_Contract.TransactOpts, msg_) +} + +// OnAcknowledgementPacket is a paid mutator transaction binding the contract method 0x428e4e17. +// +// Solidity: function onAcknowledgementPacket((string,string,uint64,(string,string,string,string,bytes),bytes,address) msg_) returns() +func (_Contract *ContractTransactorSession) OnAcknowledgementPacket(msg_ IIBCAppCallbacksOnAcknowledgementPacketCallback) (*types.Transaction, error) { + return _Contract.Contract.OnAcknowledgementPacket(&_Contract.TransactOpts, msg_) +} + +// OnRecvPacket is a paid mutator transaction binding the contract method 0x078c4a79. +// +// Solidity: function onRecvPacket((string,string,uint64,(string,string,string,string,bytes),address) msg_) returns(bytes) +func (_Contract *ContractTransactor) OnRecvPacket(opts *bind.TransactOpts, msg_ IIBCAppCallbacksOnRecvPacketCallback) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "onRecvPacket", msg_) +} + +// OnRecvPacket is a paid mutator transaction binding the contract method 0x078c4a79. +// +// Solidity: function onRecvPacket((string,string,uint64,(string,string,string,string,bytes),address) msg_) returns(bytes) +func (_Contract *ContractSession) OnRecvPacket(msg_ IIBCAppCallbacksOnRecvPacketCallback) (*types.Transaction, error) { + return _Contract.Contract.OnRecvPacket(&_Contract.TransactOpts, msg_) +} + +// OnRecvPacket is a paid mutator transaction binding the contract method 0x078c4a79. +// +// Solidity: function onRecvPacket((string,string,uint64,(string,string,string,string,bytes),address) msg_) returns(bytes) +func (_Contract *ContractTransactorSession) OnRecvPacket(msg_ IIBCAppCallbacksOnRecvPacketCallback) (*types.Transaction, error) { + return _Contract.Contract.OnRecvPacket(&_Contract.TransactOpts, msg_) +} + +// OnTimeoutPacket is a paid mutator transaction binding the contract method 0x5e32b6b6. +// +// Solidity: function onTimeoutPacket((string,string,uint64,(string,string,string,string,bytes),address) msg_) returns() +func (_Contract *ContractTransactor) OnTimeoutPacket(opts *bind.TransactOpts, msg_ IIBCAppCallbacksOnTimeoutPacketCallback) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "onTimeoutPacket", msg_) +} + +// OnTimeoutPacket is a paid mutator transaction binding the contract method 0x5e32b6b6. +// +// Solidity: function onTimeoutPacket((string,string,uint64,(string,string,string,string,bytes),address) msg_) returns() +func (_Contract *ContractSession) OnTimeoutPacket(msg_ IIBCAppCallbacksOnTimeoutPacketCallback) (*types.Transaction, error) { + return _Contract.Contract.OnTimeoutPacket(&_Contract.TransactOpts, msg_) +} + +// OnTimeoutPacket is a paid mutator transaction binding the contract method 0x5e32b6b6. +// +// Solidity: function onTimeoutPacket((string,string,uint64,(string,string,string,string,bytes),address) msg_) returns() +func (_Contract *ContractTransactorSession) OnTimeoutPacket(msg_ IIBCAppCallbacksOnTimeoutPacketCallback) (*types.Transaction, error) { + return _Contract.Contract.OnTimeoutPacket(&_Contract.TransactOpts, msg_) +} + +// SendCall is a paid mutator transaction binding the contract method 0xb1db5843. +// +// Solidity: function sendCall((string,uint64,string,bytes,bytes,string) msg_) returns(uint64) +func (_Contract *ContractTransactor) SendCall(opts *bind.TransactOpts, msg_ IICS27GMPMsgsSendCallMsg) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "sendCall", msg_) +} + +// SendCall is a paid mutator transaction binding the contract method 0xb1db5843. +// +// Solidity: function sendCall((string,uint64,string,bytes,bytes,string) msg_) returns(uint64) +func (_Contract *ContractSession) SendCall(msg_ IICS27GMPMsgsSendCallMsg) (*types.Transaction, error) { + return _Contract.Contract.SendCall(&_Contract.TransactOpts, msg_) +} + +// SendCall is a paid mutator transaction binding the contract method 0xb1db5843. +// +// Solidity: function sendCall((string,uint64,string,bytes,bytes,string) msg_) returns(uint64) +func (_Contract *ContractTransactorSession) SendCall(msg_ IICS27GMPMsgsSendCallMsg) (*types.Transaction, error) { + return _Contract.Contract.SendCall(&_Contract.TransactOpts, msg_) +} + +// UpgradeAccountTo is a paid mutator transaction binding the contract method 0xdd7345e3. +// +// Solidity: function upgradeAccountTo(address newEscrowLogic) returns() +func (_Contract *ContractTransactor) UpgradeAccountTo(opts *bind.TransactOpts, newEscrowLogic common.Address) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "upgradeAccountTo", newEscrowLogic) +} + +// UpgradeAccountTo is a paid mutator transaction binding the contract method 0xdd7345e3. +// +// Solidity: function upgradeAccountTo(address newEscrowLogic) returns() +func (_Contract *ContractSession) UpgradeAccountTo(newEscrowLogic common.Address) (*types.Transaction, error) { + return _Contract.Contract.UpgradeAccountTo(&_Contract.TransactOpts, newEscrowLogic) +} + +// UpgradeAccountTo is a paid mutator transaction binding the contract method 0xdd7345e3. +// +// Solidity: function upgradeAccountTo(address newEscrowLogic) returns() +func (_Contract *ContractTransactorSession) UpgradeAccountTo(newEscrowLogic common.Address) (*types.Transaction, error) { + return _Contract.Contract.UpgradeAccountTo(&_Contract.TransactOpts, newEscrowLogic) +} + +// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. +// +// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() +func (_Contract *ContractTransactor) UpgradeToAndCall(opts *bind.TransactOpts, newImplementation common.Address, data []byte) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "upgradeToAndCall", newImplementation, data) +} + +// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. +// +// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() +func (_Contract *ContractSession) UpgradeToAndCall(newImplementation common.Address, data []byte) (*types.Transaction, error) { + return _Contract.Contract.UpgradeToAndCall(&_Contract.TransactOpts, newImplementation, data) +} + +// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. +// +// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() +func (_Contract *ContractTransactorSession) UpgradeToAndCall(newImplementation common.Address, data []byte) (*types.Transaction, error) { + return _Contract.Contract.UpgradeToAndCall(&_Contract.TransactOpts, newImplementation, data) +} + +// ContractInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the Contract contract. +type ContractInitializedIterator struct { + Event *ContractInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ContractInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ContractInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ContractInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ContractInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractInitialized represents a Initialized event raised by the Contract contract. +type ContractInitialized struct { + Version uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_Contract *ContractFilterer) FilterInitialized(opts *bind.FilterOpts) (*ContractInitializedIterator, error) { + + logs, sub, err := _Contract.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &ContractInitializedIterator{contract: _Contract.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_Contract *ContractFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *ContractInitialized) (event.Subscription, error) { + + logs, sub, err := _Contract.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ContractInitialized) + if err := _Contract.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_Contract *ContractFilterer) ParseInitialized(log types.Log) (*ContractInitialized, error) { + event := new(ContractInitialized) + if err := _Contract.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ContractUpgradedIterator is returned from FilterUpgraded and is used to iterate over the raw logs and unpacked data for Upgraded events raised by the Contract contract. +type ContractUpgradedIterator struct { + Event *ContractUpgraded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ContractUpgradedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ContractUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ContractUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ContractUpgradedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractUpgradedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractUpgraded represents a Upgraded event raised by the Contract contract. +type ContractUpgraded struct { + Implementation common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUpgraded is a free log retrieval operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_Contract *ContractFilterer) FilterUpgraded(opts *bind.FilterOpts, implementation []common.Address) (*ContractUpgradedIterator, error) { + + var implementationRule []interface{} + for _, implementationItem := range implementation { + implementationRule = append(implementationRule, implementationItem) + } + + logs, sub, err := _Contract.contract.FilterLogs(opts, "Upgraded", implementationRule) + if err != nil { + return nil, err + } + return &ContractUpgradedIterator{contract: _Contract.contract, event: "Upgraded", logs: logs, sub: sub}, nil +} + +// WatchUpgraded is a free log subscription operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_Contract *ContractFilterer) WatchUpgraded(opts *bind.WatchOpts, sink chan<- *ContractUpgraded, implementation []common.Address) (event.Subscription, error) { + + var implementationRule []interface{} + for _, implementationItem := range implementation { + implementationRule = append(implementationRule, implementationItem) + } + + logs, sub, err := _Contract.contract.WatchLogs(opts, "Upgraded", implementationRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ContractUpgraded) + if err := _Contract.contract.UnpackLog(event, "Upgraded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUpgraded is a log parse operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_Contract *ContractFilterer) ParseUpgraded(log types.Log) (*ContractUpgraded, error) { + event := new(ContractUpgraded) + if err := _Contract.contract.UnpackLog(event, "Upgraded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/packages/solidity/src/msgs.rs b/packages/solidity/src/msgs.rs index 377a29d34..212186875 100644 --- a/packages/solidity/src/msgs.rs +++ b/packages/solidity/src/msgs.rs @@ -18,6 +18,7 @@ alloy_sol_types::sol!("../../contracts/msgs/IICS26RouterMsgs.sol"); alloy_sol_types::sol!("../../contracts/msgs/IICS02ClientMsgs.sol"); alloy_sol_types::sol!("../../contracts/msgs/ILightClientMsgs.sol"); alloy_sol_types::sol!("../../contracts/msgs/IICS20TransferMsgs.sol"); +alloy_sol_types::sol!("../../contracts/msgs/IICS27GMPMsgs.sol"); alloy_sol_types::sol!("../../contracts/msgs/IIBCAppCallbacks.sol"); alloy_sol_types::sol!("../../contracts/light-clients/msgs/IICS07TendermintMsgs.sol"); From 4e5d62b18092a219c53ab884ccb2eddf860c1538 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Fri, 25 Apr 2025 11:46:46 +0300 Subject: [PATCH 23/79] imp: regen abi --- abi/ICS27GMP.json | 10 +++++----- contracts/msgs/IICS27GMPMsgs.sol | 4 ++-- packages/go-abigen/ics27gmp/contract.go | 16 ++++++++-------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/abi/ICS27GMP.json b/abi/ICS27GMP.json index a83c63755..73fde850b 100644 --- a/abi/ICS27GMP.json +++ b/abi/ICS27GMP.json @@ -355,11 +355,6 @@ "type": "string", "internalType": "string" }, - { - "name": "timeoutTimestamp", - "type": "uint64", - "internalType": "uint64" - }, { "name": "receiver", "type": "string", @@ -375,6 +370,11 @@ "type": "bytes", "internalType": "bytes" }, + { + "name": "timeoutTimestamp", + "type": "uint64", + "internalType": "uint64" + }, { "name": "memo", "type": "string", diff --git a/contracts/msgs/IICS27GMPMsgs.sol b/contracts/msgs/IICS27GMPMsgs.sol index 19f730dfa..d58cb0ca1 100644 --- a/contracts/msgs/IICS27GMPMsgs.sol +++ b/contracts/msgs/IICS27GMPMsgs.sol @@ -4,17 +4,17 @@ pragma solidity ^0.8.28; interface IICS27GMPMsgs { /// @notice Message for sending a GMP packet /// @param sourceClient The source client identifier - /// @param timeoutTimestamp The absolute timeout timestamp in unix seconds /// @param receiver The receiver address of the contract call /// @param salt The salt used to generate the caller account address /// @param payload The payload of the call + /// @param timeoutTimestamp The absolute timeout timestamp in unix seconds /// @param memo Optional memo struct SendCallMsg { string sourceClient; - uint64 timeoutTimestamp; string receiver; bytes salt; bytes payload; + uint64 timeoutTimestamp; string memo; } diff --git a/packages/go-abigen/ics27gmp/contract.go b/packages/go-abigen/ics27gmp/contract.go index 9b146391b..02febf042 100644 --- a/packages/go-abigen/ics27gmp/contract.go +++ b/packages/go-abigen/ics27gmp/contract.go @@ -76,16 +76,16 @@ type IICS27GMPMsgsAccountIdentifier struct { // IICS27GMPMsgsSendCallMsg is an auto generated low-level Go binding around an user-defined struct. type IICS27GMPMsgsSendCallMsg struct { SourceClient string - TimeoutTimestamp uint64 Receiver string Salt []byte Payload []byte + TimeoutTimestamp uint64 Memo string } // ContractMetaData contains all meta data concerning the Contract contract. var ContractMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccountBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOrComputeAccountAddress\",\"inputs\":[{\"name\":\"accountId\",\"type\":\"tuple\",\"internalType\":\"structIICS27GMPMsgs.AccountIdentifier\",\"components\":[{\"name\":\"clientId\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"salt\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ics26\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"ics26_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accountLogic\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"multicall\",\"inputs\":[{\"name\":\"data\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[{\"name\":\"results\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onAcknowledgementPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnAcknowledgementPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"acknowledgement\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onRecvPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnRecvPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sendCall\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS27GMPMsgs.SendCallMsg\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"salt\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeAccountTo\",\"inputs\":[{\"name\":\"newEscrowLogic\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Create2EmptyBytecode\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedDeployment\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS27InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidPort\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27Unauthorized\",\"inputs\":[{\"name\":\"expected\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedEncoding\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"InsufficientBalance\",\"inputs\":[{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccountBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOrComputeAccountAddress\",\"inputs\":[{\"name\":\"accountId\",\"type\":\"tuple\",\"internalType\":\"structIICS27GMPMsgs.AccountIdentifier\",\"components\":[{\"name\":\"clientId\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"salt\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ics26\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"ics26_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accountLogic\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"multicall\",\"inputs\":[{\"name\":\"data\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[{\"name\":\"results\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onAcknowledgementPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnAcknowledgementPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"acknowledgement\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onRecvPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnRecvPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sendCall\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS27GMPMsgs.SendCallMsg\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"salt\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeAccountTo\",\"inputs\":[{\"name\":\"newEscrowLogic\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Create2EmptyBytecode\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedDeployment\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS27InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidPort\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27Unauthorized\",\"inputs\":[{\"name\":\"expected\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedEncoding\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"InsufficientBalance\",\"inputs\":[{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", } // ContractABI is the input ABI used to generate the binding from. @@ -494,23 +494,23 @@ func (_Contract *ContractTransactorSession) OnTimeoutPacket(msg_ IIBCAppCallback return _Contract.Contract.OnTimeoutPacket(&_Contract.TransactOpts, msg_) } -// SendCall is a paid mutator transaction binding the contract method 0xb1db5843. +// SendCall is a paid mutator transaction binding the contract method 0x7e5a6566. // -// Solidity: function sendCall((string,uint64,string,bytes,bytes,string) msg_) returns(uint64) +// Solidity: function sendCall((string,string,bytes,bytes,uint64,string) msg_) returns(uint64) func (_Contract *ContractTransactor) SendCall(opts *bind.TransactOpts, msg_ IICS27GMPMsgsSendCallMsg) (*types.Transaction, error) { return _Contract.contract.Transact(opts, "sendCall", msg_) } -// SendCall is a paid mutator transaction binding the contract method 0xb1db5843. +// SendCall is a paid mutator transaction binding the contract method 0x7e5a6566. // -// Solidity: function sendCall((string,uint64,string,bytes,bytes,string) msg_) returns(uint64) +// Solidity: function sendCall((string,string,bytes,bytes,uint64,string) msg_) returns(uint64) func (_Contract *ContractSession) SendCall(msg_ IICS27GMPMsgsSendCallMsg) (*types.Transaction, error) { return _Contract.Contract.SendCall(&_Contract.TransactOpts, msg_) } -// SendCall is a paid mutator transaction binding the contract method 0xb1db5843. +// SendCall is a paid mutator transaction binding the contract method 0x7e5a6566. // -// Solidity: function sendCall((string,uint64,string,bytes,bytes,string) msg_) returns(uint64) +// Solidity: function sendCall((string,string,bytes,bytes,uint64,string) msg_) returns(uint64) func (_Contract *ContractTransactorSession) SendCall(msg_ IICS27GMPMsgsSendCallMsg) (*types.Transaction, error) { return _Contract.Contract.SendCall(&_Contract.TransactOpts, msg_) } From 5e537c924be0a42dc3c7207d6af7e42a102c427d Mon Sep 17 00:00:00 2001 From: srdtrk Date: Fri, 25 Apr 2025 11:58:17 +0300 Subject: [PATCH 24/79] imp: forge fmt --- contracts/utils/ICS27Lib.sol | 1 - test/solidity-ibc/Integration2Test.t.sol | 9 ++++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/contracts/utils/ICS27Lib.sol b/contracts/utils/ICS27Lib.sol index 16c467ddd..aeb5544ba 100644 --- a/contracts/utils/ICS27Lib.sol +++ b/contracts/utils/ICS27Lib.sol @@ -24,7 +24,6 @@ library ICS27Lib { /// @notice KECCAK256_DEFAULT_PORT_ID is the keccak256 hash of the DEFAULT_PORT_ID. bytes32 internal constant KECCAK256_DEFAULT_PORT_ID = keccak256(bytes(DEFAULT_PORT_ID)); - /// @notice Create a GMP acknowledgement from a call result. /// @param result The result of the call /// @return The GMP acknowledgement message diff --git a/test/solidity-ibc/Integration2Test.t.sol b/test/solidity-ibc/Integration2Test.t.sol index c06862809..7a117b448 100644 --- a/test/solidity-ibc/Integration2Test.t.sol +++ b/test/solidity-ibc/Integration2Test.t.sol @@ -548,7 +548,8 @@ contract Integration2Test is Test { address computedAccount = ibcImplB.ics27Gmp().getOrComputeAccountAddress(accountId); // send packet - IICS26RouterMsgs.Packet memory sentPacket = ibcImplA.sendGmpAsUser(user, Strings.toHexString(receiver), payload, accountId.salt); + IICS26RouterMsgs.Packet memory sentPacket = + ibcImplA.sendGmpAsUser(user, Strings.toHexString(receiver), payload, accountId.salt); // Receive the packet on B vm.expectCall(receiver, 0, payload); @@ -591,7 +592,8 @@ contract Integration2Test is Test { }); // send packet - IICS26RouterMsgs.Packet memory sentPacket = ibcImplA.sendGmpAsUser(user, Strings.toHexString(receiver), payload, accountId.salt); + IICS26RouterMsgs.Packet memory sentPacket = + ibcImplA.sendGmpAsUser(user, Strings.toHexString(receiver), payload, accountId.salt); // Receive the packet on B vm.expectCall(receiver, 0, payload); @@ -630,7 +632,8 @@ contract Integration2Test is Test { // send packet uint64 timeoutTimestamp = uint64(block.timestamp + 10 seconds); - IICS26RouterMsgs.Packet memory sentPacket = ibcImplA.sendGmpAsUser(user, Strings.toHexString(receiver), payload, accountId.salt, "", timeoutTimestamp); + IICS26RouterMsgs.Packet memory sentPacket = + ibcImplA.sendGmpAsUser(user, Strings.toHexString(receiver), payload, accountId.salt, "", timeoutTimestamp); // Set the block timestamp to the timeout vm.warp(block.timestamp + 30 seconds); From 3c2a2fc933e661ea2b356acd3d742e1835d596d6 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Wed, 7 May 2025 19:39:28 +0400 Subject: [PATCH 25/79] imp: using contract call branch --- e2e/interchaintestv8/go.mod | 173 +++--- e2e/interchaintestv8/go.sum | 1095 ++++++++++++++++++++++++++++++----- 2 files changed, 1038 insertions(+), 230 deletions(-) diff --git a/e2e/interchaintestv8/go.mod b/e2e/interchaintestv8/go.mod index 29e755e87..3d8f641fd 100644 --- a/e2e/interchaintestv8/go.mod +++ b/e2e/interchaintestv8/go.mod @@ -1,52 +1,80 @@ module github.com/srdtrk/solidity-ibc-eureka/e2e/v8 -go 1.23.6 +go 1.23.8 + +toolchain go1.23.9 require ( - cosmossdk.io/api v0.7.6 - cosmossdk.io/collections v0.4.0 - cosmossdk.io/errors v1.0.1 - cosmossdk.io/math v1.4.0 - cosmossdk.io/x/upgrade v0.1.4 + cosmossdk.io/api v0.9.2 + cosmossdk.io/collections v1.2.0 + cosmossdk.io/errors v1.0.2 + cosmossdk.io/math v1.5.3 + cosmossdk.io/x/upgrade v0.2.0 github.com/attestantio/go-eth2-client v0.24.0 - github.com/cometbft/cometbft v0.38.15 - github.com/cosmos/cosmos-sdk v0.50.13 + github.com/cometbft/cometbft v0.38.17 + github.com/cosmos/cosmos-sdk v0.53.0 github.com/cosmos/gogoproto v1.7.0 github.com/cosmos/ibc-go/modules/light-clients/08-wasm/v10 v10.1.0 github.com/cosmos/ibc-go/v10 v10.1.0 github.com/cosmos/solidity-ibc-eureka/packages/go-abigen v0.0.0 github.com/docker/docker v27.3.1+incompatible - github.com/ethereum/go-ethereum v1.15.5 + github.com/ethereum/go-ethereum v1.15.10 github.com/holiman/uint256 v1.3.2 github.com/kurtosis-tech/kurtosis/api/golang v1.5.0 - github.com/rs/zerolog v1.33.0 + github.com/rs/zerolog v1.34.0 github.com/strangelove-ventures/interchaintest/v8 v8.3.0 github.com/stretchr/testify v1.10.0 go.uber.org/zap v1.27.0 - google.golang.org/grpc v1.69.4 - google.golang.org/protobuf v1.36.5 + google.golang.org/grpc v1.72.0 + google.golang.org/protobuf v1.36.6 ) require ( - cloud.google.com/go v0.115.0 // indirect - cloud.google.com/go/auth v0.6.0 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.2 // indirect - cloud.google.com/go/compute/metadata v0.5.2 // indirect - cloud.google.com/go/iam v1.1.9 // indirect - cloud.google.com/go/storage v1.41.0 // indirect - cosmossdk.io/core v0.11.1 // indirect - cosmossdk.io/depinject v1.1.0 // indirect - cosmossdk.io/log v1.4.1 // indirect - cosmossdk.io/store v1.1.1 // indirect + cel.dev/expr v0.20.0 // indirect + cloud.google.com/go/monitoring v1.21.2 // indirect + cosmossdk.io/schema v1.1.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 // indirect + github.com/bytedance/sonic v1.13.2 // indirect + github.com/bytedance/sonic/loader v0.2.4 // indirect + github.com/cloudwego/base64x v0.1.5 // indirect + github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42 // indirect + github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect + github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect + github.com/go-jose/go-jose/v4 v4.0.5 // indirect + github.com/go-viper/mapstructure/v2 v2.2.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/zeebo/errs v1.4.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.34.0 // indirect + go.opentelemetry.io/otel/sdk v1.34.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect + go.uber.org/mock v0.5.2 // indirect + golang.org/x/arch v0.15.0 // indirect +) + +require ( + cloud.google.com/go v0.116.0 // indirect + cloud.google.com/go/auth v0.14.1 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.7 // indirect + cloud.google.com/go/compute/metadata v0.6.0 // indirect + cloud.google.com/go/iam v1.2.2 // indirect + cloud.google.com/go/storage v1.49.0 // indirect + cosmossdk.io/core v0.11.3 // indirect + cosmossdk.io/depinject v1.2.0 // indirect + cosmossdk.io/log v1.5.1 // indirect + cosmossdk.io/store v1.1.2 // indirect cosmossdk.io/x/feegrant v0.1.1 // indirect - cosmossdk.io/x/tx v0.13.7 // indirect + cosmossdk.io/x/tx v0.14.0 // indirect filippo.io/edwards25519 v1.1.0 // indirect github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.2 // indirect github.com/BurntSushi/toml v1.4.0 // indirect github.com/CosmWasm/wasmvm/v2 v2.2.3 // indirect github.com/DataDog/datadog-go v4.8.3+incompatible // indirect - github.com/DataDog/zstd v1.5.5 // indirect + github.com/DataDog/zstd v1.5.7 // indirect github.com/Masterminds/semver/v3 v3.3.1 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/StackExchange/wmi v1.2.1 // indirect @@ -56,7 +84,7 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/bgentry/speakeasy v0.2.0 // indirect - github.com/bits-and-blooms/bitset v1.17.0 // indirect + github.com/bits-and-blooms/bitset v1.22.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/chzyer/readline v1.5.1 // indirect @@ -64,8 +92,8 @@ require ( github.com/cockroachdb/errors v1.11.3 // indirect github.com/cockroachdb/fifo v0.0.0-20240616162244-4768e80dfb9a // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v1.1.2 // indirect - github.com/cockroachdb/redact v1.1.5 // indirect + github.com/cockroachdb/pebble v1.1.5 // indirect + github.com/cockroachdb/redact v1.1.6 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect github.com/cometbft/cometbft-db v0.14.1 // indirect github.com/consensys/bavard v0.1.22 // indirect @@ -84,7 +112,7 @@ require ( github.com/danieljoos/wincred v1.2.1 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/deckarep/golang-set/v2 v2.6.0 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect github.com/desertbit/timer v1.0.1 // indirect github.com/dgraph-io/badger/v4 v4.2.0 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect @@ -100,7 +128,7 @@ require ( github.com/fatih/color v1.18.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/ferranbt/fastssz v0.1.4 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/getsentry/sentry-go v0.28.1 // indirect github.com/ghodss/yaml v1.0.0 // indirect github.com/go-kit/kit v0.13.0 // indirect @@ -114,20 +142,19 @@ require ( github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v1.2.2 // indirect + github.com/golang/glog v1.2.4 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/mock v1.6.0 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/btree v1.1.3 // indirect github.com/google/flatbuffers v24.3.25+incompatible // indirect - github.com/google/go-cmp v0.6.0 // indirect + github.com/google/go-cmp v0.7.0 // indirect github.com/google/orderedcode v0.0.1 // indirect github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 // indirect - github.com/google/s2a-go v0.1.7 // indirect + github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.5 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect + github.com/googleapis/gax-go/v2 v2.14.1 // indirect github.com/gorilla/handlers v1.5.2 // indirect github.com/gorilla/mux v1.8.1 // indirect github.com/gorilla/websocket v1.5.3 // indirect @@ -135,28 +162,27 @@ require ( github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-getter v1.7.4 // indirect + github.com/hashicorp/go-getter v1.7.8 // indirect github.com/hashicorp/go-hclog v1.6.3 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-metrics v0.5.3 // indirect - github.com/hashicorp/go-plugin v1.6.1 // indirect + github.com/hashicorp/go-metrics v0.5.4 // indirect + github.com/hashicorp/go-plugin v1.6.3 // indirect github.com/hashicorp/go-safetemp v1.0.0 // indirect github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/yamux v0.1.1 // indirect + github.com/hashicorp/yamux v0.1.2 // indirect github.com/hdevalence/ed25519consensus v0.2.0 // indirect github.com/huandu/go-clone v1.6.0 // indirect - github.com/huandu/skiplist v1.2.0 // indirect + github.com/huandu/skiplist v1.2.1 // indirect github.com/iancoleman/strcase v0.3.0 // indirect github.com/icza/dyno v0.0.0-20220812133438-f0b6f8a18845 // indirect github.com/improbable-eng/grpc-web v0.15.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/jmhodges/levigo v1.0.0 // indirect - github.com/klauspost/compress v1.17.9 // indirect - github.com/klauspost/cpuid/v2 v2.2.9 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.10 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/kurtosis-tech/kurtosis-portal/api/golang v0.0.0-20230818182330-1a86869414d2 // indirect @@ -166,7 +192,6 @@ require ( github.com/kurtosis-tech/stacktrace v0.0.0-20211028211901-1c67a77b5409 // indirect github.com/lib/pq v1.10.9 // indirect github.com/linxGnu/grocksdb v1.9.2 // indirect - github.com/magiconair/properties v1.8.7 // indirect github.com/manifoldco/promptui v0.9.0 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect @@ -189,34 +214,33 @@ require ( github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc2 // indirect github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect github.com/pierrec/lz4 v2.6.1+incompatible // indirect github.com/pk910/dynamic-ssz v0.0.4 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.20.5 // indirect + github.com/prometheus/client_golang v1.22.0 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.60.1 // indirect + github.com/prometheus/common v0.63.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/prysmaticlabs/go-bitfield v0.0.0-20240618144021-706c95b2dd15 // indirect github.com/r3labs/sse/v2 v2.10.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect - github.com/rogpeppe/go-internal v1.13.1 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect github.com/rs/cors v1.11.1 // indirect - github.com/sagikazarmark/locafero v0.6.0 // indirect - github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sagikazarmark/locafero v0.7.0 // indirect github.com/sasha-s/go-deadlock v0.3.5 // indirect github.com/shamaton/msgpack/v2 v2.2.0 // indirect github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/afero v1.12.0 // indirect github.com/spf13/cast v1.7.1 // indirect - github.com/spf13/cobra v1.8.1 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.19.0 // indirect + github.com/spf13/cobra v1.9.1 // indirect + github.com/spf13/pflag v1.0.6 // indirect + github.com/spf13/viper v1.20.1 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/supranational/blst v0.3.14 // indirect @@ -232,36 +256,35 @@ require ( go.etcd.io/bbolt v1.4.0-alpha.1 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 // indirect go.opentelemetry.io/otel v1.34.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect go.opentelemetry.io/otel/metric v1.34.0 // indirect go.opentelemetry.io/otel/trace v1.34.0 // indirect go.opentelemetry.io/proto/otlp v1.5.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.32.0 // indirect - golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa // indirect - golang.org/x/mod v0.22.0 // indirect - golang.org/x/net v0.34.0 // indirect - golang.org/x/oauth2 v0.23.0 // indirect - golang.org/x/sync v0.10.0 // indirect - golang.org/x/sys v0.29.0 // indirect - golang.org/x/term v0.28.0 // indirect - golang.org/x/text v0.21.0 // indirect - golang.org/x/time v0.9.0 // indirect - golang.org/x/tools v0.29.0 // indirect + golang.org/x/crypto v0.37.0 // indirect + golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect + golang.org/x/mod v0.24.0 // indirect + golang.org/x/net v0.39.0 // indirect + golang.org/x/oauth2 v0.27.0 // indirect + golang.org/x/sync v0.13.0 + golang.org/x/sys v0.32.0 // indirect + golang.org/x/term v0.31.0 // indirect + golang.org/x/text v0.24.0 // indirect + golang.org/x/time v0.10.0 // indirect + golang.org/x/tools v0.31.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect - google.golang.org/api v0.186.0 // indirect - google.golang.org/genproto v0.0.0-20240701130421-f6361c86f094 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect + google.golang.org/api v0.222.0 // indirect + google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250414145226-207652e42e2e // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250422160041-2d3770c4ea7f // indirect gopkg.in/Knetic/govaluate.v3 v3.0.0 // indirect gopkg.in/cenkalti/backoff.v1 v1.1.0 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - gotest.tools/v3 v3.5.1 // indirect + gotest.tools/v3 v3.5.2 // indirect modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 // indirect modernc.org/libc v1.41.0 // indirect; indirectG modernc.org/mathutil v1.6.0 // indirect @@ -270,7 +293,7 @@ require ( modernc.org/strutil v1.2.0 // indirect modernc.org/token v1.1.0 // indirect nhooyr.io/websocket v1.8.11 // indirect - pgregory.net/rapid v1.1.0 // indirect + pgregory.net/rapid v1.2.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect sigs.k8s.io/yaml v1.4.0 // indirect ) @@ -279,6 +302,8 @@ replace github.com/cosmos/solidity-ibc-eureka/packages/go-abigen => ../../packag replace github.com/strangelove-ventures/interchaintest/v8 => github.com/gjermundgaraba/interchaintest/v8 v8.0.0-20250215185800-7e1ec6907f6e +replace github.com/cosmos/ibc-go/v10 => github.com/cosmos/ibc-go/v10 v10.0.0-beta.0.0.20250507143428-be8367e07cfe + replace github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // this line is used by go-codegen # suite/module diff --git a/e2e/interchaintestv8/go.sum b/e2e/interchaintestv8/go.sum index 5e2f5f6d6..a6425fcb3 100644 --- a/e2e/interchaintestv8/go.sum +++ b/e2e/interchaintestv8/go.sum @@ -1,8 +1,11 @@ +cel.dev/expr v0.20.0 h1:OunBvVCfvpWlt4dN7zg3FM6TDkzOePe1+foGJ9AXeeI= +cel.dev/expr v0.20.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -15,6 +18,7 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= @@ -26,32 +30,96 @@ cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+Y cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14= -cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE= +cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= +cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= +cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= +cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= +cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= +cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= +cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= +cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/auth v0.6.0 h1:5x+d6b5zdezZ7gmLWD1m/xNjnaQ2YDhmIz/HH3doy1g= -cloud.google.com/go/auth v0.6.0/go.mod h1:b4acV+jLQDyjwm4OXHYjNvRi4jvGBzHWJRtJcy+2P4g= -cloud.google.com/go/auth/oauth2adapt v0.2.2 h1:+TTV8aXpjeChS9M+aTtN/TjdQnzJvmzKFt//oWu7HX4= -cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/auth v0.14.1 h1:AwoJbzUdxA/whv1qj3TLKwh3XX5sikny2fc40wUl+h0= +cloud.google.com/go/auth v0.14.1/go.mod h1:4JHUxlGXisL0AW8kXPtUF6ztuOksyfUQNFjfsOCXkPM= +cloud.google.com/go/auth/oauth2adapt v0.2.7 h1:/Lc7xODdqcEw8IrZ9SvwnlLX6j9FHQM74z6cBk9Rw6M= +cloud.google.com/go/auth/oauth2adapt v0.2.7/go.mod h1:NTbTTzfvPl1Y3V1nPpOgl2w6d/FjO7NNUQaWSox6ZMc= cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -59,12 +127,44 @@ cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUM cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= +cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= +cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= +cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= @@ -72,151 +172,483 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo= -cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= +cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= +cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= +cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= +cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= +cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v1.1.9 h1:oSkYLVtVme29uGYrOcKcvJRht7cHJpYD09GM9JaR0TE= -cloud.google.com/go/iam v1.1.9/go.mod h1:Nt1eDWNYH9nGQg3d/mY7U1hvfGmsaG9o/kLGoLoLXjQ= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iam v1.2.2 h1:ozUSofHUGf/F4tCNy/mu9tHLTaxZFLOUiKzjcgWHGIA= +cloud.google.com/go/iam v1.2.2/go.mod h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= +cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= +cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= +cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/logging v1.12.0 h1:ex1igYcGFd4S/RZWOCU51StlIEuey5bjqwH9ZYjHibk= +cloud.google.com/go/logging v1.12.0/go.mod h1:wwYBt5HlYP1InnrtYI0wtwttpVU1rifnMT7RejksUAM= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/longrunning v0.6.2 h1:xjDfh1pQcWPEvnfjZmwjKQEcHnpz6lHjfy7Fo0MK+hc= +cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/monitoring v1.21.2 h1:FChwVtClH19E7pJ+e0xUhJPGksctZNVOk2UhMmblmdU= +cloud.google.com/go/monitoring v1.21.2/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU= cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= +cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= +cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.41.0 h1:RusiwatSu6lHeEXe3kglxakAmAbfV+rhtPqA6i8RBx0= -cloud.google.com/go/storage v1.41.0/go.mod h1:J1WCa/Z2FcgdEDuPUY8DxT5I+d9mFKsCepp5vR6Sq80= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storage v1.49.0 h1:zenOPBOWHCnojRd9aJZAyQXBYqkJkdQS42dxL55CIMw= +cloud.google.com/go/storage v1.49.0/go.mod h1:k1eHhhpLvrPjVGfo0mOUPEJ4Y2+a/Hv5PiwehZI9qGU= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/trace v1.11.2 h1:4ZmaBdL8Ng/ajrgKqY5jfvzqMXbrDcBsUGXOT9aqTtI= +cloud.google.com/go/trace v1.11.2/go.mod h1:bn7OwXd4pd5rFuAnTrzBuoZ4ax2XQeG3qNgYmfCy0Io= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= +cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= +cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= +cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cosmossdk.io/api v0.7.6 h1:PC20PcXy1xYKH2KU4RMurVoFjjKkCgYRbVAD4PdqUuY= -cosmossdk.io/api v0.7.6/go.mod h1:IcxpYS5fMemZGqyYtErK7OqvdM0C8kdW3dq8Q/XIG38= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= +cosmossdk.io/api v0.9.2 h1:9i9ptOBdmoIEVEVWLtYYHjxZonlF/aOVODLFaxpmNtg= +cosmossdk.io/api v0.9.2/go.mod h1:CWt31nVohvoPMTlPv+mMNCtC0a7BqRdESjCsstHcTkU= cosmossdk.io/client/v2 v2.0.0-beta.5 h1:0LVv3nEByn//hFDIrYLs2WvsEU3HodOelh4SDHnA/1I= cosmossdk.io/client/v2 v2.0.0-beta.5/go.mod h1:4p0P6o0ro+FizakJUYS9SeM94RNbv0thLmkHRw5o5as= -cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= -cosmossdk.io/collections v0.4.0/go.mod h1:oa5lUING2dP+gdDquow+QjlF45eL1t4TJDypgGd+tv0= -cosmossdk.io/core v0.11.1 h1:h9WfBey7NAiFfIcUhDVNS503I2P2HdZLebJlUIs8LPA= -cosmossdk.io/core v0.11.1/go.mod h1:OJzxcdC+RPrgGF8NJZR2uoQr56tc7gfBKhiKeDO7hH0= -cosmossdk.io/depinject v1.1.0 h1:wLan7LG35VM7Yo6ov0jId3RHWCGRhe8E8bsuARorl5E= -cosmossdk.io/depinject v1.1.0/go.mod h1:kkI5H9jCGHeKeYWXTqYdruogYrEeWvBQCw1Pj4/eCFI= -cosmossdk.io/errors v1.0.1 h1:bzu+Kcr0kS/1DuPBtUFdWjzLqyUuCiyHjyJB6srBV/0= -cosmossdk.io/errors v1.0.1/go.mod h1:MeelVSZThMi4bEakzhhhE/CKqVv3nOJDA25bIqRDu/U= -cosmossdk.io/log v1.4.1 h1:wKdjfDRbDyZRuWa8M+9nuvpVYxrEOwbD/CA8hvhU8QM= -cosmossdk.io/log v1.4.1/go.mod h1:k08v0Pyq+gCP6phvdI6RCGhLf/r425UT6Rk/m+o74rU= -cosmossdk.io/math v1.4.0 h1:XbgExXFnXmF/CccPPEto40gOO7FpWu9yWNAZPN3nkNQ= -cosmossdk.io/math v1.4.0/go.mod h1:O5PkD4apz2jZs4zqFdTr16e1dcaQCc5z6lkEnrrppuk= -cosmossdk.io/store v1.1.1 h1:NA3PioJtWDVU7cHHeyvdva5J/ggyLDkyH0hGHl2804Y= -cosmossdk.io/store v1.1.1/go.mod h1:8DwVTz83/2PSI366FERGbWSH7hL6sB7HbYp8bqksNwM= +cosmossdk.io/collections v1.2.0 h1:IesfVG8G/+FYCMVMP01frS/Cw99Omk5vBh3cHbO01Gg= +cosmossdk.io/collections v1.2.0/go.mod h1:4NkMoYw6qRA8fnSH/yn1D/MOutr8qyQnwsO50Mz9ItU= +cosmossdk.io/core v0.11.3 h1:mei+MVDJOwIjIniaKelE3jPDqShCc/F4LkNNHh+4yfo= +cosmossdk.io/core v0.11.3/go.mod h1:9rL4RE1uDt5AJ4Tg55sYyHWXA16VmpHgbe0PbJc6N2Y= +cosmossdk.io/depinject v1.2.0 h1:6NW/FSK1IkWTrX7XxUpBmX1QMBozpEI9SsWkKTBc5zw= +cosmossdk.io/depinject v1.2.0/go.mod h1:pvitjtUxZZZTQESKNS9KhGjWVslJZxtO9VooRJYyPjk= +cosmossdk.io/errors v1.0.2 h1:wcYiJz08HThbWxd/L4jObeLaLySopyyuUFB5w4AGpCo= +cosmossdk.io/errors v1.0.2/go.mod h1:0rjgiHkftRYPj//3DrD6y8hcm40HcPv/dR4R/4efr0k= +cosmossdk.io/log v1.5.1 h1:wLwiYXmfrort/O+j6EkjF+HvbdrRQd+4cYCPKFSm+zM= +cosmossdk.io/log v1.5.1/go.mod h1:5cXXBvfBkR2/BcXmosdCSLXllvgSjphrrDVdfVRmBGM= +cosmossdk.io/math v1.5.3 h1:WH6tu6Z3AUCeHbeOSHg2mt9rnoiUWVWaQ2t6Gkll96U= +cosmossdk.io/math v1.5.3/go.mod h1:uqcZv7vexnhMFJF+6zh9EWdm/+Ylyln34IvPnBauPCQ= +cosmossdk.io/schema v1.1.0 h1:mmpuz3dzouCoyjjcMcA/xHBEmMChN+EHh8EHxHRHhzE= +cosmossdk.io/schema v1.1.0/go.mod h1:Gb7pqO+tpR+jLW5qDcNOSv0KtppYs7881kfzakguhhI= +cosmossdk.io/store v1.1.2 h1:3HOZG8+CuThREKv6cn3WSohAc6yccxO3hLzwK6rBC7o= +cosmossdk.io/store v1.1.2/go.mod h1:60rAGzTHevGm592kFhiUVkNC9w7gooSEn5iUBPzHQ6A= cosmossdk.io/x/circuit v0.1.1 h1:KPJCnLChWrxD4jLwUiuQaf5mFD/1m7Omyo7oooefBVQ= cosmossdk.io/x/circuit v0.1.1/go.mod h1:B6f/urRuQH8gjt4eLIXfZJucrbreuYrKh5CSjaOxr+Q= cosmossdk.io/x/evidence v0.1.1 h1:Ks+BLTa3uftFpElLTDp9L76t2b58htjVbSZ86aoK/E4= cosmossdk.io/x/evidence v0.1.1/go.mod h1:OoDsWlbtuyqS70LY51aX8FBTvguQqvFrt78qL7UzeNc= cosmossdk.io/x/feegrant v0.1.1 h1:EKFWOeo/pup0yF0svDisWWKAA9Zags6Zd0P3nRvVvw8= cosmossdk.io/x/feegrant v0.1.1/go.mod h1:2GjVVxX6G2fta8LWj7pC/ytHjryA6MHAJroBWHFNiEQ= -cosmossdk.io/x/tx v0.13.7 h1:8WSk6B/OHJLYjiZeMKhq7DK7lHDMyK0UfDbBMxVmeOI= -cosmossdk.io/x/tx v0.13.7/go.mod h1:V6DImnwJMTq5qFjeGWpXNiT/fjgE4HtmclRmTqRVM3w= -cosmossdk.io/x/upgrade v0.1.4 h1:/BWJim24QHoXde8Bc64/2BSEB6W4eTydq0X/2f8+g38= -cosmossdk.io/x/upgrade v0.1.4/go.mod h1:9v0Aj+fs97O+Ztw+tG3/tp5JSlrmT7IcFhAebQHmOPo= +cosmossdk.io/x/tx v0.14.0 h1:hB3O25kIcyDW/7kMTLMaO8Ripj3yqs5imceVd6c/heA= +cosmossdk.io/x/tx v0.14.0/go.mod h1:Tn30rSRA1PRfdGB3Yz55W4Sn6EIutr9xtMKSHij+9PM= +cosmossdk.io/x/upgrade v0.2.0 h1:ZHy0xny3wBCSLomyhE06+UmQHWO8cYlVYjfFAJxjz5g= +cosmossdk.io/x/upgrade v0.2.0/go.mod h1:DXDtkvi//TrFyHWSOaeCZGBoiGAE6Rs8/0ABt2pcDD0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= github.com/99designs/keyring v1.2.2 h1:pZd3neh/EmUzWONb35LxQfvuY7kiSXAq3HQd97+XBn0= @@ -232,8 +664,17 @@ github.com/CosmWasm/wasmvm/v2 v2.2.3/go.mod h1:bMhLQL4Yp9CzJi9A83aR7VO9wockOsSlZ github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/datadog-go v4.8.3+incompatible h1:fNGaYSuObuQb5nzeTQqowRAd9bpDIRRV4/gUtIBjh8Q= github.com/DataDog/datadog-go v4.8.3+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ= -github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/DataDog/zstd v1.5.7 h1:ybO8RBeh29qrxIhCA9E8gKY6xfONU9T6G6aP9DTKfLE= +github.com/DataDog/zstd v1.5.7/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0 h1:f2Qw/Ehhimh5uO1fayV0QIW7DShEQqhtUfhYc+cBPlw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0/go.mod h1:2bIszWvQRlJVmJLiuLhukLImRjKPcYdzzsx6darK02A= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 h1:UQ0AhxogsIRZDkElkblfnwjc3IaltCm2HUMvezQaL7s= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1/go.mod h1:jyqM3eLpJ3IbIFDTKVz2rF9T/xWGW0rIriGwnz8l9Tk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1 h1:oTX4vsorBZo/Zdum6OKPA4o7544hm6smoRv1QjpTwGo= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1/go.mod h1:0wEl7vrAD8mehJyohS9HZy+WyEOaQO2mJx86Cvh93kM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 h1:8nn+rsCvTq9axyEh382S0PFLBeaFwNsT43IrPWzctRU= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1/go.mod h1:viRWSEhtMZqz1rhwmOVKkWl6SwmVowfL9O2YR5gI2PE= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= @@ -255,16 +696,25 @@ github.com/adlio/schema v1.3.6/go.mod h1:qkxwLgPBd1FgLRHYVCmQT/rrBr3JH38J9LjmVzW github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/attestantio/go-eth2-client v0.24.0 h1:lGVbcnhlBwRglt1Zs56JOCgXVyLWKFZOmZN8jKhE7Ws= @@ -287,14 +737,21 @@ github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bgentry/speakeasy v0.2.0 h1:tgObeVOf8WAvtuAX6DhJ4xks4CFNwPDZiqzGqIHE51E= github.com/bgentry/speakeasy v0.2.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bits-and-blooms/bitset v1.17.0 h1:1X2TS7aHz1ELcC0yU1y2stUs/0ig5oMU6STFZGrhvHI= -github.com/bits-and-blooms/bitset v1.17.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= -github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/bits-and-blooms/bitset v1.22.0 h1:Tquv9S8+SGaS3EhyA+up3FXzmkhxPGjQQCkcs2uw7w4= +github.com/bits-and-blooms/bitset v1.22.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U= +github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/btcutil v1.1.6 h1:zFL2+c3Lb9gEgqKNzowKUPQNb8jV7v5Oaodi/AYFd6c= github.com/btcsuite/btcd/btcutil v1.1.6/go.mod h1:9dFymx8HpuLqBnsPELrImQeTQfKBQqzqGbbV3jK55aE= -github.com/bufbuild/protocompile v0.6.0 h1:Uu7WiSQ6Yj9DbkdnOe7U4mNKp58y9WDMKDn28/ZlunY= -github.com/bufbuild/protocompile v0.6.0/go.mod h1:YNP35qEYoYGme7QMtz5SBCoN4kL4g12jTtjuzRNdjpE= +github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/FBatYVw= +github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c= +github.com/bytedance/sonic v1.13.2 h1:8/H1FempDZqC4VqjptGo14QQlJx8VdZJegxs6wwfqpQ= +github.com/bytedance/sonic v1.13.2/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY= +github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= @@ -302,10 +759,13 @@ github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInq github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= @@ -322,15 +782,24 @@ github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6D github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4= +github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42 h1:Om6kYQYDUk5wWbT0t0q6pvyM49i9XZAv9dDrkDA7gjk= +github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= @@ -342,15 +811,15 @@ github.com/cockroachdb/fifo v0.0.0-20240616162244-4768e80dfb9a h1:f52TdbU4D5nozM github.com/cockroachdb/fifo v0.0.0-20240616162244-4768e80dfb9a/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA= -github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= -github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= -github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/pebble v1.1.5 h1:5AAWCBWbat0uE0blr8qzufZP5tBjkRyy/jWe1QWLnvw= +github.com/cockroachdb/pebble v1.1.5/go.mod h1:17wO9el1YEigxkP/YtV8NtCivQDgoCyBg5c4VR/eOWo= +github.com/cockroachdb/redact v1.1.6 h1:zXJBwDZ84xJNlHl1rMyCojqyIxv+7YUpQiJLQ7n4314= +github.com/cockroachdb/redact v1.1.6/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/cometbft/cometbft v0.38.15 h1:5veFd8k1uXM27PBg9sMO3hAfRJ3vbh4OmmLf6cVrqXg= -github.com/cometbft/cometbft v0.38.15/go.mod h1:+wh6ap6xctVG+JOHwbl8pPKZ0GeqdPYqISu7F4b43cQ= +github.com/cometbft/cometbft v0.38.17 h1:FkrQNbAjiFqXydeAO81FUzriL4Bz0abYxN/eOHrQGOk= +github.com/cometbft/cometbft v0.38.17/go.mod h1:5l0SkgeLRXi6bBfQuevXjKqML1jjfJJlvI1Ulp02/o4= github.com/cometbft/cometbft-db v0.14.1 h1:SxoamPghqICBAIcGpleHbmoPqy+crij/++eZz3DlerQ= github.com/cometbft/cometbft-db v0.14.1/go.mod h1:KHP1YghilyGV/xjD5DP3+2hyigWx0WTp9X+0Gnx0RxQ= github.com/consensys/bavard v0.1.22 h1:Uw2CGvbXSZWhqK59X0VG/zOjpTFuOMcPLStrp1ihI0A= @@ -371,8 +840,8 @@ github.com/cosmos/cosmos-db v1.1.1 h1:FezFSU37AlBC8S98NlSagL76oqBRWq/prTPvFcEJNC github.com/cosmos/cosmos-db v1.1.1/go.mod h1:AghjcIPqdhSLP/2Z0yha5xPH3nLnskz81pBx3tcVSAw= github.com/cosmos/cosmos-proto v1.0.0-beta.5 h1:eNcayDLpip+zVLRLYafhzLvQlSmyab+RC5W7ZfmxJLA= github.com/cosmos/cosmos-proto v1.0.0-beta.5/go.mod h1:hQGLpiIUloJBMdQMMWb/4wRApmI9hjHH05nefC0Ojec= -github.com/cosmos/cosmos-sdk v0.50.13 h1:xQ32hhzVy7agEe7behMdZN0ezWhPss3KoLZsF9KoBnw= -github.com/cosmos/cosmos-sdk v0.50.13/go.mod h1:hrWEFMU1eoXqLJeE6VVESpJDQH67FS1nnMrQIjO2daw= +github.com/cosmos/cosmos-sdk v0.53.0 h1:ZsB2tnBVudumV059oPuElcr0K1lLOutaI6WJ+osNTbI= +github.com/cosmos/cosmos-sdk v0.53.0/go.mod h1:UPcRyFwOUy2PfSFBWxBceO/HTjZOuBVqY583WyazIGs= github.com/cosmos/go-bip39 v1.0.0 h1:pcomnQdrdH22njcAatO0yWojsUnCO3y2tNoV1cb6hHY= github.com/cosmos/go-bip39 v1.0.0/go.mod h1:RNJv0H/pOIVgxw6KS7QeX2a0Uo0aKUlfhZ4xuwvCdJw= github.com/cosmos/gogogateway v1.2.0 h1:Ae/OivNhp8DqBi/sh2A8a1D0y638GpL3tkmLQAiKxTE= @@ -386,16 +855,15 @@ github.com/cosmos/ibc-go/modules/capability v1.0.1 h1:ibwhrpJ3SftEEZRxCRkH0fQZ9s github.com/cosmos/ibc-go/modules/capability v1.0.1/go.mod h1:rquyOV262nGJplkumH+/LeYs04P3eV8oB7ZM4Ygqk4E= github.com/cosmos/ibc-go/modules/light-clients/08-wasm/v10 v10.1.0 h1:q3GBXlhIb1x28EyPBAM+5v13DeGTrqh1AkEEsg9k7ro= github.com/cosmos/ibc-go/modules/light-clients/08-wasm/v10 v10.1.0/go.mod h1:efSTtz95qJotcPHwq5LWd87VCSW1MksUwChS/gJG7Vk= -github.com/cosmos/ibc-go/v10 v10.1.0 h1:2liTTnPTHkRlwin+jAtJoIQ8uGly2lothdsUpefeNwQ= -github.com/cosmos/ibc-go/v10 v10.1.0/go.mod h1:Lgp7NUqBMjZhDcHzkj7IYTKHMq09GNe2iUc/qXb+rts= +github.com/cosmos/ibc-go/v10 v10.0.0-beta.0.0.20250507143428-be8367e07cfe h1:idUeWtLzEqrZn0EKXgoWuXN1EAJoi/+h1G9PQLoai7Q= +github.com/cosmos/ibc-go/v10 v10.0.0-beta.0.0.20250507143428-be8367e07cfe/go.mod h1:sne37ZZ+haNZ2KhaND0MYqRGzIutw1lS+x0B9qHNEsI= github.com/cosmos/ics23/go v0.11.0 h1:jk5skjT0TqX5e5QJbEnwXIS2yI2vnmLOgpQPeM5RtnU= github.com/cosmos/ics23/go v0.11.0/go.mod h1:A8OjxPE67hHST4Icw94hOxxFEJMBG031xIGF/JHNIY0= github.com/cosmos/ledger-cosmos-go v0.14.0 h1:WfCHricT3rPbkPSVKRH+L4fQGKYHuGOK9Edpel8TYpE= github.com/cosmos/ledger-cosmos-go v0.14.0/go.mod h1:E07xCWSBl3mTGofZ2QnL4cIUzMbbGVyik84QYKbX3RA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc= -github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a h1:W8mUrRp6NOVl3J+MYp5kPMoUZPp7aOYHtaua31lwRHg= github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a/go.mod h1:sTwzHBvIzm2RfVCGNEBZgRyjwK40bVoun3ZnGOCafNM= github.com/crate-crypto/go-kzg-4844 v1.1.0 h1:EN/u9k2TF6OWSHrCCDBBU6GLNMq88OspHHlMnHfoyU4= @@ -410,10 +878,12 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= -github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/decred/dcrd/crypto/blake256 v1.1.0 h1:zPMNGQCm0g4QTY27fOCorQW7EryeQ/U0x++OzVrdms8= +github.com/decred/dcrd/crypto/blake256 v1.1.0/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 h1:NMZiJj8QnKe1LgsbDayM4UoHwbvwDRwnI3hwNaAHRnc= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0/go.mod h1:ZXNYxsqcloTdSy/rNShjYzMhyjf0LaoftYK0p+A3h40= +github.com/deepmap/oapi-codegen v1.6.0 h1:w/d1ntwh91XI0b/8ja7+u5SvA4IFfM0UNNLmiDR1gg0= +github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= github.com/desertbit/timer v1.0.1 h1:yRpYNn5Vaaj6QXecdLMPMJsW81JLiI1eokUft5nBmeo= github.com/desertbit/timer v1.0.1/go.mod h1:htRrYeY5V/t4iu1xCJ5XsQvp4xve8QulXXctAzxqcwE= @@ -433,6 +903,7 @@ github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5 h1:iFaUwBSo5Svw6L7HYpRu/0lE3e0BaElwnNO1qkNQxBY= github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5/go.mod h1:qssHWj60/X5sZFNxpG4HBPDHVqxNm4DfnCKgrbZOT+s= github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= @@ -458,11 +929,24 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= +github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= +github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M= +github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA= +github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A= +github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= +github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.15.5 h1:Fo2TbBWC61lWVkFw9tsMoHCNX1ndpuaQBRJ8H6xLUPo= -github.com/ethereum/go-ethereum v1.15.5/go.mod h1:1LG2LnMOx2yPRHR/S+xuipXH29vPr6BIH6GElD8N/fo= +github.com/ethereum/go-ethereum v1.15.10 h1:UxqBhpsF2TNF1f7Z/k3RUUHEuLvDGAlHuh/lQ99ZA0w= +github.com/ethereum/go-ethereum v1.15.10/go.mod h1:+S9k+jFzlyVTNcYGvqFhzN/SFhI6vA+aOY4T5tLSPL0= github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -474,6 +958,8 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/ferranbt/fastssz v0.1.4 h1:OCDB+dYDEQDvAgtAGnTSidK1Pe2tW3nFV40XyMkTeDY= github.com/ferranbt/fastssz v0.1.4/go.mod h1:Ea3+oeoRGGLGm5shYAeDgu6PGUlcvQhE2fILyD9+tGg= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= @@ -482,8 +968,10 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getsentry/sentry-go v0.28.1 h1:zzaSm/vHmGllRM6Tpx1492r0YDzauArdBfkJRtY6P5k= github.com/getsentry/sentry-go v0.28.1/go.mod h1:1fQZ+7l7eeJ3wYi82q5Hg8GqAPgefRq+FP/QhafYVgg= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= @@ -494,9 +982,16 @@ github.com/gjermundgaraba/interchaintest/v8 v8.0.0-20250215185800-7e1ec6907f6e h github.com/gjermundgaraba/interchaintest/v8 v8.0.0-20250215185800-7e1ec6907f6e/go.mod h1:S97FzDnmVQ+Y1sFYNeu2Y8BcET+9vhw9PUMCSK6GC7A= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE= +github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= @@ -505,6 +1000,8 @@ github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4F github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= @@ -518,6 +1015,8 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= @@ -532,11 +1031,14 @@ github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4 github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o= github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-yaml v1.9.2 h1:2Njwzw+0+pjU2gb805ZC1B/uBuAs2VcZ3K+ZgHwDs7w= github.com/goccy/go-yaml v1.9.2/go.mod h1:U/jl18uSupI5rdI2jmuCswEA2htH9eXfferR3KfscvA= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= @@ -556,9 +1058,12 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo= github.com/golang-jwt/jwt/v4 v4.5.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= -github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/glog v1.2.4 h1:CNNw5U8lSiiBk7druxtSHHTsRWcxKoac6kZKm2peBBc= +github.com/golang/glog v1.2.4/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -593,6 +1098,7 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -604,6 +1110,7 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI= github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -621,8 +1128,9 @@ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= @@ -632,6 +1140,7 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= @@ -645,6 +1154,7 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= @@ -653,8 +1163,8 @@ github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg= github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -664,8 +1174,10 @@ github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= +github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -675,9 +1187,12 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99 github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.12.5 h1:8gw9KZK8TiVKB6q3zHY3SBzLnrGp6HQjyfYBYGmXdxA= -github.com/googleapis/gax-go/v2 v2.12.5/go.mod h1:BUDKcWo+RaKq5SC9vVYL0wLADa3VcfswbOMMRmB9H3E= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= +github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= @@ -690,6 +1205,8 @@ github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/graph-gophers/graphql-go v1.3.0 h1:Eb9x/q6MFpCLz7jBCiP/WTxjSDrYLR1QY41SORZyNJ0= +github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= @@ -698,6 +1215,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 h1:VNqngBF40hVlDloBruUehVYC3ArSgIyScOAyMRqBxRg= github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1/go.mod h1:RBRO7fro65R6tjKzYgLAFo0t1QEXY1Dp+i/bvpRiqiQ= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= @@ -711,19 +1230,19 @@ github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtng github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.7.4 h1:3yQjWuxICvSpYwqSayAdKRFcvBl1y/vogCxczWSmix0= -github.com/hashicorp/go-getter v1.7.4/go.mod h1:W7TalhMmbPmsSMdNjD0ZskARur/9GJ17cfHTRtXV744= +github.com/hashicorp/go-getter v1.7.8 h1:mshVHx1Fto0/MydBekWan5zUipGq7jO0novchgMmSiY= +github.com/hashicorp/go-getter v1.7.8/go.mod h1:2c6CboOEb9jG6YvmC9xdD+tyAFsrUaJPedwXDGr0TM4= github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-metrics v0.5.3 h1:M5uADWMOGCTUNU1YuC4hfknOeHNaX54LDm4oYSucoNE= -github.com/hashicorp/go-metrics v0.5.3/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= +github.com/hashicorp/go-metrics v0.5.4 h1:8mmPiIJkTPPEbAiV97IxdAGNdRdaWwVap1BU6elejKY= +github.com/hashicorp/go-metrics v0.5.4/go.mod h1:CG5yz4NZ/AI/aQt9Ucm/vdBnbh7fvmv4lxZ350i+QQI= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-plugin v1.6.1 h1:P7MR2UP6gNKGPp+y7EZw2kOiq4IR9WiqLvp0XOsVdwI= -github.com/hashicorp/go-plugin v1.6.1/go.mod h1:XPHFku2tFo3o3QKFgSYo+cghcUhw1NA1hZyMK0PWAw0= +github.com/hashicorp/go-plugin v1.6.3 h1:xgHB+ZUSYeuJi96WtxEjzi23uh7YQpznjGh0U0UUrwg= +github.com/hashicorp/go-plugin v1.6.3/go.mod h1:MRobyh+Wc/nYy1V4KAXUiYfzxoYhs7V1mlH1Z7iY2h0= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo= @@ -744,14 +1263,12 @@ github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iP github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= -github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8= +github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns= github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N3iBb1Tb4rdcU= github.com/hdevalence/ed25519consensus v0.2.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/herumi/bls-eth-go-binary v0.0.0-20210917013441-d37c07cfda4e h1:wCMygKUQhmcQAjlk2Gquzq6dLmyMv2kF+llRspoRgrk= @@ -769,11 +1286,12 @@ github.com/huandu/go-clone v1.6.0 h1:HMo5uvg4wgfiy5FoGOqlFLQED/VGRm2D9Pi8g1FXPGc github.com/huandu/go-clone v1.6.0/go.mod h1:ReGivhG6op3GYr+UY3lS6mxjKp7MIGTknuU5TbTVaXE= github.com/huandu/go-clone/generic v1.6.0 h1:Wgmt/fUZ28r16F2Y3APotFD59sHk1p78K0XLdbUYN5U= github.com/huandu/go-clone/generic v1.6.0/go.mod h1:xgd9ZebcMsBWWcBx5mVMCoqMX24gLWr5lQicr+nVXNs= -github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= -github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= +github.com/huandu/skiplist v1.2.1 h1:dTi93MgjwErA/8idWTzIw4Y1kZsMWx35fmI2c8Rij7w= +github.com/huandu/skiplist v1.2.1/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -785,11 +1303,17 @@ github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPt github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/influxdata/influxdb-client-go/v2 v2.4.0 h1:HGBfZYStlx3Kqvsv1h2pJixbCl/jhnFtxpKFAv9Tu5k= +github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= +github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= +github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jhump/protoreflect v1.15.3 h1:6SFRuqU45u9hIZPJAoZ8c28T3nK64BNdp9w6jFonzls= -github.com/jhump/protoreflect v1.15.3/go.mod h1:4ORHmSBmlCW8fh3xHmJMGyul1zNqZK4Elxc8qKP+p1k= +github.com/jhump/protoreflect v1.17.0 h1:qOEr613fac2lOuTgWN4tPAtLL7fUSbuJL5X5XumQh94= +github.com/jhump/protoreflect v1.17.0/go.mod h1:h9+vUUL38jiBzck8ck+6G/aeMX8Z4QUY/NiJPwPNi+8= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= @@ -804,28 +1328,39 @@ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= -github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= -github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= +github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -857,9 +1392,12 @@ github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-b github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/linxGnu/grocksdb v1.9.2 h1:O3mzvO0wuzQ9mtlHbDrShixyVjVbmuqTjFrzlf43wZ8= github.com/linxGnu/grocksdb v1.9.2/go.mod h1:QYiYypR2d4v63Wj1adOOfzglnoII0gLj3PNh4fZkcFA= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE= +github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -881,12 +1419,15 @@ github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mholt/archiver v3.1.1+incompatible h1:1dCVxuqs0dJseYEhi5pl7MYPH9zDa1wBi7mF09cbNkU= github.com/mholt/archiver v3.1.1+incompatible/go.mod h1:Dh2dOXnSdiLxRiPoVfIr/fI1TwETms9B8CTWfeh7ROU= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= @@ -976,6 +1517,8 @@ github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= @@ -989,15 +1532,21 @@ github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144T github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= -github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= +github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8= @@ -1018,6 +1567,10 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -1028,14 +1581,16 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y= -github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= +github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -1044,14 +1599,16 @@ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt2 github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.60.1 h1:FUas6GcOw66yB/73KC+BOZoFJmbo/1pojoILArPAaSc= -github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k= +github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/prysmaticlabs/fastssz v0.0.0-20241008181541-518c4ce73516 h1:xuVAdtz5ShYblG2sPyb4gw01DF8InbOI/kBCQjk7NiM= @@ -1067,6 +1624,7 @@ github.com/r3labs/sse/v2 v2.10.0/go.mod h1:Igau6Whc+F17QUgML1fYe1VPZzTV6EMCnYktE github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= @@ -1074,24 +1632,25 @@ github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= -github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= +github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= +github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/locafero v0.6.0 h1:ON7AQg37yzcRPU69mt7gwhFEBwxI6P9T4Qu3N51bwOk= -github.com/sagikazarmark/locafero v0.6.0/go.mod h1:77OmuIc6VTraTXKXIs/uvUxKGUXjE1GbemJYHqdNjX0= -github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= -github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= +github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= @@ -1114,18 +1673,24 @@ github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJ github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= +github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= -github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI= -github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4= +github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4= +github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE= +github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= @@ -1145,8 +1710,7 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= @@ -1167,6 +1731,8 @@ github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+F github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= @@ -1188,7 +1754,12 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= +github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= @@ -1210,25 +1781,31 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/contrib/detectors/gcp v1.34.0 h1:JRxssobiPg23otYU5SbWtQC//snGVIM3Tx6QRzlQBao= +go.opentelemetry.io/contrib/detectors/gcp v1.34.0/go.mod h1:cV4BMFcscUR/ckqLkbfQmF0PRsq8w/lMGzdbCSveBHo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 h1:PS8wXpbyaDJQ2VDHHncMe9Vct0Zn1fEjpsjrLxGJoSc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0/go.mod h1:HDBUsEjOuRC0EzKZ1bSaRGZWUBAzo+MhAcUUORSr4D0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 h1:yd02MEjBdJkG3uabWP9apV+OuWRIXGDuJEUJbOHmCFU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q= go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 h1:BEj3SPM81McUZHYjRS5pEgNgnmzGJ5tRpU5krWnV8Bs= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I= go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= -go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= -go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= +go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= +go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1238,6 +1815,8 @@ go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= +go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= @@ -1249,22 +1828,35 @@ go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/arch v0.15.0 h1:QtOrQd0bTUnhNVNndMpLHNWrDmYzZ2KDqSrEymqInZw= +golang.org/x/arch v0.15.0/go.mod h1:JmwW7aLIoRUKgaTzhkiEFxvcEiQGyOg9BMonBJUS7EE= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -1272,10 +1864,22 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= -golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa h1:ELnwvuAXPNtPk1TJRuGkI9fDTwym6AYBu0qzT8AcHdI= -golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw= +golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1299,9 +1903,17 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= -golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= +golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1344,12 +1956,15 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -1360,10 +1975,23 @@ golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= +golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1387,10 +2015,14 @@ golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7Lm golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= -golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= -golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= +golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1404,9 +2036,15 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= +golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1461,23 +2099,31 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1499,20 +2145,41 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= +golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= +golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1522,20 +2189,35 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= +golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= -golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4= +golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1549,6 +2231,7 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1582,20 +2265,28 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE= -golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU= +golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1606,6 +2297,14 @@ golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNq golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -1654,9 +2353,18 @@ google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaE google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.186.0 h1:n2OPp+PPXX0Axh4GuSsL5QL8xQCTb2oDwyzPnQvqUug= -google.golang.org/api v0.186.0/go.mod h1:hvRbBmgoje49RV3xqVXrmP6w93n6ehGgIVPYrGtBFFc= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.222.0 h1:Aiewy7BKLCuq6cUCeOUrsAlzjXPqBkEeQ/iwGHVQa/4= +google.golang.org/api v0.222.0/go.mod h1:efZia3nXpWELrwMlN5vyQrD4GmJN1Vw0x68Et3r+a9c= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1703,8 +2411,10 @@ google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -1738,6 +2448,7 @@ google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2 google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= @@ -1770,13 +2481,41 @@ google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53B google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20240701130421-f6361c86f094 h1:6whtk83KtD3FkGrVb2hFXuQ+ZMbCNdakARIn/aHMmG8= -google.golang.org/genproto v0.0.0-20240701130421-f6361c86f094/go.mod h1:Zs4wYw8z1zr6RNF4cwYb31mvN/EGaKAdQjNCF3DW6K4= -google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f h1:gap6+3Gk41EItBuyi4XX/bp4oqJ3UwuIMl25yGinuAA= -google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:Ic02D47M+zbarjYYUlK57y316f2MoN0gjAwI3f2S95o= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f h1:OxYkA3wjPsZyBylwymxSHa7ViiW1Sml4ToBrncvFehI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 h1:ToEetK57OidYuqD4Q5w+vfEnPvPpuTwedCNVohYJfNk= +google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc= +google.golang.org/genproto/googleapis/api v0.0.0-20250414145226-207652e42e2e h1:UdXH7Kzbj+Vzastr5nVfccbmFsmYNygVLSPk1pEfDoY= +google.golang.org/genproto/googleapis/api v0.0.0-20250414145226-207652e42e2e/go.mod h1:085qFyf2+XaZlRdCgKNCIZ3afY2p4HHZdoIRpId8F4A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250422160041-2d3770c4ea7f h1:N/PrbTw4kdkqNRzVfWPrBekzLuarFREcbFOiOLkXon4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250422160041-2d3770c4ea7f/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1809,6 +2548,7 @@ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= @@ -1818,8 +2558,13 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A= -google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= +google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= +google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM= +google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -1836,8 +2581,11 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= -google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/Knetic/govaluate.v3 v3.0.0 h1:18mUyIt4ZlRlFZAAfVetz4/rzlJs9yhN+U02F4u1AOc= gopkg.in/Knetic/govaluate.v3 v3.0.0/go.mod h1:csKLBORsPbafmSCGTEh3U7Ozmsuq8ZSIlKk1bcqph0E= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= @@ -1854,8 +2602,6 @@ gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= @@ -1876,8 +2622,8 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= -gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= +gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1886,28 +2632,65 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= modernc.org/libc v1.41.0 h1:g9YAc6BkKlgORsUWj+JwqoB1wU3o4DE3bM3yvA3k+Gk= modernc.org/libc v1.41.0/go.mod h1:w0eszPsiXoOnoMJgrXjglgLuDy/bt5RR4y3QzUUeodY= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= modernc.org/sqlite v1.29.5 h1:8l/SQKAjDtZFo9lkJLdk8g9JEOeYRG4/ghStDCCTiTE= modernc.org/sqlite v1.29.5/go.mod h1:S02dvcmm7TnTRvGhv8IGYyLnIt7AS2KPaB1F/71p75U= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= nhooyr.io/websocket v1.8.11 h1:f/qXNc2/3DpoSZkHt1DQu6rj4zGC8JmkkLkWss0MgN0= nhooyr.io/websocket v1.8.11/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= -pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= -pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk= +pgregory.net/rapid v1.2.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= From 4f9490de5f6d90e8bb607cc495ae5db0375305cc Mon Sep 17 00:00:00 2001 From: srdtrk Date: Wed, 7 May 2025 19:45:38 +0400 Subject: [PATCH 26/79] imp: using new image contract call --- e2e/interchaintestv8/chainconfig/chain_config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/interchaintestv8/chainconfig/chain_config.go b/e2e/interchaintestv8/chainconfig/chain_config.go index df3cf4ab1..d95f94f25 100644 --- a/e2e/interchaintestv8/chainconfig/chain_config.go +++ b/e2e/interchaintestv8/chainconfig/chain_config.go @@ -19,7 +19,7 @@ func IbcGoChainSpec(name, chainId string) *interchaintest.ChainSpec { Images: []ibc.DockerImage{ { Repository: "ghcr.io/cosmos/ibc-go-wasm-simd", // FOR LOCAL IMAGE USE: Docker Image Name - Version: "release-v10.1.x", // FOR LOCAL IMAGE USE: Docker Image Tag + Version: "serdar-xxx-contract-calls", // FOR LOCAL IMAGE USE: Docker Image Tag UidGid: "1025:1025", }, }, From eb6b8f8627237cbb01d552052ab47ee8d61ac51e Mon Sep 17 00:00:00 2001 From: srdtrk Date: Wed, 7 May 2025 20:18:26 +0400 Subject: [PATCH 27/79] imp: save progress --- e2e/interchaintestv8/gmp_test.go | 1 + scripts/E2ETestDeploy.s.sol | 2 ++ 2 files changed, 3 insertions(+) create mode 100644 e2e/interchaintestv8/gmp_test.go diff --git a/e2e/interchaintestv8/gmp_test.go b/e2e/interchaintestv8/gmp_test.go new file mode 100644 index 000000000..06ab7d0f9 --- /dev/null +++ b/e2e/interchaintestv8/gmp_test.go @@ -0,0 +1 @@ +package main diff --git a/scripts/E2ETestDeploy.s.sol b/scripts/E2ETestDeploy.s.sol index 1706c0894..873c86e95 100644 --- a/scripts/E2ETestDeploy.s.sol +++ b/scripts/E2ETestDeploy.s.sol @@ -12,6 +12,7 @@ import { Script } from "forge-std/Script.sol"; import { IICS07TendermintMsgs } from "../contracts/light-clients/msgs/IICS07TendermintMsgs.sol"; import { ICS26Router } from "../contracts/ICS26Router.sol"; import { ICS20Transfer } from "../contracts/ICS20Transfer.sol"; +import { ICS27GMP } from "../contracts/ICS27GMP.sol"; import { ICS26Router } from "../contracts/ICS26Router.sol"; import { TestERC20 } from "../test/solidity-ibc/mocks/TestERC20.sol"; import { Strings } from "@openzeppelin-contracts/utils/Strings.sol"; @@ -51,6 +52,7 @@ contract E2ETestDeploy is Script, IICS07TendermintMsgs, DeployProxiedICS20Transf address ibcERC20Logic = address(new IBCERC20()); address ics26RouterLogic = address(new ICS26Router()); address ics20TransferLogic = address(new ICS20Transfer()); + address ics27GmpLogic = address(new ICS27GMP()); ERC1967Proxy routerProxy = deployProxiedICS26Router(ProxiedICS26RouterDeployment({ proxy: payable(address(0)), From 3d36b18f742f1fa44f956a0c9ec5dedc4352c5fb Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 8 May 2025 10:17:43 +0400 Subject: [PATCH 28/79] imp: update scripts --- scripts/E2ETestDeploy.s.sol | 13 ++++++- scripts/deployments/DeployProxiedICS27GMP.sol | 34 +++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 scripts/deployments/DeployProxiedICS27GMP.sol diff --git a/scripts/E2ETestDeploy.s.sol b/scripts/E2ETestDeploy.s.sol index 4ac31589a..5e9d7627f 100644 --- a/scripts/E2ETestDeploy.s.sol +++ b/scripts/E2ETestDeploy.s.sol @@ -20,14 +20,16 @@ import { ICS20Lib } from "../contracts/utils/ICS20Lib.sol"; import { ERC1967Proxy } from "@openzeppelin-contracts/proxy/ERC1967/ERC1967Proxy.sol"; import { IBCERC20 } from "../contracts/utils/IBCERC20.sol"; import { Escrow } from "../contracts/utils/Escrow.sol"; +import { ICS27Account } from "../contracts/utils/ICS27Account.sol"; import { DeployProxiedICS20Transfer } from "./deployments/DeployProxiedICS20Transfer.sol"; import { DeployProxiedICS26Router } from "./deployments/DeployProxiedICS26Router.sol"; +import { DeployProxiedICS27GMP } from "./deployments/DeployProxiedICS27GMP.sol"; import { SP1Verifier as SP1VerifierPlonk } from "@sp1-contracts/v4.0.0-rc.3/SP1VerifierPlonk.sol"; import { SP1Verifier as SP1VerifierGroth16 } from "@sp1-contracts/v4.0.0-rc.3/SP1VerifierGroth16.sol"; import { SP1MockVerifier } from "@sp1-contracts/SP1MockVerifier.sol"; /// @dev See the Solidity Scripting tutorial: https://book.getfoundry.sh/tutorials/solidity-scripting -contract E2ETestDeploy is Script, IICS07TendermintMsgs, DeployProxiedICS26Router, DeployProxiedICS20Transfer { +contract E2ETestDeploy is Script, IICS07TendermintMsgs, DeployProxiedICS26Router, DeployProxiedICS20Transfer, DeployProxiedICS27GMP { using stdJson for string; string internal constant SP1_GENESIS_DIR = "/scripts/"; @@ -50,6 +52,7 @@ contract E2ETestDeploy is Script, IICS07TendermintMsgs, DeployProxiedICS26Router // Deploy IBC Eureka with proxy address escrowLogic = address(new Escrow()); address ibcERC20Logic = address(new IBCERC20()); + address accountLogic = address(new ICS27Account()); address ics26RouterLogic = address(new ICS26Router()); address ics20TransferLogic = address(new ICS20Transfer()); address ics27GmpLogic = address(new ICS27GMP()); @@ -73,8 +76,15 @@ contract E2ETestDeploy is Script, IICS07TendermintMsgs, DeployProxiedICS26Router address(0) ); + ERC1967Proxy gmpProxy = deployProxiedICS27GMP( + ics27GmpLogic, + address(routerProxy), + accountLogic + ); + ICS26Router ics26Router = ICS26Router(address(routerProxy)); ICS20Transfer ics20Transfer = ICS20Transfer(address(transferProxy)); + ICS27GMP ics27Gmp = ICS27GMP(address(gmpProxy)); TestERC20 erc20 = new TestERC20(); // Wire Transfer app ics26Router.addIBCApp(ICS20Lib.DEFAULT_PORT_ID, address(ics20Transfer)); @@ -90,6 +100,7 @@ contract E2ETestDeploy is Script, IICS07TendermintMsgs, DeployProxiedICS26Router json.serialize("verifierMock", Strings.toHexString(address(verifierMock))); json.serialize("ics26Router", Strings.toHexString(address(ics26Router))); json.serialize("ics20Transfer", Strings.toHexString(address(ics20Transfer))); + json.serialize("ics27Gmp", Strings.toHexString(address(ics27Gmp))); json.serialize("ibcERC20Logic", Strings.toHexString(address(ibcERC20Logic))); // TODO: resolve finalJson vs json string memory finalJson = json.serialize("erc20", Strings.toHexString(address(erc20))); diff --git a/scripts/deployments/DeployProxiedICS27GMP.sol b/scripts/deployments/DeployProxiedICS27GMP.sol new file mode 100644 index 000000000..25d803675 --- /dev/null +++ b/scripts/deployments/DeployProxiedICS27GMP.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.28; + +// solhint-disable custom-errors,gas-custom-errors + +// solhint-disable-next-line no-global-import +import "forge-std/console.sol"; + +import { ERC1967Proxy } from "@openzeppelin-contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { ICS27GMP } from "../../contracts/ICS27GMP.sol"; + +abstract contract DeployProxiedICS27GMP { + function deployProxiedICS27GMP( + address implementation, + address ics26Router, + address accountImplementation + ) public returns (ERC1967Proxy) { + ERC1967Proxy gmpProxy = new ERC1967Proxy( + implementation, + abi.encodeCall( + ICS27GMP.initialize, + ( + ics26Router, + accountImplementation + ) + ) + ); + + console.log("Deployed ICS27GMP at address: ", address(gmpProxy)); + + return gmpProxy; + } +} + From af4326ed59b078336d86b7b4158bb1d85d05de32 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 8 May 2025 11:54:47 +0400 Subject: [PATCH 29/79] imp: added e2e boilerplate --- e2e/interchaintestv8/ethereum/utils.go | 2 + e2e/interchaintestv8/gmp_test.go | 439 +++++++++++++++++++++++++ justfile | 6 + 3 files changed, 447 insertions(+) diff --git a/e2e/interchaintestv8/ethereum/utils.go b/e2e/interchaintestv8/ethereum/utils.go index 17d0d678f..082686977 100644 --- a/e2e/interchaintestv8/ethereum/utils.go +++ b/e2e/interchaintestv8/ethereum/utils.go @@ -31,6 +31,7 @@ type DeployedContracts struct { VerifierMock string `json:"verifierMock"` Ics26Router string `json:"ics26Router"` Ics20Transfer string `json:"ics20Transfer"` + Ics27Gmp string `json:"ics27Gmp"` Erc20 string `json:"erc20"` } @@ -55,6 +56,7 @@ func GetEthContractsFromDeployOutput(stdout string) (DeployedContracts, error) { if embeddedContracts.Erc20 == "" || embeddedContracts.Ics20Transfer == "" || + embeddedContracts.Ics27Gmp == "" || embeddedContracts.VerifierPlonk == "" || embeddedContracts.VerifierGroth16 == "" || embeddedContracts.VerifierMock == "" || diff --git a/e2e/interchaintestv8/gmp_test.go b/e2e/interchaintestv8/gmp_test.go index 06ab7d0f9..dc1b911aa 100644 --- a/e2e/interchaintestv8/gmp_test.go +++ b/e2e/interchaintestv8/gmp_test.go @@ -1 +1,440 @@ package main + +import ( + "context" + "crypto/ecdsa" + "encoding/hex" + "fmt" + "math/big" + "os" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/suite" + + "github.com/ethereum/go-ethereum/accounts/abi" + ethcommon "github.com/ethereum/go-ethereum/common" + ethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + + gmptypes "github.com/cosmos/ibc-go/v10/modules/apps/27-gmp/types" + transfertypes "github.com/cosmos/ibc-go/v10/modules/apps/transfer/types" + clienttypes "github.com/cosmos/ibc-go/v10/modules/core/02-client/types" + clienttypesv2 "github.com/cosmos/ibc-go/v10/modules/core/02-client/v2/types" + ibcexported "github.com/cosmos/ibc-go/v10/modules/core/exported" + + "github.com/strangelove-ventures/interchaintest/v8/ibc" + + "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/ics26router" + "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/ics27gmp" + "github.com/cosmos/solidity-ibc-eureka/packages/go-abigen/sp1ics07tendermint" + + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/cosmos" + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/e2esuite" + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/ethereum" + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/operator" + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/relayer" + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/testvalues" + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/types/erc20" + relayertypes "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/types/relayer" +) + +// IbcEurekaGmpTestSuite is a suite of tests that wraps TestSuite +// and can provide additional functionality +type IbcEurekaGmpTestSuite struct { + e2esuite.TestSuite + + // The private key of a test account + key *ecdsa.PrivateKey + // The private key of the faucet account of interchaintest + deployer *ecdsa.PrivateKey + + contractAddresses ethereum.DeployedContracts + sp1Ics07Address ethcommon.Address + + sp1Ics07Contract *sp1ics07tendermint.Contract + ics26Contract *ics26router.Contract + ics27Contract *ics27gmp.Contract + erc20Contract *erc20.Contract + + RelayerClient relayertypes.RelayerServiceClient + + SimdRelayerSubmitter ibc.Wallet + EthRelayerSubmitter *ecdsa.PrivateKey +} + +// TestWithIbcEurekaGmpTestSuite is the boilerplate code that allows the test suite to be run +func TestWithIbcEurekaGmpTestSuite(t *testing.T) { + suite.Run(t, new(IbcEurekaGmpTestSuite)) +} + +func (s *IbcEurekaGmpTestSuite) SetupSuite(ctx context.Context, proofType operator.SupportedProofType) { + s.TestSuite.SetupSuite(ctx) + + eth, simd := s.EthChain, s.CosmosChains[0] + + var prover string + s.Require().True(s.Run("Set up environment", func() { + err := os.Chdir("../..") + s.Require().NoError(err) + + s.key, err = eth.CreateAndFundUser() + s.Require().NoError(err) + + s.EthRelayerSubmitter, err = eth.CreateAndFundUser() + s.Require().NoError(err) + + operatorKey, err := eth.CreateAndFundUser() + s.Require().NoError(err) + + s.deployer, err = eth.CreateAndFundUser() + s.Require().NoError(err) + + s.SimdRelayerSubmitter = s.CreateAndFundCosmosUser(ctx, simd) + + prover = os.Getenv(testvalues.EnvKeySp1Prover) + switch prover { + case "", testvalues.EnvValueSp1Prover_Mock: + s.T().Logf("Using mock prover") + prover = testvalues.EnvValueSp1Prover_Mock + os.Setenv(testvalues.EnvKeySp1Prover, testvalues.EnvValueSp1Prover_Mock) + os.Setenv(testvalues.EnvKeyVerifier, testvalues.EnvValueVerifier_Mock) + + s.Require().Empty( + os.Getenv(testvalues.EnvKeyGenerateSolidityFixtures), + "Fixtures are not supported for mock prover", + ) + case testvalues.EnvValueSp1Prover_Network: + s.Require().Empty( + os.Getenv(testvalues.EnvKeyVerifier), + fmt.Sprintf("%s should not be set when using the network prover in e2e tests.", testvalues.EnvKeyVerifier), + ) + // make sure that the NETWORK_PRIVATE_KEY is set. + s.Require().NotEmpty(os.Getenv(testvalues.EnvKeyNetworkPrivateKey)) + default: + s.Require().Fail("invalid prover type: %s", prover) + } + + if os.Getenv(testvalues.EnvKeyRustLog) == "" { + os.Setenv(testvalues.EnvKeyRustLog, testvalues.EnvValueRustLog_Info) + } + os.Setenv(testvalues.EnvKeyEthRPC, eth.RPC) + os.Setenv(testvalues.EnvKeyTendermintRPC, simd.GetHostRPCAddress()) + os.Setenv(testvalues.EnvKeySp1Prover, prover) + os.Setenv(testvalues.EnvKeyOperatorPrivateKey, hex.EncodeToString(crypto.FromECDSA(operatorKey))) + })) + + s.Require().True(s.Run("Deploy IBC contracts", func() { + stdout, err := eth.ForgeScript(s.deployer, testvalues.E2EDeployScriptPath) + s.Require().NoError(err) + + s.contractAddresses, err = ethereum.GetEthContractsFromDeployOutput(string(stdout)) + s.Require().NoError(err) + s.ics26Contract, err = ics26router.NewContract(ethcommon.HexToAddress(s.contractAddresses.Ics26Router), eth.RPCClient) + s.Require().NoError(err) + s.ics27Contract, err = ics27gmp.NewContract(ethcommon.HexToAddress(s.contractAddresses.Ics27Gmp), eth.RPCClient) + s.Require().NoError(err) + s.erc20Contract, err = erc20.NewContract(ethcommon.HexToAddress(s.contractAddresses.Erc20), eth.RPCClient) + s.Require().NoError(err) + })) + + var relayerProcess *os.Process + s.Require().True(s.Run("Start Relayer", func() { + beaconAPI := "" + // The BeaconAPIClient is nil when the testnet is `pow` + if eth.BeaconAPIClient != nil { + beaconAPI = eth.BeaconAPIClient.GetBeaconAPIURL() + } + + sp1Config := relayer.SP1ProverConfig{ + Type: prover, + PrivateCluster: os.Getenv(testvalues.EnvKeyNetworkPrivateCluster) == testvalues.EnvValueSp1Prover_PrivateCluster, + } + + config := relayer.NewConfig(relayer.CreateEthCosmosModules( + relayer.EthCosmosConfigInfo{ + EthChainID: eth.ChainID.String(), + CosmosChainID: simd.Config().ChainID, + TmRPC: simd.GetHostRPCAddress(), + ICS26Address: s.contractAddresses.Ics26Router, + EthRPC: eth.RPC, + BeaconAPI: beaconAPI, + SP1Config: sp1Config, + SignerAddress: s.SimdRelayerSubmitter.FormattedAddress(), + MockWasmClient: os.Getenv(testvalues.EnvKeyEthTestnetType) == testvalues.EthTestnetTypePoW, + }), + ) + + err := config.GenerateConfigFile(testvalues.RelayerConfigFilePath) + s.Require().NoError(err) + + relayerProcess, err = relayer.StartRelayer(testvalues.RelayerConfigFilePath) + s.Require().NoError(err) + + s.T().Cleanup(func() { + os.Remove(testvalues.RelayerConfigFilePath) + }) + })) + + s.T().Cleanup(func() { + if relayerProcess != nil { + err := relayerProcess.Kill() + if err != nil { + s.T().Logf("Failed to kill the relayer process: %v", err) + } + } + }) + + s.Require().True(s.Run("Create Relayer Client", func() { + var err error + s.RelayerClient, err = relayer.GetGRPCClient(relayer.DefaultRelayerGRPCAddress()) + s.Require().NoError(err) + })) + + s.Require().True(s.Run("Deploy SP1 ICS07 contract", func() { + var verfierAddress string + if prover == testvalues.EnvValueSp1Prover_Mock { + verfierAddress = s.contractAddresses.VerifierMock + } else { + switch proofType { + case operator.ProofTypeGroth16: + verfierAddress = s.contractAddresses.VerifierGroth16 + case operator.ProofTypePlonk: + verfierAddress = s.contractAddresses.VerifierPlonk + default: + s.Require().Fail("invalid proof type: %s", proofType) + } + } + + var createClientTxBz []byte + s.Require().True(s.Run("Retrieve create client tx", func() { + resp, err := s.RelayerClient.CreateClient(context.Background(), &relayertypes.CreateClientRequest{ + SrcChain: simd.Config().ChainID, + DstChain: eth.ChainID.String(), + Parameters: map[string]string{ + testvalues.ParameterKey_Sp1Verifier: verfierAddress, + testvalues.ParameterKey_ZkAlgorithm: proofType.String(), + }, + }) + s.Require().NoError(err) + s.Require().NotEmpty(resp.Tx) + s.Require().Empty(resp.Address) + + createClientTxBz = resp.Tx + })) + + s.Require().True(s.Run("Broadcast relay tx", func() { + receipt, err := eth.BroadcastTx(ctx, s.EthRelayerSubmitter, 15_000_000, nil, createClientTxBz) + s.Require().NoError(err) + s.Require().Equal(ethtypes.ReceiptStatusSuccessful, receipt.Status, fmt.Sprintf("Tx failed: %+v", receipt)) + + s.sp1Ics07Address = receipt.ContractAddress + s.sp1Ics07Contract, err = sp1ics07tendermint.NewContract(s.sp1Ics07Address, eth.RPCClient) + s.Require().NoError(err) + })) + })) + + s.Require().True(s.Run("Fund address with ERC20", func() { + tx, err := s.erc20Contract.Transfer(s.GetTransactOpts(eth.Faucet, eth), crypto.PubkeyToAddress(s.key.PublicKey), testvalues.StartingERC20Balance) + s.Require().NoError(err) + + _, err = eth.GetTxReciept(ctx, tx.Hash()) // wait for the tx to be mined + s.Require().NoError(err) + })) + + s.Require().True(s.Run("Create ethereum light client on Cosmos chain", func() { + checksumHex := s.StoreEthereumLightClient(ctx, simd, s.SimdRelayerSubmitter) + s.Require().NotEmpty(checksumHex) + + var createClientTxBodyBz []byte + s.Require().True(s.Run("Retrieve create client tx", func() { + resp, err := s.RelayerClient.CreateClient(context.Background(), &relayertypes.CreateClientRequest{ + SrcChain: eth.ChainID.String(), + DstChain: simd.Config().ChainID, + Parameters: map[string]string{ + testvalues.ParameterKey_ChecksumHex: checksumHex, + }, + }) + s.Require().NoError(err) + s.Require().NotEmpty(resp.Tx) + s.Require().Empty(resp.Address) + + createClientTxBodyBz = resp.Tx + })) + + s.Require().True(s.Run("Broadcast relay tx", func() { + resp := s.MustBroadcastSdkTxBody(ctx, simd, s.SimdRelayerSubmitter, 20_000_000, createClientTxBodyBz) + clientId, err := cosmos.GetEventValue(resp.Events, clienttypes.EventTypeCreateClient, clienttypes.AttributeKeyClientID) + s.Require().NoError(err) + s.Require().Equal(testvalues.FirstWasmClientID, clientId) + })) + })) + + s.Require().True(s.Run("Add client and counterparty on EVM", func() { + counterpartyInfo := ics26router.IICS02ClientMsgsCounterpartyInfo{ + ClientId: testvalues.FirstWasmClientID, + MerklePrefix: [][]byte{[]byte(ibcexported.StoreKey), []byte("")}, + } + tx, err := s.ics26Contract.AddClient(s.GetTransactOpts(s.deployer, eth), testvalues.CustomClientID, counterpartyInfo, s.sp1Ics07Address) + s.Require().NoError(err) + + receipt, err := eth.GetTxReciept(ctx, tx.Hash()) + s.Require().NoError(err) + + event, err := e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseICS02ClientAdded) + s.Require().NoError(err) + s.Require().Equal(testvalues.CustomClientID, event.ClientId) + s.Require().Equal(testvalues.FirstWasmClientID, event.CounterpartyInfo.ClientId) + })) + + s.Require().True(s.Run("Register counterparty on Cosmos chain", func() { + merklePathPrefix := [][]byte{[]byte("")} + + _, err := s.BroadcastMessages(ctx, simd, s.SimdRelayerSubmitter, 200_000, &clienttypesv2.MsgRegisterCounterparty{ + ClientId: testvalues.FirstWasmClientID, + CounterpartyMerklePrefix: merklePathPrefix, + CounterpartyClientId: testvalues.CustomClientID, + Signer: s.SimdRelayerSubmitter.FormattedAddress(), + }) + s.Require().NoError(err) + })) +} + +func (s *IbcEurekaGmpTestSuite) TestDeploy_Groth16() { + ctx := context.Background() + s.DeployTest(ctx, operator.ProofTypeGroth16) +} + +func (s *IbcEurekaGmpTestSuite) DeployTest(ctx context.Context, proofType operator.SupportedProofType) { + s.SetupSuite(ctx, proofType) + + eth, simd := s.EthChain, s.CosmosChains[0] + + s.Require().True(s.Run("Verify SP1 Client", func() { + clientState, err := s.sp1Ics07Contract.ClientState(nil) + s.Require().NoError(err) + + stakingParams, err := simd.StakingQueryParams(ctx) + s.Require().NoError(err) + + s.Require().Equal(simd.Config().ChainID, clientState.ChainId) + s.Require().Equal(uint8(testvalues.DefaultTrustLevel.Numerator), clientState.TrustLevel.Numerator) + s.Require().Equal(uint8(testvalues.DefaultTrustLevel.Denominator), clientState.TrustLevel.Denominator) + s.Require().Equal(uint32(testvalues.DefaultTrustPeriod), clientState.TrustingPeriod) + s.Require().Equal(uint32(stakingParams.UnbondingTime.Seconds()), clientState.UnbondingPeriod) + s.Require().False(clientState.IsFrozen) + s.Require().Equal(uint64(1), clientState.LatestHeight.RevisionNumber) + s.Require().Greater(clientState.LatestHeight.RevisionHeight, uint64(0)) + })) + + s.Require().True(s.Run("Verify ICS02 Client", func() { + clientAddress, err := s.ics26Contract.GetClient(nil, testvalues.CustomClientID) + s.Require().NoError(err) + s.Require().Equal(s.sp1Ics07Address, clientAddress) + + counterpartyInfo, err := s.ics26Contract.GetCounterparty(nil, testvalues.CustomClientID) + s.Require().NoError(err) + s.Require().Equal(testvalues.FirstWasmClientID, counterpartyInfo.ClientId) + })) + + s.Require().True(s.Run("Verify ICS26 Router", func() { + hasRole, err := s.ics26Contract.HasRole(nil, testvalues.PortCustomizerRole, crypto.PubkeyToAddress(s.deployer.PublicKey)) + s.Require().NoError(err) + s.Require().True(hasRole) + + transferAddress, err := s.ics26Contract.GetIBCApp(nil, transfertypes.PortID) + s.Require().NoError(err) + s.Require().Equal(s.contractAddresses.Ics20Transfer, strings.ToLower(transferAddress.Hex())) + })) + + s.Require().True(s.Run("Verify ethereum light client", func() { + _, err := e2esuite.GRPCQuery[clienttypes.QueryClientStateResponse](ctx, simd, &clienttypes.QueryClientStateRequest{ + ClientId: testvalues.FirstWasmClientID, + }) + s.Require().NoError(err) + + counterpartyInfoResp, err := e2esuite.GRPCQuery[clienttypesv2.QueryCounterpartyInfoResponse](ctx, simd, &clienttypesv2.QueryCounterpartyInfoRequest{ + ClientId: testvalues.FirstWasmClientID, + }) + s.Require().NoError(err) + s.Require().Equal(testvalues.CustomClientID, counterpartyInfoResp.CounterpartyInfo.ClientId) + })) + + s.Require().True(s.Run("Verify Cosmos to Eth Relayer Info", func() { + info, err := s.RelayerClient.Info(context.Background(), &relayertypes.InfoRequest{ + SrcChain: simd.Config().ChainID, + DstChain: eth.ChainID.String(), + }) + s.Require().NoError(err) + s.Require().NotNil(info) + s.Require().Equal(simd.Config().ChainID, info.SourceChain.ChainId) + s.Require().Equal(eth.ChainID.String(), info.TargetChain.ChainId) + })) + + s.Require().True(s.Run("Verify Eth to Cosmos Relayer Info", func() { + info, err := s.RelayerClient.Info(context.Background(), &relayertypes.InfoRequest{ + SrcChain: eth.ChainID.String(), + DstChain: simd.Config().ChainID, + }) + s.Require().NoError(err) + s.Require().NotNil(info) + s.Require().Equal(eth.ChainID.String(), info.SourceChain.ChainId) + s.Require().Equal(simd.Config().ChainID, info.TargetChain.ChainId) + })) +} + +func (s *IbcEurekaGmpTestSuite) TestSendCallFromCosmos_Groth16() { + ctx := context.Background() + s.SendCallFromCosmosTest(ctx, operator.ProofTypeGroth16) +} + +func (s *IbcEurekaGmpTestSuite) SendCallFromCosmosTest(ctx context.Context, proofType operator.SupportedProofType) { + s.SetupSuite(ctx, proofType) + + eth, simd := s.EthChain, s.CosmosChains[0] + simdUser := s.CosmosUsers[0] + + ics26Address := ethcommon.HexToAddress(s.contractAddresses.Ics26Router) + testAmount := big.NewInt(1) + + erc20Abi, err := abi.JSON(strings.NewReader(erc20.ContractABI)) + s.Require().NoError(err) + + s.Require().True(s.Run("Fund pre-computed ICS27 address", func() { + computedAddress, err := s.ics27Contract.GetOrComputeAccountAddress(nil, ics27gmp.IICS27GMPMsgsAccountIdentifier{ + ClientId: testvalues.CustomClientID, + Sender: simdUser.FormattedAddress(), + Salt: nil, + }) + s.Require().NoError(err) + + tx, err := s.erc20Contract.Transfer(s.GetTransactOpts(eth.Faucet, eth), computedAddress, testAmount) + s.Require().NoError(err) + + _, err = eth.GetTxReciept(ctx, tx.Hash()) // wait for the tx to be mined + s.Require().NoError(err) + })) + + // var sendTxHash []byte + s.Require().True(s.Run("Send call from Cosmos", func() { + timeout := uint64(time.Now().Add(30 * time.Minute).Unix()) + + encodedCall, err := erc20Abi.Pack("transfer", ics26Address, testAmount) + s.Require().NoError(err) + + resp, err := s.BroadcastMessages(ctx, simd, simdUser, 200_000, &gmptypes.MsgSendCall{ + SourceClient: testvalues.CustomClientID, + Sender: simdUser.FormattedAddress(), + Receiver: s.contractAddresses.Ics26Router, + Salt: nil, + Payload: encodedCall, + TimeoutTimestamp: timeout, + }) + s.Require().NoError(err) + s.Require().NotEmpty(resp.TxHash) + + _, err = hex.DecodeString(resp.TxHash) + s.Require().NoError(err) + })) +} diff --git a/justfile b/justfile index 01f6d7cc4..72a226963 100644 --- a/justfile +++ b/justfile @@ -148,6 +148,12 @@ test-e2e-multichain testname: clean @echo "Running {{testname}} test..." just test-e2e TestWithMultichainTestSuite/{{testname}} +# Run any e2e test in the IbcEurekaGmpTestSuite using the test's name +# For example, `just test-e2e-multichain TestDeploy_Groth16` +test-e2e-gmp testname: clean + @echo "Running {{testname}} test..." + just test-e2e TestWithIbcEurekaGmpTestSuite/{{testname}} + # Install the sp1-ics07-tendermint operator for use in the e2e tests install-operator: cargo install --bin operator --path programs/operator --locked From bc2846391c1e1016c8bf8a97a71e1248a1eacf6f Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 8 May 2025 15:09:38 +0400 Subject: [PATCH 30/79] fix: attempt 2 --- e2e/interchaintestv8/chainconfig/encoding.go | 2 ++ e2e/interchaintestv8/gmp_test.go | 8 +++++--- e2e/interchaintestv8/testvalues/values.go | 3 +++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/e2e/interchaintestv8/chainconfig/encoding.go b/e2e/interchaintestv8/chainconfig/encoding.go index 0ed0b0f6d..2e38cbe38 100644 --- a/e2e/interchaintestv8/chainconfig/encoding.go +++ b/e2e/interchaintestv8/chainconfig/encoding.go @@ -16,6 +16,7 @@ import ( proposaltypes "github.com/cosmos/cosmos-sdk/x/params/types/proposal" ibcwasmtypes "github.com/cosmos/ibc-go/modules/light-clients/08-wasm/v10/types" + gmptypes "github.com/cosmos/ibc-go/v10/modules/apps/27-gmp/types" icacontrollertypes "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/controller/types" icahosttypes "github.com/cosmos/ibc-go/v10/modules/apps/27-interchain-accounts/host/types" transfertypes "github.com/cosmos/ibc-go/v10/modules/apps/transfer/types" @@ -64,6 +65,7 @@ func codecAndEncodingConfig() (*codec.ProtoCodec, sdktestutil.TestEncodingConfig ibctmtypes.RegisterInterfaces(cfg.InterfaceRegistry) ibcwasmtypes.RegisterInterfaces(cfg.InterfaceRegistry) channeltypesv2.RegisterInterfaces(cfg.InterfaceRegistry) + gmptypes.RegisterInterfaces(cfg.InterfaceRegistry) // all other types upgradetypes.RegisterInterfaces(cfg.InterfaceRegistry) diff --git a/e2e/interchaintestv8/gmp_test.go b/e2e/interchaintestv8/gmp_test.go index dc1b911aa..eb074079c 100644 --- a/e2e/interchaintestv8/gmp_test.go +++ b/e2e/interchaintestv8/gmp_test.go @@ -423,13 +423,15 @@ func (s *IbcEurekaGmpTestSuite) SendCallFromCosmosTest(ctx context.Context, proo encodedCall, err := erc20Abi.Pack("transfer", ics26Address, testAmount) s.Require().NoError(err) - resp, err := s.BroadcastMessages(ctx, simd, simdUser, 200_000, &gmptypes.MsgSendCall{ - SourceClient: testvalues.CustomClientID, + resp, err := s.BroadcastMessages(ctx, simd, simdUser, 2_000_000, &gmptypes.MsgSendCall{ + SourceClient: testvalues.FirstWasmClientID, Sender: simdUser.FormattedAddress(), - Receiver: s.contractAddresses.Ics26Router, + Receiver: s.contractAddresses.Erc20, Salt: nil, Payload: encodedCall, TimeoutTimestamp: timeout, + Memo: "", + Encoding: testvalues.Ics27AbiEncoding, }) s.Require().NoError(err) s.Require().NotEmpty(resp.TxHash) diff --git a/e2e/interchaintestv8/testvalues/values.go b/e2e/interchaintestv8/testvalues/values.go index e7e5ec045..d53ea0696 100644 --- a/e2e/interchaintestv8/testvalues/values.go +++ b/e2e/interchaintestv8/testvalues/values.go @@ -111,6 +111,9 @@ const ( ParameterKey_ZkAlgorithm = "zk_algorithm" // Checksum hex parameter key for the relayer's ethereum light client creation. ParameterKey_ChecksumHex = "checksum_hex" + + // Ics27AbiEncoding is the solidity abi encoding type for the ICS27 packets. + Ics27AbiEncoding = "application/x-solidity-abi" ) var ( From 2800353fdc041fd095ff719d1134a41393f4b8a4 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 8 May 2025 16:24:04 +0400 Subject: [PATCH 31/79] imp: fix e2e --- e2e/interchaintestv8/ethereum/ethereum.go | 11 +++- e2e/interchaintestv8/gmp_test.go | 62 +++++++++++++++++++++-- scripts/E2ETestDeploy.s.sol | 4 +- 3 files changed, 71 insertions(+), 6 deletions(-) diff --git a/e2e/interchaintestv8/ethereum/ethereum.go b/e2e/interchaintestv8/ethereum/ethereum.go index 5bc9d1c6d..65d3fa433 100644 --- a/e2e/interchaintestv8/ethereum/ethereum.go +++ b/e2e/interchaintestv8/ethereum/ethereum.go @@ -138,12 +138,21 @@ func (e Ethereum) ForgeScript(deployer *ecdsa.PrivateKey, solidityContract strin return stdoutBytes, nil } -func (e Ethereum) CreateAndFundUser() (*ecdsa.PrivateKey, error) { +func (e Ethereum) CreateUser() (*ecdsa.PrivateKey, error) { key, err := crypto.GenerateKey() if err != nil { return nil, err } + return key, nil +} + +func (e Ethereum) CreateAndFundUser() (*ecdsa.PrivateKey, error) { + key, err := e.CreateUser() + if err != nil { + return nil, err + } + address := crypto.PubkeyToAddress(key.PublicKey).Hex() if err := e.FundUser(address, testvalues.StartingEthBalance); err != nil { return nil, err diff --git a/e2e/interchaintestv8/gmp_test.go b/e2e/interchaintestv8/gmp_test.go index eb074079c..4579cc3b4 100644 --- a/e2e/interchaintestv8/gmp_test.go +++ b/e2e/interchaintestv8/gmp_test.go @@ -398,11 +398,16 @@ func (s *IbcEurekaGmpTestSuite) SendCallFromCosmosTest(ctx context.Context, proo ics26Address := ethcommon.HexToAddress(s.contractAddresses.Ics26Router) testAmount := big.NewInt(1) + testUserKey, err := eth.CreateUser() + s.Require().NoError(err) + testUserAddress := crypto.PubkeyToAddress(testUserKey.PublicKey) + erc20Abi, err := abi.JSON(strings.NewReader(erc20.ContractABI)) s.Require().NoError(err) + var computedAddress ethcommon.Address s.Require().True(s.Run("Fund pre-computed ICS27 address", func() { - computedAddress, err := s.ics27Contract.GetOrComputeAccountAddress(nil, ics27gmp.IICS27GMPMsgsAccountIdentifier{ + computedAddress, err = s.ics27Contract.GetOrComputeAccountAddress(nil, ics27gmp.IICS27GMPMsgsAccountIdentifier{ ClientId: testvalues.CustomClientID, Sender: simdUser.FormattedAddress(), Salt: nil, @@ -416,11 +421,22 @@ func (s *IbcEurekaGmpTestSuite) SendCallFromCosmosTest(ctx context.Context, proo s.Require().NoError(err) })) - // var sendTxHash []byte + s.True(s.Run("Verify initial balances on Ethereum", func() { + // ICS27Account balance should be zero + ics27AccBal, err := s.erc20Contract.BalanceOf(nil, computedAddress) + s.Require().NoError(err) + s.Require().Equal(testAmount, ics27AccBal) + + testBalance, err := s.erc20Contract.BalanceOf(nil, testUserAddress) + s.Require().NoError(err) + s.Require().Zero(testBalance.Int64()) + })) + + var sendTxHash []byte s.Require().True(s.Run("Send call from Cosmos", func() { timeout := uint64(time.Now().Add(30 * time.Minute).Unix()) - encodedCall, err := erc20Abi.Pack("transfer", ics26Address, testAmount) + encodedCall, err := erc20Abi.Pack("transfer", testUserAddress, testAmount) s.Require().NoError(err) resp, err := s.BroadcastMessages(ctx, simd, simdUser, 2_000_000, &gmptypes.MsgSendCall{ @@ -436,7 +452,45 @@ func (s *IbcEurekaGmpTestSuite) SendCallFromCosmosTest(ctx context.Context, proo s.Require().NoError(err) s.Require().NotEmpty(resp.TxHash) - _, err = hex.DecodeString(resp.TxHash) + sendTxHash, err = hex.DecodeString(resp.TxHash) s.Require().NoError(err) })) + + // var ackTxHash []byte + s.Require().True(s.Run("Receive packet in Ethereum", func() { + var recvRelayTx []byte + s.Require().True(s.Run("Retrieve relay tx", func() { + resp, err := s.RelayerClient.RelayByTx(context.Background(), &relayertypes.RelayByTxRequest{ + SrcChain: simd.Config().ChainID, + DstChain: eth.ChainID.String(), + SourceTxIds: [][]byte{sendTxHash}, + SrcClientId: testvalues.FirstWasmClientID, + DstClientId: testvalues.CustomClientID, + }) + s.Require().NoError(err) + s.Require().NotEmpty(resp.Tx) + s.Require().Equal(resp.Address, ics26Address.String()) + + recvRelayTx = resp.Tx + })) + + s.Require().True(s.Run("Submit relay tx", func() { + receipt, err := eth.BroadcastTx(ctx, s.EthRelayerSubmitter, 2_000_000, &ics26Address, recvRelayTx) + s.Require().NoError(err) + s.Require().Equal(ethtypes.ReceiptStatusSuccessful, receipt.Status, fmt.Sprintf("Tx failed: %+v", receipt)) + + // ackTxHash = receipt.TxHash.Bytes() + })) + + s.True(s.Run("Verify balances on Ethereum", func() { + // ICS27Account balance should be zero + ics27AccBal, err := s.erc20Contract.BalanceOf(nil, computedAddress) + s.Require().NoError(err) + s.Require().Zero(ics27AccBal.Int64()) + + testBalance, err := s.erc20Contract.BalanceOf(nil, testUserAddress) + s.Require().NoError(err) + s.Require().Equal(testAmount, testBalance) + })) + })) } diff --git a/scripts/E2ETestDeploy.s.sol b/scripts/E2ETestDeploy.s.sol index 5e9d7627f..a90f288b7 100644 --- a/scripts/E2ETestDeploy.s.sol +++ b/scripts/E2ETestDeploy.s.sol @@ -17,6 +17,7 @@ import { ICS26Router } from "../contracts/ICS26Router.sol"; import { TestERC20 } from "../test/solidity-ibc/mocks/TestERC20.sol"; import { Strings } from "@openzeppelin-contracts/utils/Strings.sol"; import { ICS20Lib } from "../contracts/utils/ICS20Lib.sol"; +import { ICS27Lib } from "../contracts/utils/ICS27Lib.sol"; import { ERC1967Proxy } from "@openzeppelin-contracts/proxy/ERC1967/ERC1967Proxy.sol"; import { IBCERC20 } from "../contracts/utils/IBCERC20.sol"; import { Escrow } from "../contracts/utils/Escrow.sol"; @@ -86,8 +87,9 @@ contract E2ETestDeploy is Script, IICS07TendermintMsgs, DeployProxiedICS26Router ICS20Transfer ics20Transfer = ICS20Transfer(address(transferProxy)); ICS27GMP ics27Gmp = ICS27GMP(address(gmpProxy)); TestERC20 erc20 = new TestERC20(); - // Wire Transfer app + // Wire apps ics26Router.addIBCApp(ICS20Lib.DEFAULT_PORT_ID, address(ics20Transfer)); + ics26Router.addIBCApp(ICS27Lib.DEFAULT_PORT_ID, address(ics27Gmp)); // Mint some tokens erc20.mint(e2eFaucet, type(uint256).max); From e5ee8ace7db6219a066871a04783291198cf047d Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 8 May 2025 17:41:13 +0400 Subject: [PATCH 32/79] e2e: first test passing --- e2e/interchaintestv8/gmp_test.go | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/e2e/interchaintestv8/gmp_test.go b/e2e/interchaintestv8/gmp_test.go index 4579cc3b4..74e8e66c8 100644 --- a/e2e/interchaintestv8/gmp_test.go +++ b/e2e/interchaintestv8/gmp_test.go @@ -456,7 +456,7 @@ func (s *IbcEurekaGmpTestSuite) SendCallFromCosmosTest(ctx context.Context, proo s.Require().NoError(err) })) - // var ackTxHash []byte + var ackTxHash []byte s.Require().True(s.Run("Receive packet in Ethereum", func() { var recvRelayTx []byte s.Require().True(s.Run("Retrieve relay tx", func() { @@ -479,7 +479,7 @@ func (s *IbcEurekaGmpTestSuite) SendCallFromCosmosTest(ctx context.Context, proo s.Require().NoError(err) s.Require().Equal(ethtypes.ReceiptStatusSuccessful, receipt.Status, fmt.Sprintf("Tx failed: %+v", receipt)) - // ackTxHash = receipt.TxHash.Bytes() + ackTxHash = receipt.TxHash.Bytes() })) s.True(s.Run("Verify balances on Ethereum", func() { @@ -493,4 +493,31 @@ func (s *IbcEurekaGmpTestSuite) SendCallFromCosmosTest(ctx context.Context, proo s.Require().Equal(testAmount, testBalance) })) })) + + s.Require().True(s.Run("Acknowledge packet in Cosmos", func() { + var relayTxBodyBz []byte + s.Require().True(s.Run("Retrieve relay tx", func() { + resp, err := s.RelayerClient.RelayByTx(context.Background(), &relayertypes.RelayByTxRequest{ + SrcChain: eth.ChainID.String(), + DstChain: simd.Config().ChainID, + SourceTxIds: [][]byte{ackTxHash}, + SrcClientId: testvalues.CustomClientID, + DstClientId: testvalues.FirstWasmClientID, + }) + s.Require().NoError(err) + s.Require().NotEmpty(resp.Tx) + s.Require().Empty(resp.Address) + + relayTxBodyBz = resp.Tx + })) + + s.Require().True(s.Run("Broadcast relay tx", func() { + resp := s.MustBroadcastSdkTxBody(ctx, simd, s.SimdRelayerSubmitter, 2_000_000, relayTxBodyBz) + + var err error + ackTxHash, err = hex.DecodeString(resp.TxHash) + s.Require().NoError(err) + s.Require().NotEmpty(ackTxHash) + })) + })) } From 806a19ee7e5e6939c5e117ddb03d61d7129f9b7e Mon Sep 17 00:00:00 2001 From: srdtrk Date: Fri, 9 May 2025 14:21:39 +0400 Subject: [PATCH 33/79] feat: e2e passing --- e2e/interchaintestv8/e2esuite/utils.go | 9 +- e2e/interchaintestv8/gmp_test.go | 165 +++++++++++++++++- .../types/gmphelpers/helpers.go | 32 ++++ 3 files changed, 203 insertions(+), 3 deletions(-) create mode 100644 e2e/interchaintestv8/types/gmphelpers/helpers.go diff --git a/e2e/interchaintestv8/e2esuite/utils.go b/e2e/interchaintestv8/e2esuite/utils.go index 427ffb778..1a505b49a 100644 --- a/e2e/interchaintestv8/e2esuite/utils.go +++ b/e2e/interchaintestv8/e2esuite/utils.go @@ -90,9 +90,14 @@ func (s *TestSuite) BroadcastMessages(ctx context.Context, chain *cosmos.CosmosC return &resp, nil } -// CreateAndFundCosmosUser returns a new cosmos user with the given initial balance and funds it with the native chain denom. +// CreateAndFundCosmosUser returns a new cosmos user with the initial balance and funds it with the native chain denom. func (s *TestSuite) CreateAndFundCosmosUser(ctx context.Context, chain *cosmos.CosmosChain) ibc.Wallet { - cosmosUserFunds := sdkmath.NewInt(testvalues.InitialBalance) + return s.CreateAndFundCosmosUserWithBalance(ctx, chain, testvalues.InitialBalance) +} + +// CreateAndFundCosmosUser returns a new cosmos user with the given balance and funds it with the native chain denom. +func (s *TestSuite) CreateAndFundCosmosUserWithBalance(ctx context.Context, chain *cosmos.CosmosChain, balance int64) ibc.Wallet { + cosmosUserFunds := sdkmath.NewInt(balance) cosmosUsers := interchaintest.GetAndFundTestUsers(s.T(), ctx, s.T().Name(), cosmosUserFunds, chain) return cosmosUsers[0] diff --git a/e2e/interchaintestv8/gmp_test.go b/e2e/interchaintestv8/gmp_test.go index 74e8e66c8..09ebca2b6 100644 --- a/e2e/interchaintestv8/gmp_test.go +++ b/e2e/interchaintestv8/gmp_test.go @@ -11,6 +11,7 @@ import ( "testing" "time" + "github.com/cosmos/gogoproto/proto" "github.com/stretchr/testify/suite" "github.com/ethereum/go-ethereum/accounts/abi" @@ -18,6 +19,11 @@ import ( ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" + sdkmath "cosmossdk.io/math" + + sdk "github.com/cosmos/cosmos-sdk/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + gmptypes "github.com/cosmos/ibc-go/v10/modules/apps/27-gmp/types" transfertypes "github.com/cosmos/ibc-go/v10/modules/apps/transfer/types" clienttypes "github.com/cosmos/ibc-go/v10/modules/core/02-client/types" @@ -37,6 +43,7 @@ import ( "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/relayer" "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/testvalues" "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/types/erc20" + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/types/gmphelpers" relayertypes "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/types/relayer" ) @@ -422,7 +429,6 @@ func (s *IbcEurekaGmpTestSuite) SendCallFromCosmosTest(ctx context.Context, proo })) s.True(s.Run("Verify initial balances on Ethereum", func() { - // ICS27Account balance should be zero ics27AccBal, err := s.erc20Contract.BalanceOf(nil, computedAddress) s.Require().NoError(err) s.Require().Equal(testAmount, ics27AccBal) @@ -521,3 +527,160 @@ func (s *IbcEurekaGmpTestSuite) SendCallFromCosmosTest(ctx context.Context, proo })) })) } + +// TestSendCallFromEth_Groth16 tests the SendCall from Ethereum to Cosmos +func (s *IbcEurekaGmpTestSuite) TestSendCallFromEth_Groth16() { + ctx := context.Background() + s.SendCallFromEthTest(ctx, operator.ProofTypeGroth16) +} + +func (s *IbcEurekaGmpTestSuite) SendCallFromEthTest(ctx context.Context, proofType operator.SupportedProofType) { + s.SetupSuite(ctx, proofType) + + eth, simd := s.EthChain, s.CosmosChains[0] + ethUserAddress := crypto.PubkeyToAddress(s.key.PublicKey) + + ics26Address := ethcommon.HexToAddress(s.contractAddresses.Ics26Router) + testAmount := sdk.NewCoins(sdk.NewCoin(simd.Config().Denom, sdkmath.NewInt(1))) + testSimdUser := s.CreateAndFundCosmosUserWithBalance(ctx, simd, testAmount[0].Amount.Int64()) + + s.T().Logf("Eth user address: %s", ethUserAddress.Hex()) + + var computedAddress sdk.AccAddress + s.Require().True(s.Run("Fund pre-computed ICS27 address", func() { + res, err := e2esuite.GRPCQuery[gmptypes.QueryAccountAddressResponse](ctx, simd, &gmptypes.QueryAccountAddressRequest{ + ClientId: testvalues.FirstWasmClientID, + Sender: strings.ToLower(ethUserAddress.Hex()), + Salt: "", + }) + s.Require().NoError(err) + s.Require().NotEmpty(res.AccountAddress) + + computedAddress, err = sdk.AccAddressFromBech32(res.AccountAddress) + s.Require().NoError(err) + + _, err = s.BroadcastMessages(ctx, simd, testSimdUser, 2_000_000, &banktypes.MsgSend{ + FromAddress: testSimdUser.FormattedAddress(), + ToAddress: computedAddress.String(), + Amount: testAmount, + }) + s.Require().NoError(err) + })) + + s.True(s.Run("Verify initial balances on Cosmos", func() { + resp, err := e2esuite.GRPCQuery[banktypes.QueryBalanceResponse](ctx, simd, &banktypes.QueryBalanceRequest{ + Address: computedAddress.String(), + Denom: simd.Config().Denom, + }) + s.Require().NoError(err) + s.Require().NotNil(resp.Balance) + s.Require().Equal(testAmount[0].Denom, resp.Balance.Denom) + s.Require().Equal(testAmount[0].Amount.Int64(), resp.Balance.Amount.Int64()) + + })) + + var sendTxHash []byte + s.Require().True(s.Run("Send call from Eth", func() { + timeout := uint64(time.Now().Add(30 * time.Minute).Unix()) + + msgSend := &banktypes.MsgSend{ + FromAddress: computedAddress.String(), + ToAddress: testSimdUser.FormattedAddress(), + Amount: testAmount, + } + + sendCallMsg, err := gmphelpers.NewPayload_FromProto([]proto.Message{msgSend}) + s.Require().NoError(err) + + tx, err := s.ics27Contract.SendCall(s.GetTransactOpts(s.key, eth), ics27gmp.IICS27GMPMsgsSendCallMsg{ + SourceClient: testvalues.CustomClientID, + Receiver: "", + Salt: nil, + Payload: sendCallMsg, + TimeoutTimestamp: timeout, + Memo: "", + }) + s.Require().NoError(err) + + receipt, err := eth.GetTxReciept(ctx, tx.Hash()) + s.Require().NoError(err) + s.Require().Equal(ethtypes.ReceiptStatusSuccessful, receipt.Status, fmt.Sprintf("Tx failed: %+v", receipt)) + s.Require().NotEmpty(receipt.TxHash) + + sendTxHash = receipt.TxHash.Bytes() + })) + + var ackTxHash []byte + s.Require().True(s.Run("Receive packet in Cosmos", func() { + var recvRelayTx []byte + s.Require().True(s.Run("Retrieve relay tx", func() { + resp, err := s.RelayerClient.RelayByTx(context.Background(), &relayertypes.RelayByTxRequest{ + SrcChain: eth.ChainID.String(), + DstChain: simd.Config().ChainID, + SourceTxIds: [][]byte{sendTxHash}, + SrcClientId: testvalues.CustomClientID, + DstClientId: testvalues.FirstWasmClientID, + }) + s.Require().NoError(err) + s.Require().NotEmpty(resp.Tx) + s.Require().Empty(resp.Address) + + recvRelayTx = resp.Tx + })) + + s.Require().True(s.Run("Submit relay tx", func() { + receipt := s.MustBroadcastSdkTxBody(ctx, simd, s.SimdRelayerSubmitter, 2_000_000, recvRelayTx) + s.Require().Equal(uint32(0), receipt.Code, fmt.Sprintf("Tx failed: %+v", receipt)) + s.Require().NotEmpty(receipt.TxHash) + + var err error + ackTxHash, err = hex.DecodeString(receipt.TxHash) + s.Require().NoError(err) + })) + + s.True(s.Run("Verify balances on Cosmos", func() { + // ICS27Account balance should be zero + resp, err := e2esuite.GRPCQuery[banktypes.QueryBalanceResponse](ctx, simd, &banktypes.QueryBalanceRequest{ + Address: computedAddress.String(), + Denom: simd.Config().Denom, + }) + s.Require().NoError(err) + s.Require().NotNil(resp.Balance) + s.Require().Equal(testAmount[0].Denom, resp.Balance.Denom) + s.Require().Zero(resp.Balance.Amount.Int64()) + + resp, err = e2esuite.GRPCQuery[banktypes.QueryBalanceResponse](ctx, simd, &banktypes.QueryBalanceRequest{ + Address: testSimdUser.FormattedAddress(), + Denom: simd.Config().Denom, + }) + s.Require().NoError(err) + s.Require().NotNil(resp.Balance) + s.Require().Equal(testAmount[0].Denom, resp.Balance.Denom) + s.Require().Equal(testAmount[0].Amount.Int64(), resp.Balance.Amount.Int64()) + })) + })) + + s.Require().True(s.Run("Acknowledge packet in Eth", func() { + var relayTxBodyBz []byte + s.Require().True(s.Run("Retrieve relay tx", func() { + resp, err := s.RelayerClient.RelayByTx(context.Background(), &relayertypes.RelayByTxRequest{ + SrcChain: simd.Config().ChainID, + DstChain: eth.ChainID.String(), + SourceTxIds: [][]byte{ackTxHash}, + SrcClientId: testvalues.FirstWasmClientID, + DstClientId: testvalues.CustomClientID, + }) + s.Require().NoError(err) + s.Require().NotEmpty(resp.Tx) + s.Require().Equal(resp.Address, ics26Address.String()) + + relayTxBodyBz = resp.Tx + })) + + s.Require().True(s.Run("Broadcast relay tx", func() { + receipt, err := eth.BroadcastTx(ctx, s.EthRelayerSubmitter, 2_000_000, &ics26Address, relayTxBodyBz) + s.Require().NoError(err) + s.Require().Equal(ethtypes.ReceiptStatusSuccessful, receipt.Status, fmt.Sprintf("Tx failed: %+v", receipt)) + })) + })) +} diff --git a/e2e/interchaintestv8/types/gmphelpers/helpers.go b/e2e/interchaintestv8/types/gmphelpers/helpers.go new file mode 100644 index 000000000..3cf545b94 --- /dev/null +++ b/e2e/interchaintestv8/types/gmphelpers/helpers.go @@ -0,0 +1,32 @@ +package gmphelpers + +import ( + "github.com/cosmos/gogoproto/proto" + + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + + gmptypes "github.com/cosmos/ibc-go/v10/modules/apps/27-gmp/types" +) + +// NewPayload_FromProto creates a new payload to be submitted to cosmos through gmp. +func NewPayload_FromProto(msgs []proto.Message) ([]byte, error) { + cosmosMsgs := make([]*codectypes.Any, len(msgs)) + for i, msg := range msgs { + protoAny, err := codectypes.NewAnyWithValue(msg) + if err != nil { + return nil, err + } + + cosmosMsgs[i] = protoAny + } + + cosmosTx := gmptypes.CosmosTx{ + Messages: cosmosMsgs, + } + cosmosTxBz, err := proto.Marshal(&cosmosTx) + if err != nil { + return nil, err + } + + return cosmosTxBz, nil +} From 4d6926ba4d3dc7e552703089657e08ec367df3e9 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Mon, 2 Jun 2025 17:17:05 +0400 Subject: [PATCH 34/79] fix: justfile --- justfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/justfile b/justfile index 0fb95e551..344fa345e 100644 --- a/justfile +++ b/justfile @@ -247,7 +247,7 @@ test-e2e-multichain testname: # Run any e2e test in the IbcEurekaGmpTestSuite. For example, `just test-e2e-multichain TestDeploy_Groth16` [group('test')] -test-e2e-gmp testname: clean +test-e2e-gmp testname: @echo "Running {{testname}} test..." just test-e2e TestWithIbcEurekaGmpTestSuite/{{testname}} From 5bb5aad9cf51fc070ebde6a1a9cd40a7d1c6f900 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Wed, 18 Jun 2025 19:33:52 +0400 Subject: [PATCH 35/79] fix: merge issue --- e2e/interchaintestv8/gmp_test.go | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/e2e/interchaintestv8/gmp_test.go b/e2e/interchaintestv8/gmp_test.go index 09ebca2b6..f34b20587 100644 --- a/e2e/interchaintestv8/gmp_test.go +++ b/e2e/interchaintestv8/gmp_test.go @@ -39,9 +39,9 @@ import ( "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/cosmos" "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/e2esuite" "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/ethereum" - "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/operator" "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/relayer" "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/testvalues" + "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/types" "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/types/erc20" "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/types/gmphelpers" relayertypes "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/types/relayer" @@ -76,7 +76,7 @@ func TestWithIbcEurekaGmpTestSuite(t *testing.T) { suite.Run(t, new(IbcEurekaGmpTestSuite)) } -func (s *IbcEurekaGmpTestSuite) SetupSuite(ctx context.Context, proofType operator.SupportedProofType) { +func (s *IbcEurekaGmpTestSuite) SetupSuite(ctx context.Context, proofType types.SupportedProofType) { s.TestSuite.SetupSuite(ctx) eth, simd := s.EthChain, s.CosmosChains[0] @@ -205,9 +205,9 @@ func (s *IbcEurekaGmpTestSuite) SetupSuite(ctx context.Context, proofType operat verfierAddress = s.contractAddresses.VerifierMock } else { switch proofType { - case operator.ProofTypeGroth16: + case types.ProofTypeGroth16: verfierAddress = s.contractAddresses.VerifierGroth16 - case operator.ProofTypePlonk: + case types.ProofTypePlonk: verfierAddress = s.contractAddresses.VerifierPlonk default: s.Require().Fail("invalid proof type: %s", proofType) @@ -310,10 +310,10 @@ func (s *IbcEurekaGmpTestSuite) SetupSuite(ctx context.Context, proofType operat func (s *IbcEurekaGmpTestSuite) TestDeploy_Groth16() { ctx := context.Background() - s.DeployTest(ctx, operator.ProofTypeGroth16) + s.DeployTest(ctx, types.ProofTypeGroth16) } -func (s *IbcEurekaGmpTestSuite) DeployTest(ctx context.Context, proofType operator.SupportedProofType) { +func (s *IbcEurekaGmpTestSuite) DeployTest(ctx context.Context, proofType types.SupportedProofType) { s.SetupSuite(ctx, proofType) eth, simd := s.EthChain, s.CosmosChains[0] @@ -346,10 +346,6 @@ func (s *IbcEurekaGmpTestSuite) DeployTest(ctx context.Context, proofType operat })) s.Require().True(s.Run("Verify ICS26 Router", func() { - hasRole, err := s.ics26Contract.HasRole(nil, testvalues.PortCustomizerRole, crypto.PubkeyToAddress(s.deployer.PublicKey)) - s.Require().NoError(err) - s.Require().True(hasRole) - transferAddress, err := s.ics26Contract.GetIBCApp(nil, transfertypes.PortID) s.Require().NoError(err) s.Require().Equal(s.contractAddresses.Ics20Transfer, strings.ToLower(transferAddress.Hex())) @@ -393,10 +389,10 @@ func (s *IbcEurekaGmpTestSuite) DeployTest(ctx context.Context, proofType operat func (s *IbcEurekaGmpTestSuite) TestSendCallFromCosmos_Groth16() { ctx := context.Background() - s.SendCallFromCosmosTest(ctx, operator.ProofTypeGroth16) + s.SendCallFromCosmosTest(ctx, types.ProofTypeGroth16) } -func (s *IbcEurekaGmpTestSuite) SendCallFromCosmosTest(ctx context.Context, proofType operator.SupportedProofType) { +func (s *IbcEurekaGmpTestSuite) SendCallFromCosmosTest(ctx context.Context, proofType types.SupportedProofType) { s.SetupSuite(ctx, proofType) eth, simd := s.EthChain, s.CosmosChains[0] @@ -531,10 +527,10 @@ func (s *IbcEurekaGmpTestSuite) SendCallFromCosmosTest(ctx context.Context, proo // TestSendCallFromEth_Groth16 tests the SendCall from Ethereum to Cosmos func (s *IbcEurekaGmpTestSuite) TestSendCallFromEth_Groth16() { ctx := context.Background() - s.SendCallFromEthTest(ctx, operator.ProofTypeGroth16) + s.SendCallFromEthTest(ctx, types.ProofTypeGroth16) } -func (s *IbcEurekaGmpTestSuite) SendCallFromEthTest(ctx context.Context, proofType operator.SupportedProofType) { +func (s *IbcEurekaGmpTestSuite) SendCallFromEthTest(ctx context.Context, proofType types.SupportedProofType) { s.SetupSuite(ctx, proofType) eth, simd := s.EthChain, s.CosmosChains[0] From 75e7114d3d5d9a1af4f4b33d41aa5fab9bd29688 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Wed, 18 Jun 2025 19:34:21 +0400 Subject: [PATCH 36/79] style: forge fmt --- scripts/E2ETestDeploy.s.sol | 6 +----- scripts/deployments/DeployProxiedICS27GMP.sol | 18 ++++++------------ 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/scripts/E2ETestDeploy.s.sol b/scripts/E2ETestDeploy.s.sol index 8a6d0e1da..7800ee996 100644 --- a/scripts/E2ETestDeploy.s.sol +++ b/scripts/E2ETestDeploy.s.sol @@ -73,11 +73,7 @@ contract E2ETestDeploy is Script, IICS07TendermintMsgs, DeployAccessManagerWithR ) ); - ERC1967Proxy gmpProxy = deployProxiedICS27GMP( - ics27GmpLogic, - address(routerProxy), - accountLogic - ); + ERC1967Proxy gmpProxy = deployProxiedICS27GMP(ics27GmpLogic, address(routerProxy), accountLogic); // Wire up the IBCAdmin and access control accessManagerSetTargetRoles(accessManager, address(routerProxy), address(transferProxy), true); diff --git a/scripts/deployments/DeployProxiedICS27GMP.sol b/scripts/deployments/DeployProxiedICS27GMP.sol index 25d803675..70db48ced 100644 --- a/scripts/deployments/DeployProxiedICS27GMP.sol +++ b/scripts/deployments/DeployProxiedICS27GMP.sol @@ -14,21 +14,15 @@ abstract contract DeployProxiedICS27GMP { address implementation, address ics26Router, address accountImplementation - ) public returns (ERC1967Proxy) { - ERC1967Proxy gmpProxy = new ERC1967Proxy( - implementation, - abi.encodeCall( - ICS27GMP.initialize, - ( - ics26Router, - accountImplementation - ) - ) - ); + ) + public + returns (ERC1967Proxy) + { + ERC1967Proxy gmpProxy = + new ERC1967Proxy(implementation, abi.encodeCall(ICS27GMP.initialize, (ics26Router, accountImplementation))); console.log("Deployed ICS27GMP at address: ", address(gmpProxy)); return gmpProxy; } } - From e469421ce16b17db592a0d3bd811923f7666ad52 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Wed, 18 Jun 2025 19:35:44 +0400 Subject: [PATCH 37/79] style: consistency --- scripts/E2ETestDeploy.s.sol | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/E2ETestDeploy.s.sol b/scripts/E2ETestDeploy.s.sol index 7800ee996..b1ec16d62 100644 --- a/scripts/E2ETestDeploy.s.sol +++ b/scripts/E2ETestDeploy.s.sol @@ -49,7 +49,6 @@ contract E2ETestDeploy is Script, IICS07TendermintMsgs, DeployAccessManagerWithR address verifierMock = address(new SP1MockVerifier()); // Deploy IBC Eureka with proxy - address accountLogic = address(new ICS27Account()); address ics26RouterLogic = address(new ICS26Router()); address ics20TransferLogic = address(new ICS20Transfer()); address ics27GmpLogic = address(new ICS27GMP()); @@ -73,7 +72,7 @@ contract E2ETestDeploy is Script, IICS07TendermintMsgs, DeployAccessManagerWithR ) ); - ERC1967Proxy gmpProxy = deployProxiedICS27GMP(ics27GmpLogic, address(routerProxy), accountLogic); + ERC1967Proxy gmpProxy = deployProxiedICS27GMP(ics27GmpLogic, address(routerProxy), address(new ICS27Account())); // Wire up the IBCAdmin and access control accessManagerSetTargetRoles(accessManager, address(routerProxy), address(transferProxy), true); From af60ab9dcb84c5bb9982221601358596e2112406 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Wed, 18 Jun 2025 19:46:23 +0400 Subject: [PATCH 38/79] imp: use AccessManager in ICS27GMP --- contracts/ICS27GMP.sol | 17 ++++++----------- contracts/interfaces/IICS27GMP.sol | 3 ++- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/contracts/ICS27GMP.sol b/contracts/ICS27GMP.sol index 8a205b312..e304d2530 100644 --- a/contracts/ICS27GMP.sol +++ b/contracts/ICS27GMP.sol @@ -10,7 +10,6 @@ import { IIBCApp } from "./interfaces/IIBCApp.sol"; import { IICS27GMP } from "./interfaces/IICS27GMP.sol"; import { IICS27Account } from "./interfaces/IICS27Account.sol"; import { IICS27Errors } from "./errors/IICS27Errors.sol"; -import { IIBCUUPSUpgradeable } from "./interfaces/IIBCUUPSUpgradeable.sol"; import { ReentrancyGuardTransientUpgradeable } from "@openzeppelin-upgradeable/utils/ReentrancyGuardTransientUpgradeable.sol"; @@ -20,6 +19,7 @@ import { Create2 } from "@openzeppelin-contracts/utils/Create2.sol"; import { UUPSUpgradeable } from "@openzeppelin-contracts/proxy/utils/UUPSUpgradeable.sol"; import { UpgradeableBeacon } from "@openzeppelin-contracts/proxy/beacon/UpgradeableBeacon.sol"; import { ICS27Lib } from "./utils/ICS27Lib.sol"; +import { AccessManagedUpgradeable } from "@openzeppelin-upgradeable/access/manager/AccessManagedUpgradeable.sol"; /// @title ICS27 General Message Passing /// @notice This contract is the implementation of the ics27-2 IBC specification for general message passing. @@ -29,6 +29,7 @@ contract ICS27GMP is IIBCApp, ReentrancyGuardTransientUpgradeable, MulticallUpgradeable, + AccessManagedUpgradeable, UUPSUpgradeable { /// @notice Storage of the ICS27GMP contract @@ -54,9 +55,10 @@ contract ICS27GMP is } /// @inheritdoc IICS27GMP - function initialize(address ics26_, address accountLogic) external initializer { + function initialize(address ics26_, address accountLogic, address authority) external initializer { __ReentrancyGuardTransient_init(); __Multicall_init(); + __AccessManaged_init(authority); ICS27GMPStorage storage $ = _getICS27GMPStorage(); $._ics26 = IICS26Router(ics26_); @@ -196,12 +198,12 @@ contract ICS27GMP is } /// @inheritdoc IICS27GMP - function upgradeAccountTo(address newEscrowLogic) external onlyAdmin { + function upgradeAccountTo(address newEscrowLogic) external restricted { _getICS27GMPStorage()._accountBeacon.upgradeTo(newEscrowLogic); } /// @inheritdoc UUPSUpgradeable - function _authorizeUpgrade(address) internal view override onlyAdmin { } + function _authorizeUpgrade(address) internal override restricted { } // solhint-disable-previous-line no-empty-blocks /// @notice Modifier to check if the caller is the ICS26Router contract @@ -210,11 +212,4 @@ contract ICS27GMP is require(_msgSender() == router, ICS27Unauthorized(router, _msgSender())); _; } - - /// @notice Modifier to check if the caller is an admin via the ICS26Router contract - modifier onlyAdmin() { - address router = address(_getICS27GMPStorage()._ics26); - require(IIBCUUPSUpgradeable(router).isAdmin(_msgSender()), ICS27Unauthorized(router, _msgSender())); - _; - } } diff --git a/contracts/interfaces/IICS27GMP.sol b/contracts/interfaces/IICS27GMP.sol index e491adbcd..de9897737 100644 --- a/contracts/interfaces/IICS27GMP.sol +++ b/contracts/interfaces/IICS27GMP.sol @@ -30,7 +30,8 @@ interface IICS27GMP { /// @dev Meant to be called only once from the proxy /// @param ics26_ The ICS26Router contract address /// @param accountLogic The address of the ICS27Account logic contract - function initialize(address ics26_, address accountLogic) external; + /// @param authority The address of the AccessManager contract + function initialize(address ics26_, address accountLogic, address authority) external; /// @notice Upgrades the implementation of the account beacon contract /// @dev The caller must be the ICS26Router admin From 7b8ae7269211fbd315c0e9c61817de2aaf508c7d Mon Sep 17 00:00:00 2001 From: srdtrk Date: Wed, 18 Jun 2025 19:56:11 +0400 Subject: [PATCH 39/79] fix: fixed e2e deploy script --- scripts/E2ETestDeploy.s.sol | 9 ++++-- scripts/deployments/DeployProxiedICS27GMP.sol | 28 ------------------- 2 files changed, 7 insertions(+), 30 deletions(-) delete mode 100644 scripts/deployments/DeployProxiedICS27GMP.sol diff --git a/scripts/E2ETestDeploy.s.sol b/scripts/E2ETestDeploy.s.sol index b1ec16d62..cfbd0076d 100644 --- a/scripts/E2ETestDeploy.s.sol +++ b/scripts/E2ETestDeploy.s.sol @@ -72,7 +72,12 @@ contract E2ETestDeploy is Script, IICS07TendermintMsgs, DeployAccessManagerWithR ) ); - ERC1967Proxy gmpProxy = deployProxiedICS27GMP(ics27GmpLogic, address(routerProxy), address(new ICS27Account())); + ERC1967Proxy gmpProxy = new ERC1967Proxy( + ics27GmpLogic, + abi.encodeCall( + ICS27GMP.initialize, (address(routerProxy), address(new ICS27Account()), address(accessManager)) + ) + ); // Wire up the IBCAdmin and access control accessManagerSetTargetRoles(accessManager, address(routerProxy), address(transferProxy), true); @@ -97,7 +102,7 @@ contract E2ETestDeploy is Script, IICS07TendermintMsgs, DeployAccessManagerWithR json.serialize("verifierMock", Strings.toHexString(address(verifierMock))); json.serialize("ics26Router", Strings.toHexString(address(routerProxy))); json.serialize("ics20Transfer", Strings.toHexString(address(transferProxy))); - json.serialize("ics27Gmp", Strings.toHexString(address(ics27Gmp))); + json.serialize("ics27Gmp", Strings.toHexString(address(gmpProxy))); string memory finalJson = json.serialize("erc20", Strings.toHexString(address(erc20))); return finalJson; diff --git a/scripts/deployments/DeployProxiedICS27GMP.sol b/scripts/deployments/DeployProxiedICS27GMP.sol deleted file mode 100644 index 70db48ced..000000000 --- a/scripts/deployments/DeployProxiedICS27GMP.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.28; - -// solhint-disable custom-errors,gas-custom-errors - -// solhint-disable-next-line no-global-import -import "forge-std/console.sol"; - -import { ERC1967Proxy } from "@openzeppelin-contracts/proxy/ERC1967/ERC1967Proxy.sol"; -import { ICS27GMP } from "../../contracts/ICS27GMP.sol"; - -abstract contract DeployProxiedICS27GMP { - function deployProxiedICS27GMP( - address implementation, - address ics26Router, - address accountImplementation - ) - public - returns (ERC1967Proxy) - { - ERC1967Proxy gmpProxy = - new ERC1967Proxy(implementation, abi.encodeCall(ICS27GMP.initialize, (ics26Router, accountImplementation))); - - console.log("Deployed ICS27GMP at address: ", address(gmpProxy)); - - return gmpProxy; - } -} From 6b121dc720eafacf0b8fdc2ff90325cc1a643eea Mon Sep 17 00:00:00 2001 From: srdtrk Date: Wed, 18 Jun 2025 19:58:27 +0400 Subject: [PATCH 40/79] fix: tests --- test/solidity-ibc/utils/IbcImpl.sol | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/solidity-ibc/utils/IbcImpl.sol b/test/solidity-ibc/utils/IbcImpl.sol index 7aa0efab7..28913ce5c 100644 --- a/test/solidity-ibc/utils/IbcImpl.sol +++ b/test/solidity-ibc/utils/IbcImpl.sol @@ -70,7 +70,9 @@ contract IbcImpl is Test, DeployAccessManagerWithRoles { ERC1967Proxy gmpProxy = new ERC1967Proxy( address(ics27GmpLogic), - abi.encodeCall(ICS27GMP.initialize, (address(routerProxy), address(ics27AccountLogic))) + abi.encodeCall( + ICS27GMP.initialize, (address(routerProxy), address(ics27AccountLogic), address(accessManager)) + ) ); ics26Router = ICS26Router(address(routerProxy)); From 7e2526ea6c9ac13f2039e0c5039418ca72a4668e Mon Sep 17 00:00:00 2001 From: srdtrk Date: Wed, 18 Jun 2025 20:26:31 +0400 Subject: [PATCH 41/79] imp: regen abi --- abi/ICS27GMP.json | 95 +++++++++ packages/go-abigen/ics27gmp/contract.go | 243 ++++++++++++++++++++++-- 2 files changed, 325 insertions(+), 13 deletions(-) diff --git a/abi/ICS27GMP.json b/abi/ICS27GMP.json index 73fde850b..da88ee8cc 100644 --- a/abi/ICS27GMP.json +++ b/abi/ICS27GMP.json @@ -17,6 +17,19 @@ ], "stateMutability": "view" }, + { + "type": "function", + "name": "authority", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "getAccountBeacon", @@ -92,11 +105,29 @@ "name": "accountLogic", "type": "address", "internalType": "address" + }, + { + "name": "authority", + "type": "address", + "internalType": "address" } ], "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "isConsumingScheduledOp", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes4", + "internalType": "bytes4" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "multicall", @@ -392,6 +423,19 @@ ], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "setAuthority", + "inputs": [ + { + "name": "newAuthority", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, { "type": "function", "name": "upgradeAccountTo", @@ -423,6 +467,19 @@ "outputs": [], "stateMutability": "payable" }, + { + "type": "event", + "name": "AuthorityUpdated", + "inputs": [ + { + "name": "authority", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, { "type": "event", "name": "Initialized", @@ -449,6 +506,44 @@ ], "anonymous": false }, + { + "type": "error", + "name": "AccessManagedInvalidAuthority", + "inputs": [ + { + "name": "authority", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "AccessManagedRequiredDelay", + "inputs": [ + { + "name": "caller", + "type": "address", + "internalType": "address" + }, + { + "name": "delay", + "type": "uint32", + "internalType": "uint32" + } + ] + }, + { + "type": "error", + "name": "AccessManagedUnauthorized", + "inputs": [ + { + "name": "caller", + "type": "address", + "internalType": "address" + } + ] + }, { "type": "error", "name": "AddressEmptyCode", diff --git a/packages/go-abigen/ics27gmp/contract.go b/packages/go-abigen/ics27gmp/contract.go index 02febf042..3c68848a1 100644 --- a/packages/go-abigen/ics27gmp/contract.go +++ b/packages/go-abigen/ics27gmp/contract.go @@ -85,7 +85,7 @@ type IICS27GMPMsgsSendCallMsg struct { // ContractMetaData contains all meta data concerning the Contract contract. var ContractMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccountBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOrComputeAccountAddress\",\"inputs\":[{\"name\":\"accountId\",\"type\":\"tuple\",\"internalType\":\"structIICS27GMPMsgs.AccountIdentifier\",\"components\":[{\"name\":\"clientId\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"salt\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ics26\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"ics26_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accountLogic\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"multicall\",\"inputs\":[{\"name\":\"data\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[{\"name\":\"results\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onAcknowledgementPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnAcknowledgementPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"acknowledgement\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onRecvPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnRecvPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sendCall\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS27GMPMsgs.SendCallMsg\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"salt\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeAccountTo\",\"inputs\":[{\"name\":\"newEscrowLogic\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Create2EmptyBytecode\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedDeployment\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS27InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidPort\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27Unauthorized\",\"inputs\":[{\"name\":\"expected\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedEncoding\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"InsufficientBalance\",\"inputs\":[{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"authority\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccountBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOrComputeAccountAddress\",\"inputs\":[{\"name\":\"accountId\",\"type\":\"tuple\",\"internalType\":\"structIICS27GMPMsgs.AccountIdentifier\",\"components\":[{\"name\":\"clientId\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"salt\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ics26\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"ics26_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accountLogic\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"authority\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isConsumingScheduledOp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"multicall\",\"inputs\":[{\"name\":\"data\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[{\"name\":\"results\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onAcknowledgementPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnAcknowledgementPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"acknowledgement\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onRecvPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnRecvPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sendCall\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS27GMPMsgs.SendCallMsg\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"salt\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAuthority\",\"inputs\":[{\"name\":\"newAuthority\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeAccountTo\",\"inputs\":[{\"name\":\"newEscrowLogic\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AuthorityUpdated\",\"inputs\":[{\"name\":\"authority\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AccessManagedInvalidAuthority\",\"inputs\":[{\"name\":\"authority\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AccessManagedRequiredDelay\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"AccessManagedUnauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Create2EmptyBytecode\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedDeployment\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS27InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidPort\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27Unauthorized\",\"inputs\":[{\"name\":\"expected\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedEncoding\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"InsufficientBalance\",\"inputs\":[{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", } // ContractABI is the input ABI used to generate the binding from. @@ -265,6 +265,37 @@ func (_Contract *ContractCallerSession) UPGRADEINTERFACEVERSION() (string, error return _Contract.Contract.UPGRADEINTERFACEVERSION(&_Contract.CallOpts) } +// Authority is a free data retrieval call binding the contract method 0xbf7e214f. +// +// Solidity: function authority() view returns(address) +func (_Contract *ContractCaller) Authority(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "authority") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Authority is a free data retrieval call binding the contract method 0xbf7e214f. +// +// Solidity: function authority() view returns(address) +func (_Contract *ContractSession) Authority() (common.Address, error) { + return _Contract.Contract.Authority(&_Contract.CallOpts) +} + +// Authority is a free data retrieval call binding the contract method 0xbf7e214f. +// +// Solidity: function authority() view returns(address) +func (_Contract *ContractCallerSession) Authority() (common.Address, error) { + return _Contract.Contract.Authority(&_Contract.CallOpts) +} + // GetAccountBeacon is a free data retrieval call binding the contract method 0xf78c6a9b. // // Solidity: function getAccountBeacon() view returns(address) @@ -358,6 +389,37 @@ func (_Contract *ContractCallerSession) Ics26() (common.Address, error) { return _Contract.Contract.Ics26(&_Contract.CallOpts) } +// IsConsumingScheduledOp is a free data retrieval call binding the contract method 0x8fb36037. +// +// Solidity: function isConsumingScheduledOp() view returns(bytes4) +func (_Contract *ContractCaller) IsConsumingScheduledOp(opts *bind.CallOpts) ([4]byte, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "isConsumingScheduledOp") + + if err != nil { + return *new([4]byte), err + } + + out0 := *abi.ConvertType(out[0], new([4]byte)).(*[4]byte) + + return out0, err + +} + +// IsConsumingScheduledOp is a free data retrieval call binding the contract method 0x8fb36037. +// +// Solidity: function isConsumingScheduledOp() view returns(bytes4) +func (_Contract *ContractSession) IsConsumingScheduledOp() ([4]byte, error) { + return _Contract.Contract.IsConsumingScheduledOp(&_Contract.CallOpts) +} + +// IsConsumingScheduledOp is a free data retrieval call binding the contract method 0x8fb36037. +// +// Solidity: function isConsumingScheduledOp() view returns(bytes4) +func (_Contract *ContractCallerSession) IsConsumingScheduledOp() ([4]byte, error) { + return _Contract.Contract.IsConsumingScheduledOp(&_Contract.CallOpts) +} + // ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. // // Solidity: function proxiableUUID() view returns(bytes32) @@ -389,25 +451,25 @@ func (_Contract *ContractCallerSession) ProxiableUUID() ([32]byte, error) { return _Contract.Contract.ProxiableUUID(&_Contract.CallOpts) } -// Initialize is a paid mutator transaction binding the contract method 0x485cc955. +// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b. // -// Solidity: function initialize(address ics26_, address accountLogic) returns() -func (_Contract *ContractTransactor) Initialize(opts *bind.TransactOpts, ics26_ common.Address, accountLogic common.Address) (*types.Transaction, error) { - return _Contract.contract.Transact(opts, "initialize", ics26_, accountLogic) +// Solidity: function initialize(address ics26_, address accountLogic, address authority) returns() +func (_Contract *ContractTransactor) Initialize(opts *bind.TransactOpts, ics26_ common.Address, accountLogic common.Address, authority common.Address) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "initialize", ics26_, accountLogic, authority) } -// Initialize is a paid mutator transaction binding the contract method 0x485cc955. +// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b. // -// Solidity: function initialize(address ics26_, address accountLogic) returns() -func (_Contract *ContractSession) Initialize(ics26_ common.Address, accountLogic common.Address) (*types.Transaction, error) { - return _Contract.Contract.Initialize(&_Contract.TransactOpts, ics26_, accountLogic) +// Solidity: function initialize(address ics26_, address accountLogic, address authority) returns() +func (_Contract *ContractSession) Initialize(ics26_ common.Address, accountLogic common.Address, authority common.Address) (*types.Transaction, error) { + return _Contract.Contract.Initialize(&_Contract.TransactOpts, ics26_, accountLogic, authority) } -// Initialize is a paid mutator transaction binding the contract method 0x485cc955. +// Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b. // -// Solidity: function initialize(address ics26_, address accountLogic) returns() -func (_Contract *ContractTransactorSession) Initialize(ics26_ common.Address, accountLogic common.Address) (*types.Transaction, error) { - return _Contract.Contract.Initialize(&_Contract.TransactOpts, ics26_, accountLogic) +// Solidity: function initialize(address ics26_, address accountLogic, address authority) returns() +func (_Contract *ContractTransactorSession) Initialize(ics26_ common.Address, accountLogic common.Address, authority common.Address) (*types.Transaction, error) { + return _Contract.Contract.Initialize(&_Contract.TransactOpts, ics26_, accountLogic, authority) } // Multicall is a paid mutator transaction binding the contract method 0xac9650d8. @@ -515,6 +577,27 @@ func (_Contract *ContractTransactorSession) SendCall(msg_ IICS27GMPMsgsSendCallM return _Contract.Contract.SendCall(&_Contract.TransactOpts, msg_) } +// SetAuthority is a paid mutator transaction binding the contract method 0x7a9e5e4b. +// +// Solidity: function setAuthority(address newAuthority) returns() +func (_Contract *ContractTransactor) SetAuthority(opts *bind.TransactOpts, newAuthority common.Address) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "setAuthority", newAuthority) +} + +// SetAuthority is a paid mutator transaction binding the contract method 0x7a9e5e4b. +// +// Solidity: function setAuthority(address newAuthority) returns() +func (_Contract *ContractSession) SetAuthority(newAuthority common.Address) (*types.Transaction, error) { + return _Contract.Contract.SetAuthority(&_Contract.TransactOpts, newAuthority) +} + +// SetAuthority is a paid mutator transaction binding the contract method 0x7a9e5e4b. +// +// Solidity: function setAuthority(address newAuthority) returns() +func (_Contract *ContractTransactorSession) SetAuthority(newAuthority common.Address) (*types.Transaction, error) { + return _Contract.Contract.SetAuthority(&_Contract.TransactOpts, newAuthority) +} + // UpgradeAccountTo is a paid mutator transaction binding the contract method 0xdd7345e3. // // Solidity: function upgradeAccountTo(address newEscrowLogic) returns() @@ -557,6 +640,140 @@ func (_Contract *ContractTransactorSession) UpgradeToAndCall(newImplementation c return _Contract.Contract.UpgradeToAndCall(&_Contract.TransactOpts, newImplementation, data) } +// ContractAuthorityUpdatedIterator is returned from FilterAuthorityUpdated and is used to iterate over the raw logs and unpacked data for AuthorityUpdated events raised by the Contract contract. +type ContractAuthorityUpdatedIterator struct { + Event *ContractAuthorityUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ContractAuthorityUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ContractAuthorityUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ContractAuthorityUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ContractAuthorityUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractAuthorityUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractAuthorityUpdated represents a AuthorityUpdated event raised by the Contract contract. +type ContractAuthorityUpdated struct { + Authority common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAuthorityUpdated is a free log retrieval operation binding the contract event 0x2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad. +// +// Solidity: event AuthorityUpdated(address authority) +func (_Contract *ContractFilterer) FilterAuthorityUpdated(opts *bind.FilterOpts) (*ContractAuthorityUpdatedIterator, error) { + + logs, sub, err := _Contract.contract.FilterLogs(opts, "AuthorityUpdated") + if err != nil { + return nil, err + } + return &ContractAuthorityUpdatedIterator{contract: _Contract.contract, event: "AuthorityUpdated", logs: logs, sub: sub}, nil +} + +// WatchAuthorityUpdated is a free log subscription operation binding the contract event 0x2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad. +// +// Solidity: event AuthorityUpdated(address authority) +func (_Contract *ContractFilterer) WatchAuthorityUpdated(opts *bind.WatchOpts, sink chan<- *ContractAuthorityUpdated) (event.Subscription, error) { + + logs, sub, err := _Contract.contract.WatchLogs(opts, "AuthorityUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ContractAuthorityUpdated) + if err := _Contract.contract.UnpackLog(event, "AuthorityUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseAuthorityUpdated is a log parse operation binding the contract event 0x2f658b440c35314f52658ea8a740e05b284cdc84dc9ae01e891f21b8933e7cad. +// +// Solidity: event AuthorityUpdated(address authority) +func (_Contract *ContractFilterer) ParseAuthorityUpdated(log types.Log) (*ContractAuthorityUpdated, error) { + event := new(ContractAuthorityUpdated) + if err := _Contract.contract.UnpackLog(event, "AuthorityUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // ContractInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the Contract contract. type ContractInitializedIterator struct { Event *ContractInitialized // Event containing the contract specifics and raw log From ca6255fd91a5ebd0e69c9259f2198038c6d20511 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Wed, 18 Jun 2025 20:57:36 +0400 Subject: [PATCH 42/79] style: natlint --- contracts/ICS27GMP.sol | 2 ++ contracts/errors/IICS27Errors.sol | 2 ++ contracts/interfaces/IICS27Account.sol | 4 ++++ contracts/interfaces/IICS27GMP.sol | 2 ++ contracts/msgs/IICS27GMPMsgs.sol | 2 ++ contracts/utils/ICS27Account.sol | 6 ++++++ contracts/utils/ICS27Lib.sol | 2 ++ 7 files changed, 20 insertions(+) diff --git a/contracts/ICS27GMP.sol b/contracts/ICS27GMP.sol index e304d2530..199d5932b 100644 --- a/contracts/ICS27GMP.sol +++ b/contracts/ICS27GMP.sol @@ -50,6 +50,7 @@ contract ICS27GMP is bytes32 private constant ICS27GMP_STORAGE_SLOT = 0xe73deb02cd654f25b90ec94b434589ea350a706e2446d278b41c3a86dc8f4500; /// @dev This contract is meant to be deployed by a proxy, so the constructor is not used + // natlint-disable-next-line MissingNotice constructor() { _disableInitializers(); } @@ -190,6 +191,7 @@ contract ICS27GMP is } /// @notice Returns the storage of the ICS27GMP contract + /// @return $ The storage of the ICS27GMP contract function _getICS27GMPStorage() private pure returns (ICS27GMPStorage storage $) { // solhint-disable-next-line no-inline-assembly assembly { diff --git a/contracts/errors/IICS27Errors.sol b/contracts/errors/IICS27Errors.sol index 91f70fa98..8fcde68ba 100644 --- a/contracts/errors/IICS27Errors.sol +++ b/contracts/errors/IICS27Errors.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.28; +/// @title IICS27Errors +/// @notice Interface for ICS27 errors interface IICS27Errors { /// @notice Invalid address /// @param addr Address of the sender or receiver diff --git a/contracts/interfaces/IICS27Account.sol b/contracts/interfaces/IICS27Account.sol index 33c1ab2a9..b7b9e4409 100644 --- a/contracts/interfaces/IICS27Account.sol +++ b/contracts/interfaces/IICS27Account.sol @@ -1,9 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.28; +/// @title IICS27Account +/// @notice Interface for ICS27 Accounts to implement interface IICS27Account { /// @notice This is a wrapper around openzeppelin's `Address.sendValue`. /// @dev This function can only be called by self. + /// @param recipient The address to send the value to + /// @param amount The amount of wei to send function sendValue(address payable recipient, uint256 amount) external; /// @notice Performs a Solidity function call using a low level `call`. diff --git a/contracts/interfaces/IICS27GMP.sol b/contracts/interfaces/IICS27GMP.sol index de9897737..7fd8620f4 100644 --- a/contracts/interfaces/IICS27GMP.sol +++ b/contracts/interfaces/IICS27GMP.sol @@ -3,6 +3,8 @@ pragma solidity ^0.8.28; import { IICS27GMPMsgs } from "../msgs/IICS27GMPMsgs.sol"; +/// @title ICS27 General Message Passing (GMP) Interface +/// @notice Interface for the ICS27 General Message Passing (GMP) contract interface IICS27GMP { /// @notice The address of the ICS26Router contract /// @return The address of the ICS26Router contract diff --git a/contracts/msgs/IICS27GMPMsgs.sol b/contracts/msgs/IICS27GMPMsgs.sol index d58cb0ca1..ee70748e2 100644 --- a/contracts/msgs/IICS27GMPMsgs.sol +++ b/contracts/msgs/IICS27GMPMsgs.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.28; +/// @title ICS27 GMP Messages +/// @notice Interface defining ICS27 GMP Messages interface IICS27GMPMsgs { /// @notice Message for sending a GMP packet /// @param sourceClient The source client identifier diff --git a/contracts/utils/ICS27Account.sol b/contracts/utils/ICS27Account.sol index 884ac701a..d1e3ab720 100644 --- a/contracts/utils/ICS27Account.sol +++ b/contracts/utils/ICS27Account.sol @@ -7,6 +7,8 @@ import { IICS27Account } from "../interfaces/IICS27Account.sol"; import { ContextUpgradeable } from "@openzeppelin-upgradeable/utils/ContextUpgradeable.sol"; import { Address } from "@openzeppelin-contracts/utils/Address.sol"; +/// @title ICS27Account +/// @notice This contract is the implementation of the ICS27 Account, which is used to make the GMP calls contract ICS27Account is IICS27Errors, IICS27Account, ContextUpgradeable { /// @notice Storage of the ICS27Account contract /// @dev It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions when using with @@ -23,6 +25,7 @@ contract ICS27Account is IICS27Errors, IICS27Account, ContextUpgradeable { 0x319583b012a10c350515da7d8fdefe3c302490627bf79c0be5b739020ce32c00; /// @dev This contract is meant to be deployed by a proxy, so the constructor is not used + // natlint-disable-next-line MissingNotice constructor() { _disableInitializers(); } @@ -69,6 +72,7 @@ contract ICS27Account is IICS27Errors, IICS27Account, ContextUpgradeable { } /// @notice Returns the storage of the ICS27Account contract + /// @return $ The storage of the ICS27Account contract function _getICS27AccountStorage() private pure returns (ICS27AccountStorage storage $) { // solhint-disable-next-line no-inline-assembly assembly { @@ -76,12 +80,14 @@ contract ICS27Account is IICS27Errors, IICS27Account, ContextUpgradeable { } } + /// @notice Modifier to restrict access to the ICS27 contract modifier onlyICS27() { address ics27_ = _getICS27AccountStorage()._ics27; require(_msgSender() == ics27_, ICS27Unauthorized(ics27_, _msgSender())); _; } + /// @notice Modifier to restrict access to this contract modifier onlySelf() { require(_msgSender() == address(this), ICS27Unauthorized(address(this), _msgSender())); _; diff --git a/contracts/utils/ICS27Lib.sol b/contracts/utils/ICS27Lib.sol index aeb5544ba..007491a05 100644 --- a/contracts/utils/ICS27Lib.sol +++ b/contracts/utils/ICS27Lib.sol @@ -5,6 +5,8 @@ import { IICS27GMPMsgs } from "../msgs/IICS27GMPMsgs.sol"; import { IICS27Account } from "../interfaces/IICS27Account.sol"; import { BeaconProxy } from "@openzeppelin-contracts/proxy/beacon/BeaconProxy.sol"; +/// @title ICS27Lib +/// @notice This library provides utility functions for ICS27GMP, including versioning, encoding, and denom handling. library ICS27Lib { /// @notice ICS27_VERSION is the version string for ICS27 packet data. string internal constant ICS27_VERSION = "ics27-2"; From 48858541774b32346c00d9161d2cf85703cebec3 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Wed, 18 Jun 2025 20:58:07 +0400 Subject: [PATCH 43/79] style: golangci-lint --- e2e/interchaintestv8/gmp_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/e2e/interchaintestv8/gmp_test.go b/e2e/interchaintestv8/gmp_test.go index f34b20587..6fc67ed3b 100644 --- a/e2e/interchaintestv8/gmp_test.go +++ b/e2e/interchaintestv8/gmp_test.go @@ -572,7 +572,6 @@ func (s *IbcEurekaGmpTestSuite) SendCallFromEthTest(ctx context.Context, proofTy s.Require().NotNil(resp.Balance) s.Require().Equal(testAmount[0].Denom, resp.Balance.Denom) s.Require().Equal(testAmount[0].Amount.Int64(), resp.Balance.Amount.Int64()) - })) var sendTxHash []byte From 6bbfd983e71ccafc1a836e5f20656230bdc964e9 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Wed, 18 Jun 2025 22:25:09 +0400 Subject: [PATCH 44/79] imp: integrated sender callbacks --- contracts/ICS27GMP.sol | 24 ++++++++++++++++++++---- contracts/errors/IICS27Errors.sol | 4 ++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/contracts/ICS27GMP.sol b/contracts/ICS27GMP.sol index 199d5932b..8246bd763 100644 --- a/contracts/ICS27GMP.sol +++ b/contracts/ICS27GMP.sol @@ -18,7 +18,9 @@ import { Strings } from "@openzeppelin-contracts/utils/Strings.sol"; import { Create2 } from "@openzeppelin-contracts/utils/Create2.sol"; import { UUPSUpgradeable } from "@openzeppelin-contracts/proxy/utils/UUPSUpgradeable.sol"; import { UpgradeableBeacon } from "@openzeppelin-contracts/proxy/beacon/UpgradeableBeacon.sol"; +import { ICS24Host } from "./utils/ICS24Host.sol"; import { ICS27Lib } from "./utils/ICS27Lib.sol"; +import { IBCSenderCallbacksLib } from "./utils/IBCSenderCallbacksLib.sol"; import { AccessManagedUpgradeable } from "@openzeppelin-upgradeable/access/manager/AccessManagedUpgradeable.sol"; /// @title ICS27 General Message Passing @@ -146,12 +148,26 @@ contract ICS27GMP is external nonReentrant onlyRouter - { } - // solhint-disable-previous-line no-empty-blocks + { + IICS27GMPMsgs.GMPPacketData memory packetData = abi.decode(msg_.payload.value, (IICS27GMPMsgs.GMPPacketData)); + + (bool success, address sender) = Strings.tryParseAddress(packetData.sender); + require(success, ICS27InvalidSender(packetData.sender)); + + IBCSenderCallbacksLib.ackPacketCallback( + sender, keccak256(msg_.acknowledgement) != ICS24Host.KECCAK256_UNIVERSAL_ERROR_ACK, msg_ + ); + } /// @inheritdoc IIBCApp - function onTimeoutPacket(IIBCAppCallbacks.OnTimeoutPacketCallback calldata msg_) external nonReentrant onlyRouter { } - // solhint-disable-previous-line no-empty-blocks + function onTimeoutPacket(IIBCAppCallbacks.OnTimeoutPacketCallback calldata msg_) external nonReentrant onlyRouter { + IICS27GMPMsgs.GMPPacketData memory packetData = abi.decode(msg_.payload.value, (IICS27GMPMsgs.GMPPacketData)); + + (bool success, address sender) = Strings.tryParseAddress(packetData.sender); + require(success, ICS27InvalidSender(packetData.sender)); + + IBCSenderCallbacksLib.timeoutPacketCallback(sender, msg_); + } /// @notice Creates or retrieves an account contract for the given account identifier /// @param accountId The account identifier diff --git a/contracts/errors/IICS27Errors.sol b/contracts/errors/IICS27Errors.sol index 8fcde68ba..2d3efdc23 100644 --- a/contracts/errors/IICS27Errors.sol +++ b/contracts/errors/IICS27Errors.sol @@ -31,4 +31,8 @@ interface IICS27Errors { /// @notice Invalid receiver /// @param receiver The receiver address of the contract call error ICS27InvalidReceiver(string receiver); + + /// @notice Invalid sender + /// @param sender The sender of the packet + error ICS27InvalidSender(string sender); } From a3f8b3866a0d2223ba7c8e7b490114eb40377d2b Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 19 Jun 2025 11:58:06 +0400 Subject: [PATCH 45/79] imp: added execute batch --- contracts/interfaces/IICS27Account.sol | 29 ++++++++++++++++++-------- contracts/utils/ICS27Account.sol | 24 +++++++++++---------- 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/contracts/interfaces/IICS27Account.sol b/contracts/interfaces/IICS27Account.sol index b7b9e4409..2e0cba4e9 100644 --- a/contracts/interfaces/IICS27Account.sol +++ b/contracts/interfaces/IICS27Account.sol @@ -4,6 +4,16 @@ pragma solidity ^0.8.28; /// @title IICS27Account /// @notice Interface for ICS27 Accounts to implement interface IICS27Account { + /// @notice Call struct for the `executeBatch` function. + /// @param target The target address to call + /// @param data The data to send to the target address + /// @param value The value to send to the target address + struct Call { + address target; + bytes data; + uint256 value; + } + /// @notice This is a wrapper around openzeppelin's `Address.sendValue`. /// @dev This function can only be called by self. /// @param recipient The address to send the value to @@ -16,7 +26,7 @@ interface IICS27Account { /// @param target The target address to call /// @param data The data to send to the target address /// @return result The result of the call - function functionCall(address target, bytes memory data) external returns (bytes memory result); + function functionCall(address target, bytes calldata data) external returns (bytes memory result); /// @notice Performs a Solidity function call using a low level `call`. /// @dev This is a wrapper around openzeppelin's `Address.functionCallWithValue`. @@ -25,13 +35,14 @@ interface IICS27Account { /// @param data The data to send to the target address /// @param value The value to send to the target address /// @return result The result of the call - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) - external - returns (bytes memory result); + function execute(address target, bytes calldata data, uint256 value) external returns (bytes memory result); + + /// @notice Performs multiple Solidity function calls using a low level `call`. + /// @dev This is a wrapper around openzeppelin's `Address.functionCallWithValue`. + /// @dev This function can only be called by self. + /// @param calls The array of `Call` structs to execute + /// @return results The array of results from the calls + function executeBatch(Call[] calldata calls) external returns (bytes[] memory results); /// @notice Performs a Solidity function call using a low level `delegatecall`. /// @dev This is a wrapper around openzeppelin's `Address.functionDelegateCall`. @@ -39,7 +50,7 @@ interface IICS27Account { /// @param target The target address to call /// @param data The data to send to the target address /// @return result The result of the call - function functionDelegateCall(address target, bytes calldata data) external returns (bytes memory result); + function delegateExecute(address target, bytes calldata data) external returns (bytes memory result); /// @notice Get the ICS27 contract address /// @return The ICS27 contract address diff --git a/contracts/utils/ICS27Account.sol b/contracts/utils/ICS27Account.sol index d1e3ab720..e6509d0ab 100644 --- a/contracts/utils/ICS27Account.sol +++ b/contracts/utils/ICS27Account.sol @@ -44,25 +44,27 @@ contract ICS27Account is IICS27Errors, IICS27Account, ContextUpgradeable { } /// @inheritdoc IICS27Account - function functionCall(address target, bytes memory data) external onlyICS27 returns (bytes memory) { + function functionCall(address target, bytes calldata data) external onlyICS27 returns (bytes memory) { return Address.functionCall(target, data); } /// @inheritdoc IICS27Account - function functionCallWithValue( - address target, - bytes memory data, - uint256 value - ) - external - onlySelf - returns (bytes memory) - { + function execute(address target, bytes calldata data, uint256 value) external onlySelf returns (bytes memory) { return Address.functionCallWithValue(target, data, value); } /// @inheritdoc IICS27Account - function functionDelegateCall(address target, bytes calldata data) external onlySelf returns (bytes memory) { + function executeBatch(Call[] calldata calls) external onlySelf returns (bytes[] memory) { + bytes[] memory results = new bytes[](calls.length); + for (uint256 i = 0; i < calls.length; i++) { + Call calldata call = calls[i]; + results[i] = Address.functionCallWithValue(call.target, call.data, call.value); + } + return results; + } + + /// @inheritdoc IICS27Account + function delegateExecute(address target, bytes calldata data) external onlySelf returns (bytes memory) { return Address.functionDelegateCall(target, data); } From 26aeb9631c5ef7577db7bd30af3130529e525eb0 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 19 Jun 2025 12:17:30 +0400 Subject: [PATCH 46/79] refactor: reorganized msg and interface --- contracts/interfaces/IICS27Account.sol | 20 ++++++-------------- contracts/msgs/IICS27AccountMsgs.sol | 16 ++++++++++++++++ contracts/utils/ICS27Account.sol | 16 +++++++++------- 3 files changed, 31 insertions(+), 21 deletions(-) create mode 100644 contracts/msgs/IICS27AccountMsgs.sol diff --git a/contracts/interfaces/IICS27Account.sol b/contracts/interfaces/IICS27Account.sol index 2e0cba4e9..b7a00b90d 100644 --- a/contracts/interfaces/IICS27Account.sol +++ b/contracts/interfaces/IICS27Account.sol @@ -1,18 +1,14 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.28; +import { IICS27AccountMsgs } from "../msgs/IICS27AccountMsgs.sol"; + /// @title IICS27Account /// @notice Interface for ICS27 Accounts to implement interface IICS27Account { - /// @notice Call struct for the `executeBatch` function. - /// @param target The target address to call - /// @param data The data to send to the target address - /// @param value The value to send to the target address - struct Call { - address target; - bytes data; - uint256 value; - } + /// @notice Get the ICS27 contract address + /// @return The ICS27 contract address + function ics27() external view returns (address); /// @notice This is a wrapper around openzeppelin's `Address.sendValue`. /// @dev This function can only be called by self. @@ -42,7 +38,7 @@ interface IICS27Account { /// @dev This function can only be called by self. /// @param calls The array of `Call` structs to execute /// @return results The array of results from the calls - function executeBatch(Call[] calldata calls) external returns (bytes[] memory results); + function executeBatch(IICS27AccountMsgs.Call[] calldata calls) external returns (bytes[] memory results); /// @notice Performs a Solidity function call using a low level `delegatecall`. /// @dev This is a wrapper around openzeppelin's `Address.functionDelegateCall`. @@ -52,10 +48,6 @@ interface IICS27Account { /// @return result The result of the call function delegateExecute(address target, bytes calldata data) external returns (bytes memory result); - /// @notice Get the ICS27 contract address - /// @return The ICS27 contract address - function ics27() external view returns (address); - /// @notice Initializes the ICS27Account contract /// @dev This function is meant to be called by a proxy /// @param ics27_ The ICS27GMP contract address diff --git a/contracts/msgs/IICS27AccountMsgs.sol b/contracts/msgs/IICS27AccountMsgs.sol new file mode 100644 index 000000000..affaec976 --- /dev/null +++ b/contracts/msgs/IICS27AccountMsgs.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +/// @title ICS27 Account Messages +/// @notice Interface defining ICS27 Account Messages +interface IICS27AccountMsgs { + /// @notice Call struct for the `executeBatch` function. + /// @param target The target address to call + /// @param data The data to send to the target address + /// @param value The value to send to the target address + struct Call { + address target; + bytes data; + uint256 value; + } +} diff --git a/contracts/utils/ICS27Account.sol b/contracts/utils/ICS27Account.sol index e6509d0ab..d14f8ce42 100644 --- a/contracts/utils/ICS27Account.sol +++ b/contracts/utils/ICS27Account.sol @@ -1,6 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.28; +import { IICS27AccountMsgs } from "../msgs/IICS27AccountMsgs.sol"; + import { IICS27Errors } from "../errors/IICS27Errors.sol"; import { IICS27Account } from "../interfaces/IICS27Account.sol"; @@ -38,6 +40,11 @@ contract ICS27Account is IICS27Errors, IICS27Account, ContextUpgradeable { $._ics27 = ics27_; } + /// @inheritdoc IICS27Account + function ics27() external view returns (address) { + return _getICS27AccountStorage()._ics27; + } + /// @inheritdoc IICS27Account function sendValue(address payable recipient, uint256 amount) external onlySelf { Address.sendValue(recipient, amount); @@ -54,10 +61,10 @@ contract ICS27Account is IICS27Errors, IICS27Account, ContextUpgradeable { } /// @inheritdoc IICS27Account - function executeBatch(Call[] calldata calls) external onlySelf returns (bytes[] memory) { + function executeBatch(IICS27AccountMsgs.Call[] calldata calls) external onlySelf returns (bytes[] memory) { bytes[] memory results = new bytes[](calls.length); for (uint256 i = 0; i < calls.length; i++) { - Call calldata call = calls[i]; + IICS27AccountMsgs.Call calldata call = calls[i]; results[i] = Address.functionCallWithValue(call.target, call.data, call.value); } return results; @@ -68,11 +75,6 @@ contract ICS27Account is IICS27Errors, IICS27Account, ContextUpgradeable { return Address.functionDelegateCall(target, data); } - /// @inheritdoc IICS27Account - function ics27() external view returns (address) { - return _getICS27AccountStorage()._ics27; - } - /// @notice Returns the storage of the ICS27Account contract /// @return $ The storage of the ICS27Account contract function _getICS27AccountStorage() private pure returns (ICS27AccountStorage storage $) { From df05f6bc14c02f38d31c168198a1e93d398eb21c Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 19 Jun 2025 14:39:40 +0400 Subject: [PATCH 47/79] deps: updated forge-std --- bun.lockb | Bin 74236 -> 74236 bytes package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/bun.lockb b/bun.lockb index bf039eff0e01618d2c48fe87fa3b230c0b9acbb8..e0f00542f38b88fe14b5eb4e45826a4d20343708 100755 GIT binary patch delta 89 zcmV-f0H*)^!vy@p1duKuc6|~>OTeiB0>c!94+Ms_{UefzIOwuNuKfvUbrPr3u}<_1 v4BG(#0001xRdNIY0JBaFpD+P8v+g~PsR1{$edpjg2RAn`G%;i{lOd3pZq6dj delta 89 zcmV-f0H*)^!vy@p1duKuJBwEjh~F-4_y=#FR4r;u}<_1 v3@rr#0002UVp@<-1+z{KpD+P7v+g~PsR1^#edpjg2Qy+aFl06`lOd3pTxlYa diff --git a/package.json b/package.json index 0abca9c2f..464757bfe 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ }, "devDependencies": { "sp1-contracts": "github:succinctlabs/sp1-contracts#v5.0.0", - "forge-std": "github:foundry-rs/forge-std#v1.9.6", + "forge-std": "github:foundry-rs/forge-std#v1.9.7", "solhint": "^5.1.0", "quicktype": "^23.2.6" }, From 164fee0f390dd10cbd29017ecf82a873b13c2c39 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 19 Jun 2025 19:03:03 +0400 Subject: [PATCH 48/79] test: added account tests --- test/solidity-ibc/ICS27AccountTest.t.sol | 307 +++++++++++++++++++++++ 1 file changed, 307 insertions(+) create mode 100644 test/solidity-ibc/ICS27AccountTest.t.sol diff --git a/test/solidity-ibc/ICS27AccountTest.t.sol b/test/solidity-ibc/ICS27AccountTest.t.sol new file mode 100644 index 000000000..438488348 --- /dev/null +++ b/test/solidity-ibc/ICS27AccountTest.t.sol @@ -0,0 +1,307 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +// solhint-disable custom-errors,max-line-length + +import { Test } from "forge-std/Test.sol"; + +import { IICS27AccountMsgs } from "../../contracts/msgs/IICS27AccountMsgs.sol"; +import { IICS27Errors } from "../../contracts/errors/IICS27Errors.sol"; + +import { ERC1967Proxy } from "@openzeppelin-contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { ICS27Account } from "../../contracts/utils/ICS27Account.sol"; +import { Errors } from "@openzeppelin-contracts/utils/Errors.sol"; + +contract ICS27AccountTest is Test { + address public ics27 = makeAddr("ics27"); + ICS27Account public ics27Account; + + function setUp() public { + address accountLogic = address(new ICS27Account()); + + ERC1967Proxy accountProxy = + new ERC1967Proxy(address(accountLogic), abi.encodeCall(ICS27Account.initialize, (ics27))); + + ics27Account = ICS27Account(address(accountProxy)); + assertEq(ics27Account.ics27(), ics27, "ICS27 address should match"); + } + + function test_success_functionCall() public { + address target = makeAddr("target"); + bytes memory data = "someData"; + bytes memory resp = "mockedResponse"; + + vm.mockCall(target, data, resp); + vm.expectCall(target, data); + vm.prank(ics27); + ics27Account.functionCall(target, data); + } + + function test_failure_functionCall() public { + address target = makeAddr("target"); + bytes memory data = "someData"; + bytes memory resp = "mockedResponse"; + + // Unauthorized call + address unauthorized = makeAddr("unauthorized"); + vm.expectRevert(abi.encodeWithSelector(IICS27Errors.ICS27Unauthorized.selector, ics27, unauthorized)); + vm.prank(unauthorized); + ics27Account.functionCall(target, data); + + // Call reverts + vm.mockCallRevert(target, data, resp); + vm.expectRevert(resp); + vm.prank(ics27); + ics27Account.functionCall(target, data); + } + + function testFuzz_success_sendValue(uint256 amount) public { + vm.deal(address(ics27Account), amount); + address payable recipient = payable(makeAddr("recipient")); + + // Assert initial balances + assertEq(address(ics27Account).balance, amount, "ICS27Account balance should match amount"); + assertEq(recipient.balance, 0, "Recipient balance should be zero"); + + // Send value + vm.prank(address(ics27Account)); + ics27Account.sendValue(recipient, amount); + + // Assert final balances + assertEq(address(ics27Account).balance, 0, "ICS27Account balance should be zero after send"); + assertEq(recipient.balance, amount, "Recipient balance should match amount after send"); + } + + function testFuzz_failure_sendValue(uint256 amount) public { + vm.assume(amount < type(uint256).max); // Avoid overflow in test + + vm.deal(address(ics27Account), amount); + address payable recipient = payable(makeAddr("recipient")); + + // Unauthorized call + address unauthorized = makeAddr("unauthorized"); + vm.expectRevert( + abi.encodeWithSelector(IICS27Errors.ICS27Unauthorized.selector, address(ics27Account), unauthorized) + ); + vm.prank(address(unauthorized)); + ics27Account.sendValue(recipient, amount); + + // Insufficient balance + vm.prank(address(ics27Account)); + vm.expectRevert(abi.encodeWithSelector(Errors.InsufficientBalance.selector, amount, amount + 1)); + ics27Account.sendValue(recipient, amount + 1); + + // Assert initial balances + assertEq(address(ics27Account).balance, amount, "ICS27Account balance should match amount"); + assertEq(recipient.balance, 0, "Recipient balance should be zero"); + } + + function testFuzz_success_execute(uint256 value) public { + vm.deal(address(ics27Account), value); + + address target = address(new TestCallContract()); + bytes memory data = abi.encodeCall(TestCallContract.payableCall, ()); + bytes memory resp = abi.encode("mockedResponse"); + + // Assert initial balances + assertEq(address(ics27Account).balance, value, "ICS27Account balance should match amount"); + assertEq(target.balance, 0, "Target balance should be zero"); + + vm.expectCall(target, value, data); + vm.prank(address(ics27Account)); + bytes memory result = ics27Account.execute(target, data, value); + assertEq(result, resp, "Result should match mocked response"); + + // Assert final balance + assertEq(address(ics27Account).balance, 0, "ICS27Account balance should be zero after execute"); + assertEq(target.balance, value, "Target balance should match value after execute"); + } + + function testFuzz_failure_execute(uint256 value) public { + vm.assume(value < type(uint256).max); // Avoid overflow in test + + vm.deal(address(ics27Account), value); + + address target = address(new TestCallContract()); + bytes memory data = abi.encodeCall(TestCallContract.payableCall, ()); + bytes memory resp = abi.encode("mockedResponse"); + + // Unauthorized call + address unauthorized = makeAddr("unauthorized"); + vm.expectRevert( + abi.encodeWithSelector(IICS27Errors.ICS27Unauthorized.selector, address(ics27Account), unauthorized) + ); + vm.prank(unauthorized); + ics27Account.execute(target, data, value); + + // Call reverts + vm.mockCallRevert(target, data, resp); + vm.expectRevert(resp); + vm.prank(address(ics27Account)); + ics27Account.execute(target, data, value); + + // Insufficient balance + vm.prank(address(ics27Account)); + vm.expectRevert(abi.encodeWithSelector(Errors.InsufficientBalance.selector, value, value + 1)); + ics27Account.execute(target, data, value + 1); + + // Assert initial balances + assertEq(address(ics27Account).balance, value, "ICS27Account balance should match amount"); + assertEq(target.balance, 0, "Target balance should still be zero"); + } + + function testFuzz_success_executeBatch(uint256 totalValue, uint8 numCalls) public { + vm.assume(numCalls > 0); + + vm.deal(address(ics27Account), totalValue); + + address target = address(new TestCallContract()); + bytes memory data = abi.encodeCall(TestCallContract.payableCall, ()); + bytes[] memory expResp = new bytes[](numCalls); + + // Assert initial balances + assertEq(address(ics27Account).balance, totalValue, "ICS27Account balance should match totalValue"); + assertEq(target.balance, 0, "Target balance should be zero"); + + // Prepare calls + IICS27AccountMsgs.Call[] memory calls = new IICS27AccountMsgs.Call[](numCalls); + uint256 valuePerCall = totalValue / numCalls; + for (uint256 i = 0; i < numCalls; i++) { + calls[i] = IICS27AccountMsgs.Call({ + target: target, + data: data, + value: valuePerCall + }); + + expResp[i] = abi.encode("mockedResponse"); + } + + vm.expectCall(target, valuePerCall, data, numCalls); + vm.prank(address(ics27Account)); + + bytes[] memory results = ics27Account.executeBatch(calls); + assertEq(results.length, numCalls, "Results length should match number of calls"); + assertEq(results, expResp, "Results should match expected responses"); + + // Assert final balance + assertEq(address(ics27Account).balance, totalValue % numCalls, "ICS27Account balance should be zero after executeBatch"); + assertEq(target.balance, valuePerCall * numCalls, "Target balance should match totalValue after executeBatch"); + } + + function testFuzz_failure_executeBatch(uint256 totalValue, uint8 numCalls) public { + vm.assume(numCalls > 0 && totalValue < type(uint256).max); // Avoid overflow in test + + vm.deal(address(ics27Account), totalValue); + + address target = address(new TestCallContract()); + bytes memory data = abi.encodeCall(TestCallContract.payableCall, ()); + + IICS27AccountMsgs.Call[] memory calls = new IICS27AccountMsgs.Call[](numCalls); + for (uint256 i = 0; i < numCalls; i++) { + calls[i] = IICS27AccountMsgs.Call({ + target: target, + data: data, + value: totalValue / numCalls + }); + } + + // Unauthorized call + address unauthorized = makeAddr("unauthorized"); + vm.expectRevert( + abi.encodeWithSelector(IICS27Errors.ICS27Unauthorized.selector, address(ics27Account), unauthorized) + ); + vm.prank(unauthorized); + ics27Account.executeBatch(calls); + + // Call reverts + bytes memory revertData = "revertData"; + bytes memory revertResp = "revertResponse"; + calls[numCalls - 1].data = revertData; + + vm.mockCallRevert(target, revertData, revertResp); + vm.expectRevert(revertResp); + vm.prank(address(ics27Account)); + ics27Account.executeBatch(calls); + calls[numCalls - 1].data = data; // Reset to original data + + // Insufficient balance + calls[0].value = totalValue + 1; // Set first call to exceed balance + vm.prank(address(ics27Account)); + vm.expectRevert(abi.encodeWithSelector(Errors.InsufficientBalance.selector, totalValue, totalValue + 1)); + ics27Account.executeBatch(calls); + + // Assert initial balances + assertEq(address(ics27Account).balance, totalValue, "ICS27Account balance should match totalValue"); + assertEq(target.balance, 0, "Target balance should still be zero"); + } + + function test_success_delegateExecute() public { + address target = address(new TestCallContract()); + bytes32 testSlot = TestCallContract(target).TEST_STORAGE_SLOT(); + bytes32 testValue = keccak256("testValue"); + bytes memory data = abi.encodeCall(TestCallContract.writeCall, (testValue)); + bytes memory resp = abi.encode("mockedResponse"); + + vm.expectCall(target, data); + vm.prank(address(ics27Account)); + bytes memory result = ics27Account.delegateExecute(target, data); + assertEq(result, resp, "Result should match mocked response"); + + // Assert storage was written + bytes32 storedValue = vm.load(address(ics27Account), bytes32(testSlot)); + assertEq(storedValue, testValue, "Storage value should match written value"); + } + + function test_failure_delegateExecute() public { + address target = address(new TestCallContract()); + bytes32 testSlot = TestCallContract(target).TEST_STORAGE_SLOT(); + bytes32 testValue = keccak256("testValue"); + bytes memory data = abi.encodeCall(TestCallContract.writeCall, (testValue)); + bytes memory errResp = abi.encode("mockedError"); + + // Unauthorized call + address unauthorized = makeAddr("unauthorized"); + vm.expectRevert( + abi.encodeWithSelector(IICS27Errors.ICS27Unauthorized.selector, address(ics27Account), unauthorized) + ); + vm.prank(unauthorized); + ics27Account.delegateExecute(target, data); + + // Call reverts + vm.mockCallRevert(target, data, errResp); + vm.expectRevert(errResp); + vm.prank(address(ics27Account)); + ics27Account.delegateExecute(target, data); + + // Assert storage was not written + bytes32 storedValue = vm.load(address(ics27Account), bytes32(testSlot)); + assertEq(storedValue, bytes32(0), "Storage value should be empty"); + } +} + +contract TestCallContract { + struct Storage { + bytes32 value; + } + + bytes32 public constant TEST_STORAGE_SLOT = keccak256("test.storage.slot"); + + // TODO: Remove this once the foundry bug is addressed + // https://github.com/foundry-rs/foundry/issues/10812 + function payableCall() external payable returns (bytes memory) { + return "mockedResponse"; + } + + function writeCall(bytes32 value) external returns (bytes memory) { + Storage storage $ = _getStorage(); + $.value = value; + return "mockedResponse"; + } + + function _getStorage() internal pure returns (Storage storage $) { + bytes32 slot = TEST_STORAGE_SLOT; + assembly { + $.slot := slot + } + } +} From e6755986d75dec3cafa5086747f8f6c836e66576 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 19 Jun 2025 19:07:28 +0400 Subject: [PATCH 49/79] imp: regen abi --- abi/ICS27Account.json | 53 +++++++++- abi/ICS27GMP.json | 11 +++ packages/go-abigen/ics27account/contract.go | 102 +++++++++++++------- packages/go-abigen/ics27gmp/contract.go | 2 +- 4 files changed, 127 insertions(+), 41 deletions(-) diff --git a/abi/ICS27Account.json b/abi/ICS27Account.json index bb57f4241..3b40ac8a6 100644 --- a/abi/ICS27Account.json +++ b/abi/ICS27Account.json @@ -6,7 +6,7 @@ }, { "type": "function", - "name": "functionCall", + "name": "delegateExecute", "inputs": [ { "name": "target", @@ -30,7 +30,7 @@ }, { "type": "function", - "name": "functionCallWithValue", + "name": "execute", "inputs": [ { "name": "target", @@ -59,7 +59,43 @@ }, { "type": "function", - "name": "functionDelegateCall", + "name": "executeBatch", + "inputs": [ + { + "name": "calls", + "type": "tuple[]", + "internalType": "struct IICS27AccountMsgs.Call[]", + "components": [ + { + "name": "target", + "type": "address", + "internalType": "address" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "value", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "bytes[]", + "internalType": "bytes[]" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "functionCall", "inputs": [ { "name": "target", @@ -192,6 +228,17 @@ } ] }, + { + "type": "error", + "name": "ICS27InvalidSender", + "inputs": [ + { + "name": "sender", + "type": "string", + "internalType": "string" + } + ] + }, { "type": "error", "name": "ICS27Unauthorized", diff --git a/abi/ICS27GMP.json b/abi/ICS27GMP.json index da88ee8cc..d08f74cc0 100644 --- a/abi/ICS27GMP.json +++ b/abi/ICS27GMP.json @@ -624,6 +624,17 @@ } ] }, + { + "type": "error", + "name": "ICS27InvalidSender", + "inputs": [ + { + "name": "sender", + "type": "string", + "internalType": "string" + } + ] + }, { "type": "error", "name": "ICS27Unauthorized", diff --git a/packages/go-abigen/ics27account/contract.go b/packages/go-abigen/ics27account/contract.go index 4a2801420..1461f0881 100644 --- a/packages/go-abigen/ics27account/contract.go +++ b/packages/go-abigen/ics27account/contract.go @@ -29,9 +29,16 @@ var ( _ = abi.ConvertType ) +// IICS27AccountMsgsCall is an auto generated low-level Go binding around an user-defined struct. +type IICS27AccountMsgsCall struct { + Target common.Address + Data []byte + Value *big.Int +} + // ContractMetaData contains all meta data concerning the Contract contract. var ContractMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"functionCall\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"functionCallWithValue\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"functionDelegateCall\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ics27\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"ics27_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendValue\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS27InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidPort\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27Unauthorized\",\"inputs\":[{\"name\":\"expected\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedEncoding\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"InsufficientBalance\",\"inputs\":[{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateExecute\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"execute\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"executeBatch\",\"inputs\":[{\"name\":\"calls\",\"type\":\"tuple[]\",\"internalType\":\"structIICS27AccountMsgs.Call[]\",\"components\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"functionCall\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ics27\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"ics27_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendValue\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS27InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidPort\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidSender\",\"inputs\":[{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27Unauthorized\",\"inputs\":[{\"name\":\"expected\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedEncoding\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"InsufficientBalance\",\"inputs\":[{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]}]", } // ContractABI is the input ABI used to generate the binding from. @@ -211,67 +218,88 @@ func (_Contract *ContractCallerSession) Ics27() (common.Address, error) { return _Contract.Contract.Ics27(&_Contract.CallOpts) } -// FunctionCall is a paid mutator transaction binding the contract method 0xa0b5ffb0. +// DelegateExecute is a paid mutator transaction binding the contract method 0xb10cc728. // -// Solidity: function functionCall(address target, bytes data) returns(bytes) -func (_Contract *ContractTransactor) FunctionCall(opts *bind.TransactOpts, target common.Address, data []byte) (*types.Transaction, error) { - return _Contract.contract.Transact(opts, "functionCall", target, data) +// Solidity: function delegateExecute(address target, bytes data) returns(bytes) +func (_Contract *ContractTransactor) DelegateExecute(opts *bind.TransactOpts, target common.Address, data []byte) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "delegateExecute", target, data) } -// FunctionCall is a paid mutator transaction binding the contract method 0xa0b5ffb0. +// DelegateExecute is a paid mutator transaction binding the contract method 0xb10cc728. // -// Solidity: function functionCall(address target, bytes data) returns(bytes) -func (_Contract *ContractSession) FunctionCall(target common.Address, data []byte) (*types.Transaction, error) { - return _Contract.Contract.FunctionCall(&_Contract.TransactOpts, target, data) +// Solidity: function delegateExecute(address target, bytes data) returns(bytes) +func (_Contract *ContractSession) DelegateExecute(target common.Address, data []byte) (*types.Transaction, error) { + return _Contract.Contract.DelegateExecute(&_Contract.TransactOpts, target, data) } -// FunctionCall is a paid mutator transaction binding the contract method 0xa0b5ffb0. +// DelegateExecute is a paid mutator transaction binding the contract method 0xb10cc728. // -// Solidity: function functionCall(address target, bytes data) returns(bytes) -func (_Contract *ContractTransactorSession) FunctionCall(target common.Address, data []byte) (*types.Transaction, error) { - return _Contract.Contract.FunctionCall(&_Contract.TransactOpts, target, data) +// Solidity: function delegateExecute(address target, bytes data) returns(bytes) +func (_Contract *ContractTransactorSession) DelegateExecute(target common.Address, data []byte) (*types.Transaction, error) { + return _Contract.Contract.DelegateExecute(&_Contract.TransactOpts, target, data) } -// FunctionCallWithValue is a paid mutator transaction binding the contract method 0x2a011594. +// Execute is a paid mutator transaction binding the contract method 0xa04a0908. // -// Solidity: function functionCallWithValue(address target, bytes data, uint256 value) returns(bytes) -func (_Contract *ContractTransactor) FunctionCallWithValue(opts *bind.TransactOpts, target common.Address, data []byte, value *big.Int) (*types.Transaction, error) { - return _Contract.contract.Transact(opts, "functionCallWithValue", target, data, value) +// Solidity: function execute(address target, bytes data, uint256 value) returns(bytes) +func (_Contract *ContractTransactor) Execute(opts *bind.TransactOpts, target common.Address, data []byte, value *big.Int) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "execute", target, data, value) } -// FunctionCallWithValue is a paid mutator transaction binding the contract method 0x2a011594. +// Execute is a paid mutator transaction binding the contract method 0xa04a0908. // -// Solidity: function functionCallWithValue(address target, bytes data, uint256 value) returns(bytes) -func (_Contract *ContractSession) FunctionCallWithValue(target common.Address, data []byte, value *big.Int) (*types.Transaction, error) { - return _Contract.Contract.FunctionCallWithValue(&_Contract.TransactOpts, target, data, value) +// Solidity: function execute(address target, bytes data, uint256 value) returns(bytes) +func (_Contract *ContractSession) Execute(target common.Address, data []byte, value *big.Int) (*types.Transaction, error) { + return _Contract.Contract.Execute(&_Contract.TransactOpts, target, data, value) } -// FunctionCallWithValue is a paid mutator transaction binding the contract method 0x2a011594. +// Execute is a paid mutator transaction binding the contract method 0xa04a0908. // -// Solidity: function functionCallWithValue(address target, bytes data, uint256 value) returns(bytes) -func (_Contract *ContractTransactorSession) FunctionCallWithValue(target common.Address, data []byte, value *big.Int) (*types.Transaction, error) { - return _Contract.Contract.FunctionCallWithValue(&_Contract.TransactOpts, target, data, value) +// Solidity: function execute(address target, bytes data, uint256 value) returns(bytes) +func (_Contract *ContractTransactorSession) Execute(target common.Address, data []byte, value *big.Int) (*types.Transaction, error) { + return _Contract.Contract.Execute(&_Contract.TransactOpts, target, data, value) } -// FunctionDelegateCall is a paid mutator transaction binding the contract method 0xee33b7e2. +// ExecuteBatch is a paid mutator transaction binding the contract method 0x8a89b44b. // -// Solidity: function functionDelegateCall(address target, bytes data) returns(bytes) -func (_Contract *ContractTransactor) FunctionDelegateCall(opts *bind.TransactOpts, target common.Address, data []byte) (*types.Transaction, error) { - return _Contract.contract.Transact(opts, "functionDelegateCall", target, data) +// Solidity: function executeBatch((address,bytes,uint256)[] calls) returns(bytes[]) +func (_Contract *ContractTransactor) ExecuteBatch(opts *bind.TransactOpts, calls []IICS27AccountMsgsCall) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "executeBatch", calls) } -// FunctionDelegateCall is a paid mutator transaction binding the contract method 0xee33b7e2. +// ExecuteBatch is a paid mutator transaction binding the contract method 0x8a89b44b. // -// Solidity: function functionDelegateCall(address target, bytes data) returns(bytes) -func (_Contract *ContractSession) FunctionDelegateCall(target common.Address, data []byte) (*types.Transaction, error) { - return _Contract.Contract.FunctionDelegateCall(&_Contract.TransactOpts, target, data) +// Solidity: function executeBatch((address,bytes,uint256)[] calls) returns(bytes[]) +func (_Contract *ContractSession) ExecuteBatch(calls []IICS27AccountMsgsCall) (*types.Transaction, error) { + return _Contract.Contract.ExecuteBatch(&_Contract.TransactOpts, calls) } -// FunctionDelegateCall is a paid mutator transaction binding the contract method 0xee33b7e2. +// ExecuteBatch is a paid mutator transaction binding the contract method 0x8a89b44b. +// +// Solidity: function executeBatch((address,bytes,uint256)[] calls) returns(bytes[]) +func (_Contract *ContractTransactorSession) ExecuteBatch(calls []IICS27AccountMsgsCall) (*types.Transaction, error) { + return _Contract.Contract.ExecuteBatch(&_Contract.TransactOpts, calls) +} + +// FunctionCall is a paid mutator transaction binding the contract method 0xa0b5ffb0. // -// Solidity: function functionDelegateCall(address target, bytes data) returns(bytes) -func (_Contract *ContractTransactorSession) FunctionDelegateCall(target common.Address, data []byte) (*types.Transaction, error) { - return _Contract.Contract.FunctionDelegateCall(&_Contract.TransactOpts, target, data) +// Solidity: function functionCall(address target, bytes data) returns(bytes) +func (_Contract *ContractTransactor) FunctionCall(opts *bind.TransactOpts, target common.Address, data []byte) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "functionCall", target, data) +} + +// FunctionCall is a paid mutator transaction binding the contract method 0xa0b5ffb0. +// +// Solidity: function functionCall(address target, bytes data) returns(bytes) +func (_Contract *ContractSession) FunctionCall(target common.Address, data []byte) (*types.Transaction, error) { + return _Contract.Contract.FunctionCall(&_Contract.TransactOpts, target, data) +} + +// FunctionCall is a paid mutator transaction binding the contract method 0xa0b5ffb0. +// +// Solidity: function functionCall(address target, bytes data) returns(bytes) +func (_Contract *ContractTransactorSession) FunctionCall(target common.Address, data []byte) (*types.Transaction, error) { + return _Contract.Contract.FunctionCall(&_Contract.TransactOpts, target, data) } // Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. diff --git a/packages/go-abigen/ics27gmp/contract.go b/packages/go-abigen/ics27gmp/contract.go index 3c68848a1..939a9eefc 100644 --- a/packages/go-abigen/ics27gmp/contract.go +++ b/packages/go-abigen/ics27gmp/contract.go @@ -85,7 +85,7 @@ type IICS27GMPMsgsSendCallMsg struct { // ContractMetaData contains all meta data concerning the Contract contract. var ContractMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"authority\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccountBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOrComputeAccountAddress\",\"inputs\":[{\"name\":\"accountId\",\"type\":\"tuple\",\"internalType\":\"structIICS27GMPMsgs.AccountIdentifier\",\"components\":[{\"name\":\"clientId\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"salt\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ics26\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"ics26_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accountLogic\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"authority\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isConsumingScheduledOp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"multicall\",\"inputs\":[{\"name\":\"data\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[{\"name\":\"results\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onAcknowledgementPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnAcknowledgementPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"acknowledgement\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onRecvPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnRecvPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sendCall\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS27GMPMsgs.SendCallMsg\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"salt\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAuthority\",\"inputs\":[{\"name\":\"newAuthority\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeAccountTo\",\"inputs\":[{\"name\":\"newEscrowLogic\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AuthorityUpdated\",\"inputs\":[{\"name\":\"authority\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AccessManagedInvalidAuthority\",\"inputs\":[{\"name\":\"authority\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AccessManagedRequiredDelay\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"AccessManagedUnauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Create2EmptyBytecode\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedDeployment\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS27InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidPort\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27Unauthorized\",\"inputs\":[{\"name\":\"expected\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedEncoding\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"InsufficientBalance\",\"inputs\":[{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"authority\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccountBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOrComputeAccountAddress\",\"inputs\":[{\"name\":\"accountId\",\"type\":\"tuple\",\"internalType\":\"structIICS27GMPMsgs.AccountIdentifier\",\"components\":[{\"name\":\"clientId\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"salt\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ics26\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"ics26_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accountLogic\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"authority\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isConsumingScheduledOp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"multicall\",\"inputs\":[{\"name\":\"data\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[{\"name\":\"results\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onAcknowledgementPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnAcknowledgementPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"acknowledgement\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onRecvPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnRecvPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sendCall\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS27GMPMsgs.SendCallMsg\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"salt\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAuthority\",\"inputs\":[{\"name\":\"newAuthority\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeAccountTo\",\"inputs\":[{\"name\":\"newEscrowLogic\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AuthorityUpdated\",\"inputs\":[{\"name\":\"authority\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AccessManagedInvalidAuthority\",\"inputs\":[{\"name\":\"authority\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AccessManagedRequiredDelay\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"AccessManagedUnauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Create2EmptyBytecode\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedDeployment\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS27InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidPort\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidSender\",\"inputs\":[{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27Unauthorized\",\"inputs\":[{\"name\":\"expected\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedEncoding\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"InsufficientBalance\",\"inputs\":[{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", } // ContractABI is the input ABI used to generate the binding from. From ab943d3a8706a50f86ed52711d7b22f1531a5056 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 10 Jul 2025 08:47:56 +0300 Subject: [PATCH 50/79] style: forge fmt --- test/solidity-ibc/ICS27AccountTest.t.sol | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/test/solidity-ibc/ICS27AccountTest.t.sol b/test/solidity-ibc/ICS27AccountTest.t.sol index 438488348..debcf2f9c 100644 --- a/test/solidity-ibc/ICS27AccountTest.t.sol +++ b/test/solidity-ibc/ICS27AccountTest.t.sol @@ -167,11 +167,7 @@ contract ICS27AccountTest is Test { IICS27AccountMsgs.Call[] memory calls = new IICS27AccountMsgs.Call[](numCalls); uint256 valuePerCall = totalValue / numCalls; for (uint256 i = 0; i < numCalls; i++) { - calls[i] = IICS27AccountMsgs.Call({ - target: target, - data: data, - value: valuePerCall - }); + calls[i] = IICS27AccountMsgs.Call({ target: target, data: data, value: valuePerCall }); expResp[i] = abi.encode("mockedResponse"); } @@ -184,7 +180,11 @@ contract ICS27AccountTest is Test { assertEq(results, expResp, "Results should match expected responses"); // Assert final balance - assertEq(address(ics27Account).balance, totalValue % numCalls, "ICS27Account balance should be zero after executeBatch"); + assertEq( + address(ics27Account).balance, + totalValue % numCalls, + "ICS27Account balance should be zero after executeBatch" + ); assertEq(target.balance, valuePerCall * numCalls, "Target balance should match totalValue after executeBatch"); } @@ -198,11 +198,7 @@ contract ICS27AccountTest is Test { IICS27AccountMsgs.Call[] memory calls = new IICS27AccountMsgs.Call[](numCalls); for (uint256 i = 0; i < numCalls; i++) { - calls[i] = IICS27AccountMsgs.Call({ - target: target, - data: data, - value: totalValue / numCalls - }); + calls[i] = IICS27AccountMsgs.Call({ target: target, data: data, value: totalValue / numCalls }); } // Unauthorized call From b6b1c1f88feb2f20ce9a5b183cfc4352722240b5 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 10 Jul 2025 10:32:11 +0300 Subject: [PATCH 51/79] lint --- test/solidity-ibc/ICS27AccountTest.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/solidity-ibc/ICS27AccountTest.t.sol b/test/solidity-ibc/ICS27AccountTest.t.sol index debcf2f9c..214add9ab 100644 --- a/test/solidity-ibc/ICS27AccountTest.t.sol +++ b/test/solidity-ibc/ICS27AccountTest.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.28; -// solhint-disable custom-errors,max-line-length +// solhint-disable custom-errors,max-line-length,no-inline-assembly import { Test } from "forge-std/Test.sol"; From 64c5b8ac85dbf49929f1046558f80b48c1b641f3 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 10 Jul 2025 17:02:45 +0300 Subject: [PATCH 52/79] test: adding new tests --- test/solidity-ibc/ICS27GMPTest.t.sol | 104 +++++++++++++++++++++++ test/solidity-ibc/Integration2Test.t.sol | 5 +- 2 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 test/solidity-ibc/ICS27GMPTest.t.sol diff --git a/test/solidity-ibc/ICS27GMPTest.t.sol b/test/solidity-ibc/ICS27GMPTest.t.sol new file mode 100644 index 000000000..04a08718a --- /dev/null +++ b/test/solidity-ibc/ICS27GMPTest.t.sol @@ -0,0 +1,104 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +// solhint-disable custom-errors,max-line-length,no-inline-assembly + +import { Test } from "forge-std/Test.sol"; + +import { IICS26RouterMsgs } from "../../contracts/msgs/IICS26RouterMsgs.sol"; +import { IICS27GMPMsgs } from "../../contracts/msgs/IICS27GMPMsgs.sol"; +import { IICS27AccountMsgs } from "../../contracts/msgs/IICS27AccountMsgs.sol"; +import { IICS27Errors } from "../../contracts/errors/IICS27Errors.sol"; + +import { IICS26Router } from "../../contracts/interfaces/IICS26Router.sol"; + +import { ERC1967Proxy } from "@openzeppelin-contracts/proxy/ERC1967/ERC1967Proxy.sol"; +import { ICS27Account } from "../../contracts/utils/ICS27Account.sol"; +import { Errors } from "@openzeppelin-contracts/utils/Errors.sol"; +import { ICS27GMP } from "../../contracts/ICS27GMP.sol"; +import { ICS27Lib } from "../../contracts/utils/ICS27Lib.sol"; +import { AccessManager } from "@openzeppelin-contracts/access/manager/AccessManager.sol"; +import { UpgradeableBeacon } from "@openzeppelin-contracts/proxy/beacon/UpgradeableBeacon.sol"; +import { TestHelper } from "./utils/TestHelper.sol"; +import { IntegrationEnv } from "./utils/IntegrationEnv.sol"; +import { Strings } from "@openzeppelin-contracts/utils/Strings.sol"; + +contract ICS27GMPTest is Test { + ICS27GMP public ics27Gmp; + AccessManager public accessManager; + + TestHelper public th = new TestHelper(); + IntegrationEnv public integrationEnv = new IntegrationEnv(); + + address public mockIcs26 = makeAddr("mockIcs26"); + + function setUp() public { + address ics27AccountLogic = address(new ICS27Account()); + address ics27GmpLogic = address(new ICS27GMP()); + + accessManager = new AccessManager(address(this)); + ERC1967Proxy proxy = new ERC1967Proxy( + ics27GmpLogic, abi.encodeCall(ICS27GMP.initialize, (mockIcs26, ics27AccountLogic, address(accessManager))) + ); + ics27Gmp = ICS27GMP(address(proxy)); + + assertEq(address(ics27Gmp.ics26()), mockIcs26, "ICS26 address mismatch"); + address accountBeacon = ics27Gmp.getAccountBeacon(); + + address implementation = UpgradeableBeacon(accountBeacon).implementation(); + assertEq(implementation, ics27AccountLogic, "Account beacon implementation mismatch"); + } + + function testFuzz_success_sendCall(uint16 saltLen, uint16 payloadLen, uint64 seq) public { + vm.assume(seq > 0); + + address sender = makeAddr("sender"); + bytes memory salt = vm.randomBytes(saltLen); + string memory receiver = th.randomString(); + string memory memo = th.randomString(); + bytes memory payload = vm.randomBytes(payloadLen); + + bytes memory expCall = abi.encodeCall( + IICS26Router.sendPacket, + ( + IICS26RouterMsgs.MsgSendPacket({ + sourceClient: th.FIRST_CLIENT_ID(), + timeoutTimestamp: th.DEFAULT_TIMEOUT_TIMESTAMP(), + payload: IICS26RouterMsgs.Payload({ + sourcePort: ICS27Lib.DEFAULT_PORT_ID, + destPort: ICS27Lib.DEFAULT_PORT_ID, + version: ICS27Lib.ICS27_VERSION, + encoding: ICS27Lib.ICS27_ENCODING, + value: abi.encode( + IICS27GMPMsgs.GMPPacketData({ + sender: Strings.toHexString(sender), + receiver: receiver, + salt: salt, + payload: payload, + memo: memo + }) + ) + }) + }) + ) + ); + + vm.mockCall(mockIcs26, expCall, abi.encode(seq)); + vm.expectCall(mockIcs26, expCall); + + vm.startPrank(sender); + uint64 sequence = ics27Gmp.sendCall( + IICS27GMPMsgs.SendCallMsg({ + receiver: receiver, + payload: payload, + salt: salt, + memo: memo, + timeoutTimestamp: th.DEFAULT_TIMEOUT_TIMESTAMP(), + sourceClient: th.FIRST_CLIENT_ID() + }) + ); + vm.stopPrank(); + + assertEq(sequence, seq, "Sequence mismatch"); + } +} diff --git a/test/solidity-ibc/Integration2Test.t.sol b/test/solidity-ibc/Integration2Test.t.sol index ddffff2ae..b61d0072f 100644 --- a/test/solidity-ibc/Integration2Test.t.sol +++ b/test/solidity-ibc/Integration2Test.t.sol @@ -30,12 +30,9 @@ contract Integration2Test is Test { IbcImpl public ibcImplB; TestHelper public th = new TestHelper(); - IntegrationEnv public integrationEnv; + IntegrationEnv public integrationEnv = new IntegrationEnv(); function setUp() public { - // Set up the environment - integrationEnv = new IntegrationEnv(); - // Deploy the IBC implementation ibcImplA = new IbcImpl(integrationEnv.permit2()); ibcImplB = new IbcImpl(integrationEnv.permit2()); From 4477923cd9643a31d78ec75bc81a03bc99bfb59b Mon Sep 17 00:00:00 2001 From: srdtrk Date: Wed, 20 Aug 2025 14:29:46 +0400 Subject: [PATCH 53/79] lint: fix linter complaints --- contracts/utils/ICS27Account.sol | 2 +- scripts/E2ETestDeploy.s.sol | 1 - test/solidity-ibc/ICS27AccountTest.t.sol | 6 +++--- test/solidity-ibc/ICS27GMPTest.t.sol | 8 ++++---- test/solidity-ibc/utils/IbcImpl.sol | 6 +++--- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/contracts/utils/ICS27Account.sol b/contracts/utils/ICS27Account.sol index d14f8ce42..e87f5ea32 100644 --- a/contracts/utils/ICS27Account.sol +++ b/contracts/utils/ICS27Account.sol @@ -63,7 +63,7 @@ contract ICS27Account is IICS27Errors, IICS27Account, ContextUpgradeable { /// @inheritdoc IICS27Account function executeBatch(IICS27AccountMsgs.Call[] calldata calls) external onlySelf returns (bytes[] memory) { bytes[] memory results = new bytes[](calls.length); - for (uint256 i = 0; i < calls.length; i++) { + for (uint256 i = 0; i < calls.length; ++i) { IICS27AccountMsgs.Call calldata call = calls[i]; results[i] = Address.functionCallWithValue(call.target, call.data, call.value); } diff --git a/scripts/E2ETestDeploy.s.sol b/scripts/E2ETestDeploy.s.sol index cfbd0076d..40c25b029 100644 --- a/scripts/E2ETestDeploy.s.sol +++ b/scripts/E2ETestDeploy.s.sol @@ -14,7 +14,6 @@ import { IICS07TendermintMsgs } from "../contracts/light-clients/msgs/IICS07Tend import { ICS26Router } from "../contracts/ICS26Router.sol"; import { ICS20Transfer } from "../contracts/ICS20Transfer.sol"; import { ICS27GMP } from "../contracts/ICS27GMP.sol"; -import { ICS26Router } from "../contracts/ICS26Router.sol"; import { TestERC20 } from "../test/solidity-ibc/mocks/TestERC20.sol"; import { Strings } from "@openzeppelin-contracts/utils/Strings.sol"; import { ICS20Lib } from "../contracts/utils/ICS20Lib.sol"; diff --git a/test/solidity-ibc/ICS27AccountTest.t.sol b/test/solidity-ibc/ICS27AccountTest.t.sol index 214add9ab..6c7630ae9 100644 --- a/test/solidity-ibc/ICS27AccountTest.t.sol +++ b/test/solidity-ibc/ICS27AccountTest.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.28; -// solhint-disable custom-errors,max-line-length,no-inline-assembly +// solhint-disable custom-errors,max-line-length,no-inline-assembly,gas-small-strings import { Test } from "forge-std/Test.sol"; @@ -166,7 +166,7 @@ contract ICS27AccountTest is Test { // Prepare calls IICS27AccountMsgs.Call[] memory calls = new IICS27AccountMsgs.Call[](numCalls); uint256 valuePerCall = totalValue / numCalls; - for (uint256 i = 0; i < numCalls; i++) { + for (uint256 i = 0; i < numCalls; ++i) { calls[i] = IICS27AccountMsgs.Call({ target: target, data: data, value: valuePerCall }); expResp[i] = abi.encode("mockedResponse"); @@ -197,7 +197,7 @@ contract ICS27AccountTest is Test { bytes memory data = abi.encodeCall(TestCallContract.payableCall, ()); IICS27AccountMsgs.Call[] memory calls = new IICS27AccountMsgs.Call[](numCalls); - for (uint256 i = 0; i < numCalls; i++) { + for (uint256 i = 0; i < numCalls; ++i) { calls[i] = IICS27AccountMsgs.Call({ target: target, data: data, value: totalValue / numCalls }); } diff --git a/test/solidity-ibc/ICS27GMPTest.t.sol b/test/solidity-ibc/ICS27GMPTest.t.sol index 04a08718a..2be4ad228 100644 --- a/test/solidity-ibc/ICS27GMPTest.t.sol +++ b/test/solidity-ibc/ICS27GMPTest.t.sol @@ -1,20 +1,20 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.28; -// solhint-disable custom-errors,max-line-length,no-inline-assembly +// solhint-disable custom-errors,max-line-length,no-inline-assembly,gas-small-strings import { Test } from "forge-std/Test.sol"; import { IICS26RouterMsgs } from "../../contracts/msgs/IICS26RouterMsgs.sol"; import { IICS27GMPMsgs } from "../../contracts/msgs/IICS27GMPMsgs.sol"; -import { IICS27AccountMsgs } from "../../contracts/msgs/IICS27AccountMsgs.sol"; -import { IICS27Errors } from "../../contracts/errors/IICS27Errors.sol"; +// import { IICS27AccountMsgs } from "../../contracts/msgs/IICS27AccountMsgs.sol"; +// import { IICS27Errors } from "../../contracts/errors/IICS27Errors.sol"; import { IICS26Router } from "../../contracts/interfaces/IICS26Router.sol"; import { ERC1967Proxy } from "@openzeppelin-contracts/proxy/ERC1967/ERC1967Proxy.sol"; import { ICS27Account } from "../../contracts/utils/ICS27Account.sol"; -import { Errors } from "@openzeppelin-contracts/utils/Errors.sol"; +// import { Errors } from "@openzeppelin-contracts/utils/Errors.sol"; import { ICS27GMP } from "../../contracts/ICS27GMP.sol"; import { ICS27Lib } from "../../contracts/utils/ICS27Lib.sol"; import { AccessManager } from "@openzeppelin-contracts/access/manager/AccessManager.sol"; diff --git a/test/solidity-ibc/utils/IbcImpl.sol b/test/solidity-ibc/utils/IbcImpl.sol index 28913ce5c..be871d0b5 100644 --- a/test/solidity-ibc/utils/IbcImpl.sol +++ b/test/solidity-ibc/utils/IbcImpl.sol @@ -236,7 +236,7 @@ contract IbcImpl is Test, DeployAccessManagerWithRoles { address sender, string calldata receiver, bytes calldata payload, - bytes memory salt + bytes calldata salt ) external returns (IICS26RouterMsgs.Packet memory) @@ -249,8 +249,8 @@ contract IbcImpl is Test, DeployAccessManagerWithRoles { address sender, string calldata receiver, bytes calldata payload, - bytes memory salt, - string memory memo + bytes calldata salt, + string calldata memo ) external returns (IICS26RouterMsgs.Packet memory) From ad81f52229c10c4f814d7f5431180fa6ff6a56c0 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 21 Aug 2025 12:16:17 +0400 Subject: [PATCH 54/79] test: successful recvPacket tests --- test/solidity-ibc/ICS27GMPTest.t.sol | 55 ++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/test/solidity-ibc/ICS27GMPTest.t.sol b/test/solidity-ibc/ICS27GMPTest.t.sol index 2be4ad228..3218ea188 100644 --- a/test/solidity-ibc/ICS27GMPTest.t.sol +++ b/test/solidity-ibc/ICS27GMPTest.t.sol @@ -7,6 +7,7 @@ import { Test } from "forge-std/Test.sol"; import { IICS26RouterMsgs } from "../../contracts/msgs/IICS26RouterMsgs.sol"; import { IICS27GMPMsgs } from "../../contracts/msgs/IICS27GMPMsgs.sol"; +import { IIBCAppCallbacks } from "../../contracts/msgs/IIBCAppCallbacks.sol"; // import { IICS27AccountMsgs } from "../../contracts/msgs/IICS27AccountMsgs.sol"; // import { IICS27Errors } from "../../contracts/errors/IICS27Errors.sol"; @@ -101,4 +102,58 @@ contract ICS27GMPTest is Test { assertEq(sequence, seq, "Sequence mismatch"); } + + function testFuzz_success_onRecvPacket(uint16 saltLen, uint16 payloadLen, uint64 seq) public { + vm.assume(seq > 0); + + address relayer = makeAddr("relayer"); + address receiver = makeAddr("receiver"); + bytes memory salt = vm.randomBytes(saltLen); + string memory sender = th.randomString(); + bytes memory payload = vm.randomBytes(payloadLen); + + bytes memory mockResp = bytes("mockResp"); + bytes memory expAck = ICS27Lib.acknowledgement(mockResp); + + vm.mockCall(receiver, payload, mockResp); + + IIBCAppCallbacks.OnRecvPacketCallback memory msg_ = IIBCAppCallbacks.OnRecvPacketCallback({ + sourceClient: th.FIRST_CLIENT_ID(), + destinationClient: th.SECOND_CLIENT_ID(), + sequence: seq, + payload: IICS26RouterMsgs.Payload({ + sourcePort: ICS27Lib.DEFAULT_PORT_ID, + destPort: ICS27Lib.DEFAULT_PORT_ID, + version: ICS27Lib.ICS27_VERSION, + encoding: ICS27Lib.ICS27_ENCODING, + value: abi.encode( + IICS27GMPMsgs.GMPPacketData({ + sender: sender, + receiver: Strings.toHexString(receiver), + salt: salt, + payload: payload, + memo: "" + }) + ) + }), + relayer: relayer + }); + + IICS27GMPMsgs.AccountIdentifier memory accountId = IICS27GMPMsgs.AccountIdentifier({ + clientId: msg_.destinationClient, + sender: sender, + salt: salt + }); + + address predeterminedAccount = ics27Gmp.getOrComputeAccountAddress(accountId); + assertTrue(predeterminedAccount != address(0), "Predetermined account address should not be zero"); + + vm.expectCall(receiver, payload); + vm.prank(mockIcs26); + bytes memory ack = ics27Gmp.onRecvPacket(msg_); + assertEq(ack, expAck, "Acknowledgement mismatch"); + + address actualAccount = ics27Gmp.getOrComputeAccountAddress(accountId); + assertEq(actualAccount, predeterminedAccount, "Account address mismatch"); + } } From 478e11f5b0d2ec8f75cf91be121a1428f0033849 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 21 Aug 2025 13:44:18 +0400 Subject: [PATCH 55/79] test: 'testFuzz_failure_onRecvPacket' added --- contracts/ICS27GMP.sol | 3 + contracts/errors/IICS27Errors.sol | 3 + test/solidity-ibc/ICS27GMPTest.t.sol | 119 +++++++++++++++++++++++++-- 3 files changed, 120 insertions(+), 5 deletions(-) diff --git a/contracts/ICS27GMP.sol b/contracts/ICS27GMP.sol index 8246bd763..2098f5189 100644 --- a/contracts/ICS27GMP.sol +++ b/contracts/ICS27GMP.sol @@ -80,6 +80,8 @@ contract ICS27GMP is /// @inheritdoc IICS27GMP function sendCall(IICS27GMPMsgs.SendCallMsg calldata msg_) external nonReentrant returns (uint64) { + require(msg_.payload.length != 0, ICS27PayloadEmpty()); + IICS27GMPMsgs.GMPPacketData memory packetData = IICS27GMPMsgs.GMPPacketData({ sender: Strings.toHexString(_msgSender()), receiver: msg_.receiver, @@ -128,6 +130,7 @@ contract ICS27GMP is ); IICS27GMPMsgs.GMPPacketData memory packetData = abi.decode(msg_.payload.value, (IICS27GMPMsgs.GMPPacketData)); + require(packetData.payload.length != 0, ICS27PayloadEmpty()); IICS27GMPMsgs.AccountIdentifier memory accountId = IICS27GMPMsgs.AccountIdentifier({ clientId: msg_.destinationClient, diff --git a/contracts/errors/IICS27Errors.sol b/contracts/errors/IICS27Errors.sol index 2d3efdc23..1599b7975 100644 --- a/contracts/errors/IICS27Errors.sol +++ b/contracts/errors/IICS27Errors.sol @@ -35,4 +35,7 @@ interface IICS27Errors { /// @notice Invalid sender /// @param sender The sender of the packet error ICS27InvalidSender(string sender); + + /// @notice Payload is empty + error ICS27PayloadEmpty(); } diff --git a/test/solidity-ibc/ICS27GMPTest.t.sol b/test/solidity-ibc/ICS27GMPTest.t.sol index 3218ea188..f025b52f3 100644 --- a/test/solidity-ibc/ICS27GMPTest.t.sol +++ b/test/solidity-ibc/ICS27GMPTest.t.sol @@ -8,14 +8,12 @@ import { Test } from "forge-std/Test.sol"; import { IICS26RouterMsgs } from "../../contracts/msgs/IICS26RouterMsgs.sol"; import { IICS27GMPMsgs } from "../../contracts/msgs/IICS27GMPMsgs.sol"; import { IIBCAppCallbacks } from "../../contracts/msgs/IIBCAppCallbacks.sol"; -// import { IICS27AccountMsgs } from "../../contracts/msgs/IICS27AccountMsgs.sol"; -// import { IICS27Errors } from "../../contracts/errors/IICS27Errors.sol"; +import { IICS27Errors } from "../../contracts/errors/IICS27Errors.sol"; import { IICS26Router } from "../../contracts/interfaces/IICS26Router.sol"; import { ERC1967Proxy } from "@openzeppelin-contracts/proxy/ERC1967/ERC1967Proxy.sol"; import { ICS27Account } from "../../contracts/utils/ICS27Account.sol"; -// import { Errors } from "@openzeppelin-contracts/utils/Errors.sol"; import { ICS27GMP } from "../../contracts/ICS27GMP.sol"; import { ICS27Lib } from "../../contracts/utils/ICS27Lib.sol"; import { AccessManager } from "@openzeppelin-contracts/access/manager/AccessManager.sol"; @@ -104,12 +102,13 @@ contract ICS27GMPTest is Test { } function testFuzz_success_onRecvPacket(uint16 saltLen, uint16 payloadLen, uint64 seq) public { - vm.assume(seq > 0); + vm.assume(seq > 0 && payloadLen > 0); address relayer = makeAddr("relayer"); address receiver = makeAddr("receiver"); bytes memory salt = vm.randomBytes(saltLen); string memory sender = th.randomString(); + string memory memo = th.randomString(); bytes memory payload = vm.randomBytes(payloadLen); bytes memory mockResp = bytes("mockResp"); @@ -132,7 +131,7 @@ contract ICS27GMPTest is Test { receiver: Strings.toHexString(receiver), salt: salt, payload: payload, - memo: "" + memo: memo }) ) }), @@ -156,4 +155,114 @@ contract ICS27GMPTest is Test { address actualAccount = ics27Gmp.getOrComputeAccountAddress(accountId); assertEq(actualAccount, predeterminedAccount, "Account address mismatch"); } + + function testFuzz_failure_onRecvPacket(uint16 saltLen, uint16 payloadLen, uint64 seq) public { + vm.assume(seq > 0 && payloadLen > 0); + + address relayer = makeAddr("relayer"); + address receiver = makeAddr("receiver"); + bytes memory salt = vm.randomBytes(saltLen); + string memory sender = th.randomString(); + + bytes memory errPayload = bytes("errPayload"); + bytes memory mockErr = bytes("mockErr"); + + bytes memory payload = vm.randomBytes(payloadLen); + bytes memory mockResp = bytes("mockResp"); + + vm.mockCallRevert(receiver, errPayload, mockErr); + vm.mockCall(receiver, payload, mockResp); + + IIBCAppCallbacks.OnRecvPacketCallback memory msg_ = IIBCAppCallbacks.OnRecvPacketCallback({ + sourceClient: th.FIRST_CLIENT_ID(), + destinationClient: th.SECOND_CLIENT_ID(), + sequence: seq, + payload: IICS26RouterMsgs.Payload({ + sourcePort: ICS27Lib.DEFAULT_PORT_ID, + destPort: ICS27Lib.DEFAULT_PORT_ID, + version: ICS27Lib.ICS27_VERSION, + encoding: ICS27Lib.ICS27_ENCODING, + value: abi.encode( + IICS27GMPMsgs.GMPPacketData({ + sender: sender, + receiver: Strings.toHexString(receiver), + salt: salt, + payload: payload, + memo: "" + }) + ) + }), + relayer: relayer + }); + + // ===== Case 1: Incorrect Source Port ===== + msg_.payload.sourcePort = th.INVALID_ID(); + vm.expectRevert(abi.encodeWithSelector(IICS27Errors.ICS27InvalidPort.selector, ICS27Lib.DEFAULT_PORT_ID, msg_.payload.sourcePort)); + vm.prank(mockIcs26); + ics27Gmp.onRecvPacket(msg_); + msg_.payload.sourcePort = ICS27Lib.DEFAULT_PORT_ID; + + // ===== Case 2: Incorrect Dest Port ===== + msg_.payload.destPort = th.INVALID_ID(); + vm.expectRevert(abi.encodeWithSelector(IICS27Errors.ICS27InvalidPort.selector, ICS27Lib.DEFAULT_PORT_ID, msg_.payload.destPort)); + vm.prank(mockIcs26); + ics27Gmp.onRecvPacket(msg_); + msg_.payload.destPort = ICS27Lib.DEFAULT_PORT_ID; + + // ===== Case 3: Incorrect Version ===== + msg_.payload.version = th.INVALID_ID(); + vm.expectRevert(abi.encodeWithSelector(IICS27Errors.ICS27UnexpectedVersion.selector, ICS27Lib.ICS27_VERSION, msg_.payload.version)); + vm.prank(mockIcs26); + ics27Gmp.onRecvPacket(msg_); + msg_.payload.version = ICS27Lib.ICS27_VERSION; + + // ===== Case 4: Incorrect Encoding ===== + msg_.payload.encoding = th.INVALID_ID(); + vm.expectRevert(abi.encodeWithSelector(IICS27Errors.ICS27UnexpectedEncoding.selector, ICS27Lib.ICS27_ENCODING, msg_.payload.encoding)); + vm.prank(mockIcs26); + ics27Gmp.onRecvPacket(msg_); + msg_.payload.encoding = ICS27Lib.ICS27_ENCODING; + + // ===== Case 5: Empty Payload ===== + msg_.payload.value = abi.encode( + IICS27GMPMsgs.GMPPacketData({ + sender: sender, + receiver: Strings.toHexString(receiver), + salt: salt, + payload: bytes(""), + memo: "" + }) + ); + vm.expectRevert(IICS27Errors.ICS27PayloadEmpty.selector); + vm.prank(mockIcs26); + ics27Gmp.onRecvPacket(msg_); + + // ===== Case 6: Call reverts with the mock error ===== + msg_.payload.value = abi.encode( + IICS27GMPMsgs.GMPPacketData({ + sender: sender, + receiver: Strings.toHexString(receiver), + salt: salt, + payload: errPayload, + memo: "" + }) + ); + vm.prank(mockIcs26); + vm.expectRevert(); + ics27Gmp.onRecvPacket(msg_); + + // ===== Case 7: Invalid Receiver ===== + msg_.payload.value = abi.encode( + IICS27GMPMsgs.GMPPacketData({ + sender: sender, + receiver: th.INVALID_ID(), + salt: salt, + payload: payload, + memo: "" + }) + ); + vm.expectRevert(abi.encodeWithSelector(IICS27Errors.ICS27InvalidReceiver.selector, th.INVALID_ID())); + vm.prank(mockIcs26); + ics27Gmp.onRecvPacket(msg_); + } } From 19025e12d94ba2304d2acdb980027ffa6adcb553 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 21 Aug 2025 13:45:41 +0400 Subject: [PATCH 56/79] lint: forge fmt --- test/solidity-ibc/ICS27GMPTest.t.sol | 31 ++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/test/solidity-ibc/ICS27GMPTest.t.sol b/test/solidity-ibc/ICS27GMPTest.t.sol index f025b52f3..b99a09d35 100644 --- a/test/solidity-ibc/ICS27GMPTest.t.sol +++ b/test/solidity-ibc/ICS27GMPTest.t.sol @@ -138,11 +138,8 @@ contract ICS27GMPTest is Test { relayer: relayer }); - IICS27GMPMsgs.AccountIdentifier memory accountId = IICS27GMPMsgs.AccountIdentifier({ - clientId: msg_.destinationClient, - sender: sender, - salt: salt - }); + IICS27GMPMsgs.AccountIdentifier memory accountId = + IICS27GMPMsgs.AccountIdentifier({ clientId: msg_.destinationClient, sender: sender, salt: salt }); address predeterminedAccount = ics27Gmp.getOrComputeAccountAddress(accountId); assertTrue(predeterminedAccount != address(0), "Predetermined account address should not be zero"); @@ -197,28 +194,44 @@ contract ICS27GMPTest is Test { // ===== Case 1: Incorrect Source Port ===== msg_.payload.sourcePort = th.INVALID_ID(); - vm.expectRevert(abi.encodeWithSelector(IICS27Errors.ICS27InvalidPort.selector, ICS27Lib.DEFAULT_PORT_ID, msg_.payload.sourcePort)); + vm.expectRevert( + abi.encodeWithSelector( + IICS27Errors.ICS27InvalidPort.selector, ICS27Lib.DEFAULT_PORT_ID, msg_.payload.sourcePort + ) + ); vm.prank(mockIcs26); ics27Gmp.onRecvPacket(msg_); msg_.payload.sourcePort = ICS27Lib.DEFAULT_PORT_ID; // ===== Case 2: Incorrect Dest Port ===== msg_.payload.destPort = th.INVALID_ID(); - vm.expectRevert(abi.encodeWithSelector(IICS27Errors.ICS27InvalidPort.selector, ICS27Lib.DEFAULT_PORT_ID, msg_.payload.destPort)); + vm.expectRevert( + abi.encodeWithSelector( + IICS27Errors.ICS27InvalidPort.selector, ICS27Lib.DEFAULT_PORT_ID, msg_.payload.destPort + ) + ); vm.prank(mockIcs26); ics27Gmp.onRecvPacket(msg_); msg_.payload.destPort = ICS27Lib.DEFAULT_PORT_ID; // ===== Case 3: Incorrect Version ===== msg_.payload.version = th.INVALID_ID(); - vm.expectRevert(abi.encodeWithSelector(IICS27Errors.ICS27UnexpectedVersion.selector, ICS27Lib.ICS27_VERSION, msg_.payload.version)); + vm.expectRevert( + abi.encodeWithSelector( + IICS27Errors.ICS27UnexpectedVersion.selector, ICS27Lib.ICS27_VERSION, msg_.payload.version + ) + ); vm.prank(mockIcs26); ics27Gmp.onRecvPacket(msg_); msg_.payload.version = ICS27Lib.ICS27_VERSION; // ===== Case 4: Incorrect Encoding ===== msg_.payload.encoding = th.INVALID_ID(); - vm.expectRevert(abi.encodeWithSelector(IICS27Errors.ICS27UnexpectedEncoding.selector, ICS27Lib.ICS27_ENCODING, msg_.payload.encoding)); + vm.expectRevert( + abi.encodeWithSelector( + IICS27Errors.ICS27UnexpectedEncoding.selector, ICS27Lib.ICS27_ENCODING, msg_.payload.encoding + ) + ); vm.prank(mockIcs26); ics27Gmp.onRecvPacket(msg_); msg_.payload.encoding = ICS27Lib.ICS27_ENCODING; From 451247c5aac84ffee7faa6af150c32acaca0424d Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 21 Aug 2025 13:48:28 +0400 Subject: [PATCH 57/79] lint: ignore --- test/solidity-ibc/ICS27GMPTest.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/solidity-ibc/ICS27GMPTest.t.sol b/test/solidity-ibc/ICS27GMPTest.t.sol index b99a09d35..7d9e87239 100644 --- a/test/solidity-ibc/ICS27GMPTest.t.sol +++ b/test/solidity-ibc/ICS27GMPTest.t.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.28; -// solhint-disable custom-errors,max-line-length,no-inline-assembly,gas-small-strings +// solhint-disable custom-errors,max-line-length,no-inline-assembly,gas-small-strings,function-max-lines import { Test } from "forge-std/Test.sol"; From 93e85a8ec5b11f52f8eac9b11efbfff9820538c5 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Tue, 26 Aug 2025 18:16:51 +0400 Subject: [PATCH 58/79] test: fix --- test/solidity-ibc/ICS27GMPTest.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/solidity-ibc/ICS27GMPTest.t.sol b/test/solidity-ibc/ICS27GMPTest.t.sol index 7d9e87239..0e003f5a8 100644 --- a/test/solidity-ibc/ICS27GMPTest.t.sol +++ b/test/solidity-ibc/ICS27GMPTest.t.sol @@ -49,7 +49,7 @@ contract ICS27GMPTest is Test { } function testFuzz_success_sendCall(uint16 saltLen, uint16 payloadLen, uint64 seq) public { - vm.assume(seq > 0); + vm.assume(payloadLen > 0 && seq > 0); address sender = makeAddr("sender"); bytes memory salt = vm.randomBytes(saltLen); From 32c340b64b78032414c314393812b82c01a13c1c Mon Sep 17 00:00:00 2001 From: srdtrk Date: Tue, 26 Aug 2025 18:18:11 +0400 Subject: [PATCH 59/79] chore: regen abi --- abi/ICS27Account.json | 5 +++++ abi/ICS27GMP.json | 5 +++++ packages/go-abigen/ics27account/contract.go | 2 +- packages/go-abigen/ics27gmp/contract.go | 2 +- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/abi/ICS27Account.json b/abi/ICS27Account.json index 3b40ac8a6..e0c5e1bff 100644 --- a/abi/ICS27Account.json +++ b/abi/ICS27Account.json @@ -239,6 +239,11 @@ } ] }, + { + "type": "error", + "name": "ICS27PayloadEmpty", + "inputs": [] + }, { "type": "error", "name": "ICS27Unauthorized", diff --git a/abi/ICS27GMP.json b/abi/ICS27GMP.json index d08f74cc0..f636f597c 100644 --- a/abi/ICS27GMP.json +++ b/abi/ICS27GMP.json @@ -635,6 +635,11 @@ } ] }, + { + "type": "error", + "name": "ICS27PayloadEmpty", + "inputs": [] + }, { "type": "error", "name": "ICS27Unauthorized", diff --git a/packages/go-abigen/ics27account/contract.go b/packages/go-abigen/ics27account/contract.go index 1461f0881..67d48e4b7 100644 --- a/packages/go-abigen/ics27account/contract.go +++ b/packages/go-abigen/ics27account/contract.go @@ -38,7 +38,7 @@ type IICS27AccountMsgsCall struct { // ContractMetaData contains all meta data concerning the Contract contract. var ContractMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateExecute\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"execute\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"executeBatch\",\"inputs\":[{\"name\":\"calls\",\"type\":\"tuple[]\",\"internalType\":\"structIICS27AccountMsgs.Call[]\",\"components\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"functionCall\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ics27\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"ics27_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendValue\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS27InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidPort\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidSender\",\"inputs\":[{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27Unauthorized\",\"inputs\":[{\"name\":\"expected\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedEncoding\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"InsufficientBalance\",\"inputs\":[{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateExecute\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"execute\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"executeBatch\",\"inputs\":[{\"name\":\"calls\",\"type\":\"tuple[]\",\"internalType\":\"structIICS27AccountMsgs.Call[]\",\"components\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"functionCall\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ics27\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"ics27_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendValue\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"addresspayable\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS27InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidPort\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidSender\",\"inputs\":[{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27PayloadEmpty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS27Unauthorized\",\"inputs\":[{\"name\":\"expected\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedEncoding\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"InsufficientBalance\",\"inputs\":[{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]}]", } // ContractABI is the input ABI used to generate the binding from. diff --git a/packages/go-abigen/ics27gmp/contract.go b/packages/go-abigen/ics27gmp/contract.go index 939a9eefc..7b80a8fd8 100644 --- a/packages/go-abigen/ics27gmp/contract.go +++ b/packages/go-abigen/ics27gmp/contract.go @@ -85,7 +85,7 @@ type IICS27GMPMsgsSendCallMsg struct { // ContractMetaData contains all meta data concerning the Contract contract. var ContractMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"authority\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccountBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOrComputeAccountAddress\",\"inputs\":[{\"name\":\"accountId\",\"type\":\"tuple\",\"internalType\":\"structIICS27GMPMsgs.AccountIdentifier\",\"components\":[{\"name\":\"clientId\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"salt\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ics26\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"ics26_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accountLogic\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"authority\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isConsumingScheduledOp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"multicall\",\"inputs\":[{\"name\":\"data\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[{\"name\":\"results\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onAcknowledgementPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnAcknowledgementPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"acknowledgement\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onRecvPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnRecvPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sendCall\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS27GMPMsgs.SendCallMsg\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"salt\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAuthority\",\"inputs\":[{\"name\":\"newAuthority\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeAccountTo\",\"inputs\":[{\"name\":\"newEscrowLogic\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AuthorityUpdated\",\"inputs\":[{\"name\":\"authority\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AccessManagedInvalidAuthority\",\"inputs\":[{\"name\":\"authority\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AccessManagedRequiredDelay\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"AccessManagedUnauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Create2EmptyBytecode\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedDeployment\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS27InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidPort\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidSender\",\"inputs\":[{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27Unauthorized\",\"inputs\":[{\"name\":\"expected\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedEncoding\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"InsufficientBalance\",\"inputs\":[{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"authority\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAccountBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOrComputeAccountAddress\",\"inputs\":[{\"name\":\"accountId\",\"type\":\"tuple\",\"internalType\":\"structIICS27GMPMsgs.AccountIdentifier\",\"components\":[{\"name\":\"clientId\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"salt\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ics26\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"ics26_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"accountLogic\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"authority\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isConsumingScheduledOp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"multicall\",\"inputs\":[{\"name\":\"data\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[{\"name\":\"results\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onAcknowledgementPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnAcknowledgementPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"acknowledgement\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onRecvPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnRecvPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sequence\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payload\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Payload\",\"components\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"encoding\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"value\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"relayer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sendCall\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS27GMPMsgs.SendCallMsg\",\"components\":[{\"name\":\"sourceClient\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"salt\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"payload\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAuthority\",\"inputs\":[{\"name\":\"newAuthority\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeAccountTo\",\"inputs\":[{\"name\":\"newEscrowLogic\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AuthorityUpdated\",\"inputs\":[{\"name\":\"authority\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AccessManagedInvalidAuthority\",\"inputs\":[{\"name\":\"authority\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AccessManagedRequiredDelay\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"AccessManagedUnauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Create2EmptyBytecode\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedDeployment\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS27InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidPort\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27InvalidSender\",\"inputs\":[{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27PayloadEmpty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS27Unauthorized\",\"inputs\":[{\"name\":\"expected\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedEncoding\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS27UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"InsufficientBalance\",\"inputs\":[{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"needed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", } // ContractABI is the input ABI used to generate the binding from. From 067c46222d48e4ca06097f427aa8f2356956d6f6 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Wed, 27 Aug 2025 14:31:13 +0400 Subject: [PATCH 60/79] test: more test cases --- test/solidity-ibc/ICS27GMPTest.t.sol | 68 ++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/test/solidity-ibc/ICS27GMPTest.t.sol b/test/solidity-ibc/ICS27GMPTest.t.sol index 0e003f5a8..a5fd16c07 100644 --- a/test/solidity-ibc/ICS27GMPTest.t.sol +++ b/test/solidity-ibc/ICS27GMPTest.t.sol @@ -101,6 +101,74 @@ contract ICS27GMPTest is Test { assertEq(sequence, seq, "Sequence mismatch"); } + function test_failure_sendCall() public { + address sender = makeAddr("sender"); + bytes memory salt = vm.randomBytes(16); + string memory receiver = th.randomString(); + string memory memo = th.randomString(); + bytes memory payload = vm.randomBytes(16); + uint64 seq = uint64(vm.randomUint(1, type(uint64).max)); + + bytes memory expCall = abi.encodeCall( + IICS26Router.sendPacket, + ( + IICS26RouterMsgs.MsgSendPacket({ + sourceClient: th.FIRST_CLIENT_ID(), + timeoutTimestamp: th.DEFAULT_TIMEOUT_TIMESTAMP(), + payload: IICS26RouterMsgs.Payload({ + sourcePort: ICS27Lib.DEFAULT_PORT_ID, + destPort: ICS27Lib.DEFAULT_PORT_ID, + version: ICS27Lib.ICS27_VERSION, + encoding: ICS27Lib.ICS27_ENCODING, + value: abi.encode( + IICS27GMPMsgs.GMPPacketData({ + sender: Strings.toHexString(sender), + receiver: receiver, + salt: salt, + payload: payload, + memo: memo + }) + ) + }) + }) + ) + ); + + uint64 defaultTimeoutTimestamp = th.DEFAULT_TIMEOUT_TIMESTAMP(); + string memory defaultClientId = th.FIRST_CLIENT_ID(); + + vm.startPrank(sender); + // ===== Case 1: Empty Payload ===== + vm.expectRevert(IICS27Errors.ICS27PayloadEmpty.selector); + ics27Gmp.sendCall( + IICS27GMPMsgs.SendCallMsg({ + receiver: receiver, + payload: "", + salt: salt, + memo: memo, + timeoutTimestamp: defaultTimeoutTimestamp, + sourceClient: defaultClientId + }) + ); + + // ===== Case 2: Router call reverts ===== + bytes memory mockErr = bytes("mockErr"); + vm.mockCallRevert(mockIcs26, expCall, mockErr); + vm.expectRevert(mockErr); + ics27Gmp.sendCall( + IICS27GMPMsgs.SendCallMsg({ + receiver: receiver, + payload: payload, + salt: salt, + memo: memo, + timeoutTimestamp: defaultTimeoutTimestamp, + sourceClient: defaultClientId + }) + ); + + vm.stopPrank(); + } + function testFuzz_success_onRecvPacket(uint16 saltLen, uint16 payloadLen, uint64 seq) public { vm.assume(seq > 0 && payloadLen > 0); From b9c7230d96da705825c93252d9e907d755cba47c Mon Sep 17 00:00:00 2001 From: srdtrk Date: Wed, 27 Aug 2025 15:41:05 +0400 Subject: [PATCH 61/79] test: added onAck success --- test/solidity-ibc/ICS27GMPTest.t.sol | 47 +++++++++++++++++++++++++- test/solidity-ibc/utils/TestHelper.sol | 2 +- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/test/solidity-ibc/ICS27GMPTest.t.sol b/test/solidity-ibc/ICS27GMPTest.t.sol index a5fd16c07..1b59cd6f3 100644 --- a/test/solidity-ibc/ICS27GMPTest.t.sol +++ b/test/solidity-ibc/ICS27GMPTest.t.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.28; // solhint-disable custom-errors,max-line-length,no-inline-assembly,gas-small-strings,function-max-lines +import "forge-std/console2.sol"; import { Test } from "forge-std/Test.sol"; import { IICS26RouterMsgs } from "../../contracts/msgs/IICS26RouterMsgs.sol"; @@ -16,6 +17,7 @@ import { ERC1967Proxy } from "@openzeppelin-contracts/proxy/ERC1967/ERC1967Proxy import { ICS27Account } from "../../contracts/utils/ICS27Account.sol"; import { ICS27GMP } from "../../contracts/ICS27GMP.sol"; import { ICS27Lib } from "../../contracts/utils/ICS27Lib.sol"; +import { ICS24Host } from "../../contracts/utils/ICS24Host.sol"; import { AccessManager } from "@openzeppelin-contracts/access/manager/AccessManager.sol"; import { UpgradeableBeacon } from "@openzeppelin-contracts/proxy/beacon/UpgradeableBeacon.sol"; import { TestHelper } from "./utils/TestHelper.sol"; @@ -107,7 +109,6 @@ contract ICS27GMPTest is Test { string memory receiver = th.randomString(); string memory memo = th.randomString(); bytes memory payload = vm.randomBytes(16); - uint64 seq = uint64(vm.randomUint(1, type(uint64).max)); bytes memory expCall = abi.encodeCall( IICS26Router.sendPacket, @@ -346,4 +347,48 @@ contract ICS27GMPTest is Test { vm.prank(mockIcs26); ics27Gmp.onRecvPacket(msg_); } + + function testFuzz_success_onAcknowledgementPacket(uint16 payloadLen, uint16 ackLen, uint16 saltLen, uint64 seq) public { + vm.assume(payloadLen > 0); + + address relayer = makeAddr("relayer"); + bytes memory payload = vm.randomBytes(payloadLen); + bytes memory ack = vm.randomBytes(ackLen); + bytes memory salt = vm.randomBytes(saltLen); + string memory memo = th.randomString(); + address sender = makeAddr("sender"); + string memory receiver = th.randomString(); + + // ===== Case 1: Random Acknowledgement ===== + IIBCAppCallbacks.OnAcknowledgementPacketCallback memory msg_ = IIBCAppCallbacks.OnAcknowledgementPacketCallback({ + sourceClient: th.FIRST_CLIENT_ID(), + destinationClient: th.SECOND_CLIENT_ID(), + sequence: seq, + payload: IICS26RouterMsgs.Payload({ + sourcePort: ICS27Lib.DEFAULT_PORT_ID, + destPort: ICS27Lib.DEFAULT_PORT_ID, + version: ICS27Lib.ICS27_VERSION, + encoding: ICS27Lib.ICS27_ENCODING, + value: abi.encode( + IICS27GMPMsgs.GMPPacketData({ + sender: Strings.toHexString(sender), + receiver: receiver, + salt: salt, + payload: payload, + memo: memo + }) + ) + }), + acknowledgement: ack, + relayer: relayer + }); + + vm.prank(mockIcs26); + ics27Gmp.onAcknowledgementPacket(msg_); + + // ===== Case 2: Error Acknowledgement ===== + msg_.acknowledgement = ICS24Host.UNIVERSAL_ERROR_ACK; + vm.prank(mockIcs26); + ics27Gmp.onAcknowledgementPacket(msg_); + } } diff --git a/test/solidity-ibc/utils/TestHelper.sol b/test/solidity-ibc/utils/TestHelper.sol index f206c4ba4..ab4e088e8 100644 --- a/test/solidity-ibc/utils/TestHelper.sol +++ b/test/solidity-ibc/utils/TestHelper.sol @@ -54,7 +54,7 @@ contract TestHelper is Test { } /// @dev retuns a random base64 string - function randomString() public returns (string memory) { + function randomString() public view returns (string memory) { uint256 randomNum = vm.randomUint(); return vm.toBase64(abi.encodePacked(randomNum)); } From bbc3fc95140d2ebd58ab657227a1f42af94ec5a6 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 28 Aug 2025 01:31:58 +0400 Subject: [PATCH 62/79] imp: added failure case --- test/solidity-ibc/ICS27GMPTest.t.sol | 57 ++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/test/solidity-ibc/ICS27GMPTest.t.sol b/test/solidity-ibc/ICS27GMPTest.t.sol index 1b59cd6f3..03dcfaa86 100644 --- a/test/solidity-ibc/ICS27GMPTest.t.sol +++ b/test/solidity-ibc/ICS27GMPTest.t.sol @@ -391,4 +391,61 @@ contract ICS27GMPTest is Test { vm.prank(mockIcs26); ics27Gmp.onAcknowledgementPacket(msg_); } + + function testFuzz_failure_onAcknowledgementPacket(uint16 payloadLen, uint16 ackLen, uint16 saltLen, uint64 seq) public { + vm.assume(payloadLen > 0); + + address relayer = makeAddr("relayer"); + bytes memory payload = vm.randomBytes(payloadLen); + bytes memory ack = vm.randomBytes(ackLen); + bytes memory salt = vm.randomBytes(saltLen); + string memory memo = th.randomString(); + address sender = makeAddr("sender"); + string memory receiver = th.randomString(); + + bytes memory validValue = abi.encode( + IICS27GMPMsgs.GMPPacketData({ + sender: Strings.toHexString(sender), + receiver: receiver, + salt: salt, + payload: payload, + memo: memo + }) + ); + + IIBCAppCallbacks.OnAcknowledgementPacketCallback memory msg_ = IIBCAppCallbacks.OnAcknowledgementPacketCallback({ + sourceClient: th.FIRST_CLIENT_ID(), + destinationClient: th.SECOND_CLIENT_ID(), + sequence: seq, + payload: IICS26RouterMsgs.Payload({ + sourcePort: ICS27Lib.DEFAULT_PORT_ID, + destPort: ICS27Lib.DEFAULT_PORT_ID, + version: ICS27Lib.ICS27_VERSION, + encoding: ICS27Lib.ICS27_ENCODING, + value: validValue + }), + acknowledgement: ack, + relayer: relayer + }); + + // ===== Case 1: Invalid Payload Value ===== + msg_.payload.value = bytes("invalid"); + vm.prank(mockIcs26); + vm.expectRevert(); + ics27Gmp.onAcknowledgementPacket(msg_); + + // ===== Case 2: Invalid Sender ===== + msg_.payload.value = abi.encode( + IICS27GMPMsgs.GMPPacketData({ + sender: th.INVALID_ID(), + receiver: receiver, + salt: salt, + payload: payload, + memo: memo + }) + ); + vm.expectRevert(abi.encodeWithSelector(IICS27Errors.ICS27InvalidSender.selector, th.INVALID_ID())); + vm.prank(mockIcs26); + ics27Gmp.onAcknowledgementPacket(msg_); + } } From 3c5dc1123b34e308b80d7ab90ade4acbfcc52f5b Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 28 Aug 2025 01:39:37 +0400 Subject: [PATCH 63/79] test: add testFuzz_success_onTimeoutPacket --- test/solidity-ibc/ICS27GMPTest.t.sol | 36 ++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/test/solidity-ibc/ICS27GMPTest.t.sol b/test/solidity-ibc/ICS27GMPTest.t.sol index 03dcfaa86..6b332d99a 100644 --- a/test/solidity-ibc/ICS27GMPTest.t.sol +++ b/test/solidity-ibc/ICS27GMPTest.t.sol @@ -448,4 +448,40 @@ contract ICS27GMPTest is Test { vm.prank(mockIcs26); ics27Gmp.onAcknowledgementPacket(msg_); } + + function testFuzz_success_onTimeoutPacket(uint16 payloadLen, uint16 saltLen, uint64 seq) public { + vm.assume(payloadLen > 0); + + address relayer = makeAddr("relayer"); + bytes memory payload = vm.randomBytes(payloadLen); + bytes memory salt = vm.randomBytes(saltLen); + string memory memo = th.randomString(); + address sender = makeAddr("sender"); + string memory receiver = th.randomString(); + + IIBCAppCallbacks.OnTimeoutPacketCallback memory msg_ = IIBCAppCallbacks.OnTimeoutPacketCallback({ + sourceClient: th.FIRST_CLIENT_ID(), + destinationClient: th.SECOND_CLIENT_ID(), + sequence: seq, + payload: IICS26RouterMsgs.Payload({ + sourcePort: ICS27Lib.DEFAULT_PORT_ID, + destPort: ICS27Lib.DEFAULT_PORT_ID, + version: ICS27Lib.ICS27_VERSION, + encoding: ICS27Lib.ICS27_ENCODING, + value: abi.encode( + IICS27GMPMsgs.GMPPacketData({ + sender: Strings.toHexString(sender), + receiver: receiver, + salt: salt, + payload: payload, + memo: memo + }) + ) + }), + relayer: relayer + }); + + vm.prank(mockIcs26); + ics27Gmp.onTimeoutPacket(msg_); + } } From 4bf4d8632bec6a6b6169b38a35d058fb8a3709ab Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 28 Aug 2025 01:52:53 +0400 Subject: [PATCH 64/79] test: testFuzz_failure_onTimeoutPacket --- test/solidity-ibc/ICS27GMPTest.t.sol | 56 ++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/test/solidity-ibc/ICS27GMPTest.t.sol b/test/solidity-ibc/ICS27GMPTest.t.sol index 6b332d99a..959f57ebd 100644 --- a/test/solidity-ibc/ICS27GMPTest.t.sol +++ b/test/solidity-ibc/ICS27GMPTest.t.sol @@ -484,4 +484,60 @@ contract ICS27GMPTest is Test { vm.prank(mockIcs26); ics27Gmp.onTimeoutPacket(msg_); } + + function testFuzz_failure_onTimeoutPacket(uint16 payloadLen, uint16 saltLen, uint64 seq) public { + vm.assume(payloadLen > 0); + + address relayer = makeAddr("relayer"); + bytes memory payload = vm.randomBytes(payloadLen); + bytes memory salt = vm.randomBytes(saltLen); + string memory memo = th.randomString(); + address sender = makeAddr("sender"); + string memory receiver = th.randomString(); + + IIBCAppCallbacks.OnTimeoutPacketCallback memory msg_ = IIBCAppCallbacks.OnTimeoutPacketCallback({ + sourceClient: th.FIRST_CLIENT_ID(), + destinationClient: th.SECOND_CLIENT_ID(), + sequence: seq, + payload: IICS26RouterMsgs.Payload({ + sourcePort: ICS27Lib.DEFAULT_PORT_ID, + destPort: ICS27Lib.DEFAULT_PORT_ID, + version: ICS27Lib.ICS27_VERSION, + encoding: ICS27Lib.ICS27_ENCODING, + value: abi.encode( + IICS27GMPMsgs.GMPPacketData({ + sender: Strings.toHexString(sender), + receiver: receiver, + salt: salt, + payload: payload, + memo: memo + }) + ) + }), + relayer: relayer + }); + + vm.prank(mockIcs26); + ics27Gmp.onTimeoutPacket(msg_); + + // ===== Case 1: Invalid Payload Value ===== + msg_.payload.value = bytes("invalid"); + vm.prank(mockIcs26); + vm.expectRevert(); + ics27Gmp.onTimeoutPacket(msg_); + + // ===== Case 2: Invalid Sender ===== + msg_.payload.value = abi.encode( + IICS27GMPMsgs.GMPPacketData({ + sender: th.INVALID_ID(), + receiver: receiver, + salt: salt, + payload: payload, + memo: memo + }) + ); + vm.expectRevert(abi.encodeWithSelector(IICS27Errors.ICS27InvalidSender.selector, th.INVALID_ID())); + vm.prank(mockIcs26); + ics27Gmp.onTimeoutPacket(msg_); + } } From f343f1ec5a029ef284f39a2e398730fc367cca90 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 28 Aug 2025 11:25:03 +0400 Subject: [PATCH 65/79] test: ics27 upgrade test --- test/solidity-ibc/IBCAdminTest.t.sol | 37 ++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/test/solidity-ibc/IBCAdminTest.t.sol b/test/solidity-ibc/IBCAdminTest.t.sol index ce3c6499e..84b21f985 100644 --- a/test/solidity-ibc/IBCAdminTest.t.sol +++ b/test/solidity-ibc/IBCAdminTest.t.sol @@ -14,6 +14,9 @@ import { IAccessManaged } from "@openzeppelin-contracts/access/manager/IAccessMa import { ICS26Router } from "../../contracts/ICS26Router.sol"; import { ICS20Transfer } from "../../contracts/ICS20Transfer.sol"; import { ICS20Lib } from "../../contracts/utils/ICS20Lib.sol"; +import { ICS27GMP } from "../../contracts/ICS27GMP.sol"; +import { ICS27Account } from "../../contracts/utils/ICS27Account.sol"; +import { ICS27Lib } from "../../contracts/utils/ICS27Lib.sol"; import { DummyLightClient } from "./mocks/DummyLightClient.sol"; import { DummyInitializable, ErroneousInitializable } from "./mocks/DummyInitializable.sol"; import { ERC1967Proxy } from "@openzeppelin-contracts/proxy/ERC1967/ERC1967Proxy.sol"; @@ -28,6 +31,7 @@ import { IBCRolesLib } from "../../contracts/utils/IBCRolesLib.sol"; contract IBCAdminTest is Test, DeployAccessManagerWithRoles { ICS26Router public ics26Router; ICS20Transfer public ics20Transfer; + ICS27GMP public ics27Gmp; AccessManager public accessManager; address public customizer = makeAddr("customizer"); @@ -46,8 +50,10 @@ contract IBCAdminTest is Test, DeployAccessManagerWithRoles { DummyLightClient lightClient = new DummyLightClient(ILightClientMsgs.UpdateResult.Update, 0, false); address escrowLogic = address(new Escrow()); address ibcERC20Logic = address(new IBCERC20()); + address ics27AccountLogic = address(new ICS27Account()); ICS26Router ics26RouterLogic = new ICS26Router(); ICS20Transfer ics20TransferLogic = new ICS20Transfer(); + ICS27GMP ics27GmpLogic = new ICS27GMP(); // ============== Step 2: Deploy ERC1967 Proxies ============== accessManager = new AccessManager(address(this)); @@ -64,9 +70,17 @@ contract IBCAdminTest is Test, DeployAccessManagerWithRoles { ) ); + ERC1967Proxy gmpProxy = new ERC1967Proxy( + address(ics27GmpLogic), + abi.encodeCall( + ICS27GMP.initialize, (address(routerProxy), address(ics27AccountLogic), address(accessManager)) + ) + ); + // ============== Step 3: Wire up the contracts ============== ics26Router = ICS26Router(address(routerProxy)); ics20Transfer = ICS20Transfer(address(transferProxy)); + ics27Gmp = ICS27GMP(address(gmpProxy)); accessManagerSetTargetRoles(accessManager, address(routerProxy), address(transferProxy), false); @@ -106,6 +120,29 @@ contract IBCAdminTest is Test, DeployAccessManagerWithRoles { ics20Transfer.upgradeToAndCall(address(newLogic), abi.encodeCall(DummyInitializable.initializeV2, ())); } + function test_success_ics27_upgrade() public { + // ============== Step 4: Migrate the contracts ============== + DummyInitializable newLogic = new DummyInitializable(); + + ics27Gmp.upgradeToAndCall(address(newLogic), abi.encodeCall(DummyInitializable.initializeV2, ())); + } + + function test_failure_ics27_upgrade() public { + // Case 1: Revert on failed initialization + ErroneousInitializable erroneousLogic = new ErroneousInitializable(); + + vm.expectRevert(abi.encodeWithSelector(ErroneousInitializable.InitializeFailed.selector)); + ics27Gmp.upgradeToAndCall(address(erroneousLogic), abi.encodeCall(DummyInitializable.initializeV2, ())); + + // Case 2: Revert on unauthorized upgrade + DummyInitializable newLogic = new DummyInitializable(); + + address unauthorized = makeAddr("unauthorized"); + vm.prank(unauthorized); + vm.expectRevert(abi.encodeWithSelector(IAccessManaged.AccessManagedUnauthorized.selector, unauthorized)); + ics27Gmp.upgradeToAndCall(address(newLogic), abi.encodeCall(DummyInitializable.initializeV2, ())); + } + function test_success_ics26_upgrade() public { // ============== Step 4: Migrate the contracts ============== DummyInitializable newLogic = new DummyInitializable(); From cec5a5a46892052b66a93c7ce74229124f23ef43 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 28 Aug 2025 11:27:13 +0400 Subject: [PATCH 66/79] test: ics27Account upgrade --- test/solidity-ibc/IBCAdminTest.t.sol | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/solidity-ibc/IBCAdminTest.t.sol b/test/solidity-ibc/IBCAdminTest.t.sol index 84b21f985..408b452cd 100644 --- a/test/solidity-ibc/IBCAdminTest.t.sol +++ b/test/solidity-ibc/IBCAdminTest.t.sol @@ -237,4 +237,21 @@ contract IBCAdminTest is Test, DeployAccessManagerWithRoles { vm.expectRevert(abi.encodeWithSelector(IAccessManaged.AccessManagedUnauthorized.selector, unauthorized)); ics20Transfer.upgradeIBCERC20To(address(newLogic)); } + + function test_success_ics27Account_upgrade() public { + DummyInitializable newLogic = new DummyInitializable(); + + ics27Gmp.upgradeAccountTo(address(newLogic)); + UpgradeableBeacon beacon = UpgradeableBeacon(ics27Gmp.getAccountBeacon()); + assertEq(beacon.implementation(), address(newLogic)); + } + + function test_failure_ics27Account_upgrade() public { + DummyInitializable newLogic = new DummyInitializable(); + address unauthorized = makeAddr("unauthorized"); + + vm.prank(unauthorized); + vm.expectRevert(abi.encodeWithSelector(IAccessManaged.AccessManagedUnauthorized.selector, unauthorized)); + ics27Gmp.upgradeAccountTo(address(newLogic)); + } } From 62ee611e89625ae066db9d526fa4bd3b149debdd Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 28 Aug 2025 11:27:25 +0400 Subject: [PATCH 67/79] lint: forge fmt --- test/solidity-ibc/ICS27GMPTest.t.sol | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/test/solidity-ibc/ICS27GMPTest.t.sol b/test/solidity-ibc/ICS27GMPTest.t.sol index 959f57ebd..131af6730 100644 --- a/test/solidity-ibc/ICS27GMPTest.t.sol +++ b/test/solidity-ibc/ICS27GMPTest.t.sol @@ -348,7 +348,14 @@ contract ICS27GMPTest is Test { ics27Gmp.onRecvPacket(msg_); } - function testFuzz_success_onAcknowledgementPacket(uint16 payloadLen, uint16 ackLen, uint16 saltLen, uint64 seq) public { + function testFuzz_success_onAcknowledgementPacket( + uint16 payloadLen, + uint16 ackLen, + uint16 saltLen, + uint64 seq + ) + public + { vm.assume(payloadLen > 0); address relayer = makeAddr("relayer"); @@ -392,7 +399,14 @@ contract ICS27GMPTest is Test { ics27Gmp.onAcknowledgementPacket(msg_); } - function testFuzz_failure_onAcknowledgementPacket(uint16 payloadLen, uint16 ackLen, uint16 saltLen, uint64 seq) public { + function testFuzz_failure_onAcknowledgementPacket( + uint16 payloadLen, + uint16 ackLen, + uint16 saltLen, + uint64 seq + ) + public + { vm.assume(payloadLen > 0); address relayer = makeAddr("relayer"); From 9862c806b8647cb5af2c8be3361721a4f8728e44 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 28 Aug 2025 11:28:19 +0400 Subject: [PATCH 68/79] lint: solhint --- test/solidity-ibc/IBCAdminTest.t.sol | 1 - test/solidity-ibc/ICS27GMPTest.t.sol | 1 - 2 files changed, 2 deletions(-) diff --git a/test/solidity-ibc/IBCAdminTest.t.sol b/test/solidity-ibc/IBCAdminTest.t.sol index 408b452cd..53ba06bef 100644 --- a/test/solidity-ibc/IBCAdminTest.t.sol +++ b/test/solidity-ibc/IBCAdminTest.t.sol @@ -16,7 +16,6 @@ import { ICS20Transfer } from "../../contracts/ICS20Transfer.sol"; import { ICS20Lib } from "../../contracts/utils/ICS20Lib.sol"; import { ICS27GMP } from "../../contracts/ICS27GMP.sol"; import { ICS27Account } from "../../contracts/utils/ICS27Account.sol"; -import { ICS27Lib } from "../../contracts/utils/ICS27Lib.sol"; import { DummyLightClient } from "./mocks/DummyLightClient.sol"; import { DummyInitializable, ErroneousInitializable } from "./mocks/DummyInitializable.sol"; import { ERC1967Proxy } from "@openzeppelin-contracts/proxy/ERC1967/ERC1967Proxy.sol"; diff --git a/test/solidity-ibc/ICS27GMPTest.t.sol b/test/solidity-ibc/ICS27GMPTest.t.sol index 131af6730..9573f2767 100644 --- a/test/solidity-ibc/ICS27GMPTest.t.sol +++ b/test/solidity-ibc/ICS27GMPTest.t.sol @@ -3,7 +3,6 @@ pragma solidity ^0.8.28; // solhint-disable custom-errors,max-line-length,no-inline-assembly,gas-small-strings,function-max-lines -import "forge-std/console2.sol"; import { Test } from "forge-std/Test.sol"; import { IICS26RouterMsgs } from "../../contracts/msgs/IICS26RouterMsgs.sol"; From e2a1206364e8db853c142a4fb785df003046c563 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Sun, 31 Aug 2025 15:00:28 +0400 Subject: [PATCH 69/79] test(e2e): update gmp to use env proofType --- e2e/interchaintestv8/gmp_test.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/e2e/interchaintestv8/gmp_test.go b/e2e/interchaintestv8/gmp_test.go index 31e0f0835..dcec50435 100644 --- a/e2e/interchaintestv8/gmp_test.go +++ b/e2e/interchaintestv8/gmp_test.go @@ -308,9 +308,10 @@ func (s *IbcEurekaGmpTestSuite) SetupSuite(ctx context.Context, proofType types. })) } -func (s *IbcEurekaGmpTestSuite) TestDeploy_Groth16() { +func (s *IbcEurekaGmpTestSuite) TestDeploy() { ctx := context.Background() - s.DeployTest(ctx, types.ProofTypeGroth16) + proofType := types.GetEnvProofType() + s.DeployTest(ctx, proofType) } func (s *IbcEurekaGmpTestSuite) DeployTest(ctx context.Context, proofType types.SupportedProofType) { @@ -387,9 +388,11 @@ func (s *IbcEurekaGmpTestSuite) DeployTest(ctx context.Context, proofType types. })) } -func (s *IbcEurekaGmpTestSuite) TestSendCallFromCosmos_Groth16() { +// TestSendCallFromCosmos tests the SendCall from Cosmos to Ethereum +func (s *IbcEurekaGmpTestSuite) TestSendCallFromCosmos() { ctx := context.Background() - s.SendCallFromCosmosTest(ctx, types.ProofTypeGroth16) + proofType := types.GetEnvProofType() + s.SendCallFromCosmosTest(ctx, proofType) } func (s *IbcEurekaGmpTestSuite) SendCallFromCosmosTest(ctx context.Context, proofType types.SupportedProofType) { @@ -524,10 +527,11 @@ func (s *IbcEurekaGmpTestSuite) SendCallFromCosmosTest(ctx context.Context, proo })) } -// TestSendCallFromEth_Groth16 tests the SendCall from Ethereum to Cosmos -func (s *IbcEurekaGmpTestSuite) TestSendCallFromEth_Groth16() { +// TestSendCallFromEth tests the SendCall from Ethereum to Cosmos +func (s *IbcEurekaGmpTestSuite) TestSendCallFromEth() { ctx := context.Background() - s.SendCallFromEthTest(ctx, types.ProofTypeGroth16) + proofType := types.GetEnvProofType() + s.SendCallFromEthTest(ctx, proofType) } func (s *IbcEurekaGmpTestSuite) SendCallFromEthTest(ctx context.Context, proofType types.SupportedProofType) { From dd786e2762905bab4654abb80a4d5159dbea69cf Mon Sep 17 00:00:00 2001 From: srdtrk Date: Tue, 2 Sep 2025 00:11:23 +0400 Subject: [PATCH 70/79] fix: use checksum address --- contracts/ICS27GMP.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/ICS27GMP.sol b/contracts/ICS27GMP.sol index 2098f5189..482e07c2d 100644 --- a/contracts/ICS27GMP.sol +++ b/contracts/ICS27GMP.sol @@ -83,7 +83,7 @@ contract ICS27GMP is require(msg_.payload.length != 0, ICS27PayloadEmpty()); IICS27GMPMsgs.GMPPacketData memory packetData = IICS27GMPMsgs.GMPPacketData({ - sender: Strings.toHexString(_msgSender()), + sender: Strings.toChecksumHexString(_msgSender()), receiver: msg_.receiver, salt: msg_.salt, payload: msg_.payload, From c7ac298b5c713ff81565cbb88779151c354c0dec Mon Sep 17 00:00:00 2001 From: srdtrk Date: Tue, 2 Sep 2025 00:24:57 +0400 Subject: [PATCH 71/79] fix: e2e --- e2e/interchaintestv8/gmp_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/interchaintestv8/gmp_test.go b/e2e/interchaintestv8/gmp_test.go index dcec50435..f312be205 100644 --- a/e2e/interchaintestv8/gmp_test.go +++ b/e2e/interchaintestv8/gmp_test.go @@ -550,7 +550,7 @@ func (s *IbcEurekaGmpTestSuite) SendCallFromEthTest(ctx context.Context, proofTy s.Require().True(s.Run("Fund pre-computed ICS27 address", func() { res, err := e2esuite.GRPCQuery[gmptypes.QueryAccountAddressResponse](ctx, simd, &gmptypes.QueryAccountAddressRequest{ ClientId: testvalues.FirstWasmClientID, - Sender: strings.ToLower(ethUserAddress.Hex()), + Sender: ethUserAddress.String(), Salt: "", }) s.Require().NoError(err) From 825d3f9bcedb33740f1f08a6a46d4b6f9062ef04 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Tue, 2 Sep 2025 08:58:12 +0400 Subject: [PATCH 72/79] test: fix with checksum --- test/solidity-ibc/ICS27GMPTest.t.sol | 4 ++-- test/solidity-ibc/Integration2Test.t.sol | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/test/solidity-ibc/ICS27GMPTest.t.sol b/test/solidity-ibc/ICS27GMPTest.t.sol index 9573f2767..598a4029c 100644 --- a/test/solidity-ibc/ICS27GMPTest.t.sol +++ b/test/solidity-ibc/ICS27GMPTest.t.sol @@ -71,7 +71,7 @@ contract ICS27GMPTest is Test { encoding: ICS27Lib.ICS27_ENCODING, value: abi.encode( IICS27GMPMsgs.GMPPacketData({ - sender: Strings.toHexString(sender), + sender: Strings.toChecksumHexString(sender), receiver: receiver, salt: salt, payload: payload, @@ -122,7 +122,7 @@ contract ICS27GMPTest is Test { encoding: ICS27Lib.ICS27_ENCODING, value: abi.encode( IICS27GMPMsgs.GMPPacketData({ - sender: Strings.toHexString(sender), + sender: Strings.toChecksumHexString(sender), receiver: receiver, salt: salt, payload: payload, diff --git a/test/solidity-ibc/Integration2Test.t.sol b/test/solidity-ibc/Integration2Test.t.sol index b61d0072f..0a4ccd55a 100644 --- a/test/solidity-ibc/Integration2Test.t.sol +++ b/test/solidity-ibc/Integration2Test.t.sol @@ -583,7 +583,7 @@ contract Integration2Test is Test { IICS27GMPMsgs.GMPPacketData memory gmpPacketData = abi.decode(sentPacket.payloads[0].value, (IICS27GMPMsgs.GMPPacketData)); - assertEq(gmpPacketData.sender, Strings.toHexString(user), "sender mismatch"); + assertEq(gmpPacketData.sender, Strings.toChecksumHexString(user), "sender mismatch"); assertEq(gmpPacketData.receiver, receiver, "receiver mismatch"); assertEq(gmpPacketData.payload, mockPayload, "payload mismatch"); assertEq(gmpPacketData.salt, bytes(""), "salt mismatch"); @@ -608,14 +608,14 @@ contract Integration2Test is Test { // precompute account address IICS27GMPMsgs.AccountIdentifier memory accountId = IICS27GMPMsgs.AccountIdentifier({ clientId: th.FIRST_CLIENT_ID(), - sender: Strings.toHexString(user), + sender: Strings.toChecksumHexString(user), salt: vm.randomBytes(saltLen) }); address computedAccount = ibcImplB.ics27Gmp().getOrComputeAccountAddress(accountId); // send packet IICS26RouterMsgs.Packet memory sentPacket = - ibcImplA.sendGmpAsUser(user, Strings.toHexString(receiver), payload, accountId.salt); + ibcImplA.sendGmpAsUser(user, Strings.toChecksumHexString(receiver), payload, accountId.salt); // Receive the packet on B vm.expectCall(receiver, 0, payload); From 8098fb7f6ed4f45dc67cd8359a6446f6af028aa5 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Tue, 2 Sep 2025 09:11:25 +0400 Subject: [PATCH 73/79] test: update sender --- test/solidity-ibc/ICS27GMPTest.t.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/solidity-ibc/ICS27GMPTest.t.sol b/test/solidity-ibc/ICS27GMPTest.t.sol index 598a4029c..a37c1a57d 100644 --- a/test/solidity-ibc/ICS27GMPTest.t.sol +++ b/test/solidity-ibc/ICS27GMPTest.t.sol @@ -377,7 +377,7 @@ contract ICS27GMPTest is Test { encoding: ICS27Lib.ICS27_ENCODING, value: abi.encode( IICS27GMPMsgs.GMPPacketData({ - sender: Strings.toHexString(sender), + sender: Strings.toChecksumHexString(sender), receiver: receiver, salt: salt, payload: payload, @@ -418,7 +418,7 @@ contract ICS27GMPTest is Test { bytes memory validValue = abi.encode( IICS27GMPMsgs.GMPPacketData({ - sender: Strings.toHexString(sender), + sender: Strings.toChecksumHexString(sender), receiver: receiver, salt: salt, payload: payload, @@ -483,7 +483,7 @@ contract ICS27GMPTest is Test { encoding: ICS27Lib.ICS27_ENCODING, value: abi.encode( IICS27GMPMsgs.GMPPacketData({ - sender: Strings.toHexString(sender), + sender: Strings.toChecksumHexString(sender), receiver: receiver, salt: salt, payload: payload, @@ -519,7 +519,7 @@ contract ICS27GMPTest is Test { encoding: ICS27Lib.ICS27_ENCODING, value: abi.encode( IICS27GMPMsgs.GMPPacketData({ - sender: Strings.toHexString(sender), + sender: Strings.toChecksumHexString(sender), receiver: receiver, salt: salt, payload: payload, From 7760b34461c1e656e64ee3d2f7f427810d3ee715 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Tue, 2 Sep 2025 09:15:32 +0400 Subject: [PATCH 74/79] test: fix missing --- test/solidity-ibc/Integration2Test.t.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/solidity-ibc/Integration2Test.t.sol b/test/solidity-ibc/Integration2Test.t.sol index 0a4ccd55a..9de5b38c3 100644 --- a/test/solidity-ibc/Integration2Test.t.sol +++ b/test/solidity-ibc/Integration2Test.t.sol @@ -653,7 +653,7 @@ contract Integration2Test is Test { // precompute account address IICS27GMPMsgs.AccountIdentifier memory accountId = IICS27GMPMsgs.AccountIdentifier({ clientId: th.FIRST_CLIENT_ID(), - sender: Strings.toHexString(user), + sender: Strings.toChecksumHexString(user), salt: vm.randomBytes(saltLen) }); @@ -692,7 +692,7 @@ contract Integration2Test is Test { // precompute account address IICS27GMPMsgs.AccountIdentifier memory accountId = IICS27GMPMsgs.AccountIdentifier({ clientId: th.FIRST_CLIENT_ID(), - sender: Strings.toHexString(user), + sender: Strings.toChecksumHexString(user), salt: vm.randomBytes(saltLen) }); From c5498be54e0c5bd0b64dad1ac92974fb3ab1f192 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Tue, 2 Sep 2025 09:20:15 +0400 Subject: [PATCH 75/79] test: add cov --- test/solidity-ibc/ICS27GMPTest.t.sol | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/solidity-ibc/ICS27GMPTest.t.sol b/test/solidity-ibc/ICS27GMPTest.t.sol index a37c1a57d..70c736e88 100644 --- a/test/solidity-ibc/ICS27GMPTest.t.sol +++ b/test/solidity-ibc/ICS27GMPTest.t.sol @@ -219,6 +219,12 @@ contract ICS27GMPTest is Test { address actualAccount = ics27Gmp.getOrComputeAccountAddress(accountId); assertEq(actualAccount, predeterminedAccount, "Account address mismatch"); + + // Call again to cover the case where the account already exists + vm.expectCall(receiver, payload); + vm.prank(mockIcs26); + ack = ics27Gmp.onRecvPacket(msg_); + assertEq(ack, expAck, "Acknowledgement mismatch"); } function testFuzz_failure_onRecvPacket(uint16 saltLen, uint16 payloadLen, uint64 seq) public { From 09c4445fbfab7d5046f69ac3efdf7f0b6131997c Mon Sep 17 00:00:00 2001 From: johnnylarner Date: Tue, 9 Sep 2025 10:14:47 +0200 Subject: [PATCH 76/79] docs: add PICKUP.md --- contracts/PICKUP.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 contracts/PICKUP.md diff --git a/contracts/PICKUP.md b/contracts/PICKUP.md new file mode 100644 index 000000000..4640eedd4 --- /dev/null +++ b/contracts/PICKUP.md @@ -0,0 +1,3 @@ +# GMP pickup document +Here we summarise the top features, fixes and refactors that need completing in the GMP stack to get it closer to production readiness. + From 01c80f7bd5b9afb3477d780098223ab5096d28fc Mon Sep 17 00:00:00 2001 From: srdtrk Date: Wed, 10 Sep 2025 13:33:25 +0400 Subject: [PATCH 77/79] docs: added pickup info --- contracts/PICKUP.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/contracts/PICKUP.md b/contracts/PICKUP.md index 4640eedd4..71174e2bb 100644 --- a/contracts/PICKUP.md +++ b/contracts/PICKUP.md @@ -1,3 +1,7 @@ # GMP pickup document -Here we summarise the top features, fixes and refactors that need completing in the GMP stack to get it closer to production readiness. +The solidity implementation of `ICS27GMP` is feature complete. The next steps are all about testing and auditing. + +- Add end to end tests for the timeouts and error acknowledgements. +- If any further changes are made to the IBC-Go implementation, update the solidity code accordingly. +- Internal audit of the solidity code. From 1cc9b9ba935141e56169c17d5f67e6e8d4c80a51 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 16 Oct 2025 14:43:03 +0400 Subject: [PATCH 78/79] lint: ran forge fmt --- contracts/ICS27GMP.sol | 34 ++++++------- test/solidity-ibc/ICS27GMPTest.t.sol | 62 +++++------------------- test/solidity-ibc/Integration2Test.t.sol | 12 ++--- test/solidity-ibc/utils/IbcImpl.sol | 23 +++------ 4 files changed, 40 insertions(+), 91 deletions(-) diff --git a/contracts/ICS27GMP.sol b/contracts/ICS27GMP.sol index 482e07c2d..e27844f4f 100644 --- a/contracts/ICS27GMP.sol +++ b/contracts/ICS27GMP.sol @@ -11,8 +11,9 @@ import { IICS27GMP } from "./interfaces/IICS27GMP.sol"; import { IICS27Account } from "./interfaces/IICS27Account.sol"; import { IICS27Errors } from "./errors/IICS27Errors.sol"; -import { ReentrancyGuardTransientUpgradeable } from - "@openzeppelin-upgradeable/utils/ReentrancyGuardTransientUpgradeable.sol"; +import { + ReentrancyGuardTransientUpgradeable +} from "@openzeppelin-upgradeable/utils/ReentrancyGuardTransientUpgradeable.sol"; import { MulticallUpgradeable } from "@openzeppelin-upgradeable/utils/MulticallUpgradeable.sol"; import { Strings } from "@openzeppelin-contracts/utils/Strings.sol"; import { Create2 } from "@openzeppelin-contracts/utils/Create2.sol"; @@ -90,19 +91,20 @@ contract ICS27GMP is memo: msg_.memo }); - return _getICS27GMPStorage()._ics26.sendPacket( - IICS26RouterMsgs.MsgSendPacket({ - sourceClient: msg_.sourceClient, - timeoutTimestamp: msg_.timeoutTimestamp, - payload: IICS26RouterMsgs.Payload({ - sourcePort: ICS27Lib.DEFAULT_PORT_ID, - destPort: ICS27Lib.DEFAULT_PORT_ID, - version: ICS27Lib.ICS27_VERSION, - encoding: ICS27Lib.ICS27_ENCODING, - value: abi.encode(packetData) + return _getICS27GMPStorage()._ics26 + .sendPacket( + IICS26RouterMsgs.MsgSendPacket({ + sourceClient: msg_.sourceClient, + timeoutTimestamp: msg_.timeoutTimestamp, + payload: IICS26RouterMsgs.Payload({ + sourcePort: ICS27Lib.DEFAULT_PORT_ID, + destPort: ICS27Lib.DEFAULT_PORT_ID, + version: ICS27Lib.ICS27_VERSION, + encoding: ICS27Lib.ICS27_ENCODING, + value: abi.encode(packetData) + }) }) - }) - ); + ); } /// @inheritdoc IIBCApp @@ -133,9 +135,7 @@ contract ICS27GMP is require(packetData.payload.length != 0, ICS27PayloadEmpty()); IICS27GMPMsgs.AccountIdentifier memory accountId = IICS27GMPMsgs.AccountIdentifier({ - clientId: msg_.destinationClient, - sender: packetData.sender, - salt: packetData.salt + clientId: msg_.destinationClient, sender: packetData.sender, salt: packetData.salt }); IICS27Account account = _getOrCreateAccount(accountId); diff --git a/test/solidity-ibc/ICS27GMPTest.t.sol b/test/solidity-ibc/ICS27GMPTest.t.sol index 70c736e88..89766275e 100644 --- a/test/solidity-ibc/ICS27GMPTest.t.sol +++ b/test/solidity-ibc/ICS27GMPTest.t.sol @@ -60,8 +60,7 @@ contract ICS27GMPTest is Test { bytes memory expCall = abi.encodeCall( IICS26Router.sendPacket, - ( - IICS26RouterMsgs.MsgSendPacket({ + (IICS26RouterMsgs.MsgSendPacket({ sourceClient: th.FIRST_CLIENT_ID(), timeoutTimestamp: th.DEFAULT_TIMEOUT_TIMESTAMP(), payload: IICS26RouterMsgs.Payload({ @@ -79,8 +78,7 @@ contract ICS27GMPTest is Test { }) ) }) - }) - ) + })) ); vm.mockCall(mockIcs26, expCall, abi.encode(seq)); @@ -111,8 +109,7 @@ contract ICS27GMPTest is Test { bytes memory expCall = abi.encodeCall( IICS26Router.sendPacket, - ( - IICS26RouterMsgs.MsgSendPacket({ + (IICS26RouterMsgs.MsgSendPacket({ sourceClient: th.FIRST_CLIENT_ID(), timeoutTimestamp: th.DEFAULT_TIMEOUT_TIMESTAMP(), payload: IICS26RouterMsgs.Payload({ @@ -130,8 +127,7 @@ contract ICS27GMPTest is Test { }) ) }) - }) - ) + })) ); uint64 defaultTimeoutTimestamp = th.DEFAULT_TIMEOUT_TIMESTAMP(); @@ -255,11 +251,7 @@ contract ICS27GMPTest is Test { encoding: ICS27Lib.ICS27_ENCODING, value: abi.encode( IICS27GMPMsgs.GMPPacketData({ - sender: sender, - receiver: Strings.toHexString(receiver), - salt: salt, - payload: payload, - memo: "" + sender: sender, receiver: Strings.toHexString(receiver), salt: salt, payload: payload, memo: "" }) ) }), @@ -313,11 +305,7 @@ contract ICS27GMPTest is Test { // ===== Case 5: Empty Payload ===== msg_.payload.value = abi.encode( IICS27GMPMsgs.GMPPacketData({ - sender: sender, - receiver: Strings.toHexString(receiver), - salt: salt, - payload: bytes(""), - memo: "" + sender: sender, receiver: Strings.toHexString(receiver), salt: salt, payload: bytes(""), memo: "" }) ); vm.expectRevert(IICS27Errors.ICS27PayloadEmpty.selector); @@ -327,11 +315,7 @@ contract ICS27GMPTest is Test { // ===== Case 6: Call reverts with the mock error ===== msg_.payload.value = abi.encode( IICS27GMPMsgs.GMPPacketData({ - sender: sender, - receiver: Strings.toHexString(receiver), - salt: salt, - payload: errPayload, - memo: "" + sender: sender, receiver: Strings.toHexString(receiver), salt: salt, payload: errPayload, memo: "" }) ); vm.prank(mockIcs26); @@ -341,11 +325,7 @@ contract ICS27GMPTest is Test { // ===== Case 7: Invalid Receiver ===== msg_.payload.value = abi.encode( IICS27GMPMsgs.GMPPacketData({ - sender: sender, - receiver: th.INVALID_ID(), - salt: salt, - payload: payload, - memo: "" + sender: sender, receiver: th.INVALID_ID(), salt: salt, payload: payload, memo: "" }) ); vm.expectRevert(abi.encodeWithSelector(IICS27Errors.ICS27InvalidReceiver.selector, th.INVALID_ID())); @@ -353,12 +333,7 @@ contract ICS27GMPTest is Test { ics27Gmp.onRecvPacket(msg_); } - function testFuzz_success_onAcknowledgementPacket( - uint16 payloadLen, - uint16 ackLen, - uint16 saltLen, - uint64 seq - ) + function testFuzz_success_onAcknowledgementPacket(uint16 payloadLen, uint16 ackLen, uint16 saltLen, uint64 seq) public { vm.assume(payloadLen > 0); @@ -404,12 +379,7 @@ contract ICS27GMPTest is Test { ics27Gmp.onAcknowledgementPacket(msg_); } - function testFuzz_failure_onAcknowledgementPacket( - uint16 payloadLen, - uint16 ackLen, - uint16 saltLen, - uint64 seq - ) + function testFuzz_failure_onAcknowledgementPacket(uint16 payloadLen, uint16 ackLen, uint16 saltLen, uint64 seq) public { vm.assume(payloadLen > 0); @@ -456,11 +426,7 @@ contract ICS27GMPTest is Test { // ===== Case 2: Invalid Sender ===== msg_.payload.value = abi.encode( IICS27GMPMsgs.GMPPacketData({ - sender: th.INVALID_ID(), - receiver: receiver, - salt: salt, - payload: payload, - memo: memo + sender: th.INVALID_ID(), receiver: receiver, salt: salt, payload: payload, memo: memo }) ); vm.expectRevert(abi.encodeWithSelector(IICS27Errors.ICS27InvalidSender.selector, th.INVALID_ID())); @@ -548,11 +514,7 @@ contract ICS27GMPTest is Test { // ===== Case 2: Invalid Sender ===== msg_.payload.value = abi.encode( IICS27GMPMsgs.GMPPacketData({ - sender: th.INVALID_ID(), - receiver: receiver, - salt: salt, - payload: payload, - memo: memo + sender: th.INVALID_ID(), receiver: receiver, salt: salt, payload: payload, memo: memo }) ); vm.expectRevert(abi.encodeWithSelector(IICS27Errors.ICS27InvalidSender.selector, th.INVALID_ID())); diff --git a/test/solidity-ibc/Integration2Test.t.sol b/test/solidity-ibc/Integration2Test.t.sol index 55c92f874..6f95aedbf 100644 --- a/test/solidity-ibc/Integration2Test.t.sol +++ b/test/solidity-ibc/Integration2Test.t.sol @@ -603,9 +603,7 @@ contract Integration2Test is Test { // precompute account address IICS27GMPMsgs.AccountIdentifier memory accountId = IICS27GMPMsgs.AccountIdentifier({ - clientId: th.FIRST_CLIENT_ID(), - sender: Strings.toChecksumHexString(user), - salt: vm.randomBytes(saltLen) + clientId: th.FIRST_CLIENT_ID(), sender: Strings.toChecksumHexString(user), salt: vm.randomBytes(saltLen) }); address computedAccount = ibcImplB.ics27Gmp().getOrComputeAccountAddress(accountId); @@ -648,9 +646,7 @@ contract Integration2Test is Test { // precompute account address IICS27GMPMsgs.AccountIdentifier memory accountId = IICS27GMPMsgs.AccountIdentifier({ - clientId: th.FIRST_CLIENT_ID(), - sender: Strings.toChecksumHexString(user), - salt: vm.randomBytes(saltLen) + clientId: th.FIRST_CLIENT_ID(), sender: Strings.toChecksumHexString(user), salt: vm.randomBytes(saltLen) }); // send packet @@ -687,9 +683,7 @@ contract Integration2Test is Test { // precompute account address IICS27GMPMsgs.AccountIdentifier memory accountId = IICS27GMPMsgs.AccountIdentifier({ - clientId: th.FIRST_CLIENT_ID(), - sender: Strings.toChecksumHexString(user), - salt: vm.randomBytes(saltLen) + clientId: th.FIRST_CLIENT_ID(), sender: Strings.toChecksumHexString(user), salt: vm.randomBytes(saltLen) }); // send packet diff --git a/test/solidity-ibc/utils/IbcImpl.sol b/test/solidity-ibc/utils/IbcImpl.sol index fa2a30777..c49209fd4 100644 --- a/test/solidity-ibc/utils/IbcImpl.sol +++ b/test/solidity-ibc/utils/IbcImpl.sol @@ -110,8 +110,9 @@ contract IbcImpl is Test, DeployAccessManagerWithRoles { external returns (IICS26RouterMsgs.Packet memory) { - return - sendTransferAsUser(token, sender, receiver, amount, _th.DEFAULT_TIMEOUT_TIMESTAMP(), _th.FIRST_CLIENT_ID()); + return sendTransferAsUser( + token, sender, receiver, amount, _th.DEFAULT_TIMEOUT_TIMESTAMP(), _th.FIRST_CLIENT_ID() + ); } function sendTransferAsUser( @@ -216,23 +217,14 @@ contract IbcImpl is Test, DeployAccessManagerWithRoles { return abi.decode(packetBz, (IICS26RouterMsgs.Packet)); } - function sendGmpAsUser( - address sender, - string calldata receiver, - bytes calldata payload - ) + function sendGmpAsUser(address sender, string calldata receiver, bytes calldata payload) external returns (IICS26RouterMsgs.Packet memory) { return sendGmpAsUser(sender, receiver, payload, "", "", _th.DEFAULT_TIMEOUT_TIMESTAMP(), _th.FIRST_CLIENT_ID()); } - function sendGmpAsUser( - address sender, - string calldata receiver, - bytes calldata payload, - bytes calldata salt - ) + function sendGmpAsUser(address sender, string calldata receiver, bytes calldata payload, bytes calldata salt) external returns (IICS26RouterMsgs.Packet memory) { @@ -250,8 +242,9 @@ contract IbcImpl is Test, DeployAccessManagerWithRoles { external returns (IICS26RouterMsgs.Packet memory) { - return - sendGmpAsUser(sender, receiver, payload, salt, memo, _th.DEFAULT_TIMEOUT_TIMESTAMP(), _th.FIRST_CLIENT_ID()); + return sendGmpAsUser( + sender, receiver, payload, salt, memo, _th.DEFAULT_TIMEOUT_TIMESTAMP(), _th.FIRST_CLIENT_ID() + ); } function sendGmpAsUser( From a89796c69791159739ef671162eb45bd848019b3 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 16 Oct 2025 14:50:09 +0400 Subject: [PATCH 79/79] ci: bump go version to 1.25 --- .github/actions/e2e-setup/action.yml | 2 +- .github/workflows/abigen.yaml | 6 +++--- .github/workflows/e2e-mock.yml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/actions/e2e-setup/action.yml b/.github/actions/e2e-setup/action.yml index 74f5fd40d..c354ec0a4 100644 --- a/.github/actions/e2e-setup/action.yml +++ b/.github/actions/e2e-setup/action.yml @@ -14,7 +14,7 @@ runs: - name: Setup Go uses: actions/setup-go@v4 with: - go-version: 1.23 + go-version: 1.25 check-latest: true cache-dependency-path: e2e/interchaintestv8/go.sum diff --git a/.github/workflows/abigen.yaml b/.github/workflows/abigen.yaml index 7e942fc85..f28285727 100644 --- a/.github/workflows/abigen.yaml +++ b/.github/workflows/abigen.yaml @@ -25,7 +25,7 @@ jobs: - uses: actions/setup-go@v6 with: - go-version: 1.23 + go-version: 1.25 - uses: extractions/setup-just@v3 @@ -50,7 +50,7 @@ jobs: - uses: actions/checkout@v5 - uses: actions/setup-go@v6 with: - go-version: 1.23 + go-version: 1.25 cache-dependency-path: packages/go-abigen/go.sum - name: golangci-lint @@ -65,7 +65,7 @@ jobs: - uses: actions/checkout@v5 - uses: actions/setup-go@v6 with: - go-version: 1.23 + go-version: 1.25 cache-dependency-path: packages/go-abigen/go.sum - name: Unit test abigen diff --git a/.github/workflows/e2e-mock.yml b/.github/workflows/e2e-mock.yml index 39122a22e..3b263f1d1 100644 --- a/.github/workflows/e2e-mock.yml +++ b/.github/workflows/e2e-mock.yml @@ -33,7 +33,7 @@ jobs: - uses: actions/checkout@v5 - uses: actions/setup-go@v6 with: - go-version: 1.23 + go-version: 1.25 cache-dependency-path: e2e/interchaintestv8/go.sum - name: golangci-lint