diff --git a/x/dex/keeper/msgserver/msg_server_contract_deposit_rent_test.go b/x/dex/keeper/msgserver/msg_server_contract_deposit_rent_test.go index 88e8c4b59a..36b99be29d 100644 --- a/x/dex/keeper/msgserver/msg_server_contract_deposit_rent_test.go +++ b/x/dex/keeper/msgserver/msg_server_contract_deposit_rent_test.go @@ -23,7 +23,7 @@ func TestDepositRent(t *testing.T) { server := msgserver.NewMsgServerImpl(*keeper) contract := types.ContractInfoV2{ CodeId: 1, - ContractAddr: keepertest.TestContract, + ContractAddr: TestContractA, Creator: testAccount.String(), RentBalance: 1000000, } @@ -32,17 +32,17 @@ func TestDepositRent(t *testing.T) { Contract: &contract, }) require.NoError(t, err) - _, err = keeper.GetContract(ctx, keepertest.TestContract) + _, err = keeper.GetContract(ctx, TestContractA) require.NoError(t, err) balance := keeper.BankKeeper.GetBalance(ctx, testAccount, "usei") require.Equal(t, int64(9000000), balance.Amount.Int64()) _, err = server.ContractDepositRent(wctx, &types.MsgContractDepositRent{ Sender: testAccount.String(), - ContractAddr: keepertest.TestContract, + ContractAddr: TestContractA, Amount: 1000000, }) require.NoError(t, err) - _, err = keeper.GetContract(ctx, keepertest.TestContract) + _, err = keeper.GetContract(ctx, TestContractA) require.NoError(t, err) balance = keeper.BankKeeper.GetBalance(ctx, testAccount, "usei") require.Equal(t, int64(8000000), balance.Amount.Int64()) diff --git a/x/dex/keeper/msgserver/msg_server_register_contract.go b/x/dex/keeper/msgserver/msg_server_register_contract.go index e3b1fcfbd6..ab92601f39 100644 --- a/x/dex/keeper/msgserver/msg_server_register_contract.go +++ b/x/dex/keeper/msgserver/msg_server_register_contract.go @@ -18,7 +18,7 @@ func (k msgServer) RegisterContract(goCtx context.Context, msg *types.MsgRegiste ctx := sdk.UnwrapSDKContext(goCtx) // TODO: add validation such that only the user who stored the code can register contract - if err := k.ValidateBasics(msg); err != nil { + if err := k.ValidateBasics(ctx, msg); err != nil { ctx.Logger().Error(fmt.Sprintf("request invalid: %s", err)) return &types.MsgRegisterContractResponse{}, err } @@ -55,13 +55,17 @@ func (k msgServer) RegisterContract(goCtx context.Context, msg *types.MsgRegiste return &types.MsgRegisterContractResponse{}, nil } -func (k msgServer) ValidateBasics(msg *types.MsgRegisterContract) error { +func (k msgServer) ValidateBasics(ctx sdk.Context, msg *types.MsgRegisterContract) error { if msg.Contract == nil { return errors.New("empty contract info") } if msg.Contract.ContractAddr == "" { return errors.New("contract address is empty") } + _, err := sdk.AccAddressFromBech32(msg.Contract.ContractAddr) + if err != nil { + return errors.New("contract address format is not bech32") + } return nil } diff --git a/x/dex/keeper/msgserver/msg_server_register_contract_test.go b/x/dex/keeper/msgserver/msg_server_register_contract_test.go index b810188d24..b5250b1d15 100644 --- a/x/dex/keeper/msgserver/msg_server_register_contract_test.go +++ b/x/dex/keeper/msgserver/msg_server_register_contract_test.go @@ -12,18 +12,27 @@ import ( "github.com/stretchr/testify/require" ) +const ( + TestContractA = "sei14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9sh9m79m" + TestContractB = "sei1nc5tatafv6eyq7llkr2gv50ff9e22mnf70qgjlv737ktmt4eswrqms7u8a" + TestContractC = "sei1xr3rq8yvd7qplsw5yx90ftsr2zdhg4e9z60h5duusgxpv72hud3shh3qfl" + TestContractD = "sei1up07dctjqud4fns75cnpejr4frmjtddzsmwgcktlyxd4zekhwecqghxqcp" + TestContractX = "sei1hw5n2l4v5vz8lk4sj69j7pwdaut0kkn90mw09snlkdd3f7ckld0smdtvee" + TestContractY = "sei12pwnhtv7yat2s30xuf4gdk9qm85v4j3e6p44let47pdffpklcxlqh8ag0z" +) + func TestRegisterContract(t *testing.T) { keeper, ctx := keepertest.DexKeeper(t) wctx := sdk.WrapSDKContext(ctx) server := msgserver.NewMsgServerImpl(*keeper) - err := registerContract(server, wctx, keepertest.TestContract, nil) + err := registerContract(server, wctx, TestContractA, nil) require.NoError(t, err) storedContracts := keeper.GetAllContractInfo(ctx) require.Equal(t, 1, len(storedContracts)) require.Nil(t, storedContracts[0].Dependencies) // dependency doesn't exist - err = registerContract(server, wctx, keepertest.TestContract, []string{"TEST2"}) + err = registerContract(server, wctx, TestContractA, []string{TestContractY}) require.NotNil(t, err) storedContracts = keeper.GetAllContractInfo(ctx) require.Equal(t, 1, len(storedContracts)) @@ -33,17 +42,17 @@ func TestRegisterContractCircularDependency(t *testing.T) { keeper, ctx := keepertest.DexKeeper(t) wctx := sdk.WrapSDKContext(ctx) server := msgserver.NewMsgServerImpl(*keeper) - registerContract(server, wctx, "test1", nil) + registerContract(server, wctx, TestContractA, nil) storedContracts := keeper.GetAllContractInfo(ctx) require.Equal(t, 1, len(storedContracts)) - registerContract(server, wctx, "test2", []string{"test1"}) + registerContract(server, wctx, TestContractB, []string{TestContractA}) storedContracts = keeper.GetAllContractInfo(ctx) require.Equal(t, 2, len(storedContracts)) // This contract should fail to be registered because it causes a // circular dependency - err := registerContract(server, wctx, "test1", []string{"test2"}) + err := registerContract(server, wctx, TestContractA, []string{TestContractA}) require.NotNil(t, err) } @@ -51,7 +60,7 @@ func TestRegisterContractDuplicateDependency(t *testing.T) { keeper, ctx := keepertest.DexKeeper(t) wctx := sdk.WrapSDKContext(ctx) server := msgserver.NewMsgServerImpl(*keeper) - err := registerContract(server, wctx, "test1", []string{"test2", "test2"}) + err := registerContract(server, wctx, TestContractA, []string{TestContractA, TestContractA}) require.NotNil(t, err) storedContracts := keeper.GetAllContractInfo(ctx) require.Equal(t, 0, len(storedContracts)) @@ -61,24 +70,24 @@ func TestRegisterContractNumIncomingPaths(t *testing.T) { keeper, ctx := keepertest.DexKeeper(t) wctx := sdk.WrapSDKContext(ctx) server := msgserver.NewMsgServerImpl(*keeper) - registerContract(server, wctx, "test1", nil) - storedContract, err := keeper.GetContract(ctx, "test1") + registerContract(server, wctx, TestContractA, nil) + storedContract, err := keeper.GetContract(ctx, TestContractA) require.Nil(t, err) require.Equal(t, int64(0), storedContract.NumIncomingDependencies) - registerContract(server, wctx, "test2", []string{"test1"}) - storedContract, err = keeper.GetContract(ctx, "test1") + registerContract(server, wctx, TestContractB, []string{TestContractA}) + storedContract, err = keeper.GetContract(ctx, TestContractA) require.Nil(t, err) require.Equal(t, int64(1), storedContract.NumIncomingDependencies) - storedContract, err = keeper.GetContract(ctx, "test2") + storedContract, err = keeper.GetContract(ctx, TestContractB) require.Nil(t, err) require.Equal(t, int64(0), storedContract.NumIncomingDependencies) - registerContract(server, wctx, "test2", nil) - storedContract, err = keeper.GetContract(ctx, "test1") + registerContract(server, wctx, TestContractB, nil) + storedContract, err = keeper.GetContract(ctx, TestContractA) require.Nil(t, err) require.Equal(t, int64(0), storedContract.NumIncomingDependencies) - storedContract, err = keeper.GetContract(ctx, "test2") + storedContract, err = keeper.GetContract(ctx, TestContractA) require.Nil(t, err) require.Equal(t, int64(0), storedContract.NumIncomingDependencies) } @@ -88,41 +97,41 @@ func TestRegisterContractSetSiblings(t *testing.T) { keeper, ctx := keepertest.DexKeeper(t) wctx := sdk.WrapSDKContext(ctx) server := msgserver.NewMsgServerImpl(*keeper) - registerContract(server, wctx, "X", nil) - registerContract(server, wctx, "Y", nil) - registerContract(server, wctx, "A", []string{"X"}) - registerContract(server, wctx, "B", []string{"X"}) - registerContract(server, wctx, "C", []string{"Y"}) + registerContract(server, wctx, TestContractX, nil) + registerContract(server, wctx, TestContractY, nil) + registerContract(server, wctx, TestContractA, []string{TestContractX}) + registerContract(server, wctx, TestContractB, []string{TestContractX}) + registerContract(server, wctx, TestContractC, []string{TestContractY}) // add D -> X, D -> Y - registerContract(server, wctx, "D", []string{"X", "Y"}) - contract, _ := keeper.GetContract(ctx, "A") + registerContract(server, wctx, TestContractD, []string{TestContractX, TestContractY}) + contract, _ := keeper.GetContract(ctx, TestContractA) require.Equal(t, "", contract.Dependencies[0].ImmediateElderSibling) - require.Equal(t, "B", contract.Dependencies[0].ImmediateYoungerSibling) - contract, _ = keeper.GetContract(ctx, "B") - require.Equal(t, "A", contract.Dependencies[0].ImmediateElderSibling) - require.Equal(t, "D", contract.Dependencies[0].ImmediateYoungerSibling) - contract, _ = keeper.GetContract(ctx, "C") + require.Equal(t, TestContractB, contract.Dependencies[0].ImmediateYoungerSibling) + contract, _ = keeper.GetContract(ctx, TestContractB) + require.Equal(t, TestContractA, contract.Dependencies[0].ImmediateElderSibling) + require.Equal(t, TestContractD, contract.Dependencies[0].ImmediateYoungerSibling) + contract, _ = keeper.GetContract(ctx, TestContractC) require.Equal(t, "", contract.Dependencies[0].ImmediateElderSibling) - require.Equal(t, "D", contract.Dependencies[0].ImmediateYoungerSibling) - contract, _ = keeper.GetContract(ctx, "D") - require.Equal(t, "B", contract.Dependencies[0].ImmediateElderSibling) + require.Equal(t, TestContractD, contract.Dependencies[0].ImmediateYoungerSibling) + contract, _ = keeper.GetContract(ctx, TestContractD) + require.Equal(t, TestContractB, contract.Dependencies[0].ImmediateElderSibling) require.Equal(t, "", contract.Dependencies[0].ImmediateYoungerSibling) - require.Equal(t, "C", contract.Dependencies[1].ImmediateElderSibling) + require.Equal(t, TestContractC, contract.Dependencies[1].ImmediateElderSibling) require.Equal(t, "", contract.Dependencies[1].ImmediateYoungerSibling) // update D -> X only - registerContract(server, wctx, "D", []string{"X"}) - contract, _ = keeper.GetContract(ctx, "A") + registerContract(server, wctx, TestContractD, []string{TestContractX}) + contract, _ = keeper.GetContract(ctx, TestContractA) require.Equal(t, "", contract.Dependencies[0].ImmediateElderSibling) - require.Equal(t, "B", contract.Dependencies[0].ImmediateYoungerSibling) - contract, _ = keeper.GetContract(ctx, "B") - require.Equal(t, "A", contract.Dependencies[0].ImmediateElderSibling) - require.Equal(t, "D", contract.Dependencies[0].ImmediateYoungerSibling) - contract, _ = keeper.GetContract(ctx, "C") + require.Equal(t, TestContractB, contract.Dependencies[0].ImmediateYoungerSibling) + contract, _ = keeper.GetContract(ctx, TestContractB) + require.Equal(t, TestContractA, contract.Dependencies[0].ImmediateElderSibling) + require.Equal(t, TestContractD, contract.Dependencies[0].ImmediateYoungerSibling) + contract, _ = keeper.GetContract(ctx, TestContractC) require.Equal(t, "", contract.Dependencies[0].ImmediateElderSibling) require.Equal(t, "", contract.Dependencies[0].ImmediateYoungerSibling) - contract, _ = keeper.GetContract(ctx, "D") + contract, _ = keeper.GetContract(ctx, TestContractD) require.Equal(t, 1, len(contract.Dependencies)) - require.Equal(t, "B", contract.Dependencies[0].ImmediateElderSibling) + require.Equal(t, TestContractB, contract.Dependencies[0].ImmediateElderSibling) require.Equal(t, "", contract.Dependencies[0].ImmediateYoungerSibling) } diff --git a/x/dex/keeper/msgserver/msg_server_unregister_contract_test.go b/x/dex/keeper/msgserver/msg_server_unregister_contract_test.go index c05af0df00..8eb57b66c1 100644 --- a/x/dex/keeper/msgserver/msg_server_unregister_contract_test.go +++ b/x/dex/keeper/msgserver/msg_server_unregister_contract_test.go @@ -23,7 +23,7 @@ func TestUnregisterContractSetSiblings(t *testing.T) { server := msgserver.NewMsgServerImpl(*keeper) contract := types.ContractInfoV2{ CodeId: 1, - ContractAddr: keepertest.TestContract, + ContractAddr: TestContractA, Creator: testAccount.String(), RentBalance: 1000000, } @@ -32,16 +32,16 @@ func TestUnregisterContractSetSiblings(t *testing.T) { Contract: &contract, }) require.NoError(t, err) - _, err = keeper.GetContract(ctx, keepertest.TestContract) + _, err = keeper.GetContract(ctx, TestContractA) require.NoError(t, err) balance := keeper.BankKeeper.GetBalance(ctx, testAccount, "usei") require.Equal(t, int64(9000000), balance.Amount.Int64()) _, err = server.UnregisterContract(wctx, &types.MsgUnregisterContract{ Creator: testAccount.String(), - ContractAddr: keepertest.TestContract, + ContractAddr: TestContractA, }) require.NoError(t, err) - _, err = keeper.GetContract(ctx, keepertest.TestContract) + _, err = keeper.GetContract(ctx, TestContractA) require.Error(t, err) balance = keeper.BankKeeper.GetBalance(ctx, testAccount, "usei") require.Equal(t, int64(10000000), balance.Amount.Int64()) diff --git a/x/dex/keeper/msgserver/testdata/hackatom.wasm b/x/dex/keeper/msgserver/testdata/hackatom.wasm new file mode 100644 index 0000000000..183eef304c Binary files /dev/null and b/x/dex/keeper/msgserver/testdata/hackatom.wasm differ