Skip to content

Commit

Permalink
[WIP] Add display,name,symbol to tokenfactory denom creation (#861)
Browse files Browse the repository at this point in the history
Add display,name,symbol to tokenfactory denom creation
  • Loading branch information
philipsu522 authored Jun 13, 2023
1 parent 3096ff8 commit 95da49b
Show file tree
Hide file tree
Showing 9 changed files with 90 additions and 4 deletions.
2 changes: 1 addition & 1 deletion integration_test/dex_module/place_order_test.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
- name: Test placing a new order and query the placed order
inputs:
# Get contract address, this requires contrat already deployed
# Get contract address, this requires contract already deployed
- cmd: tail -1 integration_test/contracts/mars-addr.txt
env: CONTRACT_ADDR
# Prepare parameter
Expand Down
20 changes: 20 additions & 0 deletions integration_test/tokenfactory_module/create_tokenfactory_test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
- name: Test creating a denom
inputs:
# Get admin
- cmd: printf "12345678\n" | seid keys list --output json | jq ".[] | select (.name==\"admin\")" | jq -r .address
env: ADMIN_ADDR
# Create denom
- cmd: printf "12345678\n" | seid tx tokenfactory create-denom test --from admin --fees 2000usei -y
# Query various fields about denom
- cmd: seid q bank denom-metadata --output json | jq .metadatas | jq ".[] | select (.base==\"factory/${ADMIN_ADDR}/test\")" | jq -r .base
env: BASE
- cmd: seid q bank denom-metadata --output json | jq .metadatas | jq ".[] | select (.base==\"factory/${ADMIN_ADDR}/test\")" | jq -r .name
env: NAME
- cmd: seid q bank denom-metadata --output json | jq .metadatas | jq ".[] | select (.base==\"factory/${ADMIN_ADDR}/test\")" | jq -r .symbol
env: SYMBOL
- cmd: seid q bank denom-metadata --output json | jq .metadatas | jq ".[] | select (.base==\"factory/${ADMIN_ADDR}/test\")" | jq -r .display
env: DISPLAY
verifiers:
# All fields should be populated and match the base name
- type: eval
expr: NAME == BASE and SYMBOL == BASE and DISPLAY == BASE
4 changes: 4 additions & 0 deletions x/tokenfactory/keeper/createdenom.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ func (k Keeper) createDenomAfterValidation(ctx sdk.Context, creatorAddr string,
Exponent: 0,
}},
Base: denom,
// The following is necessary for x/bank denom validation
Display: denom,
Name: denom,
Symbol: denom,
}

k.bankKeeper.SetDenomMetaData(ctx, denomMetaData)
Expand Down
7 changes: 7 additions & 0 deletions x/tokenfactory/keeper/createdenom_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package keeper_test

