Skip to content

Commit

Permalink
add test reverse error ack
Browse files Browse the repository at this point in the history
  • Loading branch information
GNaD13 committed May 26, 2023
1 parent c2579fb commit 43a6083
Show file tree
Hide file tree
Showing 4 changed files with 255 additions and 4 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ replace (
// ibc-go with wasm client
github.com/cosmos/ibc-go/v7 => github.com/strangelove-ventures/ibc-go/v7 v7.0.0-20230410223156-8c202c556f82

github.com/strangelove-ventures/packet-forward-middleware/v7 => github.com/notional-labs/packet-forward-middleware/v7 v7.0.0-20230517054520-e1958ca2830e
github.com/strangelove-ventures/packet-forward-middleware/v7 => github.com/notional-labs/packet-forward-middleware/v7 v7.0.0-20230526180458-68520c6b500d

github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7

Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -755,8 +755,8 @@ github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi
github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/notional-labs/packet-forward-middleware/v7 v7.0.0-20230517054520-e1958ca2830e h1:VnV20PYZsHoApnSNdxgM9E8f3Xxsk8yx8lL7WZZs1Ls=
github.com/notional-labs/packet-forward-middleware/v7 v7.0.0-20230517054520-e1958ca2830e/go.mod h1:ZqzpgUUK75BHIttNMs2ANFUNGEmi+aFij6gYmiDjdqc=
github.com/notional-labs/packet-forward-middleware/v7 v7.0.0-20230526180458-68520c6b500d h1:1O+4lgWVLMXaXPmn5hYBpf4dFansC80mnSeS4KhZWrc=
github.com/notional-labs/packet-forward-middleware/v7 v7.0.0-20230526180458-68520c6b500d/go.mod h1:ZqzpgUUK75BHIttNMs2ANFUNGEmi+aFij6gYmiDjdqc=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
Expand Down
3 changes: 2 additions & 1 deletion x/transfermiddleware/keeper/ics4wrapper.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ func (keeper Keeper) SendPacket(
if err != nil {
return 0, err
}

// check if denom in fungibleTokenPacketData is native denom in parachain info and
parachainInfo := keeper.GetParachainIBCTokenInfo(ctx, fungibleTokenPacketData.Denom)

Expand Down Expand Up @@ -173,14 +174,14 @@ func (keeper Keeper) refundToken(ctx sdk.Context, packet channeltypes.Packet, da
if err != nil {
return err
}

if transfertypes.SenderChainIsSource(packet.GetSourcePort(), packet.GetSourceChannel(), data.Denom) {
// Do nothing
// This case should never happened
return nil
}
nativeDenom := keeper.GetNativeDenomByIBCDenomSecondaryIndex(ctx, trace.IBCDenom())
paraTokenInfo := keeper.GetParachainIBCTokenInfo(ctx, nativeDenom)

// only trigger if source channel is from parachain.
if !keeper.hasParachainIBCTokenInfo(ctx, nativeDenom) {
return nil
Expand Down
250 changes: 250 additions & 0 deletions x/transfermiddleware/pfm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,256 @@ func (suite *TransferMiddlewareTestSuite) TestTransferWithPFM() {
}
}

func (suite *TransferMiddlewareTestSuite) TestTransferWithPFMReverse_ErrorAck() {
var (
transferAmount = sdk.NewInt(1000000000)
// when transfer via sdk transfer from A (module) -> B (contract)
timeoutHeight = clienttypes.NewHeight(1, 110)
pathAtoB *customibctesting.Path
pathBtoC *customibctesting.Path
expDenom = "ibc/C053D637CCA2A2BA030E2C5EE1B28A16F71CCB0E45E8BE52766DC1B241B77878"
)

testCases := []struct {
name string
}{
{
"Success case Picasso -> Composable -> Osmosis and reverse from Osmosis -> Composable -> Picasso",
},
}
for _, tc := range testCases {
suite.Run(tc.name, func() {
suite.SetupTest()
pathAtoB = NewTransferPath(suite.chainA, suite.chainB)
suite.coordinator.Setup(pathAtoB)
pathBtoC = NewTransferPath(suite.chainB, suite.chainC)
suite.coordinator.Setup(pathBtoC)
senderAOriginalBalance := suite.chainA.AllBalances(suite.chainA.SenderAccount.GetAddress())
senderBOriginalBalance := suite.chainB.AllBalances(suite.chainB.SenderAccount.GetAddress())
senderCOriginalBalance := suite.chainC.AllBalances(suite.chainC.SenderAccount.GetAddress())
_ = senderAOriginalBalance
_ = senderBOriginalBalance
_ = senderCOriginalBalance
// Add parachain token info
chainBtransMiddleware := suite.chainB.TransferMiddleware()
err := chainBtransMiddleware.AddParachainIBCInfo(suite.chainB.GetContext(), expDenom, pathAtoB.EndpointB.ChannelID, sdk.DefaultBondDenom)
suite.Require().NoError(err)

// Disable receiveEnabled on chain A so it will return error ack
params := transfertypes.Params{
SendEnabled: true,
ReceiveEnabled: false,
}
// set send params
suite.chainA.GetTestSupport().TransferKeeper().SetParams(suite.chainA.GetContext(), params)

timeOut := 10 * time.Minute
retries := uint8(0)
// Build MEMO
memo := PacketMetadata{
Forward: &ForwardMetadata{
Receiver: suite.chainC.SenderAccount.GetAddress().String(),
Port: pathBtoC.EndpointA.ChannelConfig.PortID,
Channel: pathBtoC.EndpointA.ChannelID,
Timeout: timeOut,
Retries: &retries,
Next: "",
},
}
memo_marshalled, err := json.Marshal(&memo)

Check warning on line 411 in x/transfermiddleware/pfm_test.go

View workflow job for this annotation

GitHub Actions / lint

var-naming: don't use underscores in Go names; var memo_marshalled should be memoMarshalled (revive)
suite.Require().NoError(err)

msg := ibctransfertypes.NewMsgTransfer(
pathAtoB.EndpointA.ChannelConfig.PortID,
pathAtoB.EndpointA.ChannelID,
sdk.NewCoin(sdk.DefaultBondDenom, transferAmount),
suite.chainA.SenderAccount.GetAddress().String(),
suite.chainB.SenderAccount.GetAddress().String(),
timeoutHeight,
0,
string(memo_marshalled),
)
_, err = suite.chainA.SendMsgs(msg)
suite.Require().NoError(err)
suite.Require().NoError(err, pathAtoB.EndpointB.UpdateClient())

// then
suite.Require().Equal(1, len(suite.chainA.PendingSendPackets))
suite.Require().Equal(0, len(suite.chainB.PendingSendPackets))
// relay packet
sendingPacket := suite.chainA.PendingSendPackets[0]
suite.coordinator.IncrementTime()
suite.coordinator.CommitBlock(suite.chainA)
err = pathAtoB.EndpointB.UpdateClient()
suite.Require().NoError(err)

err = pathAtoB.EndpointB.RecvPacket(sendingPacket)
suite.Require().NoError(err)
suite.chainA.PendingSendPackets = nil
// then should have a packet from B to C
suite.Require().Equal(1, len(suite.chainB.PendingSendPackets))
suite.Require().Equal(0, len(suite.chainC.PendingSendPackets))

// relay packet
sendingPacket = suite.chainB.PendingSendPackets[0]
suite.coordinator.IncrementTime()
suite.coordinator.CommitBlock(suite.chainB)
err = pathBtoC.EndpointB.UpdateClient()
suite.Require().NoError(err)

err = pathBtoC.EndpointB.RecvPacket(sendingPacket)
suite.Require().NoError(err)
suite.chainB.PendingSendPackets = nil

// relay ack C to B
suite.Require().Equal(1, len(suite.chainC.PendingAckPackets))
ack := suite.chainC.PendingAckPackets[0]
suite.coordinator.IncrementTime()
suite.coordinator.CommitBlock(suite.chainC)
err = pathBtoC.EndpointA.UpdateClient()
suite.Require().NoError(err)

err = pathBtoC.EndpointA.AcknowledgePacket(ack.Packet, ack.Ack)
suite.Require().NoError(err)
suite.chainC.PendingAckPackets = nil

// relay ack B to A
suite.Require().Equal(1, len(suite.chainB.PendingAckPackets))
ack = suite.chainB.PendingAckPackets[0]
suite.coordinator.IncrementTime()
suite.coordinator.CommitBlock(suite.chainB)
err = pathAtoB.EndpointA.UpdateClient()
suite.Require().NoError(err)

err = pathAtoB.EndpointA.AcknowledgePacket(ack.Packet, ack.Ack)
suite.Require().NoError(err)
suite.chainB.PendingAckPackets = nil

senderBCurrentBalance := suite.chainB.AllBalances(suite.chainB.SenderAccount.GetAddress())
suite.Require().Equal(senderBOriginalBalance, senderBCurrentBalance)

escrowIbcDenomAddress := transfertypes.GetEscrowAddress(pathAtoB.EndpointB.ChannelConfig.PortID, pathAtoB.EndpointB.ChannelID)
escrowIbcDenomAddressBalance := suite.chainB.AllBalances(escrowIbcDenomAddress)
expBalance := sdk.NewCoins(sdk.NewCoin(expDenom, transferAmount))
suite.Require().Equal(expBalance, escrowIbcDenomAddressBalance)

escrowNativeDenomAddress := transfertypes.GetEscrowAddress(pathBtoC.EndpointA.ChannelConfig.PortID, pathBtoC.EndpointA.ChannelID)
escrowNativeDenomAddressBalance := suite.chainB.AllBalances(escrowNativeDenomAddress)
expBalance = sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, transferAmount))
suite.Require().Equal(expBalance, escrowNativeDenomAddressBalance)

balance := suite.chainC.AllBalances(suite.chainC.SenderAccount.GetAddress())
receiveBalance := balance.AmountOf(expDenom)
suite.Require().Equal(transferAmount, receiveBalance)

senderAOriginalBalance = suite.chainA.AllBalances(suite.chainA.SenderAccount.GetAddress())
senderBOriginalBalance = suite.chainB.AllBalances(suite.chainB.SenderAccount.GetAddress())
senderCOriginalBalance = suite.chainC.AllBalances(suite.chainC.SenderAccount.GetAddress())
// transfer back from osmosis to picasso
memo = PacketMetadata{
Forward: &ForwardMetadata{
Receiver: suite.chainA.SenderAccount.GetAddress().String(),
Port: pathAtoB.EndpointB.ChannelConfig.PortID,
Channel: pathAtoB.EndpointB.ChannelID,
Timeout: timeOut,
Retries: &retries,
Next: "",
},
}

memo_marshalled, err = json.Marshal(&memo)
suite.Require().NoError(err)

msg = ibctransfertypes.NewMsgTransfer(
pathBtoC.EndpointB.ChannelConfig.PortID,
pathBtoC.EndpointB.ChannelID,
sdk.NewCoin(expDenom, transferAmount),
suite.chainC.SenderAccount.GetAddress().String(),
suite.chainB.SenderAccount.GetAddress().String(),
timeoutHeight,
0,
string(memo_marshalled),
)

_, err = suite.chainC.SendMsgs(msg)
suite.Require().NoError(err)
suite.Require().NoError(err, pathBtoC.EndpointA.UpdateClient())

// then
suite.Require().Equal(1, len(suite.chainC.PendingSendPackets))
suite.Require().Equal(0, len(suite.chainB.PendingSendPackets))
// relay packet
sendingPacket = suite.chainC.PendingSendPackets[0]
suite.coordinator.IncrementTime()
suite.coordinator.CommitBlock(suite.chainC)
err = pathBtoC.EndpointA.UpdateClient()
suite.Require().NoError(err)

err = pathBtoC.EndpointA.RecvPacket(sendingPacket)
suite.Require().NoError(err)
suite.chainC.PendingSendPackets = nil

// then should have a packet from B to A
suite.Require().Equal(1, len(suite.chainB.PendingSendPackets))
suite.Require().Equal(0, len(suite.chainA.PendingSendPackets))

// relay packet
sendingPacket = suite.chainB.PendingSendPackets[0]
suite.coordinator.IncrementTime()
suite.coordinator.CommitBlock(suite.chainB)
err = pathAtoB.EndpointA.UpdateClient()
suite.Require().NoError(err)

err = pathAtoB.EndpointA.RecvPacket(sendingPacket)
suite.Require().NoError(err)
suite.chainB.PendingSendPackets = nil

// relay error ack A to B
suite.Require().Equal(1, len(suite.chainA.PendingAckPackets))
ack = suite.chainA.PendingAckPackets[0]
suite.coordinator.IncrementTime()
suite.coordinator.CommitBlock(suite.chainA)
err = pathAtoB.EndpointB.UpdateClient()
suite.Require().NoError(err)

err = pathAtoB.EndpointB.AcknowledgePacket(ack.Packet, ack.Ack)
suite.Require().NoError(err)
suite.chainA.PendingAckPackets = nil

// relay error ack B to C
suite.Require().Equal(1, len(suite.chainB.PendingAckPackets))
ack = suite.chainB.PendingAckPackets[0]
suite.coordinator.IncrementTime()
suite.coordinator.CommitBlock(suite.chainB)
err = pathBtoC.EndpointB.UpdateClient()
suite.Require().NoError(err)

err = pathBtoC.EndpointB.AcknowledgePacket(ack.Packet, ack.Ack)
suite.Require().NoError(err)
suite.chainB.PendingAckPackets = nil

senderACurrentBalance := suite.chainA.AllBalances(suite.chainA.SenderAccount.GetAddress())
suite.Require().Equal(senderAOriginalBalance, senderACurrentBalance)

senderBCurrentBalance = suite.chainB.AllBalances(suite.chainB.SenderAccount.GetAddress())
suite.Require().Equal(senderBOriginalBalance, senderBCurrentBalance)

senderCCurrentBalance := suite.chainC.AllBalances(suite.chainC.SenderAccount.GetAddress())
suite.Require().Equal(senderCOriginalBalance, senderCCurrentBalance)

escrowIbcDenomAddress = transfertypes.GetEscrowAddress(pathAtoB.EndpointB.ChannelConfig.PortID, pathAtoB.EndpointB.ChannelID)
escrowIbcDenomAddressBalance = suite.chainB.AllBalances(escrowIbcDenomAddress)
expBalance = sdk.NewCoins(sdk.NewCoin(expDenom, transferAmount))
suite.Require().Equal(expBalance, escrowIbcDenomAddressBalance)

escrowNativeDenomAddress = transfertypes.GetEscrowAddress(pathBtoC.EndpointA.ChannelConfig.PortID, pathBtoC.EndpointA.ChannelID)
escrowNativeDenomAddressBalance = suite.chainB.AllBalances(escrowNativeDenomAddress)
expBalance = sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, transferAmount))
suite.Require().Equal(expBalance, escrowNativeDenomAddressBalance)
})
}
}

func (suite *TransferMiddlewareTestSuite) TestTransferWithPFMReverse() {
var (
transferAmount = sdk.NewInt(1000000000)
Expand Down

0 comments on commit 43a6083

Please sign in to comment.