Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add metadata for IBC tokens #3104

Merged
merged 43 commits into from
Sep 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
b1359b2
add metadata after mint
0xmuralik Feb 2, 2023
4070c24
set base denom as ibc hash denom
0xmuralik Feb 2, 2023
d0c2b83
comment
0xmuralik Feb 2, 2023
d0662a4
remove unsed funcs from keeper
0xmuralik Feb 3, 2023
ef8310a
Merge branch 'main' into murali/ibc-denom
0xmuralik Feb 6, 2023
e460e35
genesis setmetadata
0xmuralik Feb 6, 2023
850ded9
set metadata in migration
0xmuralik Feb 10, 2023
9e7924a
Merge branch 'main' into murali/ibc-denom
0xmuralik Feb 10, 2023
e257dcb
Merge branch 'main' into murali/ibc-denom
0xmuralik Feb 14, 2023
21c81e5
new migration
0xmuralik Feb 16, 2023
dafd5f1
test new migration
0xmuralik Feb 16, 2023
7763f74
Merge branch 'main' into murali/ibc-denom
0xmuralik Feb 17, 2023
a2b159f
Update modules/apps/transfer/keeper/migrations.go
0xmuralik May 3, 2023
663a0fd
import seperation
0xmuralik May 3, 2023
737cba5
replace MetaData with Metadata
0xmuralik May 3, 2023
c30d23d
Merge branch 'main' of https://github.com/0xmuralik/ibc-go into mural…
0xmuralik May 3, 2023
d894142
Merge branch 'murali/ibc-denom' of https://github.com/0xmuralik/ibc-g…
0xmuralik May 3, 2023
1640753
Merge branch 'main' into murali/ibc-denom
crodriguezvega Jun 3, 2023
9501c78
fix typo
crodriguezvega Jun 5, 2023
de08338
add initial migration documentation
crodriguezvega Jun 5, 2023
324986c
fixed tests
crodriguezvega Jun 5, 2023
e4e24d2
add logging message
crodriguezvega Jul 4, 2023
8001ff5
Merge branch 'main' into murali/ibc-denom
crodriguezvega Jul 8, 2023
ff7e7ff
Merge branch 'main' into murali/ibc-denom
DimitrisJim Aug 28, 2023
dac13bb
Bump consensus version.
DimitrisJim Aug 28, 2023
d16383b
Nits:
DimitrisJim Aug 28, 2023
c29568a
Merge branch 'main' into murali/ibc-denom
crodriguezvega Aug 29, 2023
17f23ae
Merge branch 'main' into murali/ibc-denom
DimitrisJim Aug 29, 2023
771dd3c
addressing some of the feedback
crodriguezvega Aug 31, 2023
e94f138
add more test cases
crodriguezvega Aug 31, 2023
2794a64
rename variables
crodriguezvega Sep 4, 2023
b97b8ee
check metadata in onrecvpacket tests
crodriguezvega Sep 4, 2023
bcfe839
fix: remove test assertion on errors, state will be reverted by basea…
colin-axner Sep 6, 2023
b8e0f63
Merge branch 'main' into murali/ibc-denom
crodriguezvega Sep 6, 2023
7091998
address review comment
crodriguezvega Sep 6, 2023
ab7c94f
lint, lint, lint
crodriguezvega Sep 6, 2023
a433aad
Merge branch 'main' into murali/ibc-denom
crodriguezvega Sep 7, 2023
ca1304b
Merge branch 'main' into murali/ibc-denom
colin-axner Sep 7, 2023
1c2626d
fix test
crodriguezvega Sep 7, 2023
0e1c34e
Merge branch 'main' into murali/ibc-denom
crodriguezvega Sep 10, 2023
b22484a
address review comments
crodriguezvega Sep 11, 2023
ec3d294
Merge branch 'main' into murali/ibc-denom
crodriguezvega Sep 11, 2023
aaa6786
Merge branch 'main' into murali/ibc-denom
crodriguezvega Sep 11, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions docs/migrations/v7-to-v8.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@ TODO: https://github.com/cosmos/ibc-go/pull/3505 (extra parameter added to trans
)
```

### Transfer migration

An automatic migration handler (TODO: add link after https://github.com/cosmos/ibc-go/pull/3104 is merged) is configured in the transfer module to set the [denomination metadata](https://github.com/cosmos/cosmos-sdk/blob/95178ce036741ae6aa7af131fa9fccf3e13fff7a/proto/cosmos/bank/v1beta1/bank.proto#L96-L125) for the IBC denominations of all vouchers minted by the transfer module.

## IBC Apps

TODO:
Expand Down
1 change: 1 addition & 0 deletions modules/apps/transfer/keeper/genesis.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ func (k Keeper) InitGenesis(ctx sdk.Context, state types.GenesisState) {

for _, trace := range state.DenomTraces {
k.SetDenomTrace(ctx, trace)
k.setDenomMetadata(ctx, trace)
}

// Only try to bind to port if it is not already bound, since we may already own
Expand Down
11 changes: 8 additions & 3 deletions modules/apps/transfer/keeper/genesis_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ func (suite *KeeperTestSuite) TestGenesis() {
}

var (
traces types.Traces
denomTraces types.Traces
escrows sdk.Coins
pathsAndEscrowAmounts = []struct {
path string
Expand All @@ -35,7 +35,7 @@ func (suite *KeeperTestSuite) TestGenesis() {
BaseDenom: "uatom",
Path: pathAndEscrowAmount.path,
}
traces = append(types.Traces{denomTrace}, traces...)
denomTraces = append(types.Traces{denomTrace}, denomTraces...)
suite.chainA.GetSimApp().TransferKeeper.SetDenomTrace(suite.chainA.GetContext(), denomTrace)

denom := denomTrace.IBCDenom()
Expand All @@ -48,10 +48,15 @@ func (suite *KeeperTestSuite) TestGenesis() {
genesis := suite.chainA.GetSimApp().TransferKeeper.ExportGenesis(suite.chainA.GetContext())

suite.Require().Equal(types.PortID, genesis.PortId)
suite.Require().Equal(traces.Sort(), genesis.DenomTraces)
suite.Require().Equal(denomTraces.Sort(), genesis.DenomTraces)
suite.Require().Equal(escrows.Sort(), genesis.TotalEscrowed)

suite.Require().NotPanics(func() {
suite.chainA.GetSimApp().TransferKeeper.InitGenesis(suite.chainA.GetContext(), *genesis)
})

for _, denomTrace := range denomTraces {
_, found := suite.chainA.GetSimApp().BankKeeper.GetDenomMetaData(suite.chainA.GetContext(), denomTrace.IBCDenom())
suite.Require().True(found)
}
}
23 changes: 23 additions & 0 deletions modules/apps/transfer/keeper/keeper.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (

"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
paramtypes "github.com/cosmos/cosmos-sdk/x/params/types"

tmbytes "github.com/cometbft/cometbft/libs/bytes"
Expand Down Expand Up @@ -190,6 +191,28 @@ func (k Keeper) IterateDenomTraces(ctx sdk.Context, cb func(denomTrace types.Den
}
}

// setDenomMetadata sets an IBC token's denomination metadata
func (k Keeper) setDenomMetadata(ctx sdk.Context, denomTrace types.DenomTrace) {
metadata := banktypes.Metadata{
Description: fmt.Sprintf("IBC token from %s", denomTrace.GetFullDenomPath()),
DenomUnits: []*banktypes.DenomUnit{
{
Denom: denomTrace.BaseDenom,
Exponent: 0,
},
},
// Setting base as IBC hash denom since bank keepers's SetDenomMetadata uses
// Base as key path and the IBC hash is what gives this token uniqueness
// on the executing chain
Base: denomTrace.IBCDenom(),
Display: denomTrace.GetFullDenomPath(),
Name: fmt.Sprintf("%s IBC token", denomTrace.GetFullDenomPath()),
Symbol: strings.ToUpper(denomTrace.BaseDenom),
}

k.bankKeeper.SetDenomMetaData(ctx, metadata)
}

// GetTotalEscrowForDenom gets the total amount of source chain tokens that
// are in escrow, keyed by the denomination.
//
Expand Down
16 changes: 16 additions & 0 deletions modules/apps/transfer/keeper/migrations.go
crodriguezvega marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ func (m Migrator) MigrateTraces(ctx sdk.Context) error {
if !equalTraces(newTrace, dt) {
newTraces = append(newTraces, newTrace)
}

return false
})

Expand All @@ -65,6 +66,21 @@ func (m Migrator) MigrateTraces(ctx sdk.Context) error {
return nil
}

// MigrateDenomMetadata sets token metadata for all the IBC denom traces
func (m Migrator) MigrateDenomMetadata(ctx sdk.Context) error {
m.keeper.IterateDenomTraces(ctx,
func(dt types.DenomTrace) (stop bool) {
// check if the metadata for the given denom trace does not already exist
if !m.keeper.bankKeeper.HasDenomMetaData(ctx, dt.IBCDenom()) {
m.keeper.setDenomMetadata(ctx, dt)
}
return false
})

m.keeper.Logger(ctx).Info("successfully added metadata to IBC voucher denominations")
return nil
}

// MigrateTotalEscrowForDenom migrates the total amount of source chain tokens in escrow.
func (m Migrator) MigrateTotalEscrowForDenom(ctx sdk.Context) error {
var totalEscrowed sdk.Coins
Expand Down
183 changes: 183 additions & 0 deletions modules/apps/transfer/keeper/migrations_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (

sdk "github.com/cosmos/cosmos-sdk/types"
banktestutil "github.com/cosmos/cosmos-sdk/x/bank/testutil"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"

transferkeeper "github.com/cosmos/ibc-go/v8/modules/apps/transfer/keeper"
transfertypes "github.com/cosmos/ibc-go/v8/modules/apps/transfer/types"
Expand Down Expand Up @@ -235,3 +236,185 @@ func (suite *KeeperTestSuite) TestMigrateTotalEscrowForDenom() {
})
}
}

func (suite *KeeperTestSuite) TestMigratorMigrateMetadata() {
var (
denomTraces []transfertypes.DenomTrace
expectedMetadata []banktypes.Metadata
)

testCases := []struct {
msg string
malleate func()
}{
{
"success with one denom trace with one hop",
func() {
denomTraces = []transfertypes.DenomTrace{
{
BaseDenom: "foo",
Path: "transfer/channel-0",
},
}

expectedMetadata = []banktypes.Metadata{
{
Description: "IBC token from transfer/channel-0/foo",
DenomUnits: []*banktypes.DenomUnit{
{
Denom: "foo",
Exponent: 0,
},
},
Base: denomTraces[0].IBCDenom(), // ibc/EB7094899ACFB7A6F2A67DB084DEE2E9A83DEFAA5DEF92D9A9814FFD9FF673FA
Display: "transfer/channel-0/foo",
Name: "transfer/channel-0/foo IBC token",
Symbol: "FOO",
},
}
},
},
{
"success with one denom trace with two hops",
func() {
denomTraces = []transfertypes.DenomTrace{
{
BaseDenom: "ubar",
Path: "transfer/channel-1/transfer/channel-2",
},
}

expectedMetadata = []banktypes.Metadata{
{
Description: "IBC token from transfer/channel-1/transfer/channel-2/ubar",
DenomUnits: []*banktypes.DenomUnit{
{
Denom: "ubar",
Exponent: 0,
},
},
Base: denomTraces[0].IBCDenom(), // ibc/8243B3EAA19BAB1DB3B0020B81C0C5A953E7B22C042CEE44E639A11A238BA57C
Display: "transfer/channel-1/transfer/channel-2/ubar",
Name: "transfer/channel-1/transfer/channel-2/ubar IBC token",
Symbol: "UBAR",
},
}
},
},
{
"success with two denom traces with one hop",
func() {
denomTraces = []transfertypes.DenomTrace{
{
BaseDenom: "foo",
Path: "transfer/channel-0",
},
{
BaseDenom: "bar",
Path: "transfer/channel-0",
},
}

expectedMetadata = []banktypes.Metadata{
{
Description: "IBC token from transfer/channel-0/foo",
DenomUnits: []*banktypes.DenomUnit{
{
Denom: "foo",
Exponent: 0,
},
},
Base: denomTraces[0].IBCDenom(), // ibc/EB7094899ACFB7A6F2A67DB084DEE2E9A83DEFAA5DEF92D9A9814FFD9FF673FA
Display: "transfer/channel-0/foo",
Name: "transfer/channel-0/foo IBC token",
Symbol: "FOO",
},
{
Description: "IBC token from transfer/channel-0/bar",
DenomUnits: []*banktypes.DenomUnit{
{
Denom: "bar",
Exponent: 0,
},
},
Base: denomTraces[1].IBCDenom(), // ibc/E1530E21F1848B6C29C9E89256D43E294976897611A61741CACBA55BE21736F5
Display: "transfer/channel-0/bar",
Name: "transfer/channel-0/bar IBC token",
Symbol: "BAR",
},
}
},
},
{
"success with two denom traces, metadata for one of them already exists",
func() {
denomTraces = []transfertypes.DenomTrace{
{
BaseDenom: "foo",
Path: "transfer/channel-0",
},
{
BaseDenom: "bar",
Path: "transfer/channel-0",
},
}

expectedMetadata = []banktypes.Metadata{
{
Description: "IBC token from transfer/channel-0/foo",
DenomUnits: []*banktypes.DenomUnit{
{
Denom: "foo",
Exponent: 0,
},
},
Base: denomTraces[0].IBCDenom(), // ibc/EB7094899ACFB7A6F2A67DB084DEE2E9A83DEFAA5DEF92D9A9814FFD9FF673FA
Display: "transfer/channel-0/foo",
Name: "transfer/channel-0/foo IBC token",
Symbol: "FOO",
},
{
Description: "IBC token from transfer/channel-0/bar",
DenomUnits: []*banktypes.DenomUnit{
{
Denom: "bar",
Exponent: 0,
},
},
Base: denomTraces[1].IBCDenom(), // ibc/E1530E21F1848B6C29C9E89256D43E294976897611A61741CACBA55BE21736F5
Display: "transfer/channel-0/bar",
Name: "transfer/channel-0/bar IBC token",
Symbol: "BAR",
},
}

// set metadata for one of the tokens, so that it exists already in state before doing the migration
suite.chainA.GetSimApp().BankKeeper.SetDenomMetaData(suite.chainA.GetContext(), expectedMetadata[1])
},
},
}

for _, tc := range testCases {
suite.Run(fmt.Sprintf("Case %s", tc.msg), func() {
suite.SetupTest() // reset
ctx := suite.chainA.GetContext()

tc.malleate()

for _, denomTrace := range denomTraces {
suite.chainA.GetSimApp().TransferKeeper.SetDenomTrace(ctx, denomTrace)
}

// run migration
migrator := transferkeeper.NewMigrator(suite.chainA.GetSimApp().TransferKeeper)
err := migrator.MigrateDenomMetadata(ctx)
suite.Require().NoError(err)

for _, expMetadata := range expectedMetadata {
denomMetadata, found := suite.chainA.GetSimApp().BankKeeper.GetDenomMetaData(ctx, expMetadata.Base)
suite.Require().True(found)
suite.Require().Equal(expMetadata, denomMetadata)
}
})
}
}
4 changes: 4 additions & 0 deletions modules/apps/transfer/keeper/relay.go
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,10 @@ func (k Keeper) OnRecvPacket(ctx sdk.Context, packet channeltypes.Packet, data t
}

voucherDenom := denomTrace.IBCDenom()
if !k.bankKeeper.HasDenomMetaData(ctx, voucherDenom) {
k.setDenomMetadata(ctx, denomTrace)
}

ctx.EventManager().EmitEvent(
sdk.NewEvent(
types.EventTypeDenomTrace,
Expand Down
Loading
Loading