Skip to content

Commit 810e9ef

Browse files
mmsqevladjdk
andauthored
Problem: query decimals get reverted when Display doesn't match with DenomUnit for ibc token (cosmos#397)
* Problem: query decimals get reverted when Display doesn't match with DenomUnit for ibc token * add test --------- Co-authored-by: Vlad J <[email protected]>
1 parent 39ddca4 commit 810e9ef

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

precompiles/erc20/query.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,14 @@ func (p Precompile) Decimals(
113113
displayFound bool
114114
)
115115
for i := len(metadata.DenomUnits) - 1; i >= 0; i-- {
116-
if metadata.DenomUnits[i].Denom == metadata.Display {
116+
var match bool
117+
if strings.HasPrefix(metadata.Base, "ibc/") {
118+
displays := strings.Split(metadata.Display, "/")
119+
match = metadata.DenomUnits[i].Denom == displays[len(displays)-1]
120+
} else {
121+
match = metadata.DenomUnits[i].Denom == metadata.Display
122+
}
123+
if match {
117124
decimals = metadata.DenomUnits[i].Exponent
118125
displayFound = true
119126
break

tests/integration/precompiles/erc20/test_query.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,54 @@ func (s *PrecompileTestSuite) TestDecimals() {
319319
},
320320
errContains: vm.ErrExecutionReverted.Error(),
321321
},
322+
{
323+
name: "pass - valid IBC denom with metadata using display path",
324+
denom: "ibc/B89BE1E96B3DBC0ABB05F858F08561BA12B9C5E420CA2F5E83C475CCB47A834E",
325+
malleate: func(ctx sdk.Context, keeper bankkeeper.Keeper, _ transferkeeper.Keeper) {
326+
keeper.SetDenomMetaData(ctx, banktypes.Metadata{
327+
Base: "ibc/B89BE1E96B3DBC0ABB05F858F08561BA12B9C5E420CA2F5E83C475CCB47A834E",
328+
DenomUnits: []*banktypes.DenomUnit{
329+
{
330+
Denom: "ibc/B89BE1E96B3DBC0ABB05F858F08561BA12B9C5E420CA2F5E83C475CCB47A834E",
331+
Exponent: 0,
332+
},
333+
{
334+
Denom: "uom",
335+
Exponent: 6,
336+
},
337+
},
338+
Display: "transfer/channel-0/uom",
339+
Name: "transfer/channel-0/uom IBC token",
340+
Symbol: "UOM",
341+
})
342+
},
343+
expPass: true,
344+
expDecimals: 6,
345+
},
346+
{
347+
name: "fail - IBC denom with metadata but no matching display unit",
348+
denom: "ibc/C1D2E3F4567890123456789012345678901234567890123456789012345678901234",
349+
malleate: func(ctx sdk.Context, keeper bankkeeper.Keeper, _ transferkeeper.Keeper) {
350+
keeper.SetDenomMetaData(ctx, banktypes.Metadata{
351+
Base: "ibc/C1D2E3F4567890123456789012345678901234567890123456789012345678901234",
352+
DenomUnits: []*banktypes.DenomUnit{
353+
{
354+
Denom: "ibc/C1D2E3F4567890123456789012345678901234567890123456789012345678901234",
355+
Exponent: 0,
356+
},
357+
{
358+
Denom: "nomatch",
359+
Exponent: 6,
360+
},
361+
},
362+
Display: "transfer/channel-0/lastpart",
363+
Name: "Mismatched Token",
364+
Symbol: "MISMATCH",
365+
})
366+
},
367+
expPass: false,
368+
errContains: "execution reverted",
369+
},
322370
}
323371

324372
for _, tc := range testcases {

0 commit comments

Comments
 (0)