chore(nft): remove address.String() calls from nft (#17846)

This commit is contained in:
Marko 2023-09-25 10:39:07 +02:00 committed by GitHub
parent 284c955fb0
commit f9c5fd4742
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 85 additions and 48 deletions

View File

@ -38,11 +38,15 @@ func (k Keeper) ExportGenesis(ctx sdk.Context) *nft.GenesisState {
nfts := k.GetNFTsOfClass(ctx, class.Id)
for i, n := range nfts {
owner := k.GetOwner(ctx, n.ClassId, n.Id)
nftArr, ok := nftMap[owner.String()]
ownerStr, err := k.ac.BytesToString(owner.Bytes())
if err != nil {
panic(err)
}
nftArr, ok := nftMap[ownerStr]
if !ok {
nftArr = make([]*nft.NFT, 0)
}
nftMap[owner.String()] = append(nftArr, &nfts[i])
nftMap[ownerStr] = append(nftArr, &nfts[i])
}
}

View File

@ -50,7 +50,14 @@ func (k Keeper) Owner(goCtx context.Context, r *nft.QueryOwnerRequest) (*nft.Que
ctx := sdk.UnwrapSDKContext(goCtx)
owner := k.GetOwner(ctx, r.ClassId, r.Id)
return &nft.QueryOwnerResponse{Owner: owner.String()}, nil
if owner.Empty() {
return &nft.QueryOwnerResponse{Owner: ""}, nil
}
ownerstr, err := k.ac.BytesToString(owner.Bytes())
if err != nil {
return nil, err
}
return &nft.QueryOwnerResponse{Owner: ownerstr}, nil
}
// Supply return the number of NFTs from the given class, same as totalSupply of ERC721.

View File

@ -54,7 +54,7 @@ func (s *TestSuite) TestBalance() {
s.TestMint()
req = &nft.QueryBalanceRequest{
ClassId: testClassID,
Owner: s.addrs[0].String(),
Owner: s.encodedAddrs[0],
}
},
"",
@ -145,7 +145,7 @@ func (s *TestSuite) TestOwner() {
ClassId: testClassID,
Id: testID,
}
owner = s.addrs[0].String()
owner = s.encodedAddrs[0]
},
"",
func(index int, require *require.Assertions, res *nft.QueryOwnerResponse) {
@ -275,7 +275,7 @@ func (s *TestSuite) TestNFTs() {
"success,empty ClassId and no nft",
func(index int, require *require.Assertions) {
req = &nft.QueryNFTsRequest{
Owner: s.addrs[1].String(),
Owner: s.encodedAddrs[1],
}
s.TestSaveClass()
},
@ -323,7 +323,7 @@ func (s *TestSuite) TestNFTs() {
}
req = &nft.QueryNFTsRequest{
Owner: s.addrs[2].String(),
Owner: s.encodedAddrs[2],
}
},
"",
@ -348,7 +348,7 @@ func (s *TestSuite) TestNFTs() {
func(index int, require *require.Assertions) {
req = &nft.QueryNFTsRequest{
ClassId: testClassID,
Owner: s.addrs[0].String(),
Owner: s.encodedAddrs[0],
}
nfts = []*nft.NFT{
{

View File

@ -40,6 +40,7 @@ type TestSuite struct {
ctx sdk.Context
addrs []sdk.AccAddress
encodedAddrs []string
queryClient nft.QueryClient
nftKeeper keeper.Keeper
accountKeeper *nfttestutil.MockAccountKeeper
@ -64,6 +65,12 @@ func (s *TestSuite) SetupTest() {
accountKeeper.EXPECT().GetModuleAddress("nft").Return(s.addrs[0]).AnyTimes()
accountKeeper.EXPECT().AddressCodec().Return(address.NewBech32Codec("cosmos")).AnyTimes()
for _, addr := range s.addrs {
st, err := accountKeeper.AddressCodec().BytesToString(addr.Bytes())
s.Require().NoError(err)
s.encodedAddrs = append(s.encodedAddrs, st)
}
s.accountKeeper = accountKeeper
nftKeeper := keeper.NewKeeper(storeService, s.encCfg.Codec, accountKeeper, bankKeeper)
@ -348,7 +355,7 @@ func (s *TestSuite) TestExportGenesis() {
expGenesis := &nft.GenesisState{
Classes: []*nft.Class{&class},
Entries: []*nft.Entry{{
Owner: s.addrs[0].String(),
Owner: s.encodedAddrs[0],
Nfts: []*nft.NFT{&expNFT},
}},
}
@ -373,7 +380,7 @@ func (s *TestSuite) TestInitGenesis() {
expGenesis := &nft.GenesisState{
Classes: []*nft.Class{&expClass},
Entries: []*nft.Entry{{
Owner: s.addrs[0].String(),
Owner: s.encodedAddrs[0],
Nfts: []*nft.NFT{&expNFT},
}},
}

View File

@ -37,7 +37,7 @@ func (s *TestSuite) TestSend() {
expGenesis := &nft.GenesisState{
Classes: []*nft.Class{&ExpClass},
Entries: []*nft.Entry{{
Owner: s.addrs[0].String(),
Owner: s.encodedAddrs[0],
Nfts: []*nft.NFT{&ExpNFT},
}},
}
@ -55,8 +55,8 @@ func (s *TestSuite) TestSend() {
req: &nft.MsgSend{
ClassId: testClassID,
Id: "",
Sender: s.addrs[0].String(),
Receiver: s.addrs[1].String(),
Sender: s.encodedAddrs[0],
Receiver: s.encodedAddrs[1],
},
expErr: true,
errMsg: "empty nft id",
@ -66,8 +66,8 @@ func (s *TestSuite) TestSend() {
req: &nft.MsgSend{
ClassId: "",
Id: testID,
Sender: s.addrs[0].String(),
Receiver: s.addrs[1].String(),
Sender: s.encodedAddrs[0],
Receiver: s.encodedAddrs[1],
},
expErr: true,
errMsg: "empty class id",
@ -77,8 +77,8 @@ func (s *TestSuite) TestSend() {
req: &nft.MsgSend{
ClassId: "invalid ClassId",
Id: testID,
Sender: s.addrs[0].String(),
Receiver: s.addrs[1].String(),
Sender: s.encodedAddrs[0],
Receiver: s.encodedAddrs[1],
},
expErr: true,
errMsg: "unauthorized",
@ -88,8 +88,8 @@ func (s *TestSuite) TestSend() {
req: &nft.MsgSend{
ClassId: testClassID,
Id: "invalid Id",
Sender: s.addrs[0].String(),
Receiver: s.addrs[1].String(),
Sender: s.encodedAddrs[0],
Receiver: s.encodedAddrs[1],
},
expErr: true,
errMsg: "unauthorized",
@ -99,19 +99,19 @@ func (s *TestSuite) TestSend() {
req: &nft.MsgSend{
ClassId: testClassID,
Id: testID,
Sender: s.addrs[1].String(),
Receiver: s.addrs[2].String(),
Sender: s.encodedAddrs[1],
Receiver: s.encodedAddrs[2],
},
expErr: true,
errMsg: fmt.Sprintf("%s is not the owner of nft %s", s.addrs[1].String(), testID),
errMsg: fmt.Sprintf("%s is not the owner of nft %s", s.encodedAddrs[1], testID),
},
{
name: "valid transaction",
req: &nft.MsgSend{
ClassId: testClassID,
Id: testID,
Sender: s.addrs[0].String(),
Receiver: s.addrs[1].String(),
Sender: s.encodedAddrs[0],
Receiver: s.encodedAddrs[1],
},
expErr: false,
errMsg: "",

View File

@ -21,26 +21,26 @@ func (k Keeper) Mint(ctx context.Context, token nft.NFT, receiver sdk.AccAddress
return errors.Wrap(nft.ErrNFTExists, token.Id)
}
k.mintWithNoCheck(ctx, token, receiver)
return nil
return k.mintWithNoCheck(ctx, token, receiver)
}
// mintWithNoCheck defines a method for minting a new nft
// Note: this method does not check whether the class already exists in nft.
// The upper-layer application needs to check it when it needs to use it.
func (k Keeper) mintWithNoCheck(ctx context.Context, token nft.NFT, receiver sdk.AccAddress) {
func (k Keeper) mintWithNoCheck(ctx context.Context, token nft.NFT, receiver sdk.AccAddress) error {
k.setNFT(ctx, token)
k.setOwner(ctx, token.ClassId, token.Id, receiver)
k.incrTotalSupply(ctx, token.ClassId)
err := sdk.UnwrapSDKContext(ctx).EventManager().EmitTypedEvent(&nft.EventMint{
recStr, err := k.ac.BytesToString(receiver.Bytes())
if err != nil {
return err
}
return sdk.UnwrapSDKContext(ctx).EventManager().EmitTypedEvent(&nft.EventMint{
ClassId: token.ClassId,
Id: token.Id,
Owner: receiver.String(),
Owner: recStr,
})
if err != nil {
panic(err)
}
}
// Burn defines a method for burning a nft from a specific account.
@ -71,15 +71,16 @@ func (k Keeper) burnWithNoCheck(ctx context.Context, classID, nftID string) erro
k.deleteOwner(ctx, classID, nftID, owner)
k.decrTotalSupply(ctx, classID)
err := sdk.UnwrapSDKContext(ctx).EventManager().EmitTypedEvent(&nft.EventBurn{
ClassId: classID,
Id: nftID,
Owner: owner.String(),
})
ownerStr, err := k.ac.BytesToString(owner.Bytes())
if err != nil {
return err
}
return nil
return sdk.UnwrapSDKContext(ctx).EventManager().EmitTypedEvent(&nft.EventBurn{
ClassId: classID,
Id: nftID,
Owner: ownerStr,
})
}
// Update defines a method for updating an exist nft

View File

@ -25,7 +25,9 @@ func (k Keeper) BatchMint(ctx context.Context,
}
checked[token.ClassId] = true
k.mintWithNoCheck(ctx, token, receiver)
if err := k.mintWithNoCheck(ctx, token, receiver); err != nil {
return err
}
}
return nil
}

View File

@ -141,8 +141,8 @@ func (AppModule) ConsensusVersion() uint64 { return 1 }
// AppModuleSimulation functions
// GenerateGenesisState creates a randomized GenState of the nft module.
func (AppModule) GenerateGenesisState(simState *module.SimulationState) {
simulation.RandomizedGenState(simState)
func (am AppModule) GenerateGenesisState(simState *module.SimulationState) {
simulation.RandomizedGenState(simState, am.accountKeeper.AddressCodec())
}
// RegisterStoreDecoder registers a decoder for nft module's types

View File

@ -3,6 +3,7 @@ package simulation
import (
"math/rand"
"cosmossdk.io/core/address"
"cosmossdk.io/x/nft"
"github.com/cosmos/cosmos-sdk/types/module"
@ -25,12 +26,16 @@ func genClasses(r *rand.Rand, accounts []simtypes.Account) []*nft.Class {
}
// genNFT returns a slice of nft.
func genNFT(r *rand.Rand, classID string, accounts []simtypes.Account) []*nft.Entry {
func genNFT(r *rand.Rand, classID string, accounts []simtypes.Account, ac address.Codec) []*nft.Entry {
entries := make([]*nft.Entry, len(accounts)-1)
for i := 0; i < len(accounts)-1; i++ {
owner := accounts[i]
oast, err := ac.BytesToString(owner.Address.Bytes())
if err != nil {
panic(err)
}
entries[i] = &nft.Entry{
Owner: owner.Address.String(),
Owner: oast,
Nfts: []*nft.NFT{
{
ClassId: classID,
@ -44,7 +49,7 @@ func genNFT(r *rand.Rand, classID string, accounts []simtypes.Account) []*nft.En
}
// RandomizedGenState generates a random GenesisState for nft.
func RandomizedGenState(simState *module.SimulationState) {
func RandomizedGenState(simState *module.SimulationState, ac address.Codec) {
var classes []*nft.Class
simState.AppParams.GetOrGenerate(
"nft", &classes, simState.Rand,
@ -56,7 +61,7 @@ func RandomizedGenState(simState *module.SimulationState) {
"nft", &entries, simState.Rand,
func(r *rand.Rand) {
class := classes[r.Int63n(int64(len(classes)))]
entries = genNFT(r, class.Id, simState.Accounts)
entries = genNFT(r, class.Id, simState.Accounts, ac)
},
)

View File

@ -12,6 +12,7 @@ import (
nftmodule "cosmossdk.io/x/nft/module"
"cosmossdk.io/x/nft/simulation"
addresscodec "github.com/cosmos/cosmos-sdk/codec/address"
"github.com/cosmos/cosmos-sdk/types/module"
moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
simtypes "github.com/cosmos/cosmos-sdk/types/simulation"
@ -33,7 +34,7 @@ func TestRandomizedGenState(t *testing.T) {
GenState: make(map[string]json.RawMessage),
}
simulation.RandomizedGenState(&simState)
simulation.RandomizedGenState(&simState, addresscodec.NewBech32Codec("cosmos"))
var nftGenesis nft.GenesisState
simState.Cdc.MustUnmarshalJSON(simState.GenState[nft.ModuleName], &nftGenesis)

View File

@ -87,11 +87,21 @@ func SimulateMsgSend(
return simtypes.NoOpMsg(nft.ModuleName, TypeMsgSend, err.Error()), nil, err
}
senderStr, err := ak.AddressCodec().BytesToString(senderAcc.GetAddress().Bytes())
if err != nil {
return simtypes.NoOpMsg(nft.ModuleName, TypeMsgSend, err.Error()), nil, err
}
recieverStr, err := ak.AddressCodec().BytesToString(receiver.Address.Bytes())
if err != nil {
return simtypes.NoOpMsg(nft.ModuleName, TypeMsgSend, err.Error()), nil, err
}
msg := &nft.MsgSend{
ClassId: n.ClassId,
Id: n.Id,
Sender: senderAcc.GetAddress().String(),
Receiver: receiver.Address.String(),
Sender: senderStr,
Receiver: recieverStr,
}
tx, err := simtestutil.GenSignedMockTx(