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

Add display,name,symbol to tokenfactory denom creation #861

Merged
merged 8 commits into from
Jun 13, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
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