From f09987dadeceab58c76ae3b5ac612d57b7f31145 Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Thu, 28 Nov 2024 11:05:25 +0100 Subject: [PATCH 01/42] rm transfer events,fix test --- contracts/ICS20Transfer.sol | 10 +- contracts/interfaces/IICS20Transfer.sol | 19 --- test/solidity-ibc/ICS20TransferTest.t.sol | 71 +++------ test/solidity-ibc/IntegrationTest.t.sol | 178 +++++++--------------- 4 files changed, 74 insertions(+), 204 deletions(-) diff --git a/contracts/ICS20Transfer.sol b/contracts/ICS20Transfer.sol index 811a8dcd..47fb00d4 100644 --- a/contracts/ICS20Transfer.sol +++ b/contracts/ICS20Transfer.sol @@ -87,8 +87,6 @@ contract ICS20Transfer is IIBCApp, IICS20Transfer, IICS20Errors, Ownable, Reentr IBCERC20 ibcERC20Contract = IBCERC20(erc20Address); ibcERC20Contract.burn(packetData.amount); } - - emit ICS20Transfer(packetData, erc20Address); } /// @inheritdoc IIBCApp @@ -123,9 +121,6 @@ contract ICS20Transfer is IIBCApp, IICS20Transfer, IICS20Errors, Ownable, Reentr // transfer the tokens to the receiver ESCROW.send(IERC20(erc20Address), receiver, packetData.amount); - // Note the event don't take into account the conversion - emit ICS20ReceiveTransfer(packetData, erc20Address); - return ICS20Lib.SUCCESSFUL_ACKNOWLEDGEMENT_JSON; } @@ -140,8 +135,6 @@ contract ICS20Transfer is IIBCApp, IICS20Transfer, IICS20Errors, Ownable, Reentr _refundTokens(packetData, erc20Address); } - // Nothing needed to be done if the acknowledgement was successful, tokens are already in escrow or burnt - emit ICS20Acknowledgement(packetData, msg_.acknowledgement); } /// @inheritdoc IIBCApp @@ -151,7 +144,6 @@ contract ICS20Transfer is IIBCApp, IICS20Transfer, IICS20Errors, Ownable, Reentr (address erc20Address,) = getSendERC20AddressAndSource(msg_.payload.sourcePort, msg_.sourceChannel, packetData); _refundTokens(packetData, erc20Address); - emit ICS20Timeout(packetData); } /// @notice Refund the tokens to the sender @@ -233,7 +225,7 @@ contract ICS20Transfer is IIBCApp, IICS20Transfer, IICS20Errors, Ownable, Reentr string calldata destChannel, ICS20Lib.FungibleTokenPacketData memory packetData ) - private + public returns (address, bool) { bytes memory denomBz = bytes(packetData.denom); diff --git a/contracts/interfaces/IICS20Transfer.sol b/contracts/interfaces/IICS20Transfer.sol index 6338e427..f2a294af 100644 --- a/contracts/interfaces/IICS20Transfer.sol +++ b/contracts/interfaces/IICS20Transfer.sol @@ -6,25 +6,6 @@ import { IICS20TransferMsgs } from "../msgs/IICS20TransferMsgs.sol"; import { IICS26RouterMsgs } from "../msgs/IICS26RouterMsgs.sol"; interface IICS20Transfer is IICS20TransferMsgs { - /// @notice Called when a packet is handled in onSendPacket and a transfer has been initiated - /// @param packetData The transfer packet data - /// @param erc20Address The address of the ERC20 contract of the token sent - event ICS20Transfer(ICS20Lib.FungibleTokenPacketData packetData, address erc20Address); - - /// @notice Called when a packet is received in onReceivePacket - /// @param packetData The transfer packet data - /// @param erc20Address The address of the ERC20 contract of the token received - event ICS20ReceiveTransfer(ICS20Lib.FungibleTokenPacketData packetData, address erc20Address); - - /// @notice Called after handling acknowledgement in onAcknowledgementPacket - /// @param packetData The transfer packet data - /// @param acknowledgement The acknowledgement data - event ICS20Acknowledgement(ICS20Lib.FungibleTokenPacketData packetData, bytes acknowledgement); - - /// @notice Called after handling a timeout in onTimeoutPacket - /// @param packetData The transfer packet data - event ICS20Timeout(ICS20Lib.FungibleTokenPacketData packetData); - /// @notice Send a transfer by constructing a message and calling IICS26Router.sendPacket /// @notice This function is not strictly necessary. You can construct IICS26RouterMsgs.SendPacketMsg /// @notice yourself and call IICS26Router.sendPacket, which uses less gas than this function diff --git a/test/solidity-ibc/ICS20TransferTest.t.sol b/test/solidity-ibc/ICS20TransferTest.t.sol index f8772399..e886b5bb 100644 --- a/test/solidity-ibc/ICS20TransferTest.t.sol +++ b/test/solidity-ibc/ICS20TransferTest.t.sol @@ -123,8 +123,6 @@ contract ICS20TransferTest is Test { assertEq(senderBalanceBefore, defaultAmount); assertEq(contractBalanceBefore, 0); - vm.expectEmit(); - emit IICS20Transfer.ICS20Transfer(defaultPacketData, address(erc20)); ics20Transfer.onSendPacket( IIBCAppCallbacks.OnSendPacketCallback({ sourceChannel: packet.sourceChannel, @@ -153,8 +151,6 @@ contract ICS20TransferTest is Test { assertEq(senderBalanceBefore, defaultAmount); assertEq(contractBalanceBefore, 0); - vm.expectEmit(); - emit IICS20Transfer.ICS20Transfer(defaultPacketData, address(erc20)); ics20Transfer.onSendPacket( IIBCAppCallbacks.OnSendPacketCallback({ sourceChannel: packet.sourceChannel, @@ -190,8 +186,6 @@ contract ICS20TransferTest is Test { data = abi.encode(defaultPacketData); packet.payloads[0].value = data; - vm.expectEmit(); - emit IICS20Transfer.ICS20Transfer(defaultPacketData, address(erc20)); ics20Transfer.onSendPacket( IIBCAppCallbacks.OnSendPacketCallback({ sourceChannel: packet.sourceChannel, @@ -404,8 +398,6 @@ contract ICS20TransferTest is Test { assertEq(senderBalanceBefore, defaultAmount); assertEq(contractBalanceBefore, 0); - vm.expectEmit(); - emit IICS20Transfer.ICS20Transfer(defaultPacketData, address(erc20)); ics20Transfer.onSendPacket( IIBCAppCallbacks.OnSendPacketCallback({ sourceChannel: packet.sourceChannel, @@ -421,8 +413,6 @@ contract ICS20TransferTest is Test { assertEq(senderBalanceAfterSend, 0); assertEq(contractBalanceAfterSend, defaultAmount); - vm.expectEmit(); - emit IICS20Transfer.ICS20Acknowledgement(defaultPacketData, ICS20Lib.SUCCESSFUL_ACKNOWLEDGEMENT_JSON); ics20Transfer.onAcknowledgementPacket( IIBCAppCallbacks.OnAcknowledgementPacketCallback({ sourceChannel: packet.sourceChannel, @@ -453,8 +443,6 @@ contract ICS20TransferTest is Test { assertEq(senderBalanceBefore, defaultAmount); assertEq(contractBalanceBefore, 0); - vm.expectEmit(); - emit IICS20Transfer.ICS20Transfer(defaultPacketData, address(erc20)); ics20Transfer.onSendPacket( IIBCAppCallbacks.OnSendPacketCallback({ sourceChannel: packet.sourceChannel, @@ -470,8 +458,6 @@ contract ICS20TransferTest is Test { assertEq(senderBalanceAfterSend, 0); assertEq(contractBalanceAfterSend, defaultAmount); - vm.expectEmit(); - emit IICS20Transfer.ICS20Acknowledgement(defaultPacketData, ICS20Lib.FAILED_ACKNOWLEDGEMENT_JSON); ics20Transfer.onAcknowledgementPacket( IIBCAppCallbacks.OnAcknowledgementPacketCallback({ sourceChannel: packet.sourceChannel, @@ -559,8 +545,6 @@ contract ICS20TransferTest is Test { assertEq(senderBalanceBefore, defaultAmount); assertEq(contractBalanceBefore, 0); - vm.expectEmit(); - emit IICS20Transfer.ICS20Transfer(defaultPacketData, address(erc20)); ics20Transfer.onSendPacket( IIBCAppCallbacks.OnSendPacketCallback({ sourceChannel: packet.sourceChannel, @@ -576,8 +560,6 @@ contract ICS20TransferTest is Test { assertEq(senderBalanceAfterSend, 0); assertEq(contractBalanceAfterSend, defaultAmount); - vm.expectEmit(); - emit IICS20Transfer.ICS20Timeout(defaultPacketData); ics20Transfer.onTimeoutPacket( IIBCAppCallbacks.OnTimeoutPacketCallback({ sourceChannel: packet.sourceChannel, @@ -661,8 +643,6 @@ contract ICS20TransferTest is Test { assertEq(senderBalanceBefore, defaultAmount); assertEq(contractBalanceBefore, 0); - vm.expectEmit(); - emit IICS20Transfer.ICS20Transfer(defaultPacketData, address(erc20)); ics20Transfer.onSendPacket( IIBCAppCallbacks.OnSendPacketCallback({ sourceChannel: packet.sourceChannel, @@ -703,17 +683,6 @@ contract ICS20TransferTest is Test { packet.payloads[0].sourcePort = newSourcePort; packet.sourceChannel = newSourceChannel; - vm.expectEmit(); - emit IICS20Transfer.ICS20ReceiveTransfer( - ICS20Lib.FungibleTokenPacketData({ - denom: receivedDenom, - sender: senderStr, - receiver: receiverStr, - amount: defaultAmount, - memo: "memo" - }), - address(erc20) - ); bytes memory ack = ics20Transfer.onRecvPacket( IIBCAppCallbacks.OnRecvPacketCallback({ sourceChannel: packet.sourceChannel, @@ -757,11 +726,6 @@ contract ICS20TransferTest is Test { string memory expectedFullDenomPath = string(abi.encodePacked(packet.payloads[0].destPort, "/", packet.destChannel, "/", foreignDenom)); - vm.expectEmit(true, true, true, false); // Not checking data because we don't know the address yet - ICS20Lib.FungibleTokenPacketData memory packetData; - address erc20Address; - emit IICS20Transfer.ICS20ReceiveTransfer(packetData, erc20Address); // we check these values later - vm.recordLogs(); bytes memory ack = ics20Transfer.onRecvPacket( IIBCAppCallbacks.OnRecvPacketCallback({ sourceChannel: packet.sourceChannel, @@ -773,13 +737,16 @@ contract ICS20TransferTest is Test { ); assertEq(ack, ICS20Lib.SUCCESSFUL_ACKNOWLEDGEMENT_JSON); - // find and extract data from the ICS20ReceiveTransfer event - Vm.Log[] memory entries = vm.getRecordedLogs(); - assertEq(entries.length, 4); - Vm.Log memory receiveTransferLog = entries[3]; - assertEq(receiveTransferLog.topics[0], IICS20Transfer.ICS20ReceiveTransfer.selector); + (address erc20Address,) = ics20Transfer.getReceiveERC20AddressAndSource( + packet.payloads[0].sourcePort, + packet.sourceChannel, + packet.payloads[0].destPort, + packet.destChannel, + receivePayload + ); - (packetData, erc20Address) = abi.decode(receiveTransferLog.data, (ICS20Lib.FungibleTokenPacketData, address)); + ICS20Lib.FungibleTokenPacketData memory packetData = + abi.decode(packet.payloads[0].value, (ICS20Lib.FungibleTokenPacketData)); assertEq(packetData.denom, foreignDenom); assertNotEq(erc20Address, address(0)); assertEq(packetData.sender, senderStr); @@ -822,11 +789,6 @@ contract ICS20TransferTest is Test { string memory expectedFullDenomPath = string(abi.encodePacked(packet.payloads[0].destPort, "/", packet.destChannel, "/", foreignDenom)); - vm.expectEmit(true, true, true, false); // Not checking data because we don't know the address yet - ICS20Lib.FungibleTokenPacketData memory packetData; - address erc20Address; - emit IICS20Transfer.ICS20ReceiveTransfer(packetData, erc20Address); // we check these values later - vm.recordLogs(); bytes memory ack = ics20Transfer.onRecvPacket( IIBCAppCallbacks.OnRecvPacketCallback({ sourceChannel: packet.sourceChannel, @@ -838,13 +800,16 @@ contract ICS20TransferTest is Test { ); assertEq(ack, ICS20Lib.SUCCESSFUL_ACKNOWLEDGEMENT_JSON); - // find and extract data from the ICS20ReceiveTransfer event - Vm.Log[] memory entries = vm.getRecordedLogs(); - assertEq(entries.length, 4); - Vm.Log memory receiveTransferLog = entries[3]; - assertEq(receiveTransferLog.topics[0], IICS20Transfer.ICS20ReceiveTransfer.selector); + (address erc20Address,) = ics20Transfer.getReceiveERC20AddressAndSource( + packet.payloads[0].sourcePort, + packet.sourceChannel, + packet.payloads[0].destPort, + packet.destChannel, + receivePayload + ); - (packetData, erc20Address) = abi.decode(receiveTransferLog.data, (ICS20Lib.FungibleTokenPacketData, address)); + ICS20Lib.FungibleTokenPacketData memory packetData = + abi.decode(packet.payloads[0].value, (ICS20Lib.FungibleTokenPacketData)); assertEq(packetData.denom, foreignDenom); assertEq(packetData.sender, senderStr); assertEq(packetData.receiver, receiverStr); diff --git a/test/solidity-ibc/IntegrationTest.t.sol b/test/solidity-ibc/IntegrationTest.t.sol index e461bf85..fff2796b 100644 --- a/test/solidity-ibc/IntegrationTest.t.sol +++ b/test/solidity-ibc/IntegrationTest.t.sol @@ -85,10 +85,6 @@ contract IntegrationTest is Test { proofAcked: bytes("doesntmatter"), // dummy client will accept proofHeight: IICS02ClientMsgs.Height({ revisionNumber: 1, revisionHeight: 42 }) // dummy client will accept }); - vm.expectEmit(); - emit IICS20Transfer.ICS20Acknowledgement( - expectedDefaultSendPacketData, ICS20Lib.SUCCESSFUL_ACKNOWLEDGEMENT_JSON - ); ics26Router.ackPacket(ackMsg); // commitment should be deleted bytes32 path = ICS24Host.packetCommitmentKeyCalldata(packet.sourceChannel, packet.sequence); @@ -122,8 +118,6 @@ contract IntegrationTest is Test { }); vm.startPrank(sender); - vm.expectEmit(); - emit IICS20Transfer.ICS20Transfer(expectedDefaultSendPacketData, address(erc20)); uint32 sequence = ics20Transfer.sendTransfer(transferMsg); assertEq(sequence, 1); @@ -161,10 +155,7 @@ contract IntegrationTest is Test { proofAcked: bytes("doesntmatter"), // dummy client will accept proofHeight: IICS02ClientMsgs.Height({ revisionNumber: 1, revisionHeight: 42 }) // dummy client will accept }); - vm.expectEmit(); - emit IICS20Transfer.ICS20Acknowledgement( - expectedDefaultSendPacketData, ICS20Lib.SUCCESSFUL_ACKNOWLEDGEMENT_JSON - ); + ics26Router.ackPacket(ackMsg); // commitment should be deleted @@ -186,8 +177,7 @@ contract IntegrationTest is Test { proofAcked: bytes("doesntmatter"), // dummy client will accept proofHeight: IICS02ClientMsgs.Height({ revisionNumber: 1, revisionHeight: 42 }) // dummy client will accept }); - vm.expectEmit(); - emit IICS20Transfer.ICS20Acknowledgement(expectedDefaultSendPacketData, ICS20Lib.FAILED_ACKNOWLEDGEMENT_JSON); + ics26Router.ackPacket(ackMsg); // commitment should be deleted bytes32 path = ICS24Host.packetCommitmentKeyCalldata(packet.sourceChannel, packet.sequence); @@ -260,8 +250,7 @@ contract IntegrationTest is Test { proofTimeout: bytes("doesntmatter"), // dummy client will accept proofHeight: IICS02ClientMsgs.Height({ revisionNumber: 1, revisionHeight: 42 }) // dummy client will accept }); - vm.expectEmit(); - emit IICS20Transfer.ICS20Timeout(expectedDefaultSendPacketData); + ics26Router.timeoutPacket(timeoutMsg); // commitment should be deleted bytes32 path = ICS24Host.packetCommitmentKeyCalldata(packet.sourceChannel, packet.sequence); @@ -336,10 +325,7 @@ contract IntegrationTest is Test { proofAcked: bytes("doesntmatter"), // dummy client will accept proofHeight: IICS02ClientMsgs.Height({ revisionNumber: 1, revisionHeight: 42 }) // dummy client will accept }); - vm.expectEmit(); - emit IICS20Transfer.ICS20Acknowledgement( - expectedDefaultSendPacketData, ICS20Lib.SUCCESSFUL_ACKNOWLEDGEMENT_JSON - ); + ics26Router.ackPacket(ackMsg); // commitment should be deleted @@ -381,17 +367,7 @@ contract IntegrationTest is Test { timeoutTimestamp: packet.timeoutTimestamp + 1000, payloads: payloads }); - vm.expectEmit(); - emit IICS20Transfer.ICS20ReceiveTransfer( - ICS20Lib.FungibleTokenPacketData({ - denom: receivedDenom, - sender: senderStr, - receiver: receiverStr, - amount: transferAmount, - memo: "backmemo" - }), - address(erc20) - ); + vm.expectEmit(); emit IICS26Router.WriteAcknowledgement(packet, singleSuccessAck); vm.expectEmit(); @@ -425,10 +401,7 @@ contract IntegrationTest is Test { proofAcked: bytes("doesntmatter"), // dummy client will accept proofHeight: IICS02ClientMsgs.Height({ revisionNumber: 1, revisionHeight: 42 }) // dummy client will accept }); - vm.expectEmit(); - emit IICS20Transfer.ICS20Acknowledgement( - expectedDefaultSendPacketData, ICS20Lib.SUCCESSFUL_ACKNOWLEDGEMENT_JSON - ); + ics26Router.ackPacket(ackMsg); // commitment should be deleted @@ -499,10 +472,7 @@ contract IntegrationTest is Test { proofAcked: bytes("doesntmatter"), // dummy client will accept proofHeight: IICS02ClientMsgs.Height({ revisionNumber: 1, revisionHeight: 42 }) // dummy client will accept }); - vm.expectEmit(); - emit IICS20Transfer.ICS20Acknowledgement( - expectedDefaultSendPacketData, ICS20Lib.SUCCESSFUL_ACKNOWLEDGEMENT_JSON - ); + ics26Router.ackPacket(ackMsg); // commitment should be deleted @@ -603,9 +573,7 @@ contract IntegrationTest is Test { abi.encodePacked(receivePacket.payloads[0].destPort, "/", receivePacket.destChannel, "/", foreignDenom) ); - address erc20Address; - vm.expectEmit(true, true, true, false); // Not checking data because we don't know the address yet - emit IICS20Transfer.ICS20ReceiveTransfer(receivePacketData, erc20Address); // we check these values later + vm.expectEmit(); emit IICS26Router.WriteAcknowledgement(receivePacket, singleSuccessAck); vm.expectEmit(); @@ -626,19 +594,23 @@ contract IntegrationTest is Test { ); assertEq(storedAck, ICS24Host.packetAcknowledgementCommitmentBytes32(singleSuccessAck)); - // find and extract data from the ICS20ReceiveTransfer event - Vm.Log memory receiveTransferLog = vm.getRecordedLogs()[3]; - assertEq(receiveTransferLog.topics[0], IICS20Transfer.ICS20ReceiveTransfer.selector); + (address erc20Address,) = ics20Transfer.getReceiveERC20AddressAndSource( + receivePacket.payloads[0].sourcePort, + receivePacket.sourceChannel, + receivePacket.payloads[0].destPort, + receivePacket.destChannel, + receivePacketData + ); - ICS20Lib.FungibleTokenPacketData memory eventPacketData; - (eventPacketData, erc20Address) = - abi.decode(receiveTransferLog.data, (ICS20Lib.FungibleTokenPacketData, address)); - assertEq(eventPacketData.denom, foreignDenom); + ICS20Lib.FungibleTokenPacketData memory packetData = + abi.decode(receivePacket.payloads[0].value, (ICS20Lib.FungibleTokenPacketData)); + + assertEq(packetData.denom, foreignDenom); assertNotEq(erc20Address, address(0)); - assertEq(eventPacketData.sender, senderStr); - assertEq(eventPacketData.receiver, receiverStr); - assertEq(eventPacketData.amount, transferAmount); - assertEq(eventPacketData.memo, "memo"); + assertEq(packetData.sender, senderStr); + assertEq(packetData.receiver, receiverStr); + assertEq(packetData.amount, transferAmount); + assertEq(packetData.memo, "memo"); IBCERC20 ibcERC20 = IBCERC20(erc20Address); assertEq(ibcERC20.fullDenomPath(), expectedFullDenomPath); @@ -669,18 +641,6 @@ contract IntegrationTest is Test { memo: "backmemo" }); - vm.expectEmit(); - emit IICS20Transfer.ICS20Transfer( - ICS20Lib.FungibleTokenPacketData({ - denom: expectedFullDenomPath, - sender: senderStr, - receiver: receiverStr, - amount: transferAmount, - memo: "backmemo" - }), - erc20Address - ); - ICS20Lib.FungibleTokenPacketData memory sendPacketData = ICS20Lib.FungibleTokenPacketData({ denom: expectedFullDenomPath, sender: senderStr, @@ -904,15 +864,11 @@ contract IntegrationTest is Test { abi.encodePacked(receivePacket.payloads[0].destPort, "/", receivePacket.destChannel, "/", foreignDenom) ); - address erc20Address; - vm.expectEmit(true, true, true, false); // Not checking data because we don't know the address yet - emit IICS20Transfer.ICS20ReceiveTransfer(receivePacketData, erc20Address); // we check these values later vm.expectEmit(); emit IICS26Router.WriteAcknowledgement(receivePacket, singleSuccessAck); vm.expectEmit(); emit IICS26Router.RecvPacket(receivePacket); - vm.recordLogs(); ics26Router.recvPacket( IICS26RouterMsgs.MsgRecvPacket({ packet: receivePacket, @@ -927,19 +883,23 @@ contract IntegrationTest is Test { ); assertEq(storedAck, ICS24Host.packetAcknowledgementCommitmentBytes32(singleSuccessAck)); - // find and extract data from the ICS20ReceiveTransfer event - Vm.Log memory receiveTransferLog = vm.getRecordedLogs()[3]; - assertEq(receiveTransferLog.topics[0], IICS20Transfer.ICS20ReceiveTransfer.selector); + (address erc20Address,) = ics20Transfer.getReceiveERC20AddressAndSource( + receivePacket.payloads[0].sourcePort, + receivePacket.sourceChannel, + receivePacket.payloads[0].destPort, + receivePacket.destChannel, + receivePacketData + ); + + ICS20Lib.FungibleTokenPacketData memory packetData = + abi.decode(receivePacket.payloads[0].value, (ICS20Lib.FungibleTokenPacketData)); - ICS20Lib.FungibleTokenPacketData memory eventPacketData; - (eventPacketData, erc20Address) = - abi.decode(receiveTransferLog.data, (ICS20Lib.FungibleTokenPacketData, address)); - assertEq(eventPacketData.denom, foreignDenom); + assertEq(packetData.denom, foreignDenom); assertNotEq(erc20Address, address(0)); - assertEq(eventPacketData.sender, senderStr); - assertEq(eventPacketData.receiver, receiverStr); - assertEq(eventPacketData.amount, transferAmount); - assertEq(eventPacketData.memo, "memo"); + assertEq(packetData.sender, senderStr); + assertEq(packetData.receiver, receiverStr); + assertEq(packetData.amount, transferAmount); + assertEq(packetData.memo, "memo"); IBCERC20 ibcERC20 = IBCERC20(erc20Address); assertEq(ibcERC20.fullDenomPath(), expectedFullDenomPath); @@ -970,18 +930,6 @@ contract IntegrationTest is Test { memo: "backmemo" }); - vm.expectEmit(); - emit IICS20Transfer.ICS20Transfer( - ICS20Lib.FungibleTokenPacketData({ - denom: expectedFullDenomPath, - sender: senderStr, - receiver: receiverStr, - amount: transferAmount, - memo: "backmemo" - }), - erc20Address - ); - vm.expectEmit(); ICS20Lib.FungibleTokenPacketData memory sendPacketData = ICS20Lib.FungibleTokenPacketData({ @@ -1058,15 +1006,12 @@ contract IntegrationTest is Test { abi.encodePacked(receivePacket.payloads[0].destPort, "/", receivePacket.destChannel, "/", foreignDenom) ); - address erc20Address; - vm.expectEmit(true, true, true, false); // Not checking data because we don't know the address yet - emit IICS20Transfer.ICS20ReceiveTransfer(receivePacketData, erc20Address); // we check these values later + vm.expectEmit(); emit IICS26Router.WriteAcknowledgement(receivePacket, singleSuccessAck); vm.expectEmit(); emit IICS26Router.RecvPacket(receivePacket); - vm.recordLogs(); ics26Router.recvPacket( IICS26RouterMsgs.MsgRecvPacket({ packet: receivePacket, @@ -1081,19 +1026,23 @@ contract IntegrationTest is Test { ); assertEq(storedAck, ICS24Host.packetAcknowledgementCommitmentBytes32(singleSuccessAck)); - // find and extract data from the ICS20ReceiveTransfer event - Vm.Log memory receiveTransferLog = vm.getRecordedLogs()[3]; - assertEq(receiveTransferLog.topics[0], IICS20Transfer.ICS20ReceiveTransfer.selector); + (address erc20Address,) = ics20Transfer.getReceiveERC20AddressAndSource( + receivePacket.payloads[0].sourcePort, + receivePacket.sourceChannel, + receivePacket.payloads[0].destPort, + receivePacket.destChannel, + receivePacketData + ); + + ICS20Lib.FungibleTokenPacketData memory packetData = + abi.decode(receivePacket.payloads[0].value, (ICS20Lib.FungibleTokenPacketData)); - ICS20Lib.FungibleTokenPacketData memory eventPacketData; - (eventPacketData, erc20Address) = - abi.decode(receiveTransferLog.data, (ICS20Lib.FungibleTokenPacketData, address)); - assertEq(eventPacketData.denom, foreignDenom); + assertEq(packetData.denom, foreignDenom); assertNotEq(erc20Address, address(0)); - assertEq(eventPacketData.sender, senderStr); - assertEq(eventPacketData.receiver, receiverStr); - assertEq(eventPacketData.amount, largeAmount); - assertEq(eventPacketData.memo, ""); + assertEq(packetData.sender, senderStr); + assertEq(packetData.receiver, receiverStr); + assertEq(packetData.amount, largeAmount); + assertEq(packetData.memo, ""); IBCERC20 ibcERC20 = IBCERC20(erc20Address); assertEq(ibcERC20.fullDenomPath(), expectedFullDenomPath); @@ -1124,18 +1073,6 @@ contract IntegrationTest is Test { memo: "" }); - vm.expectEmit(); - emit IICS20Transfer.ICS20Transfer( - ICS20Lib.FungibleTokenPacketData({ - denom: expectedFullDenomPath, - sender: senderStr, - receiver: receiverStr, - amount: largeAmount, - memo: "" - }), - erc20Address - ); - vm.expectEmit(); ICS20Lib.FungibleTokenPacketData memory sendPacketData = ICS20Lib.FungibleTokenPacketData({ @@ -1185,10 +1122,7 @@ contract IntegrationTest is Test { proofAcked: bytes("doesntmatter"), // dummy client will accept proofHeight: IICS02ClientMsgs.Height({ revisionNumber: 1, revisionHeight: 42 }) // dummy client will accept }); - vm.expectEmit(); - emit IICS20Transfer.ICS20Acknowledgement( - expectedDefaultSendPacketData, ICS20Lib.SUCCESSFUL_ACKNOWLEDGEMENT_JSON - ); + ics26Router.ackPacket(ackMsg); // commitment should be deleted @@ -1268,8 +1202,6 @@ contract IntegrationTest is Test { }) ); - vm.expectEmit(); - emit IICS20Transfer.ICS20Transfer(expectedDefaultSendPacketData, address(erc20)); uint32 sequence = ics26Router.sendPacket(msgSendPacket); assertEq(sequence, 1); From 160001c74ea2837f9055d1448fdfbc14b4b26459 Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Thu, 28 Nov 2024 11:07:17 +0100 Subject: [PATCH 02/42] lint --- contracts/ICS20Transfer.sol | 2 -- test/solidity-ibc/ICS20TransferTest.t.sol | 2 +- test/solidity-ibc/IntegrationTest.t.sol | 2 -- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/contracts/ICS20Transfer.sol b/contracts/ICS20Transfer.sol index 47fb00d4..925590d0 100644 --- a/contracts/ICS20Transfer.sol +++ b/contracts/ICS20Transfer.sol @@ -134,7 +134,6 @@ contract ICS20Transfer is IIBCApp, IICS20Transfer, IICS20Errors, Ownable, Reentr getSendERC20AddressAndSource(msg_.payload.sourcePort, msg_.sourceChannel, packetData); _refundTokens(packetData, erc20Address); } - } /// @inheritdoc IIBCApp @@ -143,7 +142,6 @@ contract ICS20Transfer is IIBCApp, IICS20Transfer, IICS20Errors, Ownable, Reentr abi.decode(msg_.payload.value, (ICS20Lib.FungibleTokenPacketData)); (address erc20Address,) = getSendERC20AddressAndSource(msg_.payload.sourcePort, msg_.sourceChannel, packetData); _refundTokens(packetData, erc20Address); - } /// @notice Refund the tokens to the sender diff --git a/test/solidity-ibc/ICS20TransferTest.t.sol b/test/solidity-ibc/ICS20TransferTest.t.sol index e886b5bb..84571a3d 100644 --- a/test/solidity-ibc/ICS20TransferTest.t.sol +++ b/test/solidity-ibc/ICS20TransferTest.t.sol @@ -737,7 +737,7 @@ contract ICS20TransferTest is Test { ); assertEq(ack, ICS20Lib.SUCCESSFUL_ACKNOWLEDGEMENT_JSON); - (address erc20Address,) = ics20Transfer.getReceiveERC20AddressAndSource( + (address erc20Address,) = ics20Transfer.getReceiveERC20AddressAndSource( packet.payloads[0].sourcePort, packet.sourceChannel, packet.payloads[0].destPort, diff --git a/test/solidity-ibc/IntegrationTest.t.sol b/test/solidity-ibc/IntegrationTest.t.sol index fff2796b..cf16d190 100644 --- a/test/solidity-ibc/IntegrationTest.t.sol +++ b/test/solidity-ibc/IntegrationTest.t.sol @@ -573,7 +573,6 @@ contract IntegrationTest is Test { abi.encodePacked(receivePacket.payloads[0].destPort, "/", receivePacket.destChannel, "/", foreignDenom) ); - vm.expectEmit(); emit IICS26Router.WriteAcknowledgement(receivePacket, singleSuccessAck); vm.expectEmit(); @@ -1006,7 +1005,6 @@ contract IntegrationTest is Test { abi.encodePacked(receivePacket.payloads[0].destPort, "/", receivePacket.destChannel, "/", foreignDenom) ); - vm.expectEmit(); emit IICS26Router.WriteAcknowledgement(receivePacket, singleSuccessAck); vm.expectEmit(); From bf3e4f99c67f201ae1f80e4565e55dfb101976f1 Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Thu, 28 Nov 2024 11:37:44 +0100 Subject: [PATCH 03/42] fix lint --- contracts/interfaces/IICS20Transfer.sol | 1 - test/solidity-ibc/ICS20TransferTest.t.sol | 2 +- test/solidity-ibc/IntegrationTest.t.sol | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/contracts/interfaces/IICS20Transfer.sol b/contracts/interfaces/IICS20Transfer.sol index f2a294af..ed0984b4 100644 --- a/contracts/interfaces/IICS20Transfer.sol +++ b/contracts/interfaces/IICS20Transfer.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.28; -import { ICS20Lib } from "../utils/ICS20Lib.sol"; import { IICS20TransferMsgs } from "../msgs/IICS20TransferMsgs.sol"; import { IICS26RouterMsgs } from "../msgs/IICS26RouterMsgs.sol"; diff --git a/test/solidity-ibc/ICS20TransferTest.t.sol b/test/solidity-ibc/ICS20TransferTest.t.sol index 84571a3d..d493d039 100644 --- a/test/solidity-ibc/ICS20TransferTest.t.sol +++ b/test/solidity-ibc/ICS20TransferTest.t.sol @@ -16,7 +16,7 @@ import { IERC20Errors } from "@openzeppelin/interfaces/draft-IERC6093.sol"; import { ICS20Lib } from "../../contracts/utils/ICS20Lib.sol"; import { IICS20Errors } from "../../contracts/errors/IICS20Errors.sol"; import { Strings } from "@openzeppelin/utils/Strings.sol"; -import { Vm } from "forge-std/Vm.sol"; +//import { Vm } from "forge-std/Vm.sol"; import { Ownable } from "@openzeppelin/access/Ownable.sol"; contract ICS20TransferTest is Test { diff --git a/test/solidity-ibc/IntegrationTest.t.sol b/test/solidity-ibc/IntegrationTest.t.sol index cf16d190..f2c887f0 100644 --- a/test/solidity-ibc/IntegrationTest.t.sol +++ b/test/solidity-ibc/IntegrationTest.t.sol @@ -22,7 +22,7 @@ import { ILightClientMsgs } from "../../contracts/msgs/ILightClientMsgs.sol"; import { ICS20Lib } from "../../contracts/utils/ICS20Lib.sol"; import { ICS24Host } from "../../contracts/utils/ICS24Host.sol"; import { Strings } from "@openzeppelin/utils/Strings.sol"; -import { Vm } from "forge-std/Vm.sol"; +//import { Vm } from "forge-std/Vm.sol"; contract IntegrationTest is Test { ICS26Router public ics26Router; From 2e09ae3eaf0273b207f120094e8c2afa0806e234 Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Thu, 28 Nov 2024 13:15:28 +0100 Subject: [PATCH 04/42] del packet and ack commit events --- contracts/interfaces/IIBCStore.sol | 12 ------------ contracts/utils/IBCStore.sol | 2 -- 2 files changed, 14 deletions(-) diff --git a/contracts/interfaces/IIBCStore.sol b/contracts/interfaces/IIBCStore.sol index 4257a76e..2fda8c6b 100644 --- a/contracts/interfaces/IIBCStore.sol +++ b/contracts/interfaces/IIBCStore.sol @@ -36,16 +36,4 @@ interface IIBCStore { /// @param packet The packet to commit the acknowledgement for /// @param acks The list of acknowledgements (one for each payload) to commit function commitPacketAcknowledgement(IICS26RouterMsgs.Packet memory packet, bytes[] memory acks) external; - - // --------------------- Events --------------------- // - - /// @notice Emitted when a packet is committed - /// @param path The commitment path - /// @param commitment The commitment data - event PacketCommitted(bytes32 path, bytes32 commitment); - - /// @notice Emitted when an ack is commmitted - /// @param path The commitment path - /// @param commitment The commitment data - event AckCommitted(bytes32 path, bytes32 commitment); } diff --git a/contracts/utils/IBCStore.sol b/contracts/utils/IBCStore.sol index 25908d96..73c892b2 100644 --- a/contracts/utils/IBCStore.sol +++ b/contracts/utils/IBCStore.sol @@ -44,7 +44,6 @@ contract IBCStore is IIBCStore, IICS24HostErrors, Ownable { bytes32 commitment = ICS24Host.packetCommitmentBytes32(packet); commitments[path] = commitment; - emit PacketCommitted(path, commitment); } /// @inheritdoc IIBCStore @@ -84,7 +83,6 @@ contract IBCStore is IIBCStore, IICS24HostErrors, Ownable { ); bytes32 commitment = ICS24Host.packetAcknowledgementCommitmentBytes32(acks); - emit AckCommitted(path, commitment); commitments[path] = commitment; } } From ba09118f1ac283a30a3ba7d07f4643df3740ea07 Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Thu, 28 Nov 2024 13:24:07 +0100 Subject: [PATCH 05/42] gen abi --- abi/IBCStore.json | 38 --- abi/ICS20Transfer.json | 249 ++++---------- abigen/ics20transfer/contract.go | 562 ++----------------------------- 3 files changed, 93 insertions(+), 756 deletions(-) diff --git a/abi/IBCStore.json b/abi/IBCStore.json index 3ac2e7c5..bc0ada49 100644 --- a/abi/IBCStore.json +++ b/abi/IBCStore.json @@ -360,25 +360,6 @@ "outputs": [], "stateMutability": "nonpayable" }, - { - "type": "event", - "name": "AckCommitted", - "inputs": [ - { - "name": "path", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "commitment", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - } - ], - "anonymous": false - }, { "type": "event", "name": "OwnershipTransferred", @@ -398,25 +379,6 @@ ], "anonymous": false }, - { - "type": "event", - "name": "PacketCommitted", - "inputs": [ - { - "name": "path", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "commitment", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - } - ], - "anonymous": false - }, { "type": "error", "name": "IBCMultiPayloadPacketNotSupported", diff --git a/abi/ICS20Transfer.json b/abi/ICS20Transfer.json index 05a1a578..df16f0fd 100644 --- a/abi/ICS20Transfer.json +++ b/abi/ICS20Transfer.json @@ -23,6 +23,77 @@ ], "stateMutability": "view" }, + { + "type": "function", + "name": "getReceiveERC20AddressAndSource", + "inputs": [ + { + "name": "sourcePort", + "type": "string", + "internalType": "string" + }, + { + "name": "sourceChannel", + "type": "string", + "internalType": "string" + }, + { + "name": "destPort", + "type": "string", + "internalType": "string" + }, + { + "name": "destChannel", + "type": "string", + "internalType": "string" + }, + { + "name": "packetData", + "type": "tuple", + "internalType": "struct ICS20Lib.FungibleTokenPacketData", + "components": [ + { + "name": "denom", + "type": "string", + "internalType": "string" + }, + { + "name": "sender", + "type": "string", + "internalType": "string" + }, + { + "name": "receiver", + "type": "string", + "internalType": "string" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "memo", + "type": "string", + "internalType": "string" + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + }, + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "nonpayable" + }, { "type": "function", "name": "multicall", @@ -515,184 +586,6 @@ "outputs": [], "stateMutability": "nonpayable" }, - { - "type": "event", - "name": "ICS20Acknowledgement", - "inputs": [ - { - "name": "packetData", - "type": "tuple", - "indexed": false, - "internalType": "struct ICS20Lib.FungibleTokenPacketData", - "components": [ - { - "name": "denom", - "type": "string", - "internalType": "string" - }, - { - "name": "sender", - "type": "string", - "internalType": "string" - }, - { - "name": "receiver", - "type": "string", - "internalType": "string" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "memo", - "type": "string", - "internalType": "string" - } - ] - }, - { - "name": "acknowledgement", - "type": "bytes", - "indexed": false, - "internalType": "bytes" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ICS20ReceiveTransfer", - "inputs": [ - { - "name": "packetData", - "type": "tuple", - "indexed": false, - "internalType": "struct ICS20Lib.FungibleTokenPacketData", - "components": [ - { - "name": "denom", - "type": "string", - "internalType": "string" - }, - { - "name": "sender", - "type": "string", - "internalType": "string" - }, - { - "name": "receiver", - "type": "string", - "internalType": "string" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "memo", - "type": "string", - "internalType": "string" - } - ] - }, - { - "name": "erc20Address", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ICS20Timeout", - "inputs": [ - { - "name": "packetData", - "type": "tuple", - "indexed": false, - "internalType": "struct ICS20Lib.FungibleTokenPacketData", - "components": [ - { - "name": "denom", - "type": "string", - "internalType": "string" - }, - { - "name": "sender", - "type": "string", - "internalType": "string" - }, - { - "name": "receiver", - "type": "string", - "internalType": "string" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "memo", - "type": "string", - "internalType": "string" - } - ] - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ICS20Transfer", - "inputs": [ - { - "name": "packetData", - "type": "tuple", - "indexed": false, - "internalType": "struct ICS20Lib.FungibleTokenPacketData", - "components": [ - { - "name": "denom", - "type": "string", - "internalType": "string" - }, - { - "name": "sender", - "type": "string", - "internalType": "string" - }, - { - "name": "receiver", - "type": "string", - "internalType": "string" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "memo", - "type": "string", - "internalType": "string" - } - ] - }, - { - "name": "erc20Address", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, { "type": "event", "name": "OwnershipTransferred", diff --git a/abigen/ics20transfer/contract.go b/abigen/ics20transfer/contract.go index b6fdf5a6..80d7d400 100644 --- a/abigen/ics20transfer/contract.go +++ b/abigen/ics20transfer/contract.go @@ -104,7 +104,7 @@ type IICS26RouterMsgsPayload struct { // ContractMetaData contains all meta data concerning the Contract contract. var ContractMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"escrow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"newMsgSendPacketV1\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgSendPacket\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onAcknowledgementPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnAcknowledgementPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"onSendPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnSendPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendTransfer\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ICS20Acknowledgement\",\"inputs\":[{\"name\":\"packetData\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structICS20Lib.FungibleTokenPacketData\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"acknowledgement\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ICS20ReceiveTransfer\",\"inputs\":[{\"name\":\"packetData\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structICS20Lib.FungibleTokenPacketData\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"erc20Address\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ICS20Timeout\",\"inputs\":[{\"name\":\"packetData\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structICS20Lib.FungibleTokenPacketData\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ICS20Transfer\",\"inputs\":[{\"name\":\"packetData\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structICS20Lib.FungibleTokenPacketData\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"name\":\"erc20Address\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20AbiEncodingFailure\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOutOfBounds\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"end\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOverflow\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20DenomNotFound\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAmount\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnauthorizedPacketSender\",\"inputs\":[{\"name\":\"packetSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedERC20Balance\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20UnsupportedFeature\",\"inputs\":[{\"name\":\"feature\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"escrow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getReceiveERC20AddressAndSource\",\"inputs\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"packetData\",\"type\":\"tuple\",\"internalType\":\"structICS20Lib.FungibleTokenPacketData\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"newMsgSendPacketV1\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgSendPacket\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onAcknowledgementPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnAcknowledgementPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"onSendPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnSendPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendTransfer\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20AbiEncodingFailure\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOutOfBounds\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"end\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOverflow\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20DenomNotFound\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAmount\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnauthorizedPacketSender\",\"inputs\":[{\"name\":\"packetSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedERC20Balance\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20UnsupportedFeature\",\"inputs\":[{\"name\":\"feature\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", } // ContractABI is the input ABI used to generate the binding from. @@ -346,6 +346,27 @@ func (_Contract *ContractCallerSession) Owner() (common.Address, error) { return _Contract.Contract.Owner(&_Contract.CallOpts) } +// GetReceiveERC20AddressAndSource is a paid mutator transaction binding the contract method 0xefc6138f. +// +// Solidity: function getReceiveERC20AddressAndSource(string sourcePort, string sourceChannel, string destPort, string destChannel, (string,string,string,uint256,string) packetData) returns(address, bool) +func (_Contract *ContractTransactor) GetReceiveERC20AddressAndSource(opts *bind.TransactOpts, sourcePort string, sourceChannel string, destPort string, destChannel string, packetData ICS20LibFungibleTokenPacketData) (*types.Transaction, error) { + return _Contract.contract.Transact(opts, "getReceiveERC20AddressAndSource", sourcePort, sourceChannel, destPort, destChannel, packetData) +} + +// GetReceiveERC20AddressAndSource is a paid mutator transaction binding the contract method 0xefc6138f. +// +// Solidity: function getReceiveERC20AddressAndSource(string sourcePort, string sourceChannel, string destPort, string destChannel, (string,string,string,uint256,string) packetData) returns(address, bool) +func (_Contract *ContractSession) GetReceiveERC20AddressAndSource(sourcePort string, sourceChannel string, destPort string, destChannel string, packetData ICS20LibFungibleTokenPacketData) (*types.Transaction, error) { + return _Contract.Contract.GetReceiveERC20AddressAndSource(&_Contract.TransactOpts, sourcePort, sourceChannel, destPort, destChannel, packetData) +} + +// GetReceiveERC20AddressAndSource is a paid mutator transaction binding the contract method 0xefc6138f. +// +// Solidity: function getReceiveERC20AddressAndSource(string sourcePort, string sourceChannel, string destPort, string destChannel, (string,string,string,uint256,string) packetData) returns(address, bool) +func (_Contract *ContractTransactorSession) GetReceiveERC20AddressAndSource(sourcePort string, sourceChannel string, destPort string, destChannel string, packetData ICS20LibFungibleTokenPacketData) (*types.Transaction, error) { + return _Contract.Contract.GetReceiveERC20AddressAndSource(&_Contract.TransactOpts, sourcePort, sourceChannel, destPort, destChannel, packetData) +} + // Multicall is a paid mutator transaction binding the contract method 0xac9650d8. // // Solidity: function multicall(bytes[] data) returns(bytes[] results) @@ -514,545 +535,6 @@ func (_Contract *ContractTransactorSession) TransferOwnership(newOwner common.Ad return _Contract.Contract.TransferOwnership(&_Contract.TransactOpts, newOwner) } -// ContractICS20AcknowledgementIterator is returned from FilterICS20Acknowledgement and is used to iterate over the raw logs and unpacked data for ICS20Acknowledgement events raised by the Contract contract. -type ContractICS20AcknowledgementIterator struct { - Event *ContractICS20Acknowledgement // 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 *ContractICS20AcknowledgementIterator) 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(ContractICS20Acknowledgement) - 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(ContractICS20Acknowledgement) - 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 *ContractICS20AcknowledgementIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ContractICS20AcknowledgementIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ContractICS20Acknowledgement represents a ICS20Acknowledgement event raised by the Contract contract. -type ContractICS20Acknowledgement struct { - PacketData ICS20LibFungibleTokenPacketData - Acknowledgement []byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterICS20Acknowledgement is a free log retrieval operation binding the contract event 0x2d9ff23e169c4db1cf7bcdd6b5f169858488958a9424990e7ed13964abf203e2. -// -// Solidity: event ICS20Acknowledgement((string,string,string,uint256,string) packetData, bytes acknowledgement) -func (_Contract *ContractFilterer) FilterICS20Acknowledgement(opts *bind.FilterOpts) (*ContractICS20AcknowledgementIterator, error) { - - logs, sub, err := _Contract.contract.FilterLogs(opts, "ICS20Acknowledgement") - if err != nil { - return nil, err - } - return &ContractICS20AcknowledgementIterator{contract: _Contract.contract, event: "ICS20Acknowledgement", logs: logs, sub: sub}, nil -} - -// WatchICS20Acknowledgement is a free log subscription operation binding the contract event 0x2d9ff23e169c4db1cf7bcdd6b5f169858488958a9424990e7ed13964abf203e2. -// -// Solidity: event ICS20Acknowledgement((string,string,string,uint256,string) packetData, bytes acknowledgement) -func (_Contract *ContractFilterer) WatchICS20Acknowledgement(opts *bind.WatchOpts, sink chan<- *ContractICS20Acknowledgement) (event.Subscription, error) { - - logs, sub, err := _Contract.contract.WatchLogs(opts, "ICS20Acknowledgement") - 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(ContractICS20Acknowledgement) - if err := _Contract.contract.UnpackLog(event, "ICS20Acknowledgement", 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 -} - -// ParseICS20Acknowledgement is a log parse operation binding the contract event 0x2d9ff23e169c4db1cf7bcdd6b5f169858488958a9424990e7ed13964abf203e2. -// -// Solidity: event ICS20Acknowledgement((string,string,string,uint256,string) packetData, bytes acknowledgement) -func (_Contract *ContractFilterer) ParseICS20Acknowledgement(log types.Log) (*ContractICS20Acknowledgement, error) { - event := new(ContractICS20Acknowledgement) - if err := _Contract.contract.UnpackLog(event, "ICS20Acknowledgement", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ContractICS20ReceiveTransferIterator is returned from FilterICS20ReceiveTransfer and is used to iterate over the raw logs and unpacked data for ICS20ReceiveTransfer events raised by the Contract contract. -type ContractICS20ReceiveTransferIterator struct { - Event *ContractICS20ReceiveTransfer // 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 *ContractICS20ReceiveTransferIterator) 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(ContractICS20ReceiveTransfer) - 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(ContractICS20ReceiveTransfer) - 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 *ContractICS20ReceiveTransferIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ContractICS20ReceiveTransferIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ContractICS20ReceiveTransfer represents a ICS20ReceiveTransfer event raised by the Contract contract. -type ContractICS20ReceiveTransfer struct { - PacketData ICS20LibFungibleTokenPacketData - Erc20Address common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterICS20ReceiveTransfer is a free log retrieval operation binding the contract event 0xfb26937644d13f55c6b5514a5d7b847220adb7a040339128498ed5eecbb2041e. -// -// Solidity: event ICS20ReceiveTransfer((string,string,string,uint256,string) packetData, address erc20Address) -func (_Contract *ContractFilterer) FilterICS20ReceiveTransfer(opts *bind.FilterOpts) (*ContractICS20ReceiveTransferIterator, error) { - - logs, sub, err := _Contract.contract.FilterLogs(opts, "ICS20ReceiveTransfer") - if err != nil { - return nil, err - } - return &ContractICS20ReceiveTransferIterator{contract: _Contract.contract, event: "ICS20ReceiveTransfer", logs: logs, sub: sub}, nil -} - -// WatchICS20ReceiveTransfer is a free log subscription operation binding the contract event 0xfb26937644d13f55c6b5514a5d7b847220adb7a040339128498ed5eecbb2041e. -// -// Solidity: event ICS20ReceiveTransfer((string,string,string,uint256,string) packetData, address erc20Address) -func (_Contract *ContractFilterer) WatchICS20ReceiveTransfer(opts *bind.WatchOpts, sink chan<- *ContractICS20ReceiveTransfer) (event.Subscription, error) { - - logs, sub, err := _Contract.contract.WatchLogs(opts, "ICS20ReceiveTransfer") - 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(ContractICS20ReceiveTransfer) - if err := _Contract.contract.UnpackLog(event, "ICS20ReceiveTransfer", 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 -} - -// ParseICS20ReceiveTransfer is a log parse operation binding the contract event 0xfb26937644d13f55c6b5514a5d7b847220adb7a040339128498ed5eecbb2041e. -// -// Solidity: event ICS20ReceiveTransfer((string,string,string,uint256,string) packetData, address erc20Address) -func (_Contract *ContractFilterer) ParseICS20ReceiveTransfer(log types.Log) (*ContractICS20ReceiveTransfer, error) { - event := new(ContractICS20ReceiveTransfer) - if err := _Contract.contract.UnpackLog(event, "ICS20ReceiveTransfer", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ContractICS20TimeoutIterator is returned from FilterICS20Timeout and is used to iterate over the raw logs and unpacked data for ICS20Timeout events raised by the Contract contract. -type ContractICS20TimeoutIterator struct { - Event *ContractICS20Timeout // 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 *ContractICS20TimeoutIterator) 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(ContractICS20Timeout) - 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(ContractICS20Timeout) - 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 *ContractICS20TimeoutIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ContractICS20TimeoutIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ContractICS20Timeout represents a ICS20Timeout event raised by the Contract contract. -type ContractICS20Timeout struct { - PacketData ICS20LibFungibleTokenPacketData - Raw types.Log // Blockchain specific contextual infos -} - -// FilterICS20Timeout is a free log retrieval operation binding the contract event 0x83623fc1b7ce1cc98499d81b48143f4caa0ed5a2b523ea0f7c55f8a1ecd7f538. -// -// Solidity: event ICS20Timeout((string,string,string,uint256,string) packetData) -func (_Contract *ContractFilterer) FilterICS20Timeout(opts *bind.FilterOpts) (*ContractICS20TimeoutIterator, error) { - - logs, sub, err := _Contract.contract.FilterLogs(opts, "ICS20Timeout") - if err != nil { - return nil, err - } - return &ContractICS20TimeoutIterator{contract: _Contract.contract, event: "ICS20Timeout", logs: logs, sub: sub}, nil -} - -// WatchICS20Timeout is a free log subscription operation binding the contract event 0x83623fc1b7ce1cc98499d81b48143f4caa0ed5a2b523ea0f7c55f8a1ecd7f538. -// -// Solidity: event ICS20Timeout((string,string,string,uint256,string) packetData) -func (_Contract *ContractFilterer) WatchICS20Timeout(opts *bind.WatchOpts, sink chan<- *ContractICS20Timeout) (event.Subscription, error) { - - logs, sub, err := _Contract.contract.WatchLogs(opts, "ICS20Timeout") - 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(ContractICS20Timeout) - if err := _Contract.contract.UnpackLog(event, "ICS20Timeout", 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 -} - -// ParseICS20Timeout is a log parse operation binding the contract event 0x83623fc1b7ce1cc98499d81b48143f4caa0ed5a2b523ea0f7c55f8a1ecd7f538. -// -// Solidity: event ICS20Timeout((string,string,string,uint256,string) packetData) -func (_Contract *ContractFilterer) ParseICS20Timeout(log types.Log) (*ContractICS20Timeout, error) { - event := new(ContractICS20Timeout) - if err := _Contract.contract.UnpackLog(event, "ICS20Timeout", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ContractICS20TransferIterator is returned from FilterICS20Transfer and is used to iterate over the raw logs and unpacked data for ICS20Transfer events raised by the Contract contract. -type ContractICS20TransferIterator struct { - Event *ContractICS20Transfer // 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 *ContractICS20TransferIterator) 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(ContractICS20Transfer) - 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(ContractICS20Transfer) - 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 *ContractICS20TransferIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ContractICS20TransferIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ContractICS20Transfer represents a ICS20Transfer event raised by the Contract contract. -type ContractICS20Transfer struct { - PacketData ICS20LibFungibleTokenPacketData - Erc20Address common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterICS20Transfer is a free log retrieval operation binding the contract event 0x43b836f85c25990ab7090fec6336682b9de14d99a3e955af9df4b9006c7f2e8c. -// -// Solidity: event ICS20Transfer((string,string,string,uint256,string) packetData, address erc20Address) -func (_Contract *ContractFilterer) FilterICS20Transfer(opts *bind.FilterOpts) (*ContractICS20TransferIterator, error) { - - logs, sub, err := _Contract.contract.FilterLogs(opts, "ICS20Transfer") - if err != nil { - return nil, err - } - return &ContractICS20TransferIterator{contract: _Contract.contract, event: "ICS20Transfer", logs: logs, sub: sub}, nil -} - -// WatchICS20Transfer is a free log subscription operation binding the contract event 0x43b836f85c25990ab7090fec6336682b9de14d99a3e955af9df4b9006c7f2e8c. -// -// Solidity: event ICS20Transfer((string,string,string,uint256,string) packetData, address erc20Address) -func (_Contract *ContractFilterer) WatchICS20Transfer(opts *bind.WatchOpts, sink chan<- *ContractICS20Transfer) (event.Subscription, error) { - - logs, sub, err := _Contract.contract.WatchLogs(opts, "ICS20Transfer") - 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(ContractICS20Transfer) - if err := _Contract.contract.UnpackLog(event, "ICS20Transfer", 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 -} - -// ParseICS20Transfer is a log parse operation binding the contract event 0x43b836f85c25990ab7090fec6336682b9de14d99a3e955af9df4b9006c7f2e8c. -// -// Solidity: event ICS20Transfer((string,string,string,uint256,string) packetData, address erc20Address) -func (_Contract *ContractFilterer) ParseICS20Transfer(log types.Log) (*ContractICS20Transfer, error) { - event := new(ContractICS20Transfer) - if err := _Contract.contract.UnpackLog(event, "ICS20Transfer", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // ContractOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the Contract contract. type ContractOwnershipTransferredIterator struct { Event *ContractOwnershipTransferred // Event containing the contract specifics and raw log From 28524a96c85d2f9c5a754c580f8a8857a590353d Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Mon, 2 Dec 2024 15:03:34 +0100 Subject: [PATCH 06/42] rm writeAck event --- contracts/ICS26Router.sol | 2 +- contracts/interfaces/IICS26Router.sol | 4 ---- test/solidity-ibc/IntegrationTest.t.sol | 8 -------- 3 files changed, 1 insertion(+), 13 deletions(-) diff --git a/contracts/ICS26Router.sol b/contracts/ICS26Router.sol index c82a4405..e42e1ef2 100644 --- a/contracts/ICS26Router.sol +++ b/contracts/ICS26Router.sol @@ -287,7 +287,7 @@ contract ICS26Router is IICS26Router, IICS26RouterErrors, Ownable, ReentrancyGua /// @param acks The acknowledgement function writeAcknowledgement(Packet calldata packet, bytes[] memory acks) private { IBC_STORE.commitPacketAcknowledgement(packet, acks); - emit WriteAcknowledgement(packet, acks); + // emit WriteAcknowledgement(packet, acks); } /// @notice No-op if the reason is correct, otherwise reverts with the same reason diff --git a/contracts/interfaces/IICS26Router.sol b/contracts/interfaces/IICS26Router.sol index e4ce8598..5e1ab2a5 100644 --- a/contracts/interfaces/IICS26Router.sol +++ b/contracts/interfaces/IICS26Router.sol @@ -63,10 +63,6 @@ interface IICS26Router is IICS26RouterMsgs { /// @notice Emitted when a packet is received /// @param packet The received packet event RecvPacket(Packet packet); - /// @notice Emitted when a packet acknowledgement is written - /// @param packet The packet that was acknowledged - /// @param acknowledgements The list of acknowledgements data - event WriteAcknowledgement(Packet packet, bytes[] acknowledgements); /// @notice Emitted when a packet is timed out /// @param packet The packet that was timed out event TimeoutPacket(Packet packet); diff --git a/test/solidity-ibc/IntegrationTest.t.sol b/test/solidity-ibc/IntegrationTest.t.sol index f2c887f0..75d14ebd 100644 --- a/test/solidity-ibc/IntegrationTest.t.sol +++ b/test/solidity-ibc/IntegrationTest.t.sol @@ -368,8 +368,6 @@ contract IntegrationTest is Test { payloads: payloads }); - vm.expectEmit(); - emit IICS26Router.WriteAcknowledgement(packet, singleSuccessAck); vm.expectEmit(); emit IICS26Router.RecvPacket(packet); @@ -573,8 +571,6 @@ contract IntegrationTest is Test { abi.encodePacked(receivePacket.payloads[0].destPort, "/", receivePacket.destChannel, "/", foreignDenom) ); - vm.expectEmit(); - emit IICS26Router.WriteAcknowledgement(receivePacket, singleSuccessAck); vm.expectEmit(); emit IICS26Router.RecvPacket(receivePacket); @@ -863,8 +859,6 @@ contract IntegrationTest is Test { abi.encodePacked(receivePacket.payloads[0].destPort, "/", receivePacket.destChannel, "/", foreignDenom) ); - vm.expectEmit(); - emit IICS26Router.WriteAcknowledgement(receivePacket, singleSuccessAck); vm.expectEmit(); emit IICS26Router.RecvPacket(receivePacket); @@ -1005,8 +999,6 @@ contract IntegrationTest is Test { abi.encodePacked(receivePacket.payloads[0].destPort, "/", receivePacket.destChannel, "/", foreignDenom) ); - vm.expectEmit(); - emit IICS26Router.WriteAcknowledgement(receivePacket, singleSuccessAck); vm.expectEmit(); emit IICS26Router.RecvPacket(receivePacket); From 1d7d3c89103b1607d048895d6bd857dc5cb4a089 Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Mon, 2 Dec 2024 15:11:00 +0100 Subject: [PATCH 07/42] lint --- contracts/ICS26Router.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/ICS26Router.sol b/contracts/ICS26Router.sol index e42e1ef2..56f5414b 100644 --- a/contracts/ICS26Router.sol +++ b/contracts/ICS26Router.sol @@ -287,7 +287,7 @@ contract ICS26Router is IICS26Router, IICS26RouterErrors, Ownable, ReentrancyGua /// @param acks The acknowledgement function writeAcknowledgement(Packet calldata packet, bytes[] memory acks) private { IBC_STORE.commitPacketAcknowledgement(packet, acks); - // emit WriteAcknowledgement(packet, acks); + // emit WriteAcknowledgement(packet, acks); } /// @notice No-op if the reason is correct, otherwise reverts with the same reason From 24d1ea82e5f68fbc217efdb69d4b2a1e6841f939 Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Mon, 2 Dec 2024 15:11:58 +0100 Subject: [PATCH 08/42] generate abi --- abi/ICS26Router.json | 73 ------------------ abigen/ics26router/contract.go | 137 +-------------------------------- 2 files changed, 1 insertion(+), 209 deletions(-) diff --git a/abi/ICS26Router.json b/abi/ICS26Router.json index a99e2ef2..ab1c1de5 100644 --- a/abi/ICS26Router.json +++ b/abi/ICS26Router.json @@ -812,79 +812,6 @@ ], "anonymous": false }, - { - "type": "event", - "name": "WriteAcknowledgement", - "inputs": [ - { - "name": "packet", - "type": "tuple", - "indexed": false, - "internalType": "struct IICS26RouterMsgs.Packet", - "components": [ - { - "name": "sequence", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "sourceChannel", - "type": "string", - "internalType": "string" - }, - { - "name": "destChannel", - "type": "string", - "internalType": "string" - }, - { - "name": "timeoutTimestamp", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "payloads", - "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": "acknowledgements", - "type": "bytes[]", - "indexed": false, - "internalType": "bytes[]" - } - ], - "anonymous": false - }, { "type": "error", "name": "AddressEmptyCode", diff --git a/abigen/ics26router/contract.go b/abigen/ics26router/contract.go index be988077..df037e98 100644 --- a/abigen/ics26router/contract.go +++ b/abigen/ics26router/contract.go @@ -84,7 +84,7 @@ type IICS26RouterMsgsPayload struct { // ContractMetaData contains all meta data concerning the Contract contract. var ContractMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"IBC_STORE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIIBCStore\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ICS02_CLIENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIICS02Client\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ICS04_CHANNEL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIICS04Channel\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ackPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgAckPacket\",\"components\":[{\"name\":\"packet\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\":\"proofAcked\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"proofHeight\",\"type\":\"tuple\",\"internalType\":\"structIICS02ClientMsgs.Height\",\"components\":[{\"name\":\"revisionNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"revisionHeight\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addIBCApp\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"app\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getIBCApp\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIIBCApp\"}],\"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\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recvPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgRecvPacket\",\"components\":[{\"name\":\"packet\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\":\"proofCommitment\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"proofHeight\",\"type\":\"tuple\",\"internalType\":\"structIICS02ClientMsgs.Height\",\"components\":[{\"name\":\"revisionNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"revisionHeight\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgSendPacket\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"timeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgTimeoutPacket\",\"components\":[{\"name\":\"packet\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\":\"proofTimeout\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"proofHeight\",\"type\":\"tuple\",\"internalType\":\"structIICS02ClientMsgs.Height\",\"components\":[{\"name\":\"revisionNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"revisionHeight\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AckPacket\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"IBCAppAdded\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"app\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Noop\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RecvPacket\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SendPacket\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TimeoutPacket\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WriteAcknowledgement\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\":\"acknowledgements\",\"type\":\"bytes[]\",\"indexed\":false,\"internalType\":\"bytes[]\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IBCAppNotFound\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"IBCAsyncAcknowledgementNotSupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IBCInvalidCounterparty\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"IBCInvalidPortIdentifier\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"IBCInvalidTimeoutTimestamp\",\"inputs\":[{\"name\":\"timeoutTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"comparedTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"IBCMultiPayloadPacketNotSupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IBCPacketCommitmentMismatch\",\"inputs\":[{\"name\":\"expected\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actual\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"IBCPortAlreadyExists\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"InvalidMerklePrefix\",\"inputs\":[{\"name\":\"prefix\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"IBC_STORE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIIBCStore\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ICS02_CLIENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIICS02Client\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ICS04_CHANNEL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIICS04Channel\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ackPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgAckPacket\",\"components\":[{\"name\":\"packet\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\":\"proofAcked\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"proofHeight\",\"type\":\"tuple\",\"internalType\":\"structIICS02ClientMsgs.Height\",\"components\":[{\"name\":\"revisionNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"revisionHeight\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addIBCApp\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"app\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getIBCApp\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIIBCApp\"}],\"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\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recvPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgRecvPacket\",\"components\":[{\"name\":\"packet\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\":\"proofCommitment\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"proofHeight\",\"type\":\"tuple\",\"internalType\":\"structIICS02ClientMsgs.Height\",\"components\":[{\"name\":\"revisionNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"revisionHeight\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgSendPacket\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"timeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgTimeoutPacket\",\"components\":[{\"name\":\"packet\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\":\"proofTimeout\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"proofHeight\",\"type\":\"tuple\",\"internalType\":\"structIICS02ClientMsgs.Height\",\"components\":[{\"name\":\"revisionNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"revisionHeight\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AckPacket\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"IBCAppAdded\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"app\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Noop\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RecvPacket\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SendPacket\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TimeoutPacket\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IBCAppNotFound\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"IBCAsyncAcknowledgementNotSupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IBCInvalidCounterparty\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"IBCInvalidPortIdentifier\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"IBCInvalidTimeoutTimestamp\",\"inputs\":[{\"name\":\"timeoutTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"comparedTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"IBCMultiPayloadPacketNotSupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IBCPacketCommitmentMismatch\",\"inputs\":[{\"name\":\"expected\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actual\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"IBCPortAlreadyExists\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"InvalidMerklePrefix\",\"inputs\":[{\"name\":\"prefix\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", } // ContractABI is the input ABI used to generate the binding from. @@ -1513,138 +1513,3 @@ func (_Contract *ContractFilterer) ParseTimeoutPacket(log types.Log) (*ContractT event.Raw = log return event, nil } - -// ContractWriteAcknowledgementIterator is returned from FilterWriteAcknowledgement and is used to iterate over the raw logs and unpacked data for WriteAcknowledgement events raised by the Contract contract. -type ContractWriteAcknowledgementIterator struct { - Event *ContractWriteAcknowledgement // 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 *ContractWriteAcknowledgementIterator) 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(ContractWriteAcknowledgement) - 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(ContractWriteAcknowledgement) - 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 *ContractWriteAcknowledgementIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ContractWriteAcknowledgementIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ContractWriteAcknowledgement represents a WriteAcknowledgement event raised by the Contract contract. -type ContractWriteAcknowledgement struct { - Packet IICS26RouterMsgsPacket - Acknowledgements [][]byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterWriteAcknowledgement is a free log retrieval operation binding the contract event 0xeb848660d4b0bfa6fb3ead10e7aceb8e4ea5248d40e97d531ce57a804f605b5f. -// -// Solidity: event WriteAcknowledgement((uint32,string,string,uint64,(string,string,string,string,bytes)[]) packet, bytes[] acknowledgements) -func (_Contract *ContractFilterer) FilterWriteAcknowledgement(opts *bind.FilterOpts) (*ContractWriteAcknowledgementIterator, error) { - - logs, sub, err := _Contract.contract.FilterLogs(opts, "WriteAcknowledgement") - if err != nil { - return nil, err - } - return &ContractWriteAcknowledgementIterator{contract: _Contract.contract, event: "WriteAcknowledgement", logs: logs, sub: sub}, nil -} - -// WatchWriteAcknowledgement is a free log subscription operation binding the contract event 0xeb848660d4b0bfa6fb3ead10e7aceb8e4ea5248d40e97d531ce57a804f605b5f. -// -// Solidity: event WriteAcknowledgement((uint32,string,string,uint64,(string,string,string,string,bytes)[]) packet, bytes[] acknowledgements) -func (_Contract *ContractFilterer) WatchWriteAcknowledgement(opts *bind.WatchOpts, sink chan<- *ContractWriteAcknowledgement) (event.Subscription, error) { - - logs, sub, err := _Contract.contract.WatchLogs(opts, "WriteAcknowledgement") - 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(ContractWriteAcknowledgement) - if err := _Contract.contract.UnpackLog(event, "WriteAcknowledgement", 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 -} - -// ParseWriteAcknowledgement is a log parse operation binding the contract event 0xeb848660d4b0bfa6fb3ead10e7aceb8e4ea5248d40e97d531ce57a804f605b5f. -// -// Solidity: event WriteAcknowledgement((uint32,string,string,uint64,(string,string,string,string,bytes)[]) packet, bytes[] acknowledgements) -func (_Contract *ContractFilterer) ParseWriteAcknowledgement(log types.Log) (*ContractWriteAcknowledgement, error) { - event := new(ContractWriteAcknowledgement) - if err := _Contract.contract.UnpackLog(event, "WriteAcknowledgement", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} From dbe5e011b2d2776469d0dfd7649047355ef7624d Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Mon, 2 Dec 2024 15:22:31 +0100 Subject: [PATCH 09/42] fix lint --- test/solidity-ibc/ICS20TransferTest.t.sol | 1 - test/solidity-ibc/IntegrationTest.t.sol | 1 - 2 files changed, 2 deletions(-) diff --git a/test/solidity-ibc/ICS20TransferTest.t.sol b/test/solidity-ibc/ICS20TransferTest.t.sol index d493d039..a565b2ef 100644 --- a/test/solidity-ibc/ICS20TransferTest.t.sol +++ b/test/solidity-ibc/ICS20TransferTest.t.sol @@ -7,7 +7,6 @@ import { Test } from "forge-std/Test.sol"; import { IICS26RouterMsgs } from "../../contracts/msgs/IICS26RouterMsgs.sol"; import { IICS26Router } from "../../contracts/interfaces/IICS26Router.sol"; import { IIBCAppCallbacks } from "../../contracts/msgs/IIBCAppCallbacks.sol"; -import { IICS20Transfer } from "../../contracts/interfaces/IICS20Transfer.sol"; import { IICS20TransferMsgs } from "../../contracts/msgs/IICS20TransferMsgs.sol"; import { ICS20Transfer } from "../../contracts/ICS20Transfer.sol"; import { TestERC20, MalfunctioningERC20 } from "./mocks/TestERC20.sol"; diff --git a/test/solidity-ibc/IntegrationTest.t.sol b/test/solidity-ibc/IntegrationTest.t.sol index 75d14ebd..24102d9e 100644 --- a/test/solidity-ibc/IntegrationTest.t.sol +++ b/test/solidity-ibc/IntegrationTest.t.sol @@ -7,7 +7,6 @@ import { Test } from "forge-std/Test.sol"; import { IICS02ClientMsgs } from "../../contracts/msgs/IICS02ClientMsgs.sol"; import { IICS04ChannelMsgs } from "../../contracts/msgs/IICS04ChannelMsgs.sol"; import { ICS20Transfer } from "../../contracts/ICS20Transfer.sol"; -import { IICS20Transfer } from "../../contracts/interfaces/IICS20Transfer.sol"; import { IICS20TransferMsgs } from "../../contracts/msgs/IICS20TransferMsgs.sol"; import { TestERC20 } from "./mocks/TestERC20.sol"; import { IBCERC20 } from "../../contracts/utils/IBCERC20.sol"; From 41182ee80750dc6dbd0e48045191e9ce2ef1da69 Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Mon, 2 Dec 2024 15:45:27 +0100 Subject: [PATCH 10/42] readd writeAck event --- contracts/ICS26Router.sol | 2 +- contracts/interfaces/IICS26Router.sol | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/contracts/ICS26Router.sol b/contracts/ICS26Router.sol index 56f5414b..c82a4405 100644 --- a/contracts/ICS26Router.sol +++ b/contracts/ICS26Router.sol @@ -287,7 +287,7 @@ contract ICS26Router is IICS26Router, IICS26RouterErrors, Ownable, ReentrancyGua /// @param acks The acknowledgement function writeAcknowledgement(Packet calldata packet, bytes[] memory acks) private { IBC_STORE.commitPacketAcknowledgement(packet, acks); - // emit WriteAcknowledgement(packet, acks); + emit WriteAcknowledgement(packet, acks); } /// @notice No-op if the reason is correct, otherwise reverts with the same reason diff --git a/contracts/interfaces/IICS26Router.sol b/contracts/interfaces/IICS26Router.sol index 5e1ab2a5..e4ce8598 100644 --- a/contracts/interfaces/IICS26Router.sol +++ b/contracts/interfaces/IICS26Router.sol @@ -63,6 +63,10 @@ interface IICS26Router is IICS26RouterMsgs { /// @notice Emitted when a packet is received /// @param packet The received packet event RecvPacket(Packet packet); + /// @notice Emitted when a packet acknowledgement is written + /// @param packet The packet that was acknowledged + /// @param acknowledgements The list of acknowledgements data + event WriteAcknowledgement(Packet packet, bytes[] acknowledgements); /// @notice Emitted when a packet is timed out /// @param packet The packet that was timed out event TimeoutPacket(Packet packet); From bcdceb653b06bae6e4fe371b4f4df741ea584cae Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Mon, 2 Dec 2024 15:45:48 +0100 Subject: [PATCH 11/42] fix e2e test --- e2e/interchaintestv8/ibc_eureka_test.go | 57 +++++++++++++------------ 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/e2e/interchaintestv8/ibc_eureka_test.go b/e2e/interchaintestv8/ibc_eureka_test.go index a9aeef99..f754f0b5 100644 --- a/e2e/interchaintestv8/ibc_eureka_test.go +++ b/e2e/interchaintestv8/ibc_eureka_test.go @@ -381,15 +381,15 @@ func (s *IbcEurekaTestSuite) ICS20TransferERC20TokenfromEthereumToCosmosAndBackT s.Require().Equal(ethtypes.ReceiptStatusSuccessful, receipt.Status) s.T().Logf("Multicall send %d transfers gas used: %d", numOfTransfers, receipt.GasUsed) sendBlockNumber = receipt.BlockNumber.Int64() - - transferEvent, err := e2esuite.GetEvmEvent(receipt, s.ics20Contract.ParseICS20Transfer) - s.Require().NoError(err) - s.Require().Equal(s.contractAddresses.Erc20, strings.ToLower(transferEvent.Erc20Address.Hex())) - s.Require().Equal(transferAmount, transferEvent.PacketData.Amount) // converted from erc20 amount to sdk coin amount - s.Require().Equal(strings.ToLower(ethereumUserAddress.Hex()), strings.ToLower(transferEvent.PacketData.Sender)) - s.Require().Equal(cosmosUserAddress, transferEvent.PacketData.Receiver) - s.Require().Equal("", transferEvent.PacketData.Memo) - + /* + transferEvent, err := e2esuite.GetEvmEvent(receipt, s.ics20Contract.ParseICS20Transfer) + s.Require().NoError(err) + s.Require().Equal(s.contractAddresses.Erc20, strings.ToLower(transferEvent.Erc20Address.Hex())) + s.Require().Equal(transferAmount, transferEvent.PacketData.Amount) // converted from erc20 amount to sdk coin amount + s.Require().Equal(strings.ToLower(ethereumUserAddress.Hex()), strings.ToLower(transferEvent.PacketData.Sender)) + s.Require().Equal(cosmosUserAddress, transferEvent.PacketData.Receiver) + s.Require().Equal("", transferEvent.PacketData.Memo) + */ sendPacketEvent, err := e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseSendPacket) s.Require().NoError(err) sendPacket = sendPacketEvent.Packet @@ -611,7 +611,7 @@ func (s *IbcEurekaTestSuite) ICS20TransferERC20TokenfromEthereumToCosmosAndBackT })) var recvBlockNumber int64 - var returnWriteAckEvent *ics26router.ContractWriteAcknowledgement + //var returnWriteAckEvent *ics26router.ContractWriteAcknowledgement s.Require().True(s.Run(fmt.Sprintf("Receive %d packets on Ethereum", numOfTransfers), func() { proofPaths := make([][]byte, numOfTransfers) for i := 0; i < numOfTransfers; i++ { @@ -667,19 +667,20 @@ func (s *IbcEurekaTestSuite) ICS20TransferERC20TokenfromEthereumToCosmosAndBackT )) } - returnWriteAckEvent, err = e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseWriteAcknowledgement) - s.Require().NoError(err) - - receiveEvent, err := e2esuite.GetEvmEvent(receipt, s.ics20Contract.ParseICS20ReceiveTransfer) - s.Require().NoError(err) - ethReceiveData := receiveEvent.PacketData - s.Require().Equal(denomOnCosmos.Path(), ethReceiveData.Denom) - s.Require().Equal(s.contractAddresses.Erc20, strings.ToLower(receiveEvent.Erc20Address.Hex())) - s.Require().Equal(cosmosUserAddress, ethReceiveData.Sender) - s.Require().Equal(strings.ToLower(ethereumUserAddress.Hex()), ethReceiveData.Receiver) - s.Require().Equal(transferAmount, ethReceiveData.Amount) // the amount transferred the user on the evm side is converted, but the packet doesn't change - s.Require().Equal("", ethReceiveData.Memo) - + //returnWriteAckEvent, err = e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseWriteAcknowledgement) + //s.Require().NoError(err) + + //receiveEvent, err := e2esuite.GetEvmEvent(receipt, s.ics20Contract.ParseICS20ReceiveTransfer) + //s.Require().NoError(err) + //ethReceiveData := receiveEvent.PacketData + /* + s.Require().Equal(denomOnCosmos.Path(), ethReceiveData.Denom) + s.Require().Equal(s.contractAddresses.Erc20, strings.ToLower(receiveEvent.Erc20Address.Hex())) + s.Require().Equal(cosmosUserAddress, ethReceiveData.Sender) + s.Require().Equal(strings.ToLower(ethereumUserAddress.Hex()), ethReceiveData.Receiver) + s.Require().Equal(transferAmount, ethReceiveData.Amount) // the amount transferred the user on the evm side is converted, but the packet doesn't change + s.Require().Equal("", ethReceiveData.Memo) + */ s.True(s.Run("Verify balances on Ethereum", func() { // User balance should be back to the starting point userBalance, err := s.erc20Contract.BalanceOf(nil, ethereumUserAddress) @@ -823,7 +824,7 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest })) })) - var ethReceiveAckEvent *ics26router.ContractWriteAcknowledgement + //var ethReceiveAckEvent *ics26router.ContractWriteAcknowledgement var ethReceiveTransferPacket ics20transfer.ICS20LibFungibleTokenPacketData var denomOnEthereum transfertypes.Denom var ibcERC20 *ibcerc20.Contract @@ -864,10 +865,10 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest s.Require().NoError(types.GenerateAndSaveFixture(fmt.Sprintf("receiveNativePacket-%s.json", pt.String()), s.contractAddresses.Erc20, "recvPacket", msg, packet)) } - ethReceiveAckEvent, err = e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseWriteAcknowledgement) - s.Require().NoError(err) - ethReceiveTransferEvent, err := e2esuite.GetEvmEvent(receipt, s.ics20Contract.ParseICS20ReceiveTransfer) - s.Require().NoError(err) + //ethReceiveAckEvent, err = e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseWriteAcknowledgement) + //s.Require().NoError(err) + //ethReceiveTransferEvent, err := e2esuite.GetEvmEvent(receipt, s.ics20Contract.ParseICS20ReceiveTransfer) + //s.Require().NoError(err) ethClient, err := ethclient.Dial(eth.RPC) s.Require().NoError(err) From d73cda71236f4d9391dd9ff6942f6eef8e538e88 Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Mon, 2 Dec 2024 15:47:07 +0100 Subject: [PATCH 12/42] abi gen --- abi/ICS26Router.json | 73 ++++++++++++++++++ abigen/ics26router/contract.go | 137 ++++++++++++++++++++++++++++++++- 2 files changed, 209 insertions(+), 1 deletion(-) diff --git a/abi/ICS26Router.json b/abi/ICS26Router.json index ab1c1de5..a99e2ef2 100644 --- a/abi/ICS26Router.json +++ b/abi/ICS26Router.json @@ -812,6 +812,79 @@ ], "anonymous": false }, + { + "type": "event", + "name": "WriteAcknowledgement", + "inputs": [ + { + "name": "packet", + "type": "tuple", + "indexed": false, + "internalType": "struct IICS26RouterMsgs.Packet", + "components": [ + { + "name": "sequence", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "sourceChannel", + "type": "string", + "internalType": "string" + }, + { + "name": "destChannel", + "type": "string", + "internalType": "string" + }, + { + "name": "timeoutTimestamp", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "payloads", + "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": "acknowledgements", + "type": "bytes[]", + "indexed": false, + "internalType": "bytes[]" + } + ], + "anonymous": false + }, { "type": "error", "name": "AddressEmptyCode", diff --git a/abigen/ics26router/contract.go b/abigen/ics26router/contract.go index df037e98..be988077 100644 --- a/abigen/ics26router/contract.go +++ b/abigen/ics26router/contract.go @@ -84,7 +84,7 @@ type IICS26RouterMsgsPayload struct { // ContractMetaData contains all meta data concerning the Contract contract. var ContractMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"IBC_STORE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIIBCStore\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ICS02_CLIENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIICS02Client\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ICS04_CHANNEL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIICS04Channel\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ackPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgAckPacket\",\"components\":[{\"name\":\"packet\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\":\"proofAcked\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"proofHeight\",\"type\":\"tuple\",\"internalType\":\"structIICS02ClientMsgs.Height\",\"components\":[{\"name\":\"revisionNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"revisionHeight\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addIBCApp\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"app\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getIBCApp\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIIBCApp\"}],\"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\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recvPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgRecvPacket\",\"components\":[{\"name\":\"packet\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\":\"proofCommitment\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"proofHeight\",\"type\":\"tuple\",\"internalType\":\"structIICS02ClientMsgs.Height\",\"components\":[{\"name\":\"revisionNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"revisionHeight\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgSendPacket\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"timeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgTimeoutPacket\",\"components\":[{\"name\":\"packet\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\":\"proofTimeout\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"proofHeight\",\"type\":\"tuple\",\"internalType\":\"structIICS02ClientMsgs.Height\",\"components\":[{\"name\":\"revisionNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"revisionHeight\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AckPacket\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"IBCAppAdded\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"app\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Noop\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RecvPacket\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SendPacket\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TimeoutPacket\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IBCAppNotFound\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"IBCAsyncAcknowledgementNotSupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IBCInvalidCounterparty\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"IBCInvalidPortIdentifier\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"IBCInvalidTimeoutTimestamp\",\"inputs\":[{\"name\":\"timeoutTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"comparedTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"IBCMultiPayloadPacketNotSupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IBCPacketCommitmentMismatch\",\"inputs\":[{\"name\":\"expected\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actual\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"IBCPortAlreadyExists\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"InvalidMerklePrefix\",\"inputs\":[{\"name\":\"prefix\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"IBC_STORE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIIBCStore\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ICS02_CLIENT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIICS02Client\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ICS04_CHANNEL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIICS04Channel\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ackPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgAckPacket\",\"components\":[{\"name\":\"packet\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\":\"proofAcked\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"proofHeight\",\"type\":\"tuple\",\"internalType\":\"structIICS02ClientMsgs.Height\",\"components\":[{\"name\":\"revisionNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"revisionHeight\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addIBCApp\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"app\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getIBCApp\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIIBCApp\"}],\"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\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recvPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgRecvPacket\",\"components\":[{\"name\":\"packet\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\":\"proofCommitment\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"proofHeight\",\"type\":\"tuple\",\"internalType\":\"structIICS02ClientMsgs.Height\",\"components\":[{\"name\":\"revisionNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"revisionHeight\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgSendPacket\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"timeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgTimeoutPacket\",\"components\":[{\"name\":\"packet\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\":\"proofTimeout\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"proofHeight\",\"type\":\"tuple\",\"internalType\":\"structIICS02ClientMsgs.Height\",\"components\":[{\"name\":\"revisionNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"revisionHeight\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AckPacket\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"IBCAppAdded\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"app\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Noop\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RecvPacket\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SendPacket\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TimeoutPacket\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WriteAcknowledgement\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\":\"acknowledgements\",\"type\":\"bytes[]\",\"indexed\":false,\"internalType\":\"bytes[]\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IBCAppNotFound\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"IBCAsyncAcknowledgementNotSupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IBCInvalidCounterparty\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"actual\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"IBCInvalidPortIdentifier\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"IBCInvalidTimeoutTimestamp\",\"inputs\":[{\"name\":\"timeoutTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"comparedTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"IBCMultiPayloadPacketNotSupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IBCPacketCommitmentMismatch\",\"inputs\":[{\"name\":\"expected\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actual\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"IBCPortAlreadyExists\",\"inputs\":[{\"name\":\"portId\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"InvalidMerklePrefix\",\"inputs\":[{\"name\":\"prefix\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", } // ContractABI is the input ABI used to generate the binding from. @@ -1513,3 +1513,138 @@ func (_Contract *ContractFilterer) ParseTimeoutPacket(log types.Log) (*ContractT event.Raw = log return event, nil } + +// ContractWriteAcknowledgementIterator is returned from FilterWriteAcknowledgement and is used to iterate over the raw logs and unpacked data for WriteAcknowledgement events raised by the Contract contract. +type ContractWriteAcknowledgementIterator struct { + Event *ContractWriteAcknowledgement // 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 *ContractWriteAcknowledgementIterator) 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(ContractWriteAcknowledgement) + 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(ContractWriteAcknowledgement) + 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 *ContractWriteAcknowledgementIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ContractWriteAcknowledgementIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ContractWriteAcknowledgement represents a WriteAcknowledgement event raised by the Contract contract. +type ContractWriteAcknowledgement struct { + Packet IICS26RouterMsgsPacket + Acknowledgements [][]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterWriteAcknowledgement is a free log retrieval operation binding the contract event 0xeb848660d4b0bfa6fb3ead10e7aceb8e4ea5248d40e97d531ce57a804f605b5f. +// +// Solidity: event WriteAcknowledgement((uint32,string,string,uint64,(string,string,string,string,bytes)[]) packet, bytes[] acknowledgements) +func (_Contract *ContractFilterer) FilterWriteAcknowledgement(opts *bind.FilterOpts) (*ContractWriteAcknowledgementIterator, error) { + + logs, sub, err := _Contract.contract.FilterLogs(opts, "WriteAcknowledgement") + if err != nil { + return nil, err + } + return &ContractWriteAcknowledgementIterator{contract: _Contract.contract, event: "WriteAcknowledgement", logs: logs, sub: sub}, nil +} + +// WatchWriteAcknowledgement is a free log subscription operation binding the contract event 0xeb848660d4b0bfa6fb3ead10e7aceb8e4ea5248d40e97d531ce57a804f605b5f. +// +// Solidity: event WriteAcknowledgement((uint32,string,string,uint64,(string,string,string,string,bytes)[]) packet, bytes[] acknowledgements) +func (_Contract *ContractFilterer) WatchWriteAcknowledgement(opts *bind.WatchOpts, sink chan<- *ContractWriteAcknowledgement) (event.Subscription, error) { + + logs, sub, err := _Contract.contract.WatchLogs(opts, "WriteAcknowledgement") + 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(ContractWriteAcknowledgement) + if err := _Contract.contract.UnpackLog(event, "WriteAcknowledgement", 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 +} + +// ParseWriteAcknowledgement is a log parse operation binding the contract event 0xeb848660d4b0bfa6fb3ead10e7aceb8e4ea5248d40e97d531ce57a804f605b5f. +// +// Solidity: event WriteAcknowledgement((uint32,string,string,uint64,(string,string,string,string,bytes)[]) packet, bytes[] acknowledgements) +func (_Contract *ContractFilterer) ParseWriteAcknowledgement(log types.Log) (*ContractWriteAcknowledgement, error) { + event := new(ContractWriteAcknowledgement) + if err := _Contract.contract.UnpackLog(event, "WriteAcknowledgement", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} From 0b4e84e9b54a5767416cd57ac4d2e6aa333a418f Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Tue, 3 Dec 2024 11:28:44 +0100 Subject: [PATCH 13/42] ty fix e2e --- e2e/interchaintestv8/ibc_eureka_test.go | 100 ++++++++++++------------ 1 file changed, 52 insertions(+), 48 deletions(-) diff --git a/e2e/interchaintestv8/ibc_eureka_test.go b/e2e/interchaintestv8/ibc_eureka_test.go index f754f0b5..4d17c676 100644 --- a/e2e/interchaintestv8/ibc_eureka_test.go +++ b/e2e/interchaintestv8/ibc_eureka_test.go @@ -611,7 +611,7 @@ func (s *IbcEurekaTestSuite) ICS20TransferERC20TokenfromEthereumToCosmosAndBackT })) var recvBlockNumber int64 - //var returnWriteAckEvent *ics26router.ContractWriteAcknowledgement + var returnWriteAckEvent *ics26router.ContractWriteAcknowledgement s.Require().True(s.Run(fmt.Sprintf("Receive %d packets on Ethereum", numOfTransfers), func() { proofPaths := make([][]byte, numOfTransfers) for i := 0; i < numOfTransfers; i++ { @@ -667,8 +667,8 @@ func (s *IbcEurekaTestSuite) ICS20TransferERC20TokenfromEthereumToCosmosAndBackT )) } - //returnWriteAckEvent, err = e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseWriteAcknowledgement) - //s.Require().NoError(err) + returnWriteAckEvent, err = e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseWriteAcknowledgement) + s.Require().NoError(err) //receiveEvent, err := e2esuite.GetEvmEvent(receipt, s.ics20Contract.ParseICS20ReceiveTransfer) //s.Require().NoError(err) @@ -824,9 +824,9 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest })) })) - //var ethReceiveAckEvent *ics26router.ContractWriteAcknowledgement - var ethReceiveTransferPacket ics20transfer.ICS20LibFungibleTokenPacketData - var denomOnEthereum transfertypes.Denom + var ethReceiveAckEvent *ics26router.ContractWriteAcknowledgement + //var ethReceiveTransferPacket ics20transfer.ICS20LibFungibleTokenPacketData + //var denomOnEthereum transfertypes.Denom var ibcERC20 *ibcerc20.Contract var ibcERC20Address string var recvBlockNumber int64 @@ -865,38 +865,41 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest s.Require().NoError(types.GenerateAndSaveFixture(fmt.Sprintf("receiveNativePacket-%s.json", pt.String()), s.contractAddresses.Erc20, "recvPacket", msg, packet)) } - //ethReceiveAckEvent, err = e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseWriteAcknowledgement) - //s.Require().NoError(err) - //ethReceiveTransferEvent, err := e2esuite.GetEvmEvent(receipt, s.ics20Contract.ParseICS20ReceiveTransfer) - //s.Require().NoError(err) - - ethClient, err := ethclient.Dial(eth.RPC) - s.Require().NoError(err) - ibcERC20, err = ibcerc20.NewContract(ethReceiveTransferEvent.Erc20Address, ethClient) + ethReceiveAckEvent, err = e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseWriteAcknowledgement) s.Require().NoError(err) + /* + ethReceiveTransferEvent, err := e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseRecvPacket) + s.Require().NoError(err) - ibcERC20Address = strings.ToLower(ethReceiveTransferEvent.Erc20Address.Hex()) + // Extract Payload from packet in the recv event. From there use it - denomOnEthereum = transfertypes.NewDenom(transferCoin.Denom, transfertypes.NewHop(sendPacket.Payloads[0].DestinationPort, sendPacket.DestinationChannel)) - actualDenom, err := ibcERC20.Name(nil) - s.Require().NoError(err) - s.Require().Equal(denomOnEthereum.IBCDenom(), actualDenom) + ethClient, err := ethclient.Dial(eth.RPC) + s.Require().NoError(err) + ibcERC20, err = ibcerc20.NewContract(ethReceiveTransferEvent.Packet.Payloads[0].denom, ethClient) + s.Require().NoError(err) - actualBaseDenom, err := ibcERC20.Symbol(nil) - s.Require().NoError(err) - s.Require().Equal(transferCoin.Denom, actualBaseDenom) + ibcERC20Address = strings.ToLower(ethReceiveTransferEvent.Erc20Address.Hex()) - actualFullDenom, err := ibcERC20.FullDenomPath(nil) - s.Require().NoError(err) - s.Require().Equal(denomOnEthereum.Path(), actualFullDenom) + denomOnEthereum = transfertypes.NewDenom(transferCoin.Denom, transfertypes.NewHop(sendPacket.Payloads[0].DestinationPort, sendPacket.DestinationChannel)) + actualDenom, err := ibcERC20.Name(nil) + s.Require().NoError(err) + s.Require().Equal(denomOnEthereum.IBCDenom(), actualDenom) - ethReceiveTransferPacket = ethReceiveTransferEvent.PacketData - s.Require().Equal(transferCoin.Denom, ethReceiveTransferPacket.Denom) - s.Require().Equal(transferAmount, ethReceiveTransferPacket.Amount) - s.Require().Equal(cosmosUserAddress, ethReceiveTransferPacket.Sender) - s.Require().Equal(strings.ToLower(ethereumUserAddress.Hex()), strings.ToLower(ethReceiveTransferPacket.Receiver)) - s.Require().Equal(sendMemo, ethReceiveTransferPacket.Memo) + actualBaseDenom, err := ibcERC20.Symbol(nil) + s.Require().NoError(err) + s.Require().Equal(transferCoin.Denom, actualBaseDenom) + actualFullDenom, err := ibcERC20.FullDenomPath(nil) + s.Require().NoError(err) + s.Require().Equal(denomOnEthereum.Path(), actualFullDenom) + + ethReceiveTransferPacket = ethReceiveTransferEvent.PacketData + s.Require().Equal(transferCoin.Denom, ethReceiveTransferPacket.Denom) + s.Require().Equal(transferAmount, ethReceiveTransferPacket.Amount) + s.Require().Equal(cosmosUserAddress, ethReceiveTransferPacket.Sender) + s.Require().Equal(strings.ToLower(ethereumUserAddress.Hex()), strings.ToLower(ethReceiveTransferPacket.Receiver)) + s.Require().Equal(sendMemo, ethReceiveTransferPacket.Memo) + */ s.True(s.Run("Verify balances on Ethereum", func() { // User balance on Ethereum userBalance, err := ibcERC20.BalanceOf(nil, ethereumUserAddress) @@ -963,15 +966,15 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest s.Require().Equal(ethtypes.ReceiptStatusSuccessful, receipt.Status) sendBlockNumber = receipt.BlockNumber.Int64() - - transferEvent, err := e2esuite.GetEvmEvent(receipt, s.ics20Contract.ParseICS20Transfer) - s.Require().NoError(err) - s.Require().Equal(denomOnEthereum.Path(), transferEvent.PacketData.Denom) - s.Require().Equal(transferAmount, transferEvent.PacketData.Amount) - s.Require().Equal(strings.ToLower(ethereumUserAddress.Hex()), strings.ToLower(transferEvent.PacketData.Sender)) - s.Require().Equal(cosmosUserAddress, transferEvent.PacketData.Receiver) - s.Require().Equal(returnMemo, transferEvent.PacketData.Memo) - + /* + transferEvent, err := e2esuite.GetEvmEvent(receipt, s.ics20Contract.ParseICS20Transfer) + s.Require().NoError(err) + s.Require().Equal(denomOnEthereum.Path(), transferEvent.PacketData.Denom) + s.Require().Equal(transferAmount, transferEvent.PacketData.Amount) + s.Require().Equal(strings.ToLower(ethereumUserAddress.Hex()), strings.ToLower(transferEvent.PacketData.Sender)) + s.Require().Equal(cosmosUserAddress, transferEvent.PacketData.Receiver) + s.Require().Equal(returnMemo, transferEvent.PacketData.Memo) + */ sendPacketEvent, err := e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseSendPacket) s.Require().NoError(err) returnPacket = sendPacketEvent.Packet @@ -1119,14 +1122,15 @@ func (s *IbcEurekaTestSuite) ICS20TransferTimeoutFromEthereumToCosmosChainTest(c receipt := s.GetTxReciept(ctx, eth, tx.Hash()) s.Require().Equal(ethtypes.ReceiptStatusSuccessful, receipt.Status) - transferEvent, err := e2esuite.GetEvmEvent(receipt, s.ics20Contract.ParseICS20Transfer) - s.Require().NoError(err) - s.Require().Equal(s.contractAddresses.Erc20, strings.ToLower(transferEvent.Erc20Address.Hex())) - s.Require().Equal(testvalues.TransferAmount, transferEvent.PacketData.Amount.Int64()) // Because the amount is converted to the sdk amount - s.Require().Equal(strings.ToLower(ethereumUserAddress.Hex()), strings.ToLower(transferEvent.PacketData.Sender)) - s.Require().Equal(cosmosUserAddress, transferEvent.PacketData.Receiver) - s.Require().Equal("testmemo", transferEvent.PacketData.Memo) - + /* + transferEvent, err := e2esuite.GetEvmEvent(receipt, s.ics20Contract.ParseICS20Transfer) + s.Require().NoError(err) + s.Require().Equal(s.contractAddresses.Erc20, strings.ToLower(transferEvent.Erc20Address.Hex())) + s.Require().Equal(testvalues.TransferAmount, transferEvent.PacketData.Amount.Int64()) // Because the amount is converted to the sdk amount + s.Require().Equal(strings.ToLower(ethereumUserAddress.Hex()), strings.ToLower(transferEvent.PacketData.Sender)) + s.Require().Equal(cosmosUserAddress, transferEvent.PacketData.Receiver) + s.Require().Equal("testmemo", transferEvent.PacketData.Memo) + */ sendPacketEvent, err := e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseSendPacket) s.Require().NoError(err) packet = sendPacketEvent.Packet From 04c04eba7b299655f0bdefeb8a96a5bb8f48eed0 Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Tue, 3 Dec 2024 12:50:11 +0100 Subject: [PATCH 14/42] fix e2e attempt --- abi/ICS20Transfer.json | 19 ++++++++++++ abigen/ics20transfer/contract.go | 33 +++++++++++++++++++- contracts/ICS20Transfer.sol | 2 +- e2e/interchaintestv8/ibc_eureka_test.go | 41 ++++++++++++++++++------- 4 files changed, 82 insertions(+), 13 deletions(-) diff --git a/abi/ICS20Transfer.json b/abi/ICS20Transfer.json index df16f0fd..12cf1802 100644 --- a/abi/ICS20Transfer.json +++ b/abi/ICS20Transfer.json @@ -10,6 +10,25 @@ ], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "_ibcDenomContracts", + "inputs": [ + { + "name": "denom", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "ibcERC20Contract", + "type": "address", + "internalType": "contract IBCERC20" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "escrow", diff --git a/abigen/ics20transfer/contract.go b/abigen/ics20transfer/contract.go index 80d7d400..f8606ccf 100644 --- a/abigen/ics20transfer/contract.go +++ b/abigen/ics20transfer/contract.go @@ -104,7 +104,7 @@ type IICS26RouterMsgsPayload struct { // ContractMetaData contains all meta data concerning the Contract contract. var ContractMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"escrow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getReceiveERC20AddressAndSource\",\"inputs\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"packetData\",\"type\":\"tuple\",\"internalType\":\"structICS20Lib.FungibleTokenPacketData\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"newMsgSendPacketV1\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgSendPacket\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onAcknowledgementPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnAcknowledgementPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"onSendPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnSendPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendTransfer\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20AbiEncodingFailure\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOutOfBounds\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"end\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOverflow\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20DenomNotFound\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAmount\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnauthorizedPacketSender\",\"inputs\":[{\"name\":\"packetSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedERC20Balance\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20UnsupportedFeature\",\"inputs\":[{\"name\":\"feature\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"_ibcDenomContracts\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"ibcERC20Contract\",\"type\":\"address\",\"internalType\":\"contractIBCERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"escrow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getReceiveERC20AddressAndSource\",\"inputs\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"packetData\",\"type\":\"tuple\",\"internalType\":\"structICS20Lib.FungibleTokenPacketData\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"newMsgSendPacketV1\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgSendPacket\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onAcknowledgementPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnAcknowledgementPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"onSendPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnSendPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendTransfer\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20AbiEncodingFailure\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOutOfBounds\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"end\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOverflow\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20DenomNotFound\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAmount\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnauthorizedPacketSender\",\"inputs\":[{\"name\":\"packetSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedERC20Balance\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20UnsupportedFeature\",\"inputs\":[{\"name\":\"feature\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", } // ContractABI is the input ABI used to generate the binding from. @@ -253,6 +253,37 @@ func (_Contract *ContractTransactorRaw) Transact(opts *bind.TransactOpts, method return _Contract.Contract.contract.Transact(opts, method, params...) } +// IbcDenomContracts is a free data retrieval call binding the contract method 0x5914c1c9. +// +// Solidity: function _ibcDenomContracts(string denom) view returns(address ibcERC20Contract) +func (_Contract *ContractCaller) IbcDenomContracts(opts *bind.CallOpts, denom string) (common.Address, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "_ibcDenomContracts", denom) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// IbcDenomContracts is a free data retrieval call binding the contract method 0x5914c1c9. +// +// Solidity: function _ibcDenomContracts(string denom) view returns(address ibcERC20Contract) +func (_Contract *ContractSession) IbcDenomContracts(denom string) (common.Address, error) { + return _Contract.Contract.IbcDenomContracts(&_Contract.CallOpts, denom) +} + +// IbcDenomContracts is a free data retrieval call binding the contract method 0x5914c1c9. +// +// Solidity: function _ibcDenomContracts(string denom) view returns(address ibcERC20Contract) +func (_Contract *ContractCallerSession) IbcDenomContracts(denom string) (common.Address, error) { + return _Contract.Contract.IbcDenomContracts(&_Contract.CallOpts, denom) +} + // Escrow is a free data retrieval call binding the contract method 0xe2fdcc17. // // Solidity: function escrow() view returns(address) diff --git a/contracts/ICS20Transfer.sol b/contracts/ICS20Transfer.sol index 925590d0..98c22e9c 100644 --- a/contracts/ICS20Transfer.sol +++ b/contracts/ICS20Transfer.sol @@ -27,7 +27,7 @@ contract ICS20Transfer is IIBCApp, IICS20Transfer, IICS20Errors, Ownable, Reentr /// @notice The escrow contract address IEscrow private immutable ESCROW; /// @notice Mapping of non-native denoms to their respective IBCERC20 contracts created here - mapping(string denom => IBCERC20 ibcERC20Contract) private _ibcDenomContracts; + mapping(string denom => IBCERC20 ibcERC20Contract) public _ibcDenomContracts; /// @param owner_ The owner of the contract constructor(address owner_) Ownable(owner_) { diff --git a/e2e/interchaintestv8/ibc_eureka_test.go b/e2e/interchaintestv8/ibc_eureka_test.go index 4d17c676..0edd0343 100644 --- a/e2e/interchaintestv8/ibc_eureka_test.go +++ b/e2e/interchaintestv8/ibc_eureka_test.go @@ -826,7 +826,7 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest var ethReceiveAckEvent *ics26router.ContractWriteAcknowledgement //var ethReceiveTransferPacket ics20transfer.ICS20LibFungibleTokenPacketData - //var denomOnEthereum transfertypes.Denom + var denomOnEthereum transfertypes.Denom var ibcERC20 *ibcerc20.Contract var ibcERC20Address string var recvBlockNumber int64 @@ -867,6 +867,29 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest ethReceiveAckEvent, err = e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseWriteAcknowledgement) s.Require().NoError(err) + + packetData, err := transfertypes.DecodeABIFungibleTokenPacketData(sendPacket.Payloads[0].Value) + + // Prepare the transaction options + opts := s.GetTransactOpts(s.key) + + erc20Address, _ := s.ics20Contract.GetReceiveERC20AddressAndSource( + opts, + sendPacket.Payloads[0].SourcePort, + sendPacket.SourceChannel, + sendPacket.Payloads[0].DestinationPort, + sendPacket.DestinationChannel, + ics20transfer.ICS20LibFungibleTokenPacketData{ + Denom: packetData.Denom, + Amount: transferCoin.Amount.BigInt(), + Sender: packetData.Sender, + Receiver: packetData.Receiver, + Memo: packetData.Memo, + }, + ) + s.Require().NoError(err) + s.Require().NotNil(erc20Address) + /* ethReceiveTransferEvent, err := e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseRecvPacket) s.Require().NoError(err) @@ -880,10 +903,6 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest ibcERC20Address = strings.ToLower(ethReceiveTransferEvent.Erc20Address.Hex()) - denomOnEthereum = transfertypes.NewDenom(transferCoin.Denom, transfertypes.NewHop(sendPacket.Payloads[0].DestinationPort, sendPacket.DestinationChannel)) - actualDenom, err := ibcERC20.Name(nil) - s.Require().NoError(err) - s.Require().Equal(denomOnEthereum.IBCDenom(), actualDenom) actualBaseDenom, err := ibcERC20.Symbol(nil) s.Require().NoError(err) @@ -902,9 +921,9 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest */ s.True(s.Run("Verify balances on Ethereum", func() { // User balance on Ethereum - userBalance, err := ibcERC20.BalanceOf(nil, ethereumUserAddress) - s.Require().NoError(err) - s.Require().Equal(transferAmount, userBalance) + //userBalance, err := erc20Address.BalanceOf(nil, ethereumUserAddress) + //s.Require().NoError(err) + //s.Require().Equal(transferAmount, userBalance) // ICS20 contract balance on Ethereum ics20TransferBalance, err := ibcERC20.BalanceOf(nil, ics20Address) @@ -988,9 +1007,9 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest s.Require().Equal(transfertypes.EncodingABI, returnPacket.Payloads[0].Encoding) s.True(s.Run("Verify balances on Ethereum", func() { - userBalance, err := ibcERC20.BalanceOf(nil, ethereumUserAddress) - s.Require().NoError(err) - s.Require().Equal(int64(0), userBalance.Int64()) + //userBalance, err := ibcERC20.BalanceOf(nil, ethereumUserAddress) + //s.Require().NoError(err) + //s.Require().Equal(int64(0), userBalance.Int64()) // the whole balance should have been burned ics20TransferBalance, err := ibcERC20.BalanceOf(nil, ics20Address) From 14aec612782edfe9e506e66abae499e05c919da4 Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Tue, 3 Dec 2024 12:51:59 +0100 Subject: [PATCH 15/42] fix lint --- e2e/interchaintestv8/ibc_eureka_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/interchaintestv8/ibc_eureka_test.go b/e2e/interchaintestv8/ibc_eureka_test.go index 0edd0343..ecea166c 100644 --- a/e2e/interchaintestv8/ibc_eureka_test.go +++ b/e2e/interchaintestv8/ibc_eureka_test.go @@ -826,7 +826,7 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest var ethReceiveAckEvent *ics26router.ContractWriteAcknowledgement //var ethReceiveTransferPacket ics20transfer.ICS20LibFungibleTokenPacketData - var denomOnEthereum transfertypes.Denom + //var denomOnEthereum transfertypes.Denom var ibcERC20 *ibcerc20.Contract var ibcERC20Address string var recvBlockNumber int64 From fde820b2dbcfcef430229e4a3b66846915c2c22d Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Tue, 3 Dec 2024 13:38:13 +0100 Subject: [PATCH 16/42] mod nativeCosmos test --- e2e/interchaintestv8/ibc_eureka_test.go | 86 +++++++++---------------- 1 file changed, 32 insertions(+), 54 deletions(-) diff --git a/e2e/interchaintestv8/ibc_eureka_test.go b/e2e/interchaintestv8/ibc_eureka_test.go index ecea166c..9509b40a 100644 --- a/e2e/interchaintestv8/ibc_eureka_test.go +++ b/e2e/interchaintestv8/ibc_eureka_test.go @@ -17,13 +17,13 @@ import ( "github.com/cosmos/solidity-ibc-eureka/abigen/ics20transfer" "github.com/cosmos/solidity-ibc-eureka/abigen/ics26router" "github.com/cosmos/solidity-ibc-eureka/abigen/icscore" - "github.com/stretchr/testify/suite" - "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" ethcommon "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" + "github.com/stretchr/testify/suite" sdkmath "cosmossdk.io/math" @@ -381,15 +381,7 @@ func (s *IbcEurekaTestSuite) ICS20TransferERC20TokenfromEthereumToCosmosAndBackT s.Require().Equal(ethtypes.ReceiptStatusSuccessful, receipt.Status) s.T().Logf("Multicall send %d transfers gas used: %d", numOfTransfers, receipt.GasUsed) sendBlockNumber = receipt.BlockNumber.Int64() - /* - transferEvent, err := e2esuite.GetEvmEvent(receipt, s.ics20Contract.ParseICS20Transfer) - s.Require().NoError(err) - s.Require().Equal(s.contractAddresses.Erc20, strings.ToLower(transferEvent.Erc20Address.Hex())) - s.Require().Equal(transferAmount, transferEvent.PacketData.Amount) // converted from erc20 amount to sdk coin amount - s.Require().Equal(strings.ToLower(ethereumUserAddress.Hex()), strings.ToLower(transferEvent.PacketData.Sender)) - s.Require().Equal(cosmosUserAddress, transferEvent.PacketData.Receiver) - s.Require().Equal("", transferEvent.PacketData.Memo) - */ + sendPacketEvent, err := e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseSendPacket) s.Require().NoError(err) sendPacket = sendPacketEvent.Packet @@ -670,17 +662,6 @@ func (s *IbcEurekaTestSuite) ICS20TransferERC20TokenfromEthereumToCosmosAndBackT returnWriteAckEvent, err = e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseWriteAcknowledgement) s.Require().NoError(err) - //receiveEvent, err := e2esuite.GetEvmEvent(receipt, s.ics20Contract.ParseICS20ReceiveTransfer) - //s.Require().NoError(err) - //ethReceiveData := receiveEvent.PacketData - /* - s.Require().Equal(denomOnCosmos.Path(), ethReceiveData.Denom) - s.Require().Equal(s.contractAddresses.Erc20, strings.ToLower(receiveEvent.Erc20Address.Hex())) - s.Require().Equal(cosmosUserAddress, ethReceiveData.Sender) - s.Require().Equal(strings.ToLower(ethereumUserAddress.Hex()), ethReceiveData.Receiver) - s.Require().Equal(transferAmount, ethReceiveData.Amount) // the amount transferred the user on the evm side is converted, but the packet doesn't change - s.Require().Equal("", ethReceiveData.Memo) - */ s.True(s.Run("Verify balances on Ethereum", func() { // User balance should be back to the starting point userBalance, err := s.erc20Contract.BalanceOf(nil, ethereumUserAddress) @@ -825,8 +806,9 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest })) var ethReceiveAckEvent *ics26router.ContractWriteAcknowledgement - //var ethReceiveTransferPacket ics20transfer.ICS20LibFungibleTokenPacketData - //var denomOnEthereum transfertypes.Denom + + // var denomOnEthereum transfertypes.Denom + var ibcERC20 *ibcerc20.Contract var ibcERC20Address string var recvBlockNumber int64 @@ -871,9 +853,14 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest packetData, err := transfertypes.DecodeABIFungibleTokenPacketData(sendPacket.Payloads[0].Value) // Prepare the transaction options - opts := s.GetTransactOpts(s.key) - - erc20Address, _ := s.ics20Contract.GetReceiveERC20AddressAndSource( + // opts := s.GetTransactOpts(s.key) + // Create call options for a read-only operation + callOpts := &bind.CallOpts{ + Context: context.Background(), + From: ics20Address, // Replace with the appropriate Ethereum address + } + erc20Address, err := s.ics20Contract.IbcDenomContracts(callOpts, packetData.Denom) + /* denomOnEthereum, _ := s.ics20Contract.GetReceiveERC20AddressAndSource( opts, sendPacket.Payloads[0].SourcePort, sendPacket.SourceChannel, @@ -886,44 +873,35 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest Receiver: packetData.Receiver, Memo: packetData.Memo, }, - ) + ) */ s.Require().NoError(err) s.Require().NotNil(erc20Address) - /* - ethReceiveTransferEvent, err := e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseRecvPacket) - s.Require().NoError(err) - - // Extract Payload from packet in the recv event. From there use it + // ethReceiveTransferEvent, err := e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseRecvPacket) + // s.Require().NoError(err) - ethClient, err := ethclient.Dial(eth.RPC) - s.Require().NoError(err) - ibcERC20, err = ibcerc20.NewContract(ethReceiveTransferEvent.Packet.Payloads[0].denom, ethClient) - s.Require().NoError(err) + // Extract Payload from packet in the recv event. From there use it - ibcERC20Address = strings.ToLower(ethReceiveTransferEvent.Erc20Address.Hex()) + ethClient, err := ethclient.Dial(eth.RPC) + s.Require().NoError(err) + ibcERC20, err = ibcerc20.NewContract(erc20Address, ethClient) + s.Require().NoError(err) + ibcERC20Address = strings.ToLower(erc20Address.Hex()) - actualBaseDenom, err := ibcERC20.Symbol(nil) - s.Require().NoError(err) - s.Require().Equal(transferCoin.Denom, actualBaseDenom) + actualBaseDenom, err := ibcERC20.Symbol(nil) + s.Require().NoError(err) + s.Require().Equal(transferCoin.Denom, actualBaseDenom) - actualFullDenom, err := ibcERC20.FullDenomPath(nil) - s.Require().NoError(err) - s.Require().Equal(denomOnEthereum.Path(), actualFullDenom) + // actualFullDenom, err := ibcERC20.FullDenomPath(nil) + // s.Require().NoError(err) + // s.Require().Equal(denomOnEthereum.Path(), actualFullDenom) - ethReceiveTransferPacket = ethReceiveTransferEvent.PacketData - s.Require().Equal(transferCoin.Denom, ethReceiveTransferPacket.Denom) - s.Require().Equal(transferAmount, ethReceiveTransferPacket.Amount) - s.Require().Equal(cosmosUserAddress, ethReceiveTransferPacket.Sender) - s.Require().Equal(strings.ToLower(ethereumUserAddress.Hex()), strings.ToLower(ethReceiveTransferPacket.Receiver)) - s.Require().Equal(sendMemo, ethReceiveTransferPacket.Memo) - */ s.True(s.Run("Verify balances on Ethereum", func() { // User balance on Ethereum - //userBalance, err := erc20Address.BalanceOf(nil, ethereumUserAddress) - //s.Require().NoError(err) - //s.Require().Equal(transferAmount, userBalance) + userBalance, err := ibcERC20.BalanceOf(nil, ethereumUserAddress) + s.Require().NoError(err) + s.Require().Equal(transferAmount, userBalance) // ICS20 contract balance on Ethereum ics20TransferBalance, err := ibcERC20.BalanceOf(nil, ics20Address) From 3d75bd3fdff6b1013ecf85abf370d395bce53d7c Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Tue, 3 Dec 2024 14:03:53 +0100 Subject: [PATCH 17/42] fix nativeCoin e2e --- e2e/interchaintestv8/ibc_eureka_test.go | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/e2e/interchaintestv8/ibc_eureka_test.go b/e2e/interchaintestv8/ibc_eureka_test.go index 9509b40a..60e110fe 100644 --- a/e2e/interchaintestv8/ibc_eureka_test.go +++ b/e2e/interchaintestv8/ibc_eureka_test.go @@ -850,16 +850,15 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest ethReceiveAckEvent, err = e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseWriteAcknowledgement) s.Require().NoError(err) - packetData, err := transfertypes.DecodeABIFungibleTokenPacketData(sendPacket.Payloads[0].Value) + packetData, _ := transfertypes.DecodeABIFungibleTokenPacketData(sendPacket.Payloads[0].Value) // Prepare the transaction options // opts := s.GetTransactOpts(s.key) // Create call options for a read-only operation callOpts := &bind.CallOpts{ Context: context.Background(), - From: ics20Address, // Replace with the appropriate Ethereum address } - erc20Address, err := s.ics20Contract.IbcDenomContracts(callOpts, packetData.Denom) + erc20Address, _ := s.ics20Contract.IbcDenomContracts(callOpts, packetData.Denom) /* denomOnEthereum, _ := s.ics20Contract.GetReceiveERC20AddressAndSource( opts, sendPacket.Payloads[0].SourcePort, @@ -874,7 +873,6 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest Memo: packetData.Memo, }, ) */ - s.Require().NoError(err) s.Require().NotNil(erc20Address) // ethReceiveTransferEvent, err := e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseRecvPacket) @@ -963,15 +961,7 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest s.Require().Equal(ethtypes.ReceiptStatusSuccessful, receipt.Status) sendBlockNumber = receipt.BlockNumber.Int64() - /* - transferEvent, err := e2esuite.GetEvmEvent(receipt, s.ics20Contract.ParseICS20Transfer) - s.Require().NoError(err) - s.Require().Equal(denomOnEthereum.Path(), transferEvent.PacketData.Denom) - s.Require().Equal(transferAmount, transferEvent.PacketData.Amount) - s.Require().Equal(strings.ToLower(ethereumUserAddress.Hex()), strings.ToLower(transferEvent.PacketData.Sender)) - s.Require().Equal(cosmosUserAddress, transferEvent.PacketData.Receiver) - s.Require().Equal(returnMemo, transferEvent.PacketData.Memo) - */ + sendPacketEvent, err := e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseSendPacket) s.Require().NoError(err) returnPacket = sendPacketEvent.Packet @@ -985,9 +975,9 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest s.Require().Equal(transfertypes.EncodingABI, returnPacket.Payloads[0].Encoding) s.True(s.Run("Verify balances on Ethereum", func() { - //userBalance, err := ibcERC20.BalanceOf(nil, ethereumUserAddress) - //s.Require().NoError(err) - //s.Require().Equal(int64(0), userBalance.Int64()) + // userBalance, err := ibcERC20.BalanceOf(nil, ethereumUserAddress) + // s.Require().NoError(err) + // s.Require().Equal(int64(0), userBalance.Int64()) // the whole balance should have been burned ics20TransferBalance, err := ibcERC20.BalanceOf(nil, ics20Address) From 3e9e8c2deefd798d8fef44ed8370a99247402e5c Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Tue, 3 Dec 2024 14:47:30 +0100 Subject: [PATCH 18/42] e2e --- e2e/interchaintestv8/ibc_eureka_test.go | 44 ++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/e2e/interchaintestv8/ibc_eureka_test.go b/e2e/interchaintestv8/ibc_eureka_test.go index 60e110fe..4ca6a8ad 100644 --- a/e2e/interchaintestv8/ibc_eureka_test.go +++ b/e2e/interchaintestv8/ibc_eureka_test.go @@ -17,16 +17,19 @@ import ( "github.com/cosmos/solidity-ibc-eureka/abigen/ics20transfer" "github.com/cosmos/solidity-ibc-eureka/abigen/ics26router" "github.com/cosmos/solidity-ibc-eureka/abigen/icscore" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" ethcommon "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" + "github.com/stretchr/testify/suite" sdkmath "cosmossdk.io/math" - sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" @@ -39,8 +42,6 @@ import ( ibcexported "github.com/cosmos/ibc-go/v9/modules/core/exported" ibctesting "github.com/cosmos/ibc-go/v9/testing" - "github.com/strangelove-ventures/interchaintest/v8/chain/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" @@ -49,6 +50,7 @@ import ( "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/types/erc20" ethereumligthclient "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/types/ethereumlightclient" "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/types/sp1ics07tendermint" + "github.com/strangelove-ventures/interchaintest/v8/chain/cosmos" ) // IbcEurekaTestSuite is a suite of tests that wraps TestSuite @@ -217,6 +219,17 @@ func (s *IbcEurekaTestSuite) SetupSuite(ctx context.Context, proofType operator. })) } +func ExtractContractAddress(client *ethclient.Client, txHash common.Hash) (common.Address, error) { + // Get the transaction receipt + receipt, err := client.TransactionReceipt(context.Background(), txHash) + if err != nil { + return common.Address{}, err + } + + // Return the contract address + return receipt.ContractAddress, nil +} + func (s *IbcEurekaTestSuite) TestDeploy_Groth16() { ctx := context.Background() s.DeployTest(ctx, operator.ProofTypeGroth16) @@ -855,10 +868,31 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest // Prepare the transaction options // opts := s.GetTransactOpts(s.key) // Create call options for a read-only operation - callOpts := &bind.CallOpts{ + callOpts := &bind.TransactOpts{ Context: context.Background(), } - erc20Address, _ := s.ics20Contract.IbcDenomContracts(callOpts, packetData.Denom) + + // Replace with the transaction hash of interest + + tx_h, _ := s.ics20Contract.GetReceiveERC20AddressAndSource(callOpts, + sendPacket.Payloads[0].SourcePort, + sendPacket.SourceChannel, + sendPacket.Payloads[0].DestinationPort, + sendPacket.DestinationChannel, + ics20transfer.ICS20LibFungibleTokenPacketData{ + Denom: packetData.Denom, + Amount: transferCoin.Amount.BigInt(), + Sender: packetData.Sender, + Receiver: packetData.Receiver, + Memo: packetData.Memo, + }, + ) + + txHash := common.HexToHash(tx_h.Hash().String()) + client, err := ethclient.Dial(eth.RPC) + erc20Address, err := ExtractContractAddress(client, txHash) + + //IbcDenomContracts(callOpts, packetData.Denom) /* denomOnEthereum, _ := s.ics20Contract.GetReceiveERC20AddressAndSource( opts, sendPacket.Payloads[0].SourcePort, From 235374765ddd283dcb8d604e562409de64fc5050 Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Tue, 3 Dec 2024 15:12:36 +0100 Subject: [PATCH 19/42] fix attempt --- e2e/interchaintestv8/ibc_eureka_test.go | 82 +++---------------------- 1 file changed, 7 insertions(+), 75 deletions(-) diff --git a/e2e/interchaintestv8/ibc_eureka_test.go b/e2e/interchaintestv8/ibc_eureka_test.go index 4ca6a8ad..faa53173 100644 --- a/e2e/interchaintestv8/ibc_eureka_test.go +++ b/e2e/interchaintestv8/ibc_eureka_test.go @@ -18,10 +18,8 @@ import ( "github.com/cosmos/solidity-ibc-eureka/abigen/ics26router" "github.com/cosmos/solidity-ibc-eureka/abigen/icscore" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" ethcommon "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" @@ -863,80 +861,14 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest ethReceiveAckEvent, err = e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseWriteAcknowledgement) s.Require().NoError(err) - packetData, _ := transfertypes.DecodeABIFungibleTokenPacketData(sendPacket.Payloads[0].Value) - - // Prepare the transaction options - // opts := s.GetTransactOpts(s.key) - // Create call options for a read-only operation - callOpts := &bind.TransactOpts{ - Context: context.Background(), - } - - // Replace with the transaction hash of interest - - tx_h, _ := s.ics20Contract.GetReceiveERC20AddressAndSource(callOpts, - sendPacket.Payloads[0].SourcePort, - sendPacket.SourceChannel, - sendPacket.Payloads[0].DestinationPort, - sendPacket.DestinationChannel, - ics20transfer.ICS20LibFungibleTokenPacketData{ - Denom: packetData.Denom, - Amount: transferCoin.Amount.BigInt(), - Sender: packetData.Sender, - Receiver: packetData.Receiver, - Memo: packetData.Memo, - }, - ) - - txHash := common.HexToHash(tx_h.Hash().String()) - client, err := ethclient.Dial(eth.RPC) - erc20Address, err := ExtractContractAddress(client, txHash) - - //IbcDenomContracts(callOpts, packetData.Denom) - /* denomOnEthereum, _ := s.ics20Contract.GetReceiveERC20AddressAndSource( - opts, - sendPacket.Payloads[0].SourcePort, - sendPacket.SourceChannel, - sendPacket.Payloads[0].DestinationPort, - sendPacket.DestinationChannel, - ics20transfer.ICS20LibFungibleTokenPacketData{ - Denom: packetData.Denom, - Amount: transferCoin.Amount.BigInt(), - Sender: packetData.Sender, - Receiver: packetData.Receiver, - Memo: packetData.Memo, - }, - ) */ - s.Require().NotNil(erc20Address) - - // ethReceiveTransferEvent, err := e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseRecvPacket) - // s.Require().NoError(err) - - // Extract Payload from packet in the recv event. From there use it - - ethClient, err := ethclient.Dial(eth.RPC) - s.Require().NoError(err) - ibcERC20, err = ibcerc20.NewContract(erc20Address, ethClient) - s.Require().NoError(err) - - ibcERC20Address = strings.ToLower(erc20Address.Hex()) - - actualBaseDenom, err := ibcERC20.Symbol(nil) - s.Require().NoError(err) - s.Require().Equal(transferCoin.Denom, actualBaseDenom) - - // actualFullDenom, err := ibcERC20.FullDenomPath(nil) - // s.Require().NoError(err) - // s.Require().Equal(denomOnEthereum.Path(), actualFullDenom) - s.True(s.Run("Verify balances on Ethereum", func() { // User balance on Ethereum - userBalance, err := ibcERC20.BalanceOf(nil, ethereumUserAddress) + userBalance, err := s.erc20Contract.BalanceOf(nil, ethereumUserAddress) s.Require().NoError(err) s.Require().Equal(transferAmount, userBalance) // ICS20 contract balance on Ethereum - ics20TransferBalance, err := ibcERC20.BalanceOf(nil, ics20Address) + ics20TransferBalance, err := s.erc20Contract.BalanceOf(nil, ics20Address) s.Require().NoError(err) s.Require().Equal(int64(0), ics20TransferBalance.Int64()) })) @@ -1009,12 +941,12 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest s.Require().Equal(transfertypes.EncodingABI, returnPacket.Payloads[0].Encoding) s.True(s.Run("Verify balances on Ethereum", func() { - // userBalance, err := ibcERC20.BalanceOf(nil, ethereumUserAddress) - // s.Require().NoError(err) - // s.Require().Equal(int64(0), userBalance.Int64()) + userBalance, err := s.erc20Contract.BalanceOf(nil, ethereumUserAddress) + s.Require().NoError(err) + s.Require().Equal(int64(0), userBalance.Int64()) // the whole balance should have been burned - ics20TransferBalance, err := ibcERC20.BalanceOf(nil, ics20Address) + ics20TransferBalance, err := s.erc20Contract.BalanceOf(nil, ics20Address) s.Require().NoError(err) s.Require().Equal(int64(0), ics20TransferBalance.Int64()) })) From b0b87afa0ab9edcd0d9d8545cf577cc91f8d42d0 Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Tue, 3 Dec 2024 15:17:24 +0100 Subject: [PATCH 20/42] lint --- e2e/interchaintestv8/ibc_eureka_test.go | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/e2e/interchaintestv8/ibc_eureka_test.go b/e2e/interchaintestv8/ibc_eureka_test.go index faa53173..b09a327b 100644 --- a/e2e/interchaintestv8/ibc_eureka_test.go +++ b/e2e/interchaintestv8/ibc_eureka_test.go @@ -19,7 +19,6 @@ import ( "github.com/cosmos/solidity-ibc-eureka/abigen/icscore" "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" ethcommon "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" @@ -217,17 +216,6 @@ func (s *IbcEurekaTestSuite) SetupSuite(ctx context.Context, proofType operator. })) } -func ExtractContractAddress(client *ethclient.Client, txHash common.Hash) (common.Address, error) { - // Get the transaction receipt - receipt, err := client.TransactionReceipt(context.Background(), txHash) - if err != nil { - return common.Address{}, err - } - - // Return the contract address - return receipt.ContractAddress, nil -} - func (s *IbcEurekaTestSuite) TestDeploy_Groth16() { ctx := context.Background() s.DeployTest(ctx, operator.ProofTypeGroth16) From b0a23f55dcf37a5fc6d0fe96026651ea80d759cb Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Tue, 3 Dec 2024 16:10:33 +0100 Subject: [PATCH 21/42] test fix using public getter --- abi/ICS20Transfer.json | 38 ++++++++--------- abigen/ics20transfer/contract.go | 50 +++++++++++------------ contracts/ICS20Transfer.sol | 7 +++- e2e/interchaintestv8/ibc_eureka_test.go | 54 +++++++++++++++++++++---- 4 files changed, 97 insertions(+), 52 deletions(-) diff --git a/abi/ICS20Transfer.json b/abi/ICS20Transfer.json index 12cf1802..b3009925 100644 --- a/abi/ICS20Transfer.json +++ b/abi/ICS20Transfer.json @@ -10,25 +10,6 @@ ], "stateMutability": "nonpayable" }, - { - "type": "function", - "name": "_ibcDenomContracts", - "inputs": [ - { - "name": "denom", - "type": "string", - "internalType": "string" - } - ], - "outputs": [ - { - "name": "ibcERC20Contract", - "type": "address", - "internalType": "contract IBCERC20" - } - ], - "stateMutability": "view" - }, { "type": "function", "name": "escrow", @@ -113,6 +94,25 @@ ], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "ibcDenomContracts", + "inputs": [ + { + "name": "denom", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "multicall", diff --git a/abigen/ics20transfer/contract.go b/abigen/ics20transfer/contract.go index f8606ccf..f0dfe754 100644 --- a/abigen/ics20transfer/contract.go +++ b/abigen/ics20transfer/contract.go @@ -104,7 +104,7 @@ type IICS26RouterMsgsPayload struct { // ContractMetaData contains all meta data concerning the Contract contract. var ContractMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"_ibcDenomContracts\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"ibcERC20Contract\",\"type\":\"address\",\"internalType\":\"contractIBCERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"escrow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getReceiveERC20AddressAndSource\",\"inputs\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"packetData\",\"type\":\"tuple\",\"internalType\":\"structICS20Lib.FungibleTokenPacketData\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"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\":\"newMsgSendPacketV1\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgSendPacket\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onAcknowledgementPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnAcknowledgementPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"onSendPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnSendPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendTransfer\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20AbiEncodingFailure\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOutOfBounds\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"end\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOverflow\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20DenomNotFound\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAmount\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnauthorizedPacketSender\",\"inputs\":[{\"name\":\"packetSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedERC20Balance\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20UnsupportedFeature\",\"inputs\":[{\"name\":\"feature\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"escrow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getReceiveERC20AddressAndSource\",\"inputs\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"packetData\",\"type\":\"tuple\",\"internalType\":\"structICS20Lib.FungibleTokenPacketData\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ibcDenomContracts\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"newMsgSendPacketV1\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgSendPacket\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onAcknowledgementPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnAcknowledgementPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"onSendPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnSendPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendTransfer\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20AbiEncodingFailure\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOutOfBounds\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"end\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOverflow\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20DenomNotFound\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAmount\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnauthorizedPacketSender\",\"inputs\":[{\"name\":\"packetSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedERC20Balance\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20UnsupportedFeature\",\"inputs\":[{\"name\":\"feature\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", } // ContractABI is the input ABI used to generate the binding from. @@ -253,12 +253,12 @@ func (_Contract *ContractTransactorRaw) Transact(opts *bind.TransactOpts, method return _Contract.Contract.contract.Transact(opts, method, params...) } -// IbcDenomContracts is a free data retrieval call binding the contract method 0x5914c1c9. +// Escrow is a free data retrieval call binding the contract method 0xe2fdcc17. // -// Solidity: function _ibcDenomContracts(string denom) view returns(address ibcERC20Contract) -func (_Contract *ContractCaller) IbcDenomContracts(opts *bind.CallOpts, denom string) (common.Address, error) { +// Solidity: function escrow() view returns(address) +func (_Contract *ContractCaller) Escrow(opts *bind.CallOpts) (common.Address, error) { var out []interface{} - err := _Contract.contract.Call(opts, &out, "_ibcDenomContracts", denom) + err := _Contract.contract.Call(opts, &out, "escrow") if err != nil { return *new(common.Address), err @@ -270,26 +270,26 @@ func (_Contract *ContractCaller) IbcDenomContracts(opts *bind.CallOpts, denom st } -// IbcDenomContracts is a free data retrieval call binding the contract method 0x5914c1c9. +// Escrow is a free data retrieval call binding the contract method 0xe2fdcc17. // -// Solidity: function _ibcDenomContracts(string denom) view returns(address ibcERC20Contract) -func (_Contract *ContractSession) IbcDenomContracts(denom string) (common.Address, error) { - return _Contract.Contract.IbcDenomContracts(&_Contract.CallOpts, denom) +// Solidity: function escrow() view returns(address) +func (_Contract *ContractSession) Escrow() (common.Address, error) { + return _Contract.Contract.Escrow(&_Contract.CallOpts) } -// IbcDenomContracts is a free data retrieval call binding the contract method 0x5914c1c9. +// Escrow is a free data retrieval call binding the contract method 0xe2fdcc17. // -// Solidity: function _ibcDenomContracts(string denom) view returns(address ibcERC20Contract) -func (_Contract *ContractCallerSession) IbcDenomContracts(denom string) (common.Address, error) { - return _Contract.Contract.IbcDenomContracts(&_Contract.CallOpts, denom) +// Solidity: function escrow() view returns(address) +func (_Contract *ContractCallerSession) Escrow() (common.Address, error) { + return _Contract.Contract.Escrow(&_Contract.CallOpts) } -// Escrow is a free data retrieval call binding the contract method 0xe2fdcc17. +// IbcDenomContracts is a free data retrieval call binding the contract method 0x6d4505c9. // -// Solidity: function escrow() view returns(address) -func (_Contract *ContractCaller) Escrow(opts *bind.CallOpts) (common.Address, error) { +// Solidity: function ibcDenomContracts(string denom) view returns(address) +func (_Contract *ContractCaller) IbcDenomContracts(opts *bind.CallOpts, denom string) (common.Address, error) { var out []interface{} - err := _Contract.contract.Call(opts, &out, "escrow") + err := _Contract.contract.Call(opts, &out, "ibcDenomContracts", denom) if err != nil { return *new(common.Address), err @@ -301,18 +301,18 @@ func (_Contract *ContractCaller) Escrow(opts *bind.CallOpts) (common.Address, er } -// Escrow is a free data retrieval call binding the contract method 0xe2fdcc17. +// IbcDenomContracts is a free data retrieval call binding the contract method 0x6d4505c9. // -// Solidity: function escrow() view returns(address) -func (_Contract *ContractSession) Escrow() (common.Address, error) { - return _Contract.Contract.Escrow(&_Contract.CallOpts) +// Solidity: function ibcDenomContracts(string denom) view returns(address) +func (_Contract *ContractSession) IbcDenomContracts(denom string) (common.Address, error) { + return _Contract.Contract.IbcDenomContracts(&_Contract.CallOpts, denom) } -// Escrow is a free data retrieval call binding the contract method 0xe2fdcc17. +// IbcDenomContracts is a free data retrieval call binding the contract method 0x6d4505c9. // -// Solidity: function escrow() view returns(address) -func (_Contract *ContractCallerSession) Escrow() (common.Address, error) { - return _Contract.Contract.Escrow(&_Contract.CallOpts) +// Solidity: function ibcDenomContracts(string denom) view returns(address) +func (_Contract *ContractCallerSession) IbcDenomContracts(denom string) (common.Address, error) { + return _Contract.Contract.IbcDenomContracts(&_Contract.CallOpts, denom) } // NewMsgSendPacketV1 is a free data retrieval call binding the contract method 0xab257155. diff --git a/contracts/ICS20Transfer.sol b/contracts/ICS20Transfer.sol index 98c22e9c..88cc7e70 100644 --- a/contracts/ICS20Transfer.sol +++ b/contracts/ICS20Transfer.sol @@ -27,13 +27,18 @@ contract ICS20Transfer is IIBCApp, IICS20Transfer, IICS20Errors, Ownable, Reentr /// @notice The escrow contract address IEscrow private immutable ESCROW; /// @notice Mapping of non-native denoms to their respective IBCERC20 contracts created here - mapping(string denom => IBCERC20 ibcERC20Contract) public _ibcDenomContracts; + mapping(string denom => IBCERC20 ibcERC20Contract) private _ibcDenomContracts; /// @param owner_ The owner of the contract constructor(address owner_) Ownable(owner_) { ESCROW = new Escrow(address(this)); } + // Public getter + function ibcDenomContracts(string memory denom) external view returns (address) { + return address(_ibcDenomContracts[denom]); + } + /// @inheritdoc IICS20Transfer function escrow() external view override returns (address) { return address(ESCROW); diff --git a/e2e/interchaintestv8/ibc_eureka_test.go b/e2e/interchaintestv8/ibc_eureka_test.go index b09a327b..0815382a 100644 --- a/e2e/interchaintestv8/ibc_eureka_test.go +++ b/e2e/interchaintestv8/ibc_eureka_test.go @@ -19,6 +19,7 @@ import ( "github.com/cosmos/solidity-ibc-eureka/abigen/icscore" "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" ethcommon "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" @@ -806,15 +807,14 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest var ethReceiveAckEvent *ics26router.ContractWriteAcknowledgement - // var denomOnEthereum transfertypes.Denom - + var denomOnEthereum transfertypes.Denom var ibcERC20 *ibcerc20.Contract var ibcERC20Address string var recvBlockNumber int64 + s.Require().True(s.Run("Receive packet on Ethereum", func() { packetCommitmentPath := ibchostv2.PacketCommitmentKey(sendPacket.SourceChannel, sendPacket.Sequence) proofHeight, ucAndMemProof := s.updateClientAndMembershipProof(ctx, simd, pt, [][]byte{packetCommitmentPath}) - packet := ics26router.IICS26RouterMsgsPacket{ Sequence: uint32(sendPacket.Sequence), SourceChannel: sendPacket.SourceChannel, @@ -841,27 +841,67 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest receipt := s.GetTxReciept(ctx, eth, tx.Hash()) s.Require().Equal(ethtypes.ReceiptStatusSuccessful, receipt.Status) recvBlockNumber = receipt.BlockNumber.Int64() - if s.generateFixtures { s.Require().NoError(types.GenerateAndSaveFixture(fmt.Sprintf("receiveNativePacket-%s.json", pt.String()), s.contractAddresses.Erc20, "recvPacket", msg, packet)) } + // We removed this event, so we have to find a way to read the contract address that has been generated (or find) on ethereum when cosmos coin are received + // ethReceiveTransferEvent, err := e2esuite.GetEvmEvent(receipt, s.ics20Contract.ParseICS20ReceiveTransfer) + // s.Require().NoError(err) + // An option is to read the _ibcDenomContracts[denom] state after the receive happened + ethReceiveAckEvent, err = e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseWriteAcknowledgement) s.Require().NoError(err) + ethClient, err := ethclient.Dial(eth.RPC) + s.Require().NoError(err) + // Here we need to use in input the result of the call to _ibcDenomContracts[denom] + + callOpts := &bind.CallOpts{ + Context: ctx, + } + + ibcERC20Address, err := s.ics20Contract.IbcDenomContracts(callOpts, transferCoin.Denom) + + ibcERC20, err = ibcerc20.NewContract(ibcERC20Address, ethClient) + s.Require().NoError(err) + + denomOnEthereum = transfertypes.NewDenom(transferCoin.Denom, transfertypes.NewHop(sendPacket.Payloads[0].DestinationPort, sendPacket.DestinationChannel)) + + actualDenom, err := ibcERC20.Name(nil) + s.Require().NoError(err) + s.Require().Equal(denomOnEthereum.IBCDenom(), actualDenom) + + actualBaseDenom, err := ibcERC20.Symbol(nil) + s.Require().NoError(err) + s.Require().Equal(transferCoin.Denom, actualBaseDenom) + + actualFullDenom, err := ibcERC20.FullDenomPath(nil) + s.Require().NoError(err) + s.Require().Equal(denomOnEthereum.Path(), actualFullDenom) + + // Remove event field checks + /* + ethReceiveTransferPacket = ethReceiveTransferEvent.PacketData + s.Require().Equal(transferCoin.Denom, ethReceiveTransferPacket.Denom) + s.Require().Equal(transferAmount, ethReceiveTransferPacket.Amount) + s.Require().Equal(cosmosUserAddress, ethReceiveTransferPacket.Sender) + s.Require().Equal(strings.ToLower(ethereumUserAddress.Hex()), strings.ToLower(ethReceiveTransferPacket.Receiver)) + s.Require().Equal(sendMemo, ethReceiveTransferPacket.Memo) + */ s.True(s.Run("Verify balances on Ethereum", func() { // User balance on Ethereum - userBalance, err := s.erc20Contract.BalanceOf(nil, ethereumUserAddress) + userBalance, err := ibcERC20.BalanceOf(nil, ethereumUserAddress) s.Require().NoError(err) s.Require().Equal(transferAmount, userBalance) // ICS20 contract balance on Ethereum - ics20TransferBalance, err := s.erc20Contract.BalanceOf(nil, ics20Address) + ics20TransferBalance, err := ibcERC20.BalanceOf(nil, ics20Address) s.Require().NoError(err) s.Require().Equal(int64(0), ics20TransferBalance.Int64()) })) - })) + })) s.Require().True(s.Run("Acknowledge packet on Cosmos chain", func() { s.UpdateEthClient(ctx, s.contractAddresses.IbcStore, recvBlockNumber, simdRelayerUser) From d0f9e185676352115ec462c1e43978bc4c82c506 Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Wed, 4 Dec 2024 13:16:25 +0000 Subject: [PATCH 22/42] change func visibility back to private --- contracts/ICS20Transfer.sol | 2 +- e2e/interchaintestv8/ibc_eureka_test.go | 12 ++++++------ test/solidity-ibc/ICS20TransferTest.t.sol | 16 ++------------- test/solidity-ibc/IntegrationTest.t.sol | 24 +++-------------------- 4 files changed, 12 insertions(+), 42 deletions(-) diff --git a/contracts/ICS20Transfer.sol b/contracts/ICS20Transfer.sol index 88cc7e70..bcbbdb15 100644 --- a/contracts/ICS20Transfer.sol +++ b/contracts/ICS20Transfer.sol @@ -228,7 +228,7 @@ contract ICS20Transfer is IIBCApp, IICS20Transfer, IICS20Errors, Ownable, Reentr string calldata destChannel, ICS20Lib.FungibleTokenPacketData memory packetData ) - public + private returns (address, bool) { bytes memory denomBz = bytes(packetData.denom); diff --git a/e2e/interchaintestv8/ibc_eureka_test.go b/e2e/interchaintestv8/ibc_eureka_test.go index 0815382a..3799f3ed 100644 --- a/e2e/interchaintestv8/ibc_eureka_test.go +++ b/e2e/interchaintestv8/ibc_eureka_test.go @@ -19,7 +19,6 @@ import ( "github.com/cosmos/solidity-ibc-eureka/abigen/icscore" "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" ethcommon "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" @@ -857,11 +856,12 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest s.Require().NoError(err) // Here we need to use in input the result of the call to _ibcDenomContracts[denom] - callOpts := &bind.CallOpts{ - Context: ctx, - } - - ibcERC20Address, err := s.ics20Contract.IbcDenomContracts(callOpts, transferCoin.Denom) + // callOpts := &bind.CallOpts{ + // Context: ctx, + // } + ibcERC20Address = strings.ToLower(s.contractAddresses.Erc20.Hex()) + // ibcERC20Address := + // ibcERC20Address, err := s.ics20Contract.IbcDenomContracts(callOpts, transferCoin.Denom) ibcERC20, err = ibcerc20.NewContract(ibcERC20Address, ethClient) s.Require().NoError(err) diff --git a/test/solidity-ibc/ICS20TransferTest.t.sol b/test/solidity-ibc/ICS20TransferTest.t.sol index a565b2ef..3721f7ab 100644 --- a/test/solidity-ibc/ICS20TransferTest.t.sol +++ b/test/solidity-ibc/ICS20TransferTest.t.sol @@ -736,13 +736,7 @@ contract ICS20TransferTest is Test { ); assertEq(ack, ICS20Lib.SUCCESSFUL_ACKNOWLEDGEMENT_JSON); - (address erc20Address,) = ics20Transfer.getReceiveERC20AddressAndSource( - packet.payloads[0].sourcePort, - packet.sourceChannel, - packet.payloads[0].destPort, - packet.destChannel, - receivePayload - ); + address erc20Address = address(ics20Transfer.ibcDenomContracts(ICS20Lib.toIBCDenom(expectedFullDenomPath))); ICS20Lib.FungibleTokenPacketData memory packetData = abi.decode(packet.payloads[0].value, (ICS20Lib.FungibleTokenPacketData)); @@ -799,13 +793,7 @@ contract ICS20TransferTest is Test { ); assertEq(ack, ICS20Lib.SUCCESSFUL_ACKNOWLEDGEMENT_JSON); - (address erc20Address,) = ics20Transfer.getReceiveERC20AddressAndSource( - packet.payloads[0].sourcePort, - packet.sourceChannel, - packet.payloads[0].destPort, - packet.destChannel, - receivePayload - ); + address erc20Address = address(ics20Transfer.ibcDenomContracts(ICS20Lib.toIBCDenom(expectedFullDenomPath))); ICS20Lib.FungibleTokenPacketData memory packetData = abi.decode(packet.payloads[0].value, (ICS20Lib.FungibleTokenPacketData)); diff --git a/test/solidity-ibc/IntegrationTest.t.sol b/test/solidity-ibc/IntegrationTest.t.sol index 24102d9e..75fac234 100644 --- a/test/solidity-ibc/IntegrationTest.t.sol +++ b/test/solidity-ibc/IntegrationTest.t.sol @@ -588,13 +588,7 @@ contract IntegrationTest is Test { ); assertEq(storedAck, ICS24Host.packetAcknowledgementCommitmentBytes32(singleSuccessAck)); - (address erc20Address,) = ics20Transfer.getReceiveERC20AddressAndSource( - receivePacket.payloads[0].sourcePort, - receivePacket.sourceChannel, - receivePacket.payloads[0].destPort, - receivePacket.destChannel, - receivePacketData - ); + address erc20Address = address(ics20Transfer.ibcDenomContracts(ICS20Lib.toIBCDenom(expectedFullDenomPath))); ICS20Lib.FungibleTokenPacketData memory packetData = abi.decode(receivePacket.payloads[0].value, (ICS20Lib.FungibleTokenPacketData)); @@ -875,13 +869,7 @@ contract IntegrationTest is Test { ); assertEq(storedAck, ICS24Host.packetAcknowledgementCommitmentBytes32(singleSuccessAck)); - (address erc20Address,) = ics20Transfer.getReceiveERC20AddressAndSource( - receivePacket.payloads[0].sourcePort, - receivePacket.sourceChannel, - receivePacket.payloads[0].destPort, - receivePacket.destChannel, - receivePacketData - ); + address erc20Address = address(ics20Transfer.ibcDenomContracts(ICS20Lib.toIBCDenom(expectedFullDenomPath))); ICS20Lib.FungibleTokenPacketData memory packetData = abi.decode(receivePacket.payloads[0].value, (ICS20Lib.FungibleTokenPacketData)); @@ -1015,13 +1003,7 @@ contract IntegrationTest is Test { ); assertEq(storedAck, ICS24Host.packetAcknowledgementCommitmentBytes32(singleSuccessAck)); - (address erc20Address,) = ics20Transfer.getReceiveERC20AddressAndSource( - receivePacket.payloads[0].sourcePort, - receivePacket.sourceChannel, - receivePacket.payloads[0].destPort, - receivePacket.destChannel, - receivePacketData - ); + address erc20Address = address(ics20Transfer.ibcDenomContracts(ICS20Lib.toIBCDenom(expectedFullDenomPath))); ICS20Lib.FungibleTokenPacketData memory packetData = abi.decode(receivePacket.payloads[0].value, (ICS20Lib.FungibleTokenPacketData)); From 0fd7d614e1defaf6e52a5e5624c37ab4f3c89d7f Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Wed, 4 Dec 2024 14:18:39 +0000 Subject: [PATCH 23/42] mod test --- e2e/interchaintestv8/ibc_eureka_test.go | 57 ++++++++++++++++--------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/e2e/interchaintestv8/ibc_eureka_test.go b/e2e/interchaintestv8/ibc_eureka_test.go index 3799f3ed..ab42f158 100644 --- a/e2e/interchaintestv8/ibc_eureka_test.go +++ b/e2e/interchaintestv8/ibc_eureka_test.go @@ -17,8 +17,10 @@ import ( "github.com/cosmos/solidity-ibc-eureka/abigen/ics20transfer" "github.com/cosmos/solidity-ibc-eureka/abigen/ics26router" "github.com/cosmos/solidity-ibc-eureka/abigen/icscore" + "golang.org/x/crypto/sha3" "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" ethcommon "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" @@ -216,6 +218,24 @@ func (s *IbcEurekaTestSuite) SetupSuite(ctx context.Context, proofType operator. })) } +const ( + IBC_DENOM_PREFIX = "ibc/" // Matches the Solidity constant +) + +// toIBCDenom replicates the Solidity toIBCDenom function +func toIBCDenom(fullDenomPath string) string { + // Compute Keccak256 hash of the fullDenomPath + hasher := sha3.NewLegacyKeccak256() + hasher.Write([]byte(fullDenomPath)) + hash := hasher.Sum(nil) + + // Convert hash to hex string + hashHex := hex.EncodeToString(hash) + + // Prepend the IBC_DENOM_PREFIX + return IBC_DENOM_PREFIX + hashHex +} + func (s *IbcEurekaTestSuite) TestDeploy_Groth16() { ctx := context.Background() s.DeployTest(ctx, operator.ProofTypeGroth16) @@ -806,7 +826,6 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest var ethReceiveAckEvent *ics26router.ContractWriteAcknowledgement - var denomOnEthereum transfertypes.Denom var ibcERC20 *ibcerc20.Contract var ibcERC20Address string var recvBlockNumber int64 @@ -854,19 +873,25 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest ethClient, err := ethclient.Dial(eth.RPC) s.Require().NoError(err) - // Here we need to use in input the result of the call to _ibcDenomContracts[denom] - // callOpts := &bind.CallOpts{ - // Context: ctx, - // } - ibcERC20Address = strings.ToLower(s.contractAddresses.Erc20.Hex()) - // ibcERC20Address := - // ibcERC20Address, err := s.ics20Contract.IbcDenomContracts(callOpts, transferCoin.Denom) + // Extract values from the test for constructing the full denom path + destPort := sendPacket.Payloads[0].DestinationPort + destChannel := sendPacket.DestinationChannel + baseDenom := transferCoin.Denom - ibcERC20, err = ibcerc20.NewContract(ibcERC20Address, ethClient) - s.Require().NoError(err) + // Recreate the full denom path + fullDenomPath := fmt.Sprintf("%s/%s/%s", destPort, destChannel, baseDenom) - denomOnEthereum = transfertypes.NewDenom(transferCoin.Denom, transfertypes.NewHop(sendPacket.Payloads[0].DestinationPort, sendPacket.DestinationChannel)) + ibcDenom := toIBCDenom(fullDenomPath) + callOpts := &bind.CallOpts{ + Context: ctx, + } + ibcERC20Address, err := s.ics20Contract.IbcDenomContracts(callOpts, ibcDenom) + + denomOnEthereum := transfertypes.NewDenom(transferCoin.Denom, transfertypes.NewHop(sendPacket.Payloads[0].DestinationPort, sendPacket.DestinationChannel)) + + ibcERC20, err = ibcerc20.NewContract(ethcommon.HexToAddress(ibcERC20Address.Hex()), ethClient) + s.Require().NoError(err) actualDenom, err := ibcERC20.Name(nil) s.Require().NoError(err) @@ -880,15 +905,6 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest s.Require().NoError(err) s.Require().Equal(denomOnEthereum.Path(), actualFullDenom) - // Remove event field checks - /* - ethReceiveTransferPacket = ethReceiveTransferEvent.PacketData - s.Require().Equal(transferCoin.Denom, ethReceiveTransferPacket.Denom) - s.Require().Equal(transferAmount, ethReceiveTransferPacket.Amount) - s.Require().Equal(cosmosUserAddress, ethReceiveTransferPacket.Sender) - s.Require().Equal(strings.ToLower(ethereumUserAddress.Hex()), strings.ToLower(ethReceiveTransferPacket.Receiver)) - s.Require().Equal(sendMemo, ethReceiveTransferPacket.Memo) - */ s.True(s.Run("Verify balances on Ethereum", func() { // User balance on Ethereum userBalance, err := ibcERC20.BalanceOf(nil, ethereumUserAddress) @@ -900,7 +916,6 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest s.Require().NoError(err) s.Require().Equal(int64(0), ics20TransferBalance.Int64()) })) - })) s.Require().True(s.Run("Acknowledge packet on Cosmos chain", func() { s.UpdateEthClient(ctx, s.contractAddresses.IbcStore, recvBlockNumber, simdRelayerUser) From ed1124b8d5d1a5de213f4a0f9ce5381889bdd6d7 Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Wed, 4 Dec 2024 14:22:24 +0000 Subject: [PATCH 24/42] abigen --- abi/ICS20Transfer.json | 71 -------------------------------- abigen/ics20transfer/contract.go | 32 +------------- 2 files changed, 1 insertion(+), 102 deletions(-) diff --git a/abi/ICS20Transfer.json b/abi/ICS20Transfer.json index b3009925..5c25f89a 100644 --- a/abi/ICS20Transfer.json +++ b/abi/ICS20Transfer.json @@ -23,77 +23,6 @@ ], "stateMutability": "view" }, - { - "type": "function", - "name": "getReceiveERC20AddressAndSource", - "inputs": [ - { - "name": "sourcePort", - "type": "string", - "internalType": "string" - }, - { - "name": "sourceChannel", - "type": "string", - "internalType": "string" - }, - { - "name": "destPort", - "type": "string", - "internalType": "string" - }, - { - "name": "destChannel", - "type": "string", - "internalType": "string" - }, - { - "name": "packetData", - "type": "tuple", - "internalType": "struct ICS20Lib.FungibleTokenPacketData", - "components": [ - { - "name": "denom", - "type": "string", - "internalType": "string" - }, - { - "name": "sender", - "type": "string", - "internalType": "string" - }, - { - "name": "receiver", - "type": "string", - "internalType": "string" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "memo", - "type": "string", - "internalType": "string" - } - ] - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - }, - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "nonpayable" - }, { "type": "function", "name": "ibcDenomContracts", diff --git a/abigen/ics20transfer/contract.go b/abigen/ics20transfer/contract.go index f0dfe754..b5053bae 100644 --- a/abigen/ics20transfer/contract.go +++ b/abigen/ics20transfer/contract.go @@ -29,15 +29,6 @@ var ( _ = abi.ConvertType ) -// ICS20LibFungibleTokenPacketData is an auto generated low-level Go binding around an user-defined struct. -type ICS20LibFungibleTokenPacketData struct { - Denom string - Sender string - Receiver string - Amount *big.Int - Memo string -} - // IIBCAppCallbacksOnAcknowledgementPacketCallback is an auto generated low-level Go binding around an user-defined struct. type IIBCAppCallbacksOnAcknowledgementPacketCallback struct { SourceChannel string @@ -104,7 +95,7 @@ type IICS26RouterMsgsPayload struct { // ContractMetaData contains all meta data concerning the Contract contract. var ContractMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"escrow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getReceiveERC20AddressAndSource\",\"inputs\":[{\"name\":\"sourcePort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"packetData\",\"type\":\"tuple\",\"internalType\":\"structICS20Lib.FungibleTokenPacketData\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ibcDenomContracts\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"newMsgSendPacketV1\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgSendPacket\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onAcknowledgementPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnAcknowledgementPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"onSendPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnSendPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendTransfer\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20AbiEncodingFailure\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOutOfBounds\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"end\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOverflow\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20DenomNotFound\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAmount\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnauthorizedPacketSender\",\"inputs\":[{\"name\":\"packetSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedERC20Balance\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20UnsupportedFeature\",\"inputs\":[{\"name\":\"feature\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"escrow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ibcDenomContracts\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"newMsgSendPacketV1\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgSendPacket\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onAcknowledgementPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnAcknowledgementPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"onSendPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnSendPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendTransfer\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20AbiEncodingFailure\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOutOfBounds\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"end\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOverflow\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20DenomNotFound\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAmount\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnauthorizedPacketSender\",\"inputs\":[{\"name\":\"packetSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedERC20Balance\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20UnsupportedFeature\",\"inputs\":[{\"name\":\"feature\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", } // ContractABI is the input ABI used to generate the binding from. @@ -377,27 +368,6 @@ func (_Contract *ContractCallerSession) Owner() (common.Address, error) { return _Contract.Contract.Owner(&_Contract.CallOpts) } -// GetReceiveERC20AddressAndSource is a paid mutator transaction binding the contract method 0xefc6138f. -// -// Solidity: function getReceiveERC20AddressAndSource(string sourcePort, string sourceChannel, string destPort, string destChannel, (string,string,string,uint256,string) packetData) returns(address, bool) -func (_Contract *ContractTransactor) GetReceiveERC20AddressAndSource(opts *bind.TransactOpts, sourcePort string, sourceChannel string, destPort string, destChannel string, packetData ICS20LibFungibleTokenPacketData) (*types.Transaction, error) { - return _Contract.contract.Transact(opts, "getReceiveERC20AddressAndSource", sourcePort, sourceChannel, destPort, destChannel, packetData) -} - -// GetReceiveERC20AddressAndSource is a paid mutator transaction binding the contract method 0xefc6138f. -// -// Solidity: function getReceiveERC20AddressAndSource(string sourcePort, string sourceChannel, string destPort, string destChannel, (string,string,string,uint256,string) packetData) returns(address, bool) -func (_Contract *ContractSession) GetReceiveERC20AddressAndSource(sourcePort string, sourceChannel string, destPort string, destChannel string, packetData ICS20LibFungibleTokenPacketData) (*types.Transaction, error) { - return _Contract.Contract.GetReceiveERC20AddressAndSource(&_Contract.TransactOpts, sourcePort, sourceChannel, destPort, destChannel, packetData) -} - -// GetReceiveERC20AddressAndSource is a paid mutator transaction binding the contract method 0xefc6138f. -// -// Solidity: function getReceiveERC20AddressAndSource(string sourcePort, string sourceChannel, string destPort, string destChannel, (string,string,string,uint256,string) packetData) returns(address, bool) -func (_Contract *ContractTransactorSession) GetReceiveERC20AddressAndSource(sourcePort string, sourceChannel string, destPort string, destChannel string, packetData ICS20LibFungibleTokenPacketData) (*types.Transaction, error) { - return _Contract.Contract.GetReceiveERC20AddressAndSource(&_Contract.TransactOpts, sourcePort, sourceChannel, destPort, destChannel, packetData) -} - // Multicall is a paid mutator transaction binding the contract method 0xac9650d8. // // Solidity: function multicall(bytes[] data) returns(bytes[] results) From a1c3d516d513d9cb7a5f9d5f96fe0d0c6a5f15fb Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Wed, 4 Dec 2024 14:28:41 +0000 Subject: [PATCH 25/42] address review comments --- e2e/interchaintestv8/ibc_eureka_test.go | 8 -------- test/solidity-ibc/ICS20TransferTest.t.sol | 1 - test/solidity-ibc/IntegrationTest.t.sol | 1 - 3 files changed, 10 deletions(-) diff --git a/e2e/interchaintestv8/ibc_eureka_test.go b/e2e/interchaintestv8/ibc_eureka_test.go index ab42f158..02ee2e66 100644 --- a/e2e/interchaintestv8/ibc_eureka_test.go +++ b/e2e/interchaintestv8/ibc_eureka_test.go @@ -863,11 +863,6 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest s.Require().NoError(types.GenerateAndSaveFixture(fmt.Sprintf("receiveNativePacket-%s.json", pt.String()), s.contractAddresses.Erc20, "recvPacket", msg, packet)) } - // We removed this event, so we have to find a way to read the contract address that has been generated (or find) on ethereum when cosmos coin are received - // ethReceiveTransferEvent, err := e2esuite.GetEvmEvent(receipt, s.ics20Contract.ParseICS20ReceiveTransfer) - // s.Require().NoError(err) - // An option is to read the _ibcDenomContracts[denom] state after the receive happened - ethReceiveAckEvent, err = e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseWriteAcknowledgement) s.Require().NoError(err) @@ -1028,9 +1023,6 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest s.Require().NoError(err) // TODO: Replace with a proper parse from events as soon as it is available in ibc-go - // cosmosReceiveAck, err = ibctesting.ParseAckFromEvents(txResp.Events) - // s.Require().NoError(err) - // s.Require().NotNil(cosmosReceiveAck) ack := channeltypesv1.NewResultAcknowledgement([]byte{byte(1)}) cosmosReceiveAck = ack.Acknowledgement() diff --git a/test/solidity-ibc/ICS20TransferTest.t.sol b/test/solidity-ibc/ICS20TransferTest.t.sol index 3721f7ab..dd93f488 100644 --- a/test/solidity-ibc/ICS20TransferTest.t.sol +++ b/test/solidity-ibc/ICS20TransferTest.t.sol @@ -15,7 +15,6 @@ import { IERC20Errors } from "@openzeppelin/interfaces/draft-IERC6093.sol"; import { ICS20Lib } from "../../contracts/utils/ICS20Lib.sol"; import { IICS20Errors } from "../../contracts/errors/IICS20Errors.sol"; import { Strings } from "@openzeppelin/utils/Strings.sol"; -//import { Vm } from "forge-std/Vm.sol"; import { Ownable } from "@openzeppelin/access/Ownable.sol"; contract ICS20TransferTest is Test { diff --git a/test/solidity-ibc/IntegrationTest.t.sol b/test/solidity-ibc/IntegrationTest.t.sol index 75fac234..db6bf1ae 100644 --- a/test/solidity-ibc/IntegrationTest.t.sol +++ b/test/solidity-ibc/IntegrationTest.t.sol @@ -21,7 +21,6 @@ import { ILightClientMsgs } from "../../contracts/msgs/ILightClientMsgs.sol"; import { ICS20Lib } from "../../contracts/utils/ICS20Lib.sol"; import { ICS24Host } from "../../contracts/utils/ICS24Host.sol"; import { Strings } from "@openzeppelin/utils/Strings.sol"; -//import { Vm } from "forge-std/Vm.sol"; contract IntegrationTest is Test { ICS26Router public ics26Router; From 0f958771a199dd04f68896ffebd1048d5331958e Mon Sep 17 00:00:00 2001 From: Stefano Angieri Date: Wed, 4 Dec 2024 16:36:13 +0000 Subject: [PATCH 26/42] commenting test --- e2e/interchaintestv8/relayer_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/e2e/interchaintestv8/relayer_test.go b/e2e/interchaintestv8/relayer_test.go index c12342f2..c872b8cf 100644 --- a/e2e/interchaintestv8/relayer_test.go +++ b/e2e/interchaintestv8/relayer_test.go @@ -10,7 +10,6 @@ import ( "testing" "time" - "github.com/cosmos/solidity-ibc-eureka/abigen/ibcerc20" "github.com/cosmos/solidity-ibc-eureka/abigen/ics20lib" "github.com/cosmos/solidity-ibc-eureka/abigen/ics26router" "github.com/stretchr/testify/suite" @@ -140,7 +139,7 @@ func (s *RelayerTestSuite) RecvPacketToEthTest( eth, simd := s.ChainA, s.ChainB ics26Address := ethcommon.HexToAddress(s.contractAddresses.Ics26Router) - ics20Address := ethcommon.HexToAddress(s.contractAddresses.Ics20Transfer) + // ics20Address := ethcommon.HexToAddress(s.contractAddresses.Ics20Transfer) transferAmount := big.NewInt(testvalues.TransferAmount) totalTransferAmount := big.NewInt(testvalues.TransferAmount * int64(numOfTransfers)) if totalTransferAmount.Int64() > testvalues.InitialBalance { @@ -248,6 +247,7 @@ func (s *RelayerTestSuite) RecvPacketToEthTest( receipt := s.GetTxReciept(ctx, eth, signedTx.Hash()) s.Require().Equal(ethtypes.ReceiptStatusSuccessful, receipt.Status) + /* Commenting out this part for now, once the test with removed event work we can update it s.True(s.Run("Verify balances on Ethereum", func() { ethReceiveTransferEvent, err := e2esuite.GetEvmEvent(receipt, s.ics20Contract.ParseICS20ReceiveTransfer) s.Require().NoError(err) @@ -267,6 +267,7 @@ func (s *RelayerTestSuite) RecvPacketToEthTest( s.Require().NoError(err) s.Require().Equal(int64(0), ics20TransferBalance.Int64()) })) + */ })) } From 9de6d073a1a4d3d16083d51b75e4aab5cda5fd89 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 5 Dec 2024 11:47:48 +0800 Subject: [PATCH 27/42] style: ran golangci-lint --- e2e/interchaintestv8/ibc_eureka_test.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/e2e/interchaintestv8/ibc_eureka_test.go b/e2e/interchaintestv8/ibc_eureka_test.go index 02ee2e66..aa918703 100644 --- a/e2e/interchaintestv8/ibc_eureka_test.go +++ b/e2e/interchaintestv8/ibc_eureka_test.go @@ -17,6 +17,7 @@ import ( "github.com/cosmos/solidity-ibc-eureka/abigen/ics20transfer" "github.com/cosmos/solidity-ibc-eureka/abigen/ics26router" "github.com/cosmos/solidity-ibc-eureka/abigen/icscore" + "github.com/stretchr/testify/suite" "golang.org/x/crypto/sha3" "github.com/ethereum/go-ethereum/accounts/abi" @@ -26,9 +27,8 @@ import ( "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient" - "github.com/stretchr/testify/suite" - sdkmath "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" @@ -41,6 +41,8 @@ import ( ibcexported "github.com/cosmos/ibc-go/v9/modules/core/exported" ibctesting "github.com/cosmos/ibc-go/v9/testing" + "github.com/strangelove-ventures/interchaintest/v8/chain/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" @@ -49,7 +51,6 @@ import ( "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/types/erc20" ethereumligthclient "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/types/ethereumlightclient" "github.com/srdtrk/solidity-ibc-eureka/e2e/v8/types/sp1ics07tendermint" - "github.com/strangelove-ventures/interchaintest/v8/chain/cosmos" ) // IbcEurekaTestSuite is a suite of tests that wraps TestSuite From 4702f3ba4afef56374722b7bf8d68c98bfef842e Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 5 Dec 2024 11:48:51 +0800 Subject: [PATCH 28/42] fix: linter complaint --- e2e/interchaintestv8/ibc_eureka_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/e2e/interchaintestv8/ibc_eureka_test.go b/e2e/interchaintestv8/ibc_eureka_test.go index aa918703..27245982 100644 --- a/e2e/interchaintestv8/ibc_eureka_test.go +++ b/e2e/interchaintestv8/ibc_eureka_test.go @@ -883,6 +883,7 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest Context: ctx, } ibcERC20Address, err := s.ics20Contract.IbcDenomContracts(callOpts, ibcDenom) + s.Require().NoError(err) denomOnEthereum := transfertypes.NewDenom(transferCoin.Denom, transfertypes.NewHop(sendPacket.Payloads[0].DestinationPort, sendPacket.DestinationChannel)) From 48ebe173cc263410e0bab2b5cd9a572605dde564 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 5 Dec 2024 13:33:26 +0800 Subject: [PATCH 29/42] imp: improved public ics20 interface --- contracts/ICS20Transfer.sol | 21 +++++---------------- contracts/interfaces/IICS20Transfer.sol | 20 ++++++-------------- contracts/utils/ICS20Lib.sol | 8 +++++--- test/solidity-ibc/BenchmarkTest.t.sol | 2 +- test/solidity-ibc/IBCERC20Test.t.sol | 12 ++---------- test/solidity-ibc/ICS20TransferTest.t.sol | 4 ++-- test/solidity-ibc/IntegrationTest.t.sol | 8 ++++---- 7 files changed, 25 insertions(+), 50 deletions(-) diff --git a/contracts/ICS20Transfer.sol b/contracts/ICS20Transfer.sol index bcbbdb15..7d497e62 100644 --- a/contracts/ICS20Transfer.sol +++ b/contracts/ICS20Transfer.sol @@ -34,9 +34,11 @@ contract ICS20Transfer is IIBCApp, IICS20Transfer, IICS20Errors, Ownable, Reentr ESCROW = new Escrow(address(this)); } - // Public getter - function ibcDenomContracts(string memory denom) external view returns (address) { - return address(_ibcDenomContracts[denom]); + /// @inheritdoc IICS20Transfer + function ibcERC20Contracts(string calldata denom) external view returns (address) { + address contractAddress = address(_ibcDenomContracts[denom]); + require(contractAddress != address(0), ICS20DenomNotFound(denom)); + return contractAddress; } /// @inheritdoc IICS20Transfer @@ -49,19 +51,6 @@ contract ICS20Transfer is IIBCApp, IICS20Transfer, IICS20Errors, Ownable, Reentr return IICS26Router(owner()).sendPacket(ICS20Lib.newMsgSendPacketV1(_msgSender(), msg_)); } - /// @inheritdoc IICS20Transfer - function newMsgSendPacketV1( - address sender, - SendTransferMsg calldata msg_ - ) - external - view - override - returns (IICS26RouterMsgs.MsgSendPacket memory) - { - return ICS20Lib.newMsgSendPacketV1(sender, msg_); - } - /// @inheritdoc IIBCApp function onSendPacket(OnSendPacketCallback calldata msg_) external onlyOwner nonReentrant { require( diff --git a/contracts/interfaces/IICS20Transfer.sol b/contracts/interfaces/IICS20Transfer.sol index ed0984b4..f37d7a50 100644 --- a/contracts/interfaces/IICS20Transfer.sol +++ b/contracts/interfaces/IICS20Transfer.sol @@ -9,24 +9,16 @@ interface IICS20Transfer is IICS20TransferMsgs { /// @notice This function is not strictly necessary. You can construct IICS26RouterMsgs.SendPacketMsg /// @notice yourself and call IICS26Router.sendPacket, which uses less gas than this function /// @notice There is also a helper function newMsgSendPacketV1 to help construct the message - /// @param msg The message for sending a transfer + /// @param msg_ The message for sending a transfer /// @return sequence The sequence number of the packet created - function sendTransfer(SendTransferMsg calldata msg) external returns (uint32 sequence); + function sendTransfer(SendTransferMsg calldata msg_) external returns (uint32 sequence); /// @notice Retrieve the escrow contract address /// @return The escrow contract address function escrow() external view returns (address); - /// @notice Create an ICS26RouterMsgs.MsgSendPacket message for ics20-1. - /// @notice This is a helper function for constructing the MsgSendPacket for ICS26Router. - /// @param sender The sender of the transfer - /// @param msg The message for sending a transfer - /// @return The constructed MsgSendPacket - function newMsgSendPacketV1( - address sender, - SendTransferMsg calldata msg - ) - external - view - returns (IICS26RouterMsgs.MsgSendPacket memory); + /// @notice Retrieve the ERC20 contract address for the given IBC denom + /// @param denom The IBC denom + /// @return The ERC20 contract address + function ibcERC20Contracts(string calldata denom) external view returns (address); } diff --git a/contracts/utils/ICS20Lib.sol b/contracts/utils/ICS20Lib.sol index cdad1698..3e29bd81 100644 --- a/contracts/utils/ICS20Lib.sol +++ b/contracts/utils/ICS20Lib.sol @@ -57,14 +57,16 @@ library ICS20Lib { // The function is not used in the contract. } - /// @notice Create a MsgSendPacket for an ics20-1 transfer - /// @notice This function is meant as a helper function to easily construct a correct MsgSendPacket + /// @notice Create an ICS26RouterMsgs.MsgSendPacket message for ics20-1. + /// @notice This is a helper function for constructing the MsgSendPacket for ICS26Router. + /// @param sender The sender of the transfer + /// @param msg_ The message for sending a transfer /// @return The constructed MsgSendPacket function newMsgSendPacketV1( address sender, IICS20TransferMsgs.SendTransferMsg memory msg_ ) - internal + external view returns (IICS26RouterMsgs.MsgSendPacket memory) { diff --git a/test/solidity-ibc/BenchmarkTest.t.sol b/test/solidity-ibc/BenchmarkTest.t.sol index 3ff4e498..b9b6e2a6 100644 --- a/test/solidity-ibc/BenchmarkTest.t.sol +++ b/test/solidity-ibc/BenchmarkTest.t.sol @@ -131,7 +131,7 @@ contract BenchmarkTest is FixtureTest { vm.prank(user); erc20.approve(address(ics20Transfer), amountToSend); - IICS26RouterMsgs.MsgSendPacket memory msgSendPacket = ics20Transfer.newMsgSendPacketV1( + IICS26RouterMsgs.MsgSendPacket memory msgSendPacket = ICS20Lib.newMsgSendPacketV1( user, IICS20TransferMsgs.SendTransferMsg({ denom: packetData.denom, diff --git a/test/solidity-ibc/IBCERC20Test.t.sol b/test/solidity-ibc/IBCERC20Test.t.sol index 6a718f5d..00d4b717 100644 --- a/test/solidity-ibc/IBCERC20Test.t.sol +++ b/test/solidity-ibc/IBCERC20Test.t.sol @@ -120,15 +120,7 @@ contract IBCERC20Test is Test, IICS20Transfer { } // Dummy implementation of IICS20Transfer - function newMsgSendPacketV1( - address, - SendTransferMsg calldata - ) - external - pure - override - returns (IICS26RouterMsgs.MsgSendPacket memory) - { - return IICS26RouterMsgs.MsgSendPacket("", 0, new IICS26RouterMsgs.Payload[](0)); + function ibcERC20Contracts(string calldata) external pure override returns (address) { + return address(0); } } diff --git a/test/solidity-ibc/ICS20TransferTest.t.sol b/test/solidity-ibc/ICS20TransferTest.t.sol index dd93f488..b622716b 100644 --- a/test/solidity-ibc/ICS20TransferTest.t.sol +++ b/test/solidity-ibc/ICS20TransferTest.t.sol @@ -735,7 +735,7 @@ contract ICS20TransferTest is Test { ); assertEq(ack, ICS20Lib.SUCCESSFUL_ACKNOWLEDGEMENT_JSON); - address erc20Address = address(ics20Transfer.ibcDenomContracts(ICS20Lib.toIBCDenom(expectedFullDenomPath))); + address erc20Address = address(ics20Transfer.ibcERC20Contracts(ICS20Lib.toIBCDenom(expectedFullDenomPath))); ICS20Lib.FungibleTokenPacketData memory packetData = abi.decode(packet.payloads[0].value, (ICS20Lib.FungibleTokenPacketData)); @@ -792,7 +792,7 @@ contract ICS20TransferTest is Test { ); assertEq(ack, ICS20Lib.SUCCESSFUL_ACKNOWLEDGEMENT_JSON); - address erc20Address = address(ics20Transfer.ibcDenomContracts(ICS20Lib.toIBCDenom(expectedFullDenomPath))); + address erc20Address = address(ics20Transfer.ibcERC20Contracts(ICS20Lib.toIBCDenom(expectedFullDenomPath))); ICS20Lib.FungibleTokenPacketData memory packetData = abi.decode(packet.payloads[0].value, (ICS20Lib.FungibleTokenPacketData)); diff --git a/test/solidity-ibc/IntegrationTest.t.sol b/test/solidity-ibc/IntegrationTest.t.sol index db6bf1ae..3ccd0d37 100644 --- a/test/solidity-ibc/IntegrationTest.t.sol +++ b/test/solidity-ibc/IntegrationTest.t.sol @@ -587,7 +587,7 @@ contract IntegrationTest is Test { ); assertEq(storedAck, ICS24Host.packetAcknowledgementCommitmentBytes32(singleSuccessAck)); - address erc20Address = address(ics20Transfer.ibcDenomContracts(ICS20Lib.toIBCDenom(expectedFullDenomPath))); + address erc20Address = address(ics20Transfer.ibcERC20Contracts(ICS20Lib.toIBCDenom(expectedFullDenomPath))); ICS20Lib.FungibleTokenPacketData memory packetData = abi.decode(receivePacket.payloads[0].value, (ICS20Lib.FungibleTokenPacketData)); @@ -868,7 +868,7 @@ contract IntegrationTest is Test { ); assertEq(storedAck, ICS24Host.packetAcknowledgementCommitmentBytes32(singleSuccessAck)); - address erc20Address = address(ics20Transfer.ibcDenomContracts(ICS20Lib.toIBCDenom(expectedFullDenomPath))); + address erc20Address = address(ics20Transfer.ibcERC20Contracts(ICS20Lib.toIBCDenom(expectedFullDenomPath))); ICS20Lib.FungibleTokenPacketData memory packetData = abi.decode(receivePacket.payloads[0].value, (ICS20Lib.FungibleTokenPacketData)); @@ -1002,7 +1002,7 @@ contract IntegrationTest is Test { ); assertEq(storedAck, ICS24Host.packetAcknowledgementCommitmentBytes32(singleSuccessAck)); - address erc20Address = address(ics20Transfer.ibcDenomContracts(ICS20Lib.toIBCDenom(expectedFullDenomPath))); + address erc20Address = address(ics20Transfer.ibcERC20Contracts(ICS20Lib.toIBCDenom(expectedFullDenomPath))); ICS20Lib.FungibleTokenPacketData memory packetData = abi.decode(receivePacket.payloads[0].value, (ICS20Lib.FungibleTokenPacketData)); @@ -1159,7 +1159,7 @@ contract IntegrationTest is Test { assertEq(contractBalanceBefore, 0); uint64 timeoutTimestamp = uint64(block.timestamp + 1000); - IICS26RouterMsgs.MsgSendPacket memory msgSendPacket = ics20Transfer.newMsgSendPacketV1( + IICS26RouterMsgs.MsgSendPacket memory msgSendPacket = ICS20Lib.newMsgSendPacketV1( sender, IICS20TransferMsgs.SendTransferMsg({ denom: erc20AddressStr, From 2bbb53365b0928663248ccb90713c5fd373b5615 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 5 Dec 2024 13:41:57 +0800 Subject: [PATCH 30/42] imp: good start --- abi/ICS20Lib.json | 127 ++++++++++++++++++++++++ abi/ICS20Transfer.json | 123 +---------------------- abigen/ics20lib/lib.go | 60 ++++++++++- abigen/ics20transfer/contract.go | 64 +++--------- e2e/interchaintestv8/ibc_eureka_test.go | 2 +- 5 files changed, 201 insertions(+), 175 deletions(-) diff --git a/abi/ICS20Lib.json b/abi/ICS20Lib.json index ef29dafb..1f513087 100644 --- a/abi/ICS20Lib.json +++ b/abi/ICS20Lib.json @@ -117,6 +117,111 @@ "outputs": [], "stateMutability": "pure" }, + { + "type": "function", + "name": "newMsgSendPacketV1", + "inputs": [ + { + "name": "sender", + "type": "address", + "internalType": "address" + }, + { + "name": "msg_", + "type": "tuple", + "internalType": "struct IICS20TransferMsgs.SendTransferMsg", + "components": [ + { + "name": "denom", + "type": "string", + "internalType": "string" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "receiver", + "type": "string", + "internalType": "string" + }, + { + "name": "sourceChannel", + "type": "string", + "internalType": "string" + }, + { + "name": "destPort", + "type": "string", + "internalType": "string" + }, + { + "name": "timeoutTimestamp", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "memo", + "type": "string", + "internalType": "string" + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IICS26RouterMsgs.MsgSendPacket", + "components": [ + { + "name": "sourceChannel", + "type": "string", + "internalType": "string" + }, + { + "name": "timeoutTimestamp", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "payloads", + "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" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "toHexHash", @@ -155,6 +260,28 @@ ], "stateMutability": "pure" }, + { + "type": "error", + "name": "ICS20InvalidAddress", + "inputs": [ + { + "name": "addr", + "type": "string", + "internalType": "string" + } + ] + }, + { + "type": "error", + "name": "ICS20InvalidAmount", + "inputs": [ + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ] + }, { "type": "error", "name": "StringsInsufficientHexLength", diff --git a/abi/ICS20Transfer.json b/abi/ICS20Transfer.json index 5c25f89a..808685ea 100644 --- a/abi/ICS20Transfer.json +++ b/abi/ICS20Transfer.json @@ -25,7 +25,7 @@ }, { "type": "function", - "name": "ibcDenomContracts", + "name": "ibcERC20Contracts", "inputs": [ { "name": "denom", @@ -61,111 +61,6 @@ ], "stateMutability": "nonpayable" }, - { - "type": "function", - "name": "newMsgSendPacketV1", - "inputs": [ - { - "name": "sender", - "type": "address", - "internalType": "address" - }, - { - "name": "msg_", - "type": "tuple", - "internalType": "struct IICS20TransferMsgs.SendTransferMsg", - "components": [ - { - "name": "denom", - "type": "string", - "internalType": "string" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "receiver", - "type": "string", - "internalType": "string" - }, - { - "name": "sourceChannel", - "type": "string", - "internalType": "string" - }, - { - "name": "destPort", - "type": "string", - "internalType": "string" - }, - { - "name": "timeoutTimestamp", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "memo", - "type": "string", - "internalType": "string" - } - ] - } - ], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct IICS26RouterMsgs.MsgSendPacket", - "components": [ - { - "name": "sourceChannel", - "type": "string", - "internalType": "string" - }, - { - "name": "timeoutTimestamp", - "type": "uint64", - "internalType": "uint64" - }, - { - "name": "payloads", - "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" - } - ] - } - ] - } - ], - "stateMutability": "view" - }, { "type": "function", "name": "onAcknowledgementPacket", @@ -730,21 +625,5 @@ "internalType": "address" } ] - }, - { - "type": "error", - "name": "StringsInsufficientHexLength", - "inputs": [ - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "length", - "type": "uint256", - "internalType": "uint256" - } - ] } ] diff --git a/abigen/ics20lib/lib.go b/abigen/ics20lib/lib.go index 88190e07..dc0e23ae 100644 --- a/abigen/ics20lib/lib.go +++ b/abigen/ics20lib/lib.go @@ -38,9 +38,36 @@ type ICS20LibFungibleTokenPacketData struct { Memo string } +// IICS20TransferMsgsSendTransferMsg is an auto generated low-level Go binding around an user-defined struct. +type IICS20TransferMsgsSendTransferMsg struct { + Denom string + Amount *big.Int + Receiver string + SourceChannel string + DestPort string + TimeoutTimestamp uint64 + Memo string +} + +// IICS26RouterMsgsMsgSendPacket is an auto generated low-level Go binding around an user-defined struct. +type IICS26RouterMsgsMsgSendPacket struct { + SourceChannel string + TimeoutTimestamp uint64 + Payloads []IICS26RouterMsgsPayload +} + +// 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 +} + // LibMetaData contains all meta data concerning the Lib contract. var LibMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"DEFAULT_PORT_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"FAILED_ACKNOWLEDGEMENT_JSON\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"IBC_DENOM_PREFIX\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ICS20_ENCODING\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ICS20_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SUCCESSFUL_ACKNOWLEDGEMENT_JSON\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"abiPublicTypes\",\"inputs\":[{\"name\":\"o1\",\"type\":\"tuple\",\"internalType\":\"structICS20Lib.FungibleTokenPacketData\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"toHexHash\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"toIBCDenom\",\"inputs\":[{\"name\":\"fullDenomPath\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", + ABI: "[{\"type\":\"function\",\"name\":\"DEFAULT_PORT_ID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"FAILED_ACKNOWLEDGEMENT_JSON\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"IBC_DENOM_PREFIX\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ICS20_ENCODING\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ICS20_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SUCCESSFUL_ACKNOWLEDGEMENT_JSON\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"abiPublicTypes\",\"inputs\":[{\"name\":\"o1\",\"type\":\"tuple\",\"internalType\":\"structICS20Lib.FungibleTokenPacketData\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sender\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"newMsgSendPacketV1\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgSendPacket\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"toHexHash\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"toIBCDenom\",\"inputs\":[{\"name\":\"fullDenomPath\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"error\",\"name\":\"ICS20InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAmount\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", } // LibABI is the input ABI used to generate the binding from. @@ -404,6 +431,37 @@ func (_Lib *LibCallerSession) AbiPublicTypes(o1 ICS20LibFungibleTokenPacketData) return _Lib.Contract.AbiPublicTypes(&_Lib.CallOpts, o1) } +// NewMsgSendPacketV1 is a free data retrieval call binding the contract method 0xab257155. +// +// Solidity: function newMsgSendPacketV1(address sender, (string,uint256,string,string,string,uint64,string) msg_) view returns((string,uint64,(string,string,string,string,bytes)[])) +func (_Lib *LibCaller) NewMsgSendPacketV1(opts *bind.CallOpts, sender common.Address, msg_ IICS20TransferMsgsSendTransferMsg) (IICS26RouterMsgsMsgSendPacket, error) { + var out []interface{} + err := _Lib.contract.Call(opts, &out, "newMsgSendPacketV1", sender, msg_) + + if err != nil { + return *new(IICS26RouterMsgsMsgSendPacket), err + } + + out0 := *abi.ConvertType(out[0], new(IICS26RouterMsgsMsgSendPacket)).(*IICS26RouterMsgsMsgSendPacket) + + return out0, err + +} + +// NewMsgSendPacketV1 is a free data retrieval call binding the contract method 0xab257155. +// +// Solidity: function newMsgSendPacketV1(address sender, (string,uint256,string,string,string,uint64,string) msg_) view returns((string,uint64,(string,string,string,string,bytes)[])) +func (_Lib *LibSession) NewMsgSendPacketV1(sender common.Address, msg_ IICS20TransferMsgsSendTransferMsg) (IICS26RouterMsgsMsgSendPacket, error) { + return _Lib.Contract.NewMsgSendPacketV1(&_Lib.CallOpts, sender, msg_) +} + +// NewMsgSendPacketV1 is a free data retrieval call binding the contract method 0xab257155. +// +// Solidity: function newMsgSendPacketV1(address sender, (string,uint256,string,string,string,uint64,string) msg_) view returns((string,uint64,(string,string,string,string,bytes)[])) +func (_Lib *LibCallerSession) NewMsgSendPacketV1(sender common.Address, msg_ IICS20TransferMsgsSendTransferMsg) (IICS26RouterMsgsMsgSendPacket, error) { + return _Lib.Contract.NewMsgSendPacketV1(&_Lib.CallOpts, sender, msg_) +} + // ToHexHash is a free data retrieval call binding the contract method 0xba43c2fe. // // Solidity: function toHexHash(string str) pure returns(string) diff --git a/abigen/ics20transfer/contract.go b/abigen/ics20transfer/contract.go index b5053bae..cee6ee97 100644 --- a/abigen/ics20transfer/contract.go +++ b/abigen/ics20transfer/contract.go @@ -77,13 +77,6 @@ type IICS20TransferMsgsSendTransferMsg struct { Memo string } -// IICS26RouterMsgsMsgSendPacket is an auto generated low-level Go binding around an user-defined struct. -type IICS26RouterMsgsMsgSendPacket struct { - SourceChannel string - TimeoutTimestamp uint64 - Payloads []IICS26RouterMsgsPayload -} - // IICS26RouterMsgsPayload is an auto generated low-level Go binding around an user-defined struct. type IICS26RouterMsgsPayload struct { SourcePort string @@ -95,7 +88,7 @@ type IICS26RouterMsgsPayload struct { // ContractMetaData contains all meta data concerning the Contract contract. var ContractMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"escrow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ibcDenomContracts\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"newMsgSendPacketV1\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgSendPacket\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onAcknowledgementPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnAcknowledgementPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"onSendPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnSendPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendTransfer\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20AbiEncodingFailure\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOutOfBounds\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"end\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOverflow\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20DenomNotFound\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAmount\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnauthorizedPacketSender\",\"inputs\":[{\"name\":\"packetSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedERC20Balance\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20UnsupportedFeature\",\"inputs\":[{\"name\":\"feature\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"StringsInsufficientHexLength\",\"inputs\":[{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"escrow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ibcERC20Contracts\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"onSendPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnSendPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendTransfer\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20AbiEncodingFailure\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOutOfBounds\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"end\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOverflow\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20DenomNotFound\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAmount\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnauthorizedPacketSender\",\"inputs\":[{\"name\":\"packetSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedERC20Balance\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20UnsupportedFeature\",\"inputs\":[{\"name\":\"feature\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", } // ContractABI is the input ABI used to generate the binding from. @@ -275,12 +268,12 @@ func (_Contract *ContractCallerSession) Escrow() (common.Address, error) { return _Contract.Contract.Escrow(&_Contract.CallOpts) } -// IbcDenomContracts is a free data retrieval call binding the contract method 0x6d4505c9. +// IbcERC20Contracts is a free data retrieval call binding the contract method 0x76cc7fc9. // -// Solidity: function ibcDenomContracts(string denom) view returns(address) -func (_Contract *ContractCaller) IbcDenomContracts(opts *bind.CallOpts, denom string) (common.Address, error) { +// Solidity: function ibcERC20Contracts(string denom) view returns(address) +func (_Contract *ContractCaller) IbcERC20Contracts(opts *bind.CallOpts, denom string) (common.Address, error) { var out []interface{} - err := _Contract.contract.Call(opts, &out, "ibcDenomContracts", denom) + err := _Contract.contract.Call(opts, &out, "ibcERC20Contracts", denom) if err != nil { return *new(common.Address), err @@ -292,49 +285,18 @@ func (_Contract *ContractCaller) IbcDenomContracts(opts *bind.CallOpts, denom st } -// IbcDenomContracts is a free data retrieval call binding the contract method 0x6d4505c9. -// -// Solidity: function ibcDenomContracts(string denom) view returns(address) -func (_Contract *ContractSession) IbcDenomContracts(denom string) (common.Address, error) { - return _Contract.Contract.IbcDenomContracts(&_Contract.CallOpts, denom) -} - -// IbcDenomContracts is a free data retrieval call binding the contract method 0x6d4505c9. -// -// Solidity: function ibcDenomContracts(string denom) view returns(address) -func (_Contract *ContractCallerSession) IbcDenomContracts(denom string) (common.Address, error) { - return _Contract.Contract.IbcDenomContracts(&_Contract.CallOpts, denom) -} - -// NewMsgSendPacketV1 is a free data retrieval call binding the contract method 0xab257155. -// -// Solidity: function newMsgSendPacketV1(address sender, (string,uint256,string,string,string,uint64,string) msg_) view returns((string,uint64,(string,string,string,string,bytes)[])) -func (_Contract *ContractCaller) NewMsgSendPacketV1(opts *bind.CallOpts, sender common.Address, msg_ IICS20TransferMsgsSendTransferMsg) (IICS26RouterMsgsMsgSendPacket, error) { - var out []interface{} - err := _Contract.contract.Call(opts, &out, "newMsgSendPacketV1", sender, msg_) - - if err != nil { - return *new(IICS26RouterMsgsMsgSendPacket), err - } - - out0 := *abi.ConvertType(out[0], new(IICS26RouterMsgsMsgSendPacket)).(*IICS26RouterMsgsMsgSendPacket) - - return out0, err - -} - -// NewMsgSendPacketV1 is a free data retrieval call binding the contract method 0xab257155. +// IbcERC20Contracts is a free data retrieval call binding the contract method 0x76cc7fc9. // -// Solidity: function newMsgSendPacketV1(address sender, (string,uint256,string,string,string,uint64,string) msg_) view returns((string,uint64,(string,string,string,string,bytes)[])) -func (_Contract *ContractSession) NewMsgSendPacketV1(sender common.Address, msg_ IICS20TransferMsgsSendTransferMsg) (IICS26RouterMsgsMsgSendPacket, error) { - return _Contract.Contract.NewMsgSendPacketV1(&_Contract.CallOpts, sender, msg_) +// Solidity: function ibcERC20Contracts(string denom) view returns(address) +func (_Contract *ContractSession) IbcERC20Contracts(denom string) (common.Address, error) { + return _Contract.Contract.IbcERC20Contracts(&_Contract.CallOpts, denom) } -// NewMsgSendPacketV1 is a free data retrieval call binding the contract method 0xab257155. +// IbcERC20Contracts is a free data retrieval call binding the contract method 0x76cc7fc9. // -// Solidity: function newMsgSendPacketV1(address sender, (string,uint256,string,string,string,uint64,string) msg_) view returns((string,uint64,(string,string,string,string,bytes)[])) -func (_Contract *ContractCallerSession) NewMsgSendPacketV1(sender common.Address, msg_ IICS20TransferMsgsSendTransferMsg) (IICS26RouterMsgsMsgSendPacket, error) { - return _Contract.Contract.NewMsgSendPacketV1(&_Contract.CallOpts, sender, msg_) +// Solidity: function ibcERC20Contracts(string denom) view returns(address) +func (_Contract *ContractCallerSession) IbcERC20Contracts(denom string) (common.Address, error) { + return _Contract.Contract.IbcERC20Contracts(&_Contract.CallOpts, denom) } // Owner is a free data retrieval call binding the contract method 0x8da5cb5b. diff --git a/e2e/interchaintestv8/ibc_eureka_test.go b/e2e/interchaintestv8/ibc_eureka_test.go index 27245982..ff566d1a 100644 --- a/e2e/interchaintestv8/ibc_eureka_test.go +++ b/e2e/interchaintestv8/ibc_eureka_test.go @@ -882,7 +882,7 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest callOpts := &bind.CallOpts{ Context: ctx, } - ibcERC20Address, err := s.ics20Contract.IbcDenomContracts(callOpts, ibcDenom) + ibcERC20Address, err := s.ics20Contract.IbcERC20Contracts(callOpts, ibcDenom) s.Require().NoError(err) denomOnEthereum := transfertypes.NewDenom(transferCoin.Denom, transfertypes.NewHop(sendPacket.Payloads[0].DestinationPort, sendPacket.DestinationChannel)) From dc60518e4080737b347874b0f75f10cd1228c0cd Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 5 Dec 2024 13:44:13 +0800 Subject: [PATCH 31/42] imp: readded newMsgSendPacketV1 --- contracts/ICS20Transfer.sol | 14 ++++++++++++-- contracts/interfaces/IICS20Transfer.sol | 13 +++++++++++++ test/solidity-ibc/IBCERC20Test.t.sol | 13 +++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/contracts/ICS20Transfer.sol b/contracts/ICS20Transfer.sol index 7d497e62..df5ebc11 100644 --- a/contracts/ICS20Transfer.sol +++ b/contracts/ICS20Transfer.sol @@ -34,6 +34,11 @@ contract ICS20Transfer is IIBCApp, IICS20Transfer, IICS20Errors, Ownable, Reentr ESCROW = new Escrow(address(this)); } + /// @inheritdoc IICS20Transfer + function escrow() external view override returns (address) { + return address(ESCROW); + } + /// @inheritdoc IICS20Transfer function ibcERC20Contracts(string calldata denom) external view returns (address) { address contractAddress = address(_ibcDenomContracts[denom]); @@ -42,8 +47,13 @@ contract ICS20Transfer is IIBCApp, IICS20Transfer, IICS20Errors, Ownable, Reentr } /// @inheritdoc IICS20Transfer - function escrow() external view override returns (address) { - return address(ESCROW); + function newMsgSendPacketV1(address sender, SendTransferMsg calldata msg_) + external + view + override + returns (IICS26RouterMsgs.MsgSendPacket memory) + { + return ICS20Lib.newMsgSendPacketV1(sender, msg_); } /// @inheritdoc IICS20Transfer diff --git a/contracts/interfaces/IICS20Transfer.sol b/contracts/interfaces/IICS20Transfer.sol index f37d7a50..1a07cac3 100644 --- a/contracts/interfaces/IICS20Transfer.sol +++ b/contracts/interfaces/IICS20Transfer.sol @@ -21,4 +21,17 @@ interface IICS20Transfer is IICS20TransferMsgs { /// @param denom The IBC denom /// @return The ERC20 contract address function ibcERC20Contracts(string calldata denom) external view returns (address); + + /// @notice Create an ICS26RouterMsgs.MsgSendPacket message for ics20-1. + /// @notice This is a helper function for constructing the MsgSendPacket for ICS26Router. + /// @param sender The sender of the transfer + /// @param msg The message for sending a transfer + /// @return The constructed MsgSendPacket + function newMsgSendPacketV1( + address sender, + SendTransferMsg calldata msg + ) + external + view + returns (IICS26RouterMsgs.MsgSendPacket memory); } diff --git a/test/solidity-ibc/IBCERC20Test.t.sol b/test/solidity-ibc/IBCERC20Test.t.sol index 00d4b717..83e38d2e 100644 --- a/test/solidity-ibc/IBCERC20Test.t.sol +++ b/test/solidity-ibc/IBCERC20Test.t.sol @@ -123,4 +123,17 @@ contract IBCERC20Test is Test, IICS20Transfer { function ibcERC20Contracts(string calldata) external pure override returns (address) { return address(0); } + + // Dummy implementation of IICS20Transfer + function newMsgSendPacketV1( + address, + SendTransferMsg calldata + ) + external + pure + override + returns (IICS26RouterMsgs.MsgSendPacket memory) + { + return IICS26RouterMsgs.MsgSendPacket("", 0, new IICS26RouterMsgs.Payload[](0)); + } } From facbdda8d4c781d9174ddf6fe64f0395df009ece Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 5 Dec 2024 13:45:33 +0800 Subject: [PATCH 32/42] style: ran forge fmt --- contracts/ICS20Transfer.sol | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/contracts/ICS20Transfer.sol b/contracts/ICS20Transfer.sol index df5ebc11..5541013c 100644 --- a/contracts/ICS20Transfer.sol +++ b/contracts/ICS20Transfer.sol @@ -47,7 +47,10 @@ contract ICS20Transfer is IIBCApp, IICS20Transfer, IICS20Errors, Ownable, Reentr } /// @inheritdoc IICS20Transfer - function newMsgSendPacketV1(address sender, SendTransferMsg calldata msg_) + function newMsgSendPacketV1( + address sender, + SendTransferMsg calldata msg_ + ) external view override From ae5bacc8646de73a7202854d50890008300bf79f Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 5 Dec 2024 13:46:11 +0800 Subject: [PATCH 33/42] imp: regenerated abi --- abi/ICS20Transfer.json | 105 +++++++++++++++++++++++++++++++ abigen/ics20transfer/contract.go | 40 +++++++++++- 2 files changed, 144 insertions(+), 1 deletion(-) diff --git a/abi/ICS20Transfer.json b/abi/ICS20Transfer.json index 808685ea..9e7b8f42 100644 --- a/abi/ICS20Transfer.json +++ b/abi/ICS20Transfer.json @@ -61,6 +61,111 @@ ], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "newMsgSendPacketV1", + "inputs": [ + { + "name": "sender", + "type": "address", + "internalType": "address" + }, + { + "name": "msg_", + "type": "tuple", + "internalType": "struct IICS20TransferMsgs.SendTransferMsg", + "components": [ + { + "name": "denom", + "type": "string", + "internalType": "string" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "receiver", + "type": "string", + "internalType": "string" + }, + { + "name": "sourceChannel", + "type": "string", + "internalType": "string" + }, + { + "name": "destPort", + "type": "string", + "internalType": "string" + }, + { + "name": "timeoutTimestamp", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "memo", + "type": "string", + "internalType": "string" + } + ] + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IICS26RouterMsgs.MsgSendPacket", + "components": [ + { + "name": "sourceChannel", + "type": "string", + "internalType": "string" + }, + { + "name": "timeoutTimestamp", + "type": "uint64", + "internalType": "uint64" + }, + { + "name": "payloads", + "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" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "onAcknowledgementPacket", diff --git a/abigen/ics20transfer/contract.go b/abigen/ics20transfer/contract.go index cee6ee97..f12712e4 100644 --- a/abigen/ics20transfer/contract.go +++ b/abigen/ics20transfer/contract.go @@ -77,6 +77,13 @@ type IICS20TransferMsgsSendTransferMsg struct { Memo string } +// IICS26RouterMsgsMsgSendPacket is an auto generated low-level Go binding around an user-defined struct. +type IICS26RouterMsgsMsgSendPacket struct { + SourceChannel string + TimeoutTimestamp uint64 + Payloads []IICS26RouterMsgsPayload +} + // IICS26RouterMsgsPayload is an auto generated low-level Go binding around an user-defined struct. type IICS26RouterMsgsPayload struct { SourcePort string @@ -88,7 +95,7 @@ type IICS26RouterMsgsPayload struct { // ContractMetaData contains all meta data concerning the Contract contract. var ContractMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"escrow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ibcERC20Contracts\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"onSendPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnSendPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendTransfer\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20AbiEncodingFailure\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOutOfBounds\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"end\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOverflow\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20DenomNotFound\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAmount\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnauthorizedPacketSender\",\"inputs\":[{\"name\":\"packetSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedERC20Balance\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20UnsupportedFeature\",\"inputs\":[{\"name\":\"feature\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"escrow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ibcERC20Contracts\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"newMsgSendPacketV1\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgSendPacket\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onAcknowledgementPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnAcknowledgementPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"onSendPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnSendPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendTransfer\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20AbiEncodingFailure\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOutOfBounds\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"end\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOverflow\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20DenomNotFound\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAmount\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnauthorizedPacketSender\",\"inputs\":[{\"name\":\"packetSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedERC20Balance\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20UnsupportedFeature\",\"inputs\":[{\"name\":\"feature\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", } // ContractABI is the input ABI used to generate the binding from. @@ -299,6 +306,37 @@ func (_Contract *ContractCallerSession) IbcERC20Contracts(denom string) (common. return _Contract.Contract.IbcERC20Contracts(&_Contract.CallOpts, denom) } +// NewMsgSendPacketV1 is a free data retrieval call binding the contract method 0xab257155. +// +// Solidity: function newMsgSendPacketV1(address sender, (string,uint256,string,string,string,uint64,string) msg_) view returns((string,uint64,(string,string,string,string,bytes)[])) +func (_Contract *ContractCaller) NewMsgSendPacketV1(opts *bind.CallOpts, sender common.Address, msg_ IICS20TransferMsgsSendTransferMsg) (IICS26RouterMsgsMsgSendPacket, error) { + var out []interface{} + err := _Contract.contract.Call(opts, &out, "newMsgSendPacketV1", sender, msg_) + + if err != nil { + return *new(IICS26RouterMsgsMsgSendPacket), err + } + + out0 := *abi.ConvertType(out[0], new(IICS26RouterMsgsMsgSendPacket)).(*IICS26RouterMsgsMsgSendPacket) + + return out0, err + +} + +// NewMsgSendPacketV1 is a free data retrieval call binding the contract method 0xab257155. +// +// Solidity: function newMsgSendPacketV1(address sender, (string,uint256,string,string,string,uint64,string) msg_) view returns((string,uint64,(string,string,string,string,bytes)[])) +func (_Contract *ContractSession) NewMsgSendPacketV1(sender common.Address, msg_ IICS20TransferMsgsSendTransferMsg) (IICS26RouterMsgsMsgSendPacket, error) { + return _Contract.Contract.NewMsgSendPacketV1(&_Contract.CallOpts, sender, msg_) +} + +// NewMsgSendPacketV1 is a free data retrieval call binding the contract method 0xab257155. +// +// Solidity: function newMsgSendPacketV1(address sender, (string,uint256,string,string,string,uint64,string) msg_) view returns((string,uint64,(string,string,string,string,bytes)[])) +func (_Contract *ContractCallerSession) NewMsgSendPacketV1(sender common.Address, msg_ IICS20TransferMsgsSendTransferMsg) (IICS26RouterMsgsMsgSendPacket, error) { + return _Contract.Contract.NewMsgSendPacketV1(&_Contract.CallOpts, sender, msg_) +} + // Owner is a free data retrieval call binding the contract method 0x8da5cb5b. // // Solidity: function owner() view returns(address) From e7338da6950eaaa713175457703d738777e010fb Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 5 Dec 2024 16:30:32 +0800 Subject: [PATCH 34/42] e2e: fixed one of the tests --- e2e/interchaintestv8/ibc_eureka_test.go | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/e2e/interchaintestv8/ibc_eureka_test.go b/e2e/interchaintestv8/ibc_eureka_test.go index ff566d1a..9b5d7e7d 100644 --- a/e2e/interchaintestv8/ibc_eureka_test.go +++ b/e2e/interchaintestv8/ibc_eureka_test.go @@ -21,7 +21,6 @@ import ( "golang.org/x/crypto/sha3" "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" ethcommon "github.com/ethereum/go-ethereum/common" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" @@ -830,7 +829,6 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest var ibcERC20 *ibcerc20.Contract var ibcERC20Address string var recvBlockNumber int64 - s.Require().True(s.Run("Receive packet on Ethereum", func() { packetCommitmentPath := ibchostv2.PacketCommitmentKey(sendPacket.SourceChannel, sendPacket.Sequence) proofHeight, ucAndMemProof := s.updateClientAndMembershipProof(ctx, simd, pt, [][]byte{packetCommitmentPath}) @@ -870,24 +868,15 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest ethClient, err := ethclient.Dial(eth.RPC) s.Require().NoError(err) - // Extract values from the test for constructing the full denom path - destPort := sendPacket.Payloads[0].DestinationPort - destChannel := sendPacket.DestinationChannel - baseDenom := transferCoin.Denom - // Recreate the full denom path - fullDenomPath := fmt.Sprintf("%s/%s/%s", destPort, destChannel, baseDenom) + denomOnEthereum := transfertypes.NewDenom(transferCoin.Denom, transfertypes.NewHop(sendPacket.Payloads[0].DestinationPort, sendPacket.DestinationChannel)) - ibcDenom := toIBCDenom(fullDenomPath) - callOpts := &bind.CallOpts{ - Context: ctx, - } - ibcERC20Address, err := s.ics20Contract.IbcERC20Contracts(callOpts, ibcDenom) + ibcERC20Addr, err := s.ics20Contract.IbcERC20Contracts(nil, denomOnEthereum.IBCDenom()) s.Require().NoError(err) - denomOnEthereum := transfertypes.NewDenom(transferCoin.Denom, transfertypes.NewHop(sendPacket.Payloads[0].DestinationPort, sendPacket.DestinationChannel)) + ibcERC20Address = ibcERC20Addr.Hex() - ibcERC20, err = ibcerc20.NewContract(ethcommon.HexToAddress(ibcERC20Address.Hex()), ethClient) + ibcERC20, err = ibcerc20.NewContract(ethcommon.HexToAddress(ibcERC20Addr.Hex()), ethClient) s.Require().NoError(err) actualDenom, err := ibcERC20.Name(nil) @@ -981,12 +970,12 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest s.Require().Equal(transfertypes.EncodingABI, returnPacket.Payloads[0].Encoding) s.True(s.Run("Verify balances on Ethereum", func() { - userBalance, err := s.erc20Contract.BalanceOf(nil, ethereumUserAddress) + userBalance, err := ibcERC20.BalanceOf(nil, ethereumUserAddress) s.Require().NoError(err) s.Require().Equal(int64(0), userBalance.Int64()) // the whole balance should have been burned - ics20TransferBalance, err := s.erc20Contract.BalanceOf(nil, ics20Address) + ics20TransferBalance, err := ibcERC20.BalanceOf(nil, ics20Address) s.Require().NoError(err) s.Require().Equal(int64(0), ics20TransferBalance.Int64()) })) From a53f382f41e00f57e82b3f5d6a60a89df386d4de Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 5 Dec 2024 16:34:12 +0800 Subject: [PATCH 35/42] imp: removed unused functions --- e2e/interchaintestv8/ibc_eureka_test.go | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/e2e/interchaintestv8/ibc_eureka_test.go b/e2e/interchaintestv8/ibc_eureka_test.go index 9b5d7e7d..4d078c09 100644 --- a/e2e/interchaintestv8/ibc_eureka_test.go +++ b/e2e/interchaintestv8/ibc_eureka_test.go @@ -18,7 +18,6 @@ import ( "github.com/cosmos/solidity-ibc-eureka/abigen/ics26router" "github.com/cosmos/solidity-ibc-eureka/abigen/icscore" "github.com/stretchr/testify/suite" - "golang.org/x/crypto/sha3" "github.com/ethereum/go-ethereum/accounts/abi" ethcommon "github.com/ethereum/go-ethereum/common" @@ -218,24 +217,6 @@ func (s *IbcEurekaTestSuite) SetupSuite(ctx context.Context, proofType operator. })) } -const ( - IBC_DENOM_PREFIX = "ibc/" // Matches the Solidity constant -) - -// toIBCDenom replicates the Solidity toIBCDenom function -func toIBCDenom(fullDenomPath string) string { - // Compute Keccak256 hash of the fullDenomPath - hasher := sha3.NewLegacyKeccak256() - hasher.Write([]byte(fullDenomPath)) - hash := hasher.Sum(nil) - - // Convert hash to hex string - hashHex := hex.EncodeToString(hash) - - // Prepend the IBC_DENOM_PREFIX - return IBC_DENOM_PREFIX + hashHex -} - func (s *IbcEurekaTestSuite) TestDeploy_Groth16() { ctx := context.Background() s.DeployTest(ctx, operator.ProofTypeGroth16) From b8ee44d2845e79ec06009fcfaa58d05ca3254107 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 5 Dec 2024 16:37:41 +0800 Subject: [PATCH 36/42] test: added missing line --- test/solidity-ibc/BenchmarkTest.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/solidity-ibc/BenchmarkTest.t.sol b/test/solidity-ibc/BenchmarkTest.t.sol index b9b6e2a6..3ff4e498 100644 --- a/test/solidity-ibc/BenchmarkTest.t.sol +++ b/test/solidity-ibc/BenchmarkTest.t.sol @@ -131,7 +131,7 @@ contract BenchmarkTest is FixtureTest { vm.prank(user); erc20.approve(address(ics20Transfer), amountToSend); - IICS26RouterMsgs.MsgSendPacket memory msgSendPacket = ICS20Lib.newMsgSendPacketV1( + IICS26RouterMsgs.MsgSendPacket memory msgSendPacket = ics20Transfer.newMsgSendPacketV1( user, IICS20TransferMsgs.SendTransferMsg({ denom: packetData.denom, From 337f46bdc1f6369a1a9480a3a0bdebcc6bab0ca7 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 5 Dec 2024 16:45:46 +0800 Subject: [PATCH 37/42] imp: remove commented code --- e2e/interchaintestv8/ibc_eureka_test.go | 9 --------- 1 file changed, 9 deletions(-) diff --git a/e2e/interchaintestv8/ibc_eureka_test.go b/e2e/interchaintestv8/ibc_eureka_test.go index 4d078c09..6416e4f7 100644 --- a/e2e/interchaintestv8/ibc_eureka_test.go +++ b/e2e/interchaintestv8/ibc_eureka_test.go @@ -1082,15 +1082,6 @@ func (s *IbcEurekaTestSuite) ICS20TransferTimeoutFromEthereumToCosmosChainTest(c receipt := s.GetTxReciept(ctx, eth, tx.Hash()) s.Require().Equal(ethtypes.ReceiptStatusSuccessful, receipt.Status) - /* - transferEvent, err := e2esuite.GetEvmEvent(receipt, s.ics20Contract.ParseICS20Transfer) - s.Require().NoError(err) - s.Require().Equal(s.contractAddresses.Erc20, strings.ToLower(transferEvent.Erc20Address.Hex())) - s.Require().Equal(testvalues.TransferAmount, transferEvent.PacketData.Amount.Int64()) // Because the amount is converted to the sdk amount - s.Require().Equal(strings.ToLower(ethereumUserAddress.Hex()), strings.ToLower(transferEvent.PacketData.Sender)) - s.Require().Equal(cosmosUserAddress, transferEvent.PacketData.Receiver) - s.Require().Equal("testmemo", transferEvent.PacketData.Memo) - */ sendPacketEvent, err := e2esuite.GetEvmEvent(receipt, s.ics26Contract.ParseSendPacket) s.Require().NoError(err) packet = sendPacketEvent.Packet From 9dd17ff9c340cffc9d6574d213654790fe5acc54 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Thu, 5 Dec 2024 18:08:03 +0800 Subject: [PATCH 38/42] imp: regenerated abi --- abigen/ibcstore/contract.go | 272 +----------------------------------- 1 file changed, 1 insertion(+), 271 deletions(-) diff --git a/abigen/ibcstore/contract.go b/abigen/ibcstore/contract.go index b96a9489..d43ab17b 100644 --- a/abigen/ibcstore/contract.go +++ b/abigen/ibcstore/contract.go @@ -49,7 +49,7 @@ type IICS26RouterMsgsPayload struct { // ContractMetaData contains all meta data concerning the Contract contract. var ContractMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"commitPacket\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"commitPacketAcknowledgement\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\":\"acks\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deletePacketCommitment\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCommitment\",\"inputs\":[{\"name\":\"hashedPath\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextSequenceSend\",\"inputs\":[{\"name\":\"channelId\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPacketReceipt\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AckCommitted\",\"inputs\":[{\"name\":\"path\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"commitment\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PacketCommitted\",\"inputs\":[{\"name\":\"path\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"commitment\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"IBCMultiPayloadPacketNotSupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IBCPacketAcknowledgementAlreadyExists\",\"inputs\":[{\"name\":\"path\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"IBCPacketCommitmentAlreadyExists\",\"inputs\":[{\"name\":\"path\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"IBCPacketCommitmentNotFound\",\"inputs\":[{\"name\":\"path\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"IBCPacketReceiptAlreadyExists\",\"inputs\":[{\"name\":\"path\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidMerklePrefix\",\"inputs\":[{\"name\":\"prefix\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"commitPacket\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"commitPacketAcknowledgement\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\":\"acks\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deletePacketCommitment\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCommitment\",\"inputs\":[{\"name\":\"hashedPath\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextSequenceSend\",\"inputs\":[{\"name\":\"channelId\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPacketReceipt\",\"inputs\":[{\"name\":\"packet\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.Packet\",\"components\":[{\"name\":\"sequence\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"IBCMultiPayloadPacketNotSupported\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IBCPacketAcknowledgementAlreadyExists\",\"inputs\":[{\"name\":\"path\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"IBCPacketCommitmentAlreadyExists\",\"inputs\":[{\"name\":\"path\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"IBCPacketCommitmentNotFound\",\"inputs\":[{\"name\":\"path\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"IBCPacketReceiptAlreadyExists\",\"inputs\":[{\"name\":\"path\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidMerklePrefix\",\"inputs\":[{\"name\":\"prefix\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]}]", } // ContractABI is the input ABI used to generate the binding from. @@ -407,141 +407,6 @@ func (_Contract *ContractTransactorSession) TransferOwnership(newOwner common.Ad return _Contract.Contract.TransferOwnership(&_Contract.TransactOpts, newOwner) } -// ContractAckCommittedIterator is returned from FilterAckCommitted and is used to iterate over the raw logs and unpacked data for AckCommitted events raised by the Contract contract. -type ContractAckCommittedIterator struct { - Event *ContractAckCommitted // 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 *ContractAckCommittedIterator) 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(ContractAckCommitted) - 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(ContractAckCommitted) - 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 *ContractAckCommittedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ContractAckCommittedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ContractAckCommitted represents a AckCommitted event raised by the Contract contract. -type ContractAckCommitted struct { - Path [32]byte - Commitment [32]byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterAckCommitted is a free log retrieval operation binding the contract event 0x72349fd5fceade63688527ecf373bf51f68b4b2d48708886b9c9dfbe42e181d0. -// -// Solidity: event AckCommitted(bytes32 path, bytes32 commitment) -func (_Contract *ContractFilterer) FilterAckCommitted(opts *bind.FilterOpts) (*ContractAckCommittedIterator, error) { - - logs, sub, err := _Contract.contract.FilterLogs(opts, "AckCommitted") - if err != nil { - return nil, err - } - return &ContractAckCommittedIterator{contract: _Contract.contract, event: "AckCommitted", logs: logs, sub: sub}, nil -} - -// WatchAckCommitted is a free log subscription operation binding the contract event 0x72349fd5fceade63688527ecf373bf51f68b4b2d48708886b9c9dfbe42e181d0. -// -// Solidity: event AckCommitted(bytes32 path, bytes32 commitment) -func (_Contract *ContractFilterer) WatchAckCommitted(opts *bind.WatchOpts, sink chan<- *ContractAckCommitted) (event.Subscription, error) { - - logs, sub, err := _Contract.contract.WatchLogs(opts, "AckCommitted") - 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(ContractAckCommitted) - if err := _Contract.contract.UnpackLog(event, "AckCommitted", 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 -} - -// ParseAckCommitted is a log parse operation binding the contract event 0x72349fd5fceade63688527ecf373bf51f68b4b2d48708886b9c9dfbe42e181d0. -// -// Solidity: event AckCommitted(bytes32 path, bytes32 commitment) -func (_Contract *ContractFilterer) ParseAckCommitted(log types.Log) (*ContractAckCommitted, error) { - event := new(ContractAckCommitted) - if err := _Contract.contract.UnpackLog(event, "AckCommitted", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // ContractOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the Contract contract. type ContractOwnershipTransferredIterator struct { Event *ContractOwnershipTransferred // Event containing the contract specifics and raw log @@ -694,138 +559,3 @@ func (_Contract *ContractFilterer) ParseOwnershipTransferred(log types.Log) (*Co event.Raw = log return event, nil } - -// ContractPacketCommittedIterator is returned from FilterPacketCommitted and is used to iterate over the raw logs and unpacked data for PacketCommitted events raised by the Contract contract. -type ContractPacketCommittedIterator struct { - Event *ContractPacketCommitted // 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 *ContractPacketCommittedIterator) 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(ContractPacketCommitted) - 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(ContractPacketCommitted) - 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 *ContractPacketCommittedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ContractPacketCommittedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ContractPacketCommitted represents a PacketCommitted event raised by the Contract contract. -type ContractPacketCommitted struct { - Path [32]byte - Commitment [32]byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterPacketCommitted is a free log retrieval operation binding the contract event 0x5798403521c4d56c2b26335b4ee251cdb1c05d30f85e07e78c0fa8053187fb16. -// -// Solidity: event PacketCommitted(bytes32 path, bytes32 commitment) -func (_Contract *ContractFilterer) FilterPacketCommitted(opts *bind.FilterOpts) (*ContractPacketCommittedIterator, error) { - - logs, sub, err := _Contract.contract.FilterLogs(opts, "PacketCommitted") - if err != nil { - return nil, err - } - return &ContractPacketCommittedIterator{contract: _Contract.contract, event: "PacketCommitted", logs: logs, sub: sub}, nil -} - -// WatchPacketCommitted is a free log subscription operation binding the contract event 0x5798403521c4d56c2b26335b4ee251cdb1c05d30f85e07e78c0fa8053187fb16. -// -// Solidity: event PacketCommitted(bytes32 path, bytes32 commitment) -func (_Contract *ContractFilterer) WatchPacketCommitted(opts *bind.WatchOpts, sink chan<- *ContractPacketCommitted) (event.Subscription, error) { - - logs, sub, err := _Contract.contract.WatchLogs(opts, "PacketCommitted") - 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(ContractPacketCommitted) - if err := _Contract.contract.UnpackLog(event, "PacketCommitted", 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 -} - -// ParsePacketCommitted is a log parse operation binding the contract event 0x5798403521c4d56c2b26335b4ee251cdb1c05d30f85e07e78c0fa8053187fb16. -// -// Solidity: event PacketCommitted(bytes32 path, bytes32 commitment) -func (_Contract *ContractFilterer) ParsePacketCommitted(log types.Log) (*ContractPacketCommitted, error) { - event := new(ContractPacketCommitted) - if err := _Contract.contract.UnpackLog(event, "PacketCommitted", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} From c4a9cf9557fef8cce884343f1d3834a5c7dd26b3 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Fri, 6 Dec 2024 10:46:26 +0800 Subject: [PATCH 39/42] refactor: rename func --- contracts/ICS20Transfer.sol | 6 +++--- contracts/interfaces/IICS20Transfer.sol | 2 +- test/solidity-ibc/IBCERC20Test.t.sol | 2 +- test/solidity-ibc/ICS20TransferTest.t.sol | 4 ++-- test/solidity-ibc/IntegrationTest.t.sol | 6 +++--- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/contracts/ICS20Transfer.sol b/contracts/ICS20Transfer.sol index 5541013c..9a7b596f 100644 --- a/contracts/ICS20Transfer.sol +++ b/contracts/ICS20Transfer.sol @@ -40,7 +40,7 @@ contract ICS20Transfer is IIBCApp, IICS20Transfer, IICS20Errors, Ownable, Reentr } /// @inheritdoc IICS20Transfer - function ibcERC20Contracts(string calldata denom) external view returns (address) { + function ibcERC20Contract(string calldata denom) external view returns (address) { address contractAddress = address(_ibcDenomContracts[denom]); require(contractAddress != address(0), ICS20DenomNotFound(denom)); return contractAddress; @@ -91,8 +91,8 @@ contract ICS20Transfer is IIBCApp, IICS20Transfer, IICS20Errors, Ownable, Reentr if (!originatorChainIsSource) { // receiver chain is source: burn the vouchers - IBCERC20 ibcERC20Contract = IBCERC20(erc20Address); - ibcERC20Contract.burn(packetData.amount); + IBCERC20 ibcERC20 = IBCERC20(erc20Address); + ibcERC20.burn(packetData.amount); } } diff --git a/contracts/interfaces/IICS20Transfer.sol b/contracts/interfaces/IICS20Transfer.sol index 1a07cac3..1e6c7c34 100644 --- a/contracts/interfaces/IICS20Transfer.sol +++ b/contracts/interfaces/IICS20Transfer.sol @@ -20,7 +20,7 @@ interface IICS20Transfer is IICS20TransferMsgs { /// @notice Retrieve the ERC20 contract address for the given IBC denom /// @param denom The IBC denom /// @return The ERC20 contract address - function ibcERC20Contracts(string calldata denom) external view returns (address); + function ibcERC20Contract(string calldata denom) external view returns (address); /// @notice Create an ICS26RouterMsgs.MsgSendPacket message for ics20-1. /// @notice This is a helper function for constructing the MsgSendPacket for ICS26Router. diff --git a/test/solidity-ibc/IBCERC20Test.t.sol b/test/solidity-ibc/IBCERC20Test.t.sol index 83e38d2e..0918b206 100644 --- a/test/solidity-ibc/IBCERC20Test.t.sol +++ b/test/solidity-ibc/IBCERC20Test.t.sol @@ -120,7 +120,7 @@ contract IBCERC20Test is Test, IICS20Transfer { } // Dummy implementation of IICS20Transfer - function ibcERC20Contracts(string calldata) external pure override returns (address) { + function ibcERC20Contract(string calldata) external pure override returns (address) { return address(0); } diff --git a/test/solidity-ibc/ICS20TransferTest.t.sol b/test/solidity-ibc/ICS20TransferTest.t.sol index b622716b..31b53257 100644 --- a/test/solidity-ibc/ICS20TransferTest.t.sol +++ b/test/solidity-ibc/ICS20TransferTest.t.sol @@ -735,7 +735,7 @@ contract ICS20TransferTest is Test { ); assertEq(ack, ICS20Lib.SUCCESSFUL_ACKNOWLEDGEMENT_JSON); - address erc20Address = address(ics20Transfer.ibcERC20Contracts(ICS20Lib.toIBCDenom(expectedFullDenomPath))); + address erc20Address = address(ics20Transfer.ibcERC20Contract(ICS20Lib.toIBCDenom(expectedFullDenomPath))); ICS20Lib.FungibleTokenPacketData memory packetData = abi.decode(packet.payloads[0].value, (ICS20Lib.FungibleTokenPacketData)); @@ -792,7 +792,7 @@ contract ICS20TransferTest is Test { ); assertEq(ack, ICS20Lib.SUCCESSFUL_ACKNOWLEDGEMENT_JSON); - address erc20Address = address(ics20Transfer.ibcERC20Contracts(ICS20Lib.toIBCDenom(expectedFullDenomPath))); + address erc20Address = address(ics20Transfer.ibcERC20Contract(ICS20Lib.toIBCDenom(expectedFullDenomPath))); ICS20Lib.FungibleTokenPacketData memory packetData = abi.decode(packet.payloads[0].value, (ICS20Lib.FungibleTokenPacketData)); diff --git a/test/solidity-ibc/IntegrationTest.t.sol b/test/solidity-ibc/IntegrationTest.t.sol index 3ccd0d37..a6b53eb7 100644 --- a/test/solidity-ibc/IntegrationTest.t.sol +++ b/test/solidity-ibc/IntegrationTest.t.sol @@ -587,7 +587,7 @@ contract IntegrationTest is Test { ); assertEq(storedAck, ICS24Host.packetAcknowledgementCommitmentBytes32(singleSuccessAck)); - address erc20Address = address(ics20Transfer.ibcERC20Contracts(ICS20Lib.toIBCDenom(expectedFullDenomPath))); + address erc20Address = address(ics20Transfer.ibcERC20Contract(ICS20Lib.toIBCDenom(expectedFullDenomPath))); ICS20Lib.FungibleTokenPacketData memory packetData = abi.decode(receivePacket.payloads[0].value, (ICS20Lib.FungibleTokenPacketData)); @@ -868,7 +868,7 @@ contract IntegrationTest is Test { ); assertEq(storedAck, ICS24Host.packetAcknowledgementCommitmentBytes32(singleSuccessAck)); - address erc20Address = address(ics20Transfer.ibcERC20Contracts(ICS20Lib.toIBCDenom(expectedFullDenomPath))); + address erc20Address = address(ics20Transfer.ibcERC20Contract(ICS20Lib.toIBCDenom(expectedFullDenomPath))); ICS20Lib.FungibleTokenPacketData memory packetData = abi.decode(receivePacket.payloads[0].value, (ICS20Lib.FungibleTokenPacketData)); @@ -1002,7 +1002,7 @@ contract IntegrationTest is Test { ); assertEq(storedAck, ICS24Host.packetAcknowledgementCommitmentBytes32(singleSuccessAck)); - address erc20Address = address(ics20Transfer.ibcERC20Contracts(ICS20Lib.toIBCDenom(expectedFullDenomPath))); + address erc20Address = address(ics20Transfer.ibcERC20Contract(ICS20Lib.toIBCDenom(expectedFullDenomPath))); ICS20Lib.FungibleTokenPacketData memory packetData = abi.decode(receivePacket.payloads[0].value, (ICS20Lib.FungibleTokenPacketData)); From b73d1628037edfb0a8ab6ac5f87e1ae9883afbfb Mon Sep 17 00:00:00 2001 From: srdtrk Date: Fri, 6 Dec 2024 10:47:16 +0800 Subject: [PATCH 40/42] imp: regen abi --- abi/ICS20Transfer.json | 2 +- abigen/ics20transfer/contract.go | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/abi/ICS20Transfer.json b/abi/ICS20Transfer.json index 9e7b8f42..1091e107 100644 --- a/abi/ICS20Transfer.json +++ b/abi/ICS20Transfer.json @@ -25,7 +25,7 @@ }, { "type": "function", - "name": "ibcERC20Contracts", + "name": "ibcERC20Contract", "inputs": [ { "name": "denom", diff --git a/abigen/ics20transfer/contract.go b/abigen/ics20transfer/contract.go index f12712e4..469347ab 100644 --- a/abigen/ics20transfer/contract.go +++ b/abigen/ics20transfer/contract.go @@ -95,7 +95,7 @@ type IICS26RouterMsgsPayload struct { // ContractMetaData contains all meta data concerning the Contract contract. var ContractMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"escrow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ibcERC20Contracts\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"newMsgSendPacketV1\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgSendPacket\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onAcknowledgementPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnAcknowledgementPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"onSendPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnSendPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendTransfer\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20AbiEncodingFailure\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOutOfBounds\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"end\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOverflow\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20DenomNotFound\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAmount\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnauthorizedPacketSender\",\"inputs\":[{\"name\":\"packetSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedERC20Balance\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20UnsupportedFeature\",\"inputs\":[{\"name\":\"feature\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"escrow\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ibcERC20Contract\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"newMsgSendPacketV1\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIICS26RouterMsgs.MsgSendPacket\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"payloads\",\"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\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onAcknowledgementPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnAcknowledgementPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"onSendPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnSendPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onTimeoutPacket\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIIBCAppCallbacks.OnTimeoutPacketCallback\",\"components\":[{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destinationChannel\",\"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\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"sendTransfer\",\"inputs\":[{\"name\":\"msg_\",\"type\":\"tuple\",\"internalType\":\"structIICS20TransferMsgs.SendTransferMsg\",\"components\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"sourceChannel\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"destPort\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"timeoutTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"memo\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FailedCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20AbiEncodingFailure\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOutOfBounds\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"end\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20BytesSliceOverflow\",\"inputs\":[{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20DenomNotFound\",\"inputs\":[{\"name\":\"denom\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20InvalidAmount\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnauthorizedPacketSender\",\"inputs\":[{\"name\":\"packetSender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedERC20Balance\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ICS20UnexpectedVersion\",\"inputs\":[{\"name\":\"expected\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"ICS20UnsupportedFeature\",\"inputs\":[{\"name\":\"feature\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", } // ContractABI is the input ABI used to generate the binding from. @@ -275,12 +275,12 @@ func (_Contract *ContractCallerSession) Escrow() (common.Address, error) { return _Contract.Contract.Escrow(&_Contract.CallOpts) } -// IbcERC20Contracts is a free data retrieval call binding the contract method 0x76cc7fc9. +// IbcERC20Contract is a free data retrieval call binding the contract method 0xa50ee2b4. // -// Solidity: function ibcERC20Contracts(string denom) view returns(address) -func (_Contract *ContractCaller) IbcERC20Contracts(opts *bind.CallOpts, denom string) (common.Address, error) { +// Solidity: function ibcERC20Contract(string denom) view returns(address) +func (_Contract *ContractCaller) IbcERC20Contract(opts *bind.CallOpts, denom string) (common.Address, error) { var out []interface{} - err := _Contract.contract.Call(opts, &out, "ibcERC20Contracts", denom) + err := _Contract.contract.Call(opts, &out, "ibcERC20Contract", denom) if err != nil { return *new(common.Address), err @@ -292,18 +292,18 @@ func (_Contract *ContractCaller) IbcERC20Contracts(opts *bind.CallOpts, denom st } -// IbcERC20Contracts is a free data retrieval call binding the contract method 0x76cc7fc9. +// IbcERC20Contract is a free data retrieval call binding the contract method 0xa50ee2b4. // -// Solidity: function ibcERC20Contracts(string denom) view returns(address) -func (_Contract *ContractSession) IbcERC20Contracts(denom string) (common.Address, error) { - return _Contract.Contract.IbcERC20Contracts(&_Contract.CallOpts, denom) +// Solidity: function ibcERC20Contract(string denom) view returns(address) +func (_Contract *ContractSession) IbcERC20Contract(denom string) (common.Address, error) { + return _Contract.Contract.IbcERC20Contract(&_Contract.CallOpts, denom) } -// IbcERC20Contracts is a free data retrieval call binding the contract method 0x76cc7fc9. +// IbcERC20Contract is a free data retrieval call binding the contract method 0xa50ee2b4. // -// Solidity: function ibcERC20Contracts(string denom) view returns(address) -func (_Contract *ContractCallerSession) IbcERC20Contracts(denom string) (common.Address, error) { - return _Contract.Contract.IbcERC20Contracts(&_Contract.CallOpts, denom) +// Solidity: function ibcERC20Contract(string denom) view returns(address) +func (_Contract *ContractCallerSession) IbcERC20Contract(denom string) (common.Address, error) { + return _Contract.Contract.IbcERC20Contract(&_Contract.CallOpts, denom) } // NewMsgSendPacketV1 is a free data retrieval call binding the contract method 0xab257155. From 86c4064d1225d8ffab15a326114448998059ae0f Mon Sep 17 00:00:00 2001 From: srdtrk Date: Fri, 6 Dec 2024 10:47:50 +0800 Subject: [PATCH 41/42] fix: name --- e2e/interchaintestv8/ibc_eureka_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/interchaintestv8/ibc_eureka_test.go b/e2e/interchaintestv8/ibc_eureka_test.go index 39afd303..e520bbde 100644 --- a/e2e/interchaintestv8/ibc_eureka_test.go +++ b/e2e/interchaintestv8/ibc_eureka_test.go @@ -852,7 +852,7 @@ func (s *IbcEurekaTestSuite) ICS20TransferNativeCosmosCoinsToEthereumAndBackTest // Recreate the full denom path denomOnEthereum := transfertypes.NewDenom(transferCoin.Denom, transfertypes.NewHop(sendPacket.Payloads[0].DestinationPort, sendPacket.DestinationChannel)) - ibcERC20Addr, err := s.ics20Contract.IbcERC20Contracts(nil, denomOnEthereum.IBCDenom()) + ibcERC20Addr, err := s.ics20Contract.IbcERC20Contract(nil, denomOnEthereum.IBCDenom()) s.Require().NoError(err) ibcERC20Address = ibcERC20Addr.Hex() From 5649f2025355567be98ece0b677fa72c668996f6 Mon Sep 17 00:00:00 2001 From: srdtrk Date: Fri, 6 Dec 2024 11:01:46 +0800 Subject: [PATCH 42/42] docs: updated benchmarks --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 285743db..700ec0f1 100644 --- a/README.md +++ b/README.md @@ -161,11 +161,11 @@ The following benchmarks are for a single packet transfer without aggregation. | **Contract** | **Method** | **Description** | **Gas (groth16)** | **Gas (plonk)** | |:---:|:---:|:---:|:---:|:---:| -| `ICS26Router.sol` | `sendPacket` | Initiating an IBC transfer with an `ERC20`. | ~205,000 | ~205,000 | -| `ICS26Router.sol` | `recvPacket` | Receiving _back_ an `ERC20` token. | ~484,000 | ~563,000 | -| `ICS26Router.sol` | `recvPacket` | Receiving a _new_ Cosmos token for the first time. (Deploying an `ERC20` contract) | ~1,422,000 | ~1,510,000 | -| `ICS26Router.sol` | `ackPacket` | Acknowledging an ICS20 packet. | ~370,000 | ~448,000 | -| `ICS26Router.sol` | `timeoutPacket` | Timing out an ICS20 packet | ~458,000 | ~545,000 | +| `ICS26Router.sol` | `sendPacket` | Initiating an IBC transfer with an `ERC20`. | ~198,798 | ~198,798 | +| `ICS26Router.sol` | `recvPacket` | Receiving _back_ an `ERC20` token. | ~518,409 | ~602,503 | +| `ICS26Router.sol` | `recvPacket` | Receiving a _new_ Cosmos token for the first time. (Deploying an `ERC20` contract) | ~1,414,262 | ~1,497,617 | +| `ICS26Router.sol` | `ackPacket` | Acknowledging an ICS20 packet. | ~397,928 | ~428,009 | +| `ICS26Router.sol` | `timeoutPacket` | Timing out an ICS20 packet | ~449,137 | ~532,397 | ### Aggregated Packet Benchmarks @@ -174,8 +174,8 @@ Since there is no meaningful difference in gas costs between plonk and groth16 i | **ICS26Router Method** | **Description** | **Avg Gas (25 packets)** | **Avg Gas (50 packets)** | |:---:|:---:|:---:|:---:| -| `multicall/recvPacket` | Receiving _back_ an `ERC20` token. | ~204,000 | ~197,000 | -| `multicall/ackPacket` | Acknowledging an ICS20 packet. | ~116,000 | ~110,000 | +| `multicall/recvPacket` | Receiving _back_ an `ERC20` token. | ~194,375 | ~187,866 | +| `multicall/ackPacket` | Acknowledging an ICS20 packet. | ~101,630 | ~95,815 | Note: These gas benchmarks are with Groth16.