From 3428c1fc81f1c4dd15916e81d82747f971f4d44d Mon Sep 17 00:00:00 2001 From: mmsqe Date: Mon, 4 Aug 2025 17:55:39 +0800 Subject: [PATCH 1/2] Problem: query decimals get reverted when Display doesn't match with DenomUnit for ibc token --- precompiles/erc20/query.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/precompiles/erc20/query.go b/precompiles/erc20/query.go index b3461f2c0..e0c7b72fb 100644 --- a/precompiles/erc20/query.go +++ b/precompiles/erc20/query.go @@ -113,7 +113,14 @@ func (p Precompile) Decimals( displayFound bool ) for i := len(metadata.DenomUnits) - 1; i >= 0; i-- { - if metadata.DenomUnits[i].Denom == metadata.Display { + var match bool + if strings.HasPrefix(metadata.Base, "ibc/") { + displays := strings.Split(metadata.Display, "/") + match = metadata.DenomUnits[i].Denom == displays[len(displays)-1] + } else { + match = metadata.DenomUnits[i].Denom == metadata.Display + } + if match { decimals = metadata.DenomUnits[i].Exponent displayFound = true break From 55f35f23b6f7412eea407b105859de5f084999f9 Mon Sep 17 00:00:00 2001 From: mmsqe Date: Mon, 4 Aug 2025 19:45:32 +0800 Subject: [PATCH 2/2] add test --- .../precompiles/erc20/test_query.go | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/tests/integration/precompiles/erc20/test_query.go b/tests/integration/precompiles/erc20/test_query.go index a826edafe..f462bc2c1 100644 --- a/tests/integration/precompiles/erc20/test_query.go +++ b/tests/integration/precompiles/erc20/test_query.go @@ -319,6 +319,54 @@ func (s *PrecompileTestSuite) TestDecimals() { }, errContains: vm.ErrExecutionReverted.Error(), }, + { + name: "pass - valid IBC denom with metadata using display path", + denom: "ibc/B89BE1E96B3DBC0ABB05F858F08561BA12B9C5E420CA2F5E83C475CCB47A834E", + malleate: func(ctx sdk.Context, keeper bankkeeper.Keeper, _ transferkeeper.Keeper) { + keeper.SetDenomMetaData(ctx, banktypes.Metadata{ + Base: "ibc/B89BE1E96B3DBC0ABB05F858F08561BA12B9C5E420CA2F5E83C475CCB47A834E", + DenomUnits: []*banktypes.DenomUnit{ + { + Denom: "ibc/B89BE1E96B3DBC0ABB05F858F08561BA12B9C5E420CA2F5E83C475CCB47A834E", + Exponent: 0, + }, + { + Denom: "uom", + Exponent: 6, + }, + }, + Display: "transfer/channel-0/uom", + Name: "transfer/channel-0/uom IBC token", + Symbol: "UOM", + }) + }, + expPass: true, + expDecimals: 6, + }, + { + name: "fail - IBC denom with metadata but no matching display unit", + denom: "ibc/C1D2E3F4567890123456789012345678901234567890123456789012345678901234", + malleate: func(ctx sdk.Context, keeper bankkeeper.Keeper, _ transferkeeper.Keeper) { + keeper.SetDenomMetaData(ctx, banktypes.Metadata{ + Base: "ibc/C1D2E3F4567890123456789012345678901234567890123456789012345678901234", + DenomUnits: []*banktypes.DenomUnit{ + { + Denom: "ibc/C1D2E3F4567890123456789012345678901234567890123456789012345678901234", + Exponent: 0, + }, + { + Denom: "nomatch", + Exponent: 6, + }, + }, + Display: "transfer/channel-0/lastpart", + Name: "Mismatched Token", + Symbol: "MISMATCH", + }) + }, + expPass: false, + errContains: "execution reverted", + }, } for _, tc := range testcases {