Skip to content
This repository was archived by the owner on Feb 23, 2024. It is now read-only.

Commit 84f3aa0

Browse files
boojamyaagouinxlab
authored
Merge PR #81: Backport #81, #78 into v3
* Fix same bool being used for all 3 (#81) * fix: middleware panic upon receiving amount that is not int64; added test (#78) resolves #77 * fix test * remove unused make command --------- Co-authored-by: Andrew Gouin <andrew@gouin.io> Co-authored-by: Max Kupriianov <max@kc.vc>
1 parent d786894 commit 84f3aa0

File tree

4 files changed

+122
-28
lines changed

4 files changed

+122
-28
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ go.sum: go.mod
177177
###############################################################################
178178

179179
test: test-unit
180-
test-all: test-unit test-ledger-mock test-race test-cover
180+
test-all: test-unit test-ledger-mock test-race
181181

182182
TEST_PACKAGES=./...
183183
TEST_TARGETS := test-unit test-unit-amino test-unit-proto test-ledger-mock test-race test-ledger test-race

router/ibc_middleware.go

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,18 @@ func getDenomForThisChain(port, channel, counterpartyPort, counterpartyChannel,
118118
return transfertypes.ParseDenomTrace(prefixedDenom).IBCDenom()
119119
}
120120

121+
// getBoolFromAny returns the bool value is any is a valid bool, otherwise false.
122+
func getBoolFromAny(value any) bool {
123+
if value == nil {
124+
return false
125+
}
126+
boolVal, ok := value.(bool)
127+
if !ok {
128+
return false
129+
}
130+
return boolVal
131+
}
132+
121133
// OnRecvPacket checks the memo field on this packet and if the metadata inside's root key indicates this packet
122134
// should be handled by the swap middleware it attempts to perform a swap. If the swap is successful
123135
// the underlying application's OnRecvPacket callback is invoked, an ack error is returned otherwise.
@@ -153,27 +165,10 @@ func (im IBCMiddleware) OnRecvPacket(
153165

154166
metadata := m.Forward
155167

156-
var processed, nonrefundable, disableDenomComposition bool
157168
goCtx := ctx.Context()
158-
p := goCtx.Value(types.ProcessedKey{})
159-
nr := goCtx.Value(types.NonrefundableKey{})
160-
ddc := goCtx.Value(types.DisableDenomCompositionKey{})
161-
162-
if p != nil {
163-
if pb, ok := p.(bool); ok {
164-
processed = pb
165-
}
166-
}
167-
if nr != nil {
168-
if nrb, ok := p.(bool); ok {
169-
nonrefundable = nrb
170-
}
171-
}
172-
if ddc != nil {
173-
if ddcb, ok := p.(bool); ok {
174-
disableDenomComposition = ddcb
175-
}
176-
}
169+
processed := getBoolFromAny(goCtx.Value(types.ProcessedKey{}))
170+
nonrefundable := getBoolFromAny(goCtx.Value(types.NonrefundableKey{}))
171+
disableDenomComposition := getBoolFromAny(goCtx.Value(types.DisableDenomCompositionKey{}))
177172

178173
if err := metadata.Validate(); err != nil {
179174
return channeltypes.NewErrorAcknowledgement(err.Error())

router/keeper/keeper.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -302,11 +302,13 @@ func (k *Keeper) ForwardTransferPacket(
302302
store.Set(key, bz)
303303

304304
defer func() {
305-
telemetry.SetGaugeWithLabels(
306-
[]string{"tx", "msg", "ibc", "transfer"},
307-
float32(token.Amount.Int64()),
308-
[]metrics.Label{telemetry.NewLabel(coretypes.LabelDenom, token.Denom)},
309-
)
305+
if token.Amount.IsInt64() {
306+
telemetry.SetGaugeWithLabels(
307+
[]string{"tx", "msg", "ibc", "transfer"},
308+
float32(token.Amount.Int64()),
309+
[]metrics.Label{telemetry.NewLabel(coretypes.LabelDenom, token.Denom)},
310+
)
311+
}
310312

311313
telemetry.IncrCounterWithLabels(
312314
[]string{"ibc", types.ModuleName, "send"},

router/module_test.go

Lines changed: 99 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ import (
1717
)
1818

1919
var (
20-
testDenom = "uatom"
21-
testAmount = "100"
20+
testDenom = "uatom"
21+
testAmount = "100"
22+
testAmount256 = "100000000000000000000"
2223

2324
testSourcePort = "transfer"
2425
testSourceChannel = "channel-10"
@@ -64,6 +65,36 @@ func transferPacket(t *testing.T, receiver string, metadata any) channeltypes.Pa
6465
}
6566
}
6667

68+
func transferPacket256(t *testing.T, receiver string, metadata any) channeltypes.Packet {
69+
t.Helper()
70+
transferPacket := transfertypes.FungibleTokenPacketData{
71+
Denom: testDenom,
72+
Amount: testAmount256,
73+
Receiver: receiver,
74+
}
75+
76+
if metadata != nil {
77+
if mStr, ok := metadata.(string); ok {
78+
transferPacket.Memo = mStr
79+
} else {
80+
memo, err := json.Marshal(metadata)
81+
require.NoError(t, err)
82+
transferPacket.Memo = string(memo)
83+
}
84+
}
85+
86+
transferData, err := transfertypes.ModuleCdc.MarshalJSON(&transferPacket)
87+
require.NoError(t, err)
88+
89+
return channeltypes.Packet{
90+
SourcePort: testSourcePort,
91+
SourceChannel: testSourceChannel,
92+
DestinationPort: testDestinationPort,
93+
DestinationChannel: testDestinationChannel,
94+
Data: transferData,
95+
}
96+
}
97+
6798
func TestOnRecvPacket_EmptyPacket(t *testing.T) {
6899
ctl := gomock.NewController(t)
69100
defer ctl.Finish()
@@ -254,6 +285,72 @@ func TestOnRecvPacket_ForwardNoFee(t *testing.T) {
254285
require.NoError(t, err)
255286
}
256287

288+
func TestOnRecvPacket_ForwardAmountInt256(t *testing.T) {
289+
var err error
290+
ctl := gomock.NewController(t)
291+
defer ctl.Finish()
292+
setup := test.NewTestSetup(t, ctl)
293+
ctx := setup.Initializer.Ctx
294+
cdc := setup.Initializer.Marshaler
295+
forwardMiddleware := setup.ForwardMiddleware
296+
297+
// Test data
298+
const (
299+
hostAddr = "cosmos1vzxkv3lxccnttr9rs0002s93sgw72h7ghukuhs"
300+
destAddr = "cosmos16plylpsgxechajltx9yeseqexzdzut9g8vla4k"
301+
port = "transfer"
302+
channel = "channel-0"
303+
)
304+
denom := makeIBCDenom(testDestinationPort, testDestinationChannel, testDenom)
305+
senderAccAddr := test.AccAddress()
306+
307+
amount256, ok := sdk.NewIntFromString(testAmount256)
308+
require.True(t, ok)
309+
310+
testCoin := sdk.NewCoin(denom, amount256)
311+
packetOrig := transferPacket256(t, hostAddr, &types.PacketMetadata{
312+
Forward: &types.ForwardMetadata{
313+
Receiver: destAddr,
314+
Port: port,
315+
Channel: channel,
316+
},
317+
})
318+
packetFwd := transferPacket256(t, destAddr, nil)
319+
320+
acknowledgement := channeltypes.NewResultAcknowledgement([]byte("test"))
321+
successAck := cdc.MustMarshalJSON(&acknowledgement)
322+
323+
// Expected mocks
324+
gomock.InOrder(
325+
setup.Mocks.IBCModuleMock.EXPECT().OnRecvPacket(ctx, packetOrig, senderAccAddr).
326+
Return(acknowledgement),
327+
328+
setup.Mocks.TransferKeeperMock.EXPECT().Transfer(
329+
sdk.WrapSDKContext(ctx),
330+
transfertypes.NewMsgTransfer(
331+
port,
332+
channel,
333+
testCoin,
334+
hostAddr,
335+
destAddr,
336+
keeper.DefaultTransferPacketTimeoutHeight,
337+
uint64(ctx.BlockTime().UnixNano())+uint64(keeper.DefaultForwardTransferPacketTimeoutTimestamp.Nanoseconds()),
338+
),
339+
).Return(&transfertypes.MsgTransferResponse{Sequence: 0}, nil),
340+
341+
setup.Mocks.IBCModuleMock.EXPECT().OnAcknowledgementPacket(ctx, packetFwd, successAck, senderAccAddr).
342+
Return(nil),
343+
)
344+
345+
// chain B with router module receives packet and forwards. ack should be nil so that it is not written yet.
346+
ack := forwardMiddleware.OnRecvPacket(ctx, packetOrig, senderAccAddr)
347+
require.Nil(t, ack)
348+
349+
// ack returned from chain C
350+
err = forwardMiddleware.OnAcknowledgementPacket(ctx, packetFwd, successAck, senderAccAddr)
351+
require.NoError(t, err)
352+
}
353+
257354
func TestOnRecvPacket_ForwardWithFee(t *testing.T) {
258355
var err error
259356
ctl := gomock.NewController(t)

0 commit comments

Comments
 (0)