Skip to content

Commit 650af69

Browse files
authored
Merge pull request #1170 from CosmWasm/mergify/bp/develop_sdk47/pr-1164
Better to sdk coin convertion (backport #1164)
2 parents 22880a8 + cc28399 commit 650af69

File tree

3 files changed

+87
-3
lines changed

3 files changed

+87
-3
lines changed

x/wasm/keeper/handler_plugin.go

+3
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,9 @@ func NewBurnCoinMessageHandler(burner types.Burner) MessageHandlerFunc {
190190
if err != nil {
191191
return nil, nil, err
192192
}
193+
if coins.IsZero() {
194+
return nil, nil, types.ErrEmpty.Wrap("amount")
195+
}
193196
if err := burner.SendCoinsFromAccountToModule(ctx, contractAddr, types.ModuleName, coins); err != nil {
194197
return nil, nil, sdkerrors.Wrap(err, "transfer to module")
195198
}

x/wasm/keeper/handler_plugin_encoders.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -330,10 +330,9 @@ func ConvertWasmCoinsToSdkCoins(coins []wasmvmtypes.Coin) (sdk.Coins, error) {
330330
if err != nil {
331331
return nil, err
332332
}
333-
toSend = append(toSend, c)
333+
toSend = toSend.Add(c)
334334
}
335-
toSend.Sort()
336-
return toSend, nil
335+
return toSend.Sort(), nil
337336
}
338337

339338
// ConvertWasmCoinToSdkCoin converts a wasm vm type coin to sdk type coin

x/wasm/keeper/handler_plugin_encoders_test.go

+82
Original file line numberDiff line numberDiff line change
@@ -635,3 +635,85 @@ func TestConvertWasmCoinToSdkCoin(t *testing.T) {
635635
})
636636
}
637637
}
638+
639+
func TestConvertWasmCoinsToSdkCoins(t *testing.T) {
640+
specs := map[string]struct {
641+
src []wasmvmtypes.Coin
642+
exp sdk.Coins
643+
expErr bool
644+
}{
645+
"empty": {
646+
src: []wasmvmtypes.Coin{},
647+
exp: nil,
648+
},
649+
"single coin": {
650+
src: []wasmvmtypes.Coin{{Denom: "foo", Amount: "1"}},
651+
exp: sdk.NewCoins(sdk.NewCoin("foo", sdk.NewInt(1))),
652+
},
653+
"multiple coins": {
654+
src: []wasmvmtypes.Coin{
655+
{Denom: "foo", Amount: "1"},
656+
{Denom: "bar", Amount: "2"},
657+
},
658+
exp: sdk.NewCoins(
659+
sdk.NewCoin("bar", sdk.NewInt(2)),
660+
sdk.NewCoin("foo", sdk.NewInt(1)),
661+
),
662+
},
663+
"sorted": {
664+
src: []wasmvmtypes.Coin{
665+
{Denom: "foo", Amount: "1"},
666+
{Denom: "other", Amount: "1"},
667+
{Denom: "bar", Amount: "1"},
668+
},
669+
exp: []sdk.Coin{
670+
sdk.NewCoin("bar", sdk.NewInt(1)),
671+
sdk.NewCoin("foo", sdk.NewInt(1)),
672+
sdk.NewCoin("other", sdk.NewInt(1)),
673+
},
674+
},
675+
"zero amounts dropped": {
676+
src: []wasmvmtypes.Coin{
677+
{Denom: "foo", Amount: "1"},
678+
{Denom: "bar", Amount: "0"},
679+
},
680+
exp: sdk.NewCoins(
681+
sdk.NewCoin("foo", sdk.NewInt(1)),
682+
),
683+
},
684+
"duplicate denoms merged": {
685+
src: []wasmvmtypes.Coin{
686+
{Denom: "foo", Amount: "1"},
687+
{Denom: "foo", Amount: "1"},
688+
},
689+
exp: []sdk.Coin{sdk.NewCoin("foo", sdk.NewInt(2))},
690+
},
691+
"duplicate denoms with one 0 amount does not fail": {
692+
src: []wasmvmtypes.Coin{
693+
{Denom: "foo", Amount: "0"},
694+
{Denom: "foo", Amount: "1"},
695+
},
696+
exp: []sdk.Coin{sdk.NewCoin("foo", sdk.NewInt(1))},
697+
},
698+
"empty denom rejected": {
699+
src: []wasmvmtypes.Coin{{Denom: "", Amount: "1"}},
700+
expErr: true,
701+
},
702+
"invalid denom rejected": {
703+
src: []wasmvmtypes.Coin{{Denom: "!%&", Amount: "1"}},
704+
expErr: true,
705+
},
706+
}
707+
for name, spec := range specs {
708+
t.Run(name, func(t *testing.T) {
709+
gotCoins, gotErr := ConvertWasmCoinsToSdkCoins(spec.src)
710+
if spec.expErr {
711+
require.Error(t, gotErr)
712+
return
713+
}
714+
require.NoError(t, gotErr)
715+
assert.Equal(t, spec.exp, gotCoins)
716+
assert.NoError(t, gotCoins.Validate())
717+
})
718+
}
719+
}

0 commit comments

Comments
 (0)