import (
"fmt"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"

sdk "github.com/cosmos/cosmos-sdk/types"

Expand Down Expand Up @@ -96,7 +97,13 @@ func (suite *KeeperTestSuite) TestCreateDenom() {

suite.Require().NoError(err)
suite.Require().Equal(suite.TestAccs[0].String(), queryRes.AuthorityMetadata.Admin)
// Make sure that the denom is valid from the perspective of x/bank
bankQueryRes, err := suite.bankQueryClient.DenomMetadata(suite.Ctx.Context(), &banktypes.QueryDenomMetadataRequest{
Denom: res.GetNewTokenDenom(),
})

suite.Require().NoError(err)
suite.Require().NoError(bankQueryRes.Metadata.Validate())
} else {
suite.Require().Error(err)
}
Expand Down
7 changes: 5 additions & 2 deletions x/tokenfactory/keeper/keeper_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package keeper_test

import (
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
"testing"

sdk "github.com/cosmos/cosmos-sdk/types"
Expand All @@ -15,8 +16,9 @@ import (
type KeeperTestSuite struct {
apptesting.KeeperTestHelper

queryClient types.QueryClient
msgServer types.MsgServer
queryClient types.QueryClient
bankQueryClient banktypes.QueryClient
msgServer types.MsgServer
// defaultDenom is on the suite, as it depends on the creator test address.
defaultDenom string
}
Expand All @@ -31,6 +33,7 @@ func (suite *KeeperTestSuite) SetupTest() {
suite.SetupTokenFactory()

suite.queryClient = types.NewQueryClient(suite.QueryHelper)
suite.bankQueryClient = banktypes.NewQueryClient(suite.QueryHelper)
suite.msgServer = keeper.NewMsgServerImpl(suite.App.TokenFactoryKeeper)
}

Expand Down
31 changes: 31 additions & 0 deletions x/tokenfactory/keeper/migrations.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package keeper

import (
"fmt"
"strings"

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

sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/sei-protocol/sei-chain/x/tokenfactory/types"
)
Expand Down Expand Up @@ -37,3 +40,31 @@ func (m Migrator) Migrate2to3(ctx sdk.Context) error {
}
return nil
}

func (m Migrator) Migrate3to4(ctx sdk.Context) error {
// Set denom metadata for all denoms
m.keeper.bankKeeper.IterateTotalSupply(ctx, func(coin sdk.Coin) bool {
fmt.Printf("Migration denom: %s\n", coin.Denom)
if denomMetadata, err := m.keeper.bankKeeper.GetDenomMetaData(ctx, coin.Denom); !err {
panic(fmt.Errorf("denom %s does not exist", coin.Denom))
} else {
m.SetMetadata(&denomMetadata)
m.keeper.bankKeeper.SetDenomMetaData(ctx, denomMetadata)
}
return true
})
return nil
}

func (m Migrator) SetMetadata(denomMetadata *banktypes.Metadata) {
if len(denomMetadata.Base) == 0 {
panic(fmt.Errorf("no base exists for denom %v", denomMetadata))
}
if len(denomMetadata.Display) == 0 {
denomMetadata.Display = denomMetadata.Base
denomMetadata.Name = denomMetadata.Base
denomMetadata.Symbol = denomMetadata.Base
} else {
fmt.Printf("Denom %s already has denom set", denomMetadata.Base)
}
}
19 changes: 19 additions & 0 deletions x/tokenfactory/keeper/migrations_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package keeper

import (
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
"strings"
"testing"

Expand Down Expand Up @@ -66,3 +67,21 @@ func TestMigrate2to3(t *testing.T) {
paramsSubspace.GetParamSet(ctx, &params)
require.Equal(t, types.Params{}, params)
}

func TestMigrate3To4(t *testing.T) {
// Test migration with all metadata denom
metadata := banktypes.Metadata{Description: sdk.DefaultBondDenom, Base: sdk.DefaultBondDenom, Display: sdk.DefaultBondDenom, Name: sdk.DefaultBondDenom, Symbol: sdk.DefaultBondDenom}
keeper := NewKeeper(nil, nil, typesparams.Subspace{}, nil, nil, nil)
m := NewMigrator(keeper)
m.SetMetadata(&metadata)
require.Equal(t, sdk.DefaultBondDenom, metadata.Display)
require.Equal(t, sdk.DefaultBondDenom, metadata.Name)
require.Equal(t, sdk.DefaultBondDenom, metadata.Symbol)
// Test migration with missing fields
testDenom := "test_denom"
metadata = banktypes.Metadata{Base: testDenom}
m.SetMetadata(&metadata)
require.Equal(t, testDenom, metadata.Display)
require.Equal(t, testDenom, metadata.Name)
require.Equal(t, testDenom, metadata.Symbol)
}
3 changes: 2 additions & 1 deletion x/tokenfactory/module.go
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ func (am AppModule) RegisterServices(cfg module.Configurator) {
m := keeper.NewMigrator(am.keeper)
_ = cfg.RegisterMigration(types.ModuleName, 1, func(ctx sdk.Context) error { return nil })
_ = cfg.RegisterMigration(types.ModuleName, 2, m.Migrate2to3)
_ = cfg.RegisterMigration(types.ModuleName, 3, m.Migrate3to4)
}

// RegisterInvariants registers the x/tokenfactory module's invariants.
Expand All @@ -172,7 +173,7 @@ func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.Raw
}

// ConsensusVersion implements ConsensusVersion.
func (AppModule) ConsensusVersion() uint64 { return 1 }
func (AppModule) ConsensusVersion() uint64 { return 4 }

// BeginBlock executes all ABCI BeginBlock logic respective to the tokenfactory module.
func (am AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) {}
Expand Down
1 change: 1 addition & 0 deletions x/tokenfactory/types/expected_keepers.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ type BankKeeper interface {
SetDenomMetaData(ctx sdk.Context, denomMetaData banktypes.Metadata)

HasSupply(ctx sdk.Context, denom string) bool
IterateTotalSupply(ctx sdk.Context, cb func(sdk.Coin) bool)

SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error
SendCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error
Expand Down

0 comments on commit 95da49b

Please sign in to comment.