@agoric/cosmos 0.35.0-u21.0 → 0.35.0-u22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/CHANGELOG.md +11 -187
  2. package/Makefile +2 -2
  3. package/ante/ante.go +2 -2
  4. package/ante/inbound.go +1 -2
  5. package/ante/inbound_test.go +3 -1
  6. package/ante/vm_admission.go +1 -2
  7. package/app/app.go +255 -174
  8. package/app/encoding.go +6 -3
  9. package/app/export.go +50 -21
  10. package/app/genesis.go +7 -5
  11. package/app/params/encoding.go +1 -1
  12. package/app/params/proto.go +6 -4
  13. package/app/sim_test.go +11 -13
  14. package/app/txconfig/tx_config.go +169 -0
  15. package/app/upgrade.go +52 -97
  16. package/app/upgrade_test.go +1 -1
  17. package/cmd/agd/agvm.go +1 -1
  18. package/cmd/agd/main.go +1 -1
  19. package/cmd/libdaemon/main.go +2 -2
  20. package/daemon/cmd/root.go +99 -30
  21. package/daemon/cmd/root_test.go +12 -27
  22. package/daemon/main.go +2 -9
  23. package/git-revision.txt +1 -1
  24. package/go.mod +129 -109
  25. package/go.sum +228 -469
  26. package/package.json +2 -2
  27. package/proto/agoric/swingset/msgs.proto +46 -9
  28. package/proto/agoric/swingset/swingset.proto +7 -2
  29. package/proto/agoric/vbank/vbank.proto +1 -1
  30. package/proto/agoric/vibc/msgs.proto +4 -0
  31. package/tests/e2e/vbank/vbank_test.go +172 -0
  32. package/tests/integrations/types/aminojson_test.go +214 -0
  33. package/tests/integrations/vbank/vbank_test.go +348 -0
  34. package/third_party/proto/amino/amino.proto +6 -1
  35. package/third_party/proto/cosmos/base/v1beta1/coin.proto +18 -5
  36. package/third_party/proto/cosmos/upgrade/v1beta1/upgrade.proto +4 -8
  37. package/third_party/proto/ibc/core/channel/v1/channel.proto +42 -17
  38. package/third_party/proto/ibc/core/client/v1/client.proto +48 -40
  39. package/types/address_hooks.go +2 -2
  40. package/types/address_hooks_test.go +3 -3
  41. package/types/ibc_packet.go +3 -3
  42. package/types/ibc_packet_test.go +3 -3
  43. package/types/kv_entry_helpers.go +3 -3
  44. package/types/kv_entry_helpers_test.go +2 -2
  45. package/types/legacy_address_encoder.go +58 -0
  46. package/vm/proto_json_test.go +1 -1
  47. package/vm/server.go +2 -1
  48. package/x/swingset/abci.go +2 -2
  49. package/x/swingset/client/cli/tx.go +16 -14
  50. package/x/swingset/config.go +1 -1
  51. package/x/swingset/genesis.go +2 -1
  52. package/x/swingset/handler.go +2 -1
  53. package/x/swingset/keeper/extension_snapshotter.go +14 -5
  54. package/x/swingset/keeper/extension_snapshotter_test.go +1 -1
  55. package/x/swingset/keeper/keeper.go +21 -17
  56. package/x/swingset/keeper/keeper_test.go +10 -7
  57. package/x/swingset/keeper/msg_server.go +26 -5
  58. package/x/swingset/keeper/swing_store_exports_handler.go +1 -1
  59. package/x/swingset/keeper/swing_store_exports_handler_test.go +1 -1
  60. package/x/swingset/module.go +20 -22
  61. package/x/swingset/types/codec.go +10 -5
  62. package/x/swingset/types/default-params.go +13 -12
  63. package/x/swingset/types/expected_keepers.go +5 -4
  64. package/x/swingset/types/msgs.go +50 -36
  65. package/x/swingset/types/msgs.pb.go +60 -51
  66. package/x/swingset/types/params_test.go +21 -20
  67. package/x/swingset/types/swingset.pb.go +67 -61
  68. package/x/vbank/genesis.go +12 -8
  69. package/x/vbank/handler.go +2 -1
  70. package/x/vbank/keeper/grpc_query.go +4 -1
  71. package/x/vbank/keeper/keeper.go +108 -23
  72. package/x/vbank/keeper/querier.go +4 -1
  73. package/x/vbank/keeper/rewards.go +6 -2
  74. package/x/vbank/module.go +47 -75
  75. package/x/vbank/types/expected_keepers.go +15 -10
  76. package/x/vbank/types/key.go +3 -0
  77. package/x/vbank/types/params.go +4 -3
  78. package/x/vbank/types/vbank.pb.go +41 -40
  79. package/x/vbank/vbank.go +25 -10
  80. package/x/vbank/vbank_test.go +213 -154
  81. package/x/vibc/handler.go +2 -1
  82. package/x/vibc/keeper/keeper.go +10 -10
  83. package/x/vibc/keeper/migrations.go +1 -1
  84. package/x/vibc/keeper/triggers.go +1 -1
  85. package/x/vibc/module.go +5 -22
  86. package/x/vibc/types/codec.go +2 -1
  87. package/x/vibc/types/expected_keepers.go +7 -5
  88. package/x/vibc/types/ibc_module.go +5 -5
  89. package/x/vibc/types/msgs.go +30 -7
  90. package/x/vibc/types/msgs.pb.go +29 -25
  91. package/x/vibc/types/receiver.go +2 -2
  92. package/x/vlocalchain/handler.go +2 -1
  93. package/x/vlocalchain/keeper/keeper.go +17 -5
  94. package/x/vlocalchain/keeper/keeper_test.go +3 -2
  95. package/x/vlocalchain/types/expected_keepers.go +7 -4
  96. package/x/vlocalchain/vlocalchain_test.go +38 -26
  97. package/x/vstorage/genesis.go +10 -10
  98. package/x/vstorage/handler.go +2 -1
  99. package/x/vstorage/keeper/keeper.go +68 -46
  100. package/x/vstorage/keeper/keeper_test.go +35 -19
  101. package/x/vstorage/module.go +27 -13
  102. package/x/vstorage/testing/queue.go +5 -3
  103. package/x/vstorage/vstorage.go +2 -1
  104. package/x/vstorage/vstorage_test.go +21 -17
  105. package/x/vtransfer/genesis.go +1 -3
  106. package/x/vtransfer/handler.go +3 -2
  107. package/x/vtransfer/ibc_middleware.go +5 -5
  108. package/x/vtransfer/ibc_middleware_test.go +43 -29
  109. package/x/vtransfer/keeper/keeper.go +35 -33
  110. package/x/vtransfer/module.go +8 -11
  111. package/x/vtransfer/types/expected_keepers.go +3 -3
  112. package/x/vtransfer/utils_test.go +26 -11
  113. package/daemon/cmd/testnet.go +0 -539
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agoric/cosmos",
3
- "version": "0.35.0-u21.0",
3
+ "version": "0.35.0-u22.0",
4
4
  "description": "Connect JS to the Cosmos blockchain SDK",
5
5
  "parsers": {
6
6
  "js": "mjs"
@@ -41,5 +41,5 @@
41
41
  "typeCoverage": {
42
42
  "atLeast": 0
43
43
  },
44
- "gitHead": "e4dd46857133403d584bcf822a81817b355532f9"
44
+ "gitHead": "83a42d0f343b01448a918631dce159b5bdb69b7e"
45
45
  }
@@ -1,6 +1,7 @@
1
1
  syntax = "proto3";
2
2
  package agoric.swingset;
3
3
 
4
+ import "amino/amino.proto";
4
5
  import "gogoproto/gogo.proto";
5
6
 
6
7
  option go_package = "github.com/Agoric/agoric-sdk/golang/cosmos/x/swingset/types";
@@ -22,11 +23,23 @@ service Msg {
22
23
  // MsgDeliverInbound defines an SDK message for delivering an eventual send
23
24
  message MsgDeliverInbound {
24
25
  option (gogoproto.equal) = false;
26
+ option (amino.name) = "swingset/DeliverInbound";
25
27
 
26
- repeated string messages = 1 [(gogoproto.jsontag) = "messages", (gogoproto.moretags) = "yaml:\"messages\""];
27
- repeated uint64 nums = 2 [(gogoproto.jsontag) = "nums", (gogoproto.moretags) = "yaml:\"nums\""];
28
- uint64 ack = 3 [(gogoproto.jsontag) = "ack", (gogoproto.moretags) = "yaml:\"ack\""];
29
- bytes submitter = 4 [
28
+ repeated string messages = 1 [
29
+ (amino.dont_omitempty) = true,
30
+ (amino.encoding) = "null_slice_as_empty",
31
+ (gogoproto.jsontag) = "messages",
32
+ (gogoproto.moretags) = "yaml:\"messages\""
33
+ ];
34
+ repeated uint64 nums = 2 [
35
+ (amino.dont_omitempty) = true,
36
+ (amino.encoding) = "null_slice_as_empty",
37
+ (gogoproto.jsontag) = "nums",
38
+ (gogoproto.moretags) = "yaml:\"nums\""
39
+ ];
40
+ uint64 ack = 3 [(amino.dont_omitempty) = true, (gogoproto.jsontag) = "ack", (gogoproto.moretags) = "yaml:\"ack\""];
41
+ bytes submitter = 4 [
42
+ (amino.encoding) = "legacy_address",
30
43
  (gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress",
31
44
  (gogoproto.jsontag) = "submitter",
32
45
  (gogoproto.moretags) = "yaml:\"submitter\""
@@ -41,8 +54,10 @@ message MsgDeliverInboundResponse {}
41
54
  // message type is typically protected by feegrant budgets.
42
55
  message MsgWalletAction {
43
56
  option (gogoproto.equal) = false;
57
+ option (amino.name) = "swingset/WalletAction";
44
58
 
45
59
  bytes owner = 1 [
60
+ (amino.encoding) = "legacy_address",
46
61
  (gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress",
47
62
  (gogoproto.jsontag) = "owner",
48
63
  (gogoproto.moretags) = "yaml:\"owner\""
@@ -60,8 +75,10 @@ message MsgWalletActionResponse {}
60
75
  // typically protected by explicit confirmation by the user.
61
76
  message MsgWalletSpendAction {
62
77
  option (gogoproto.equal) = false;
78
+ option (amino.name) = "swingset/WalletSpendAction";
63
79
 
64
80
  bytes owner = 1 [
81
+ (amino.encoding) = "legacy_address",
65
82
  (gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress",
66
83
  (gogoproto.jsontag) = "owner",
67
84
  (gogoproto.moretags) = "yaml:\"owner\""
@@ -77,19 +94,25 @@ message MsgWalletSpendActionResponse {}
77
94
  // MsgProvision defines an SDK message for provisioning a client to the chain
78
95
  message MsgProvision {
79
96
  option (gogoproto.equal) = false;
97
+ option (amino.name) = "swingset/Provision";
80
98
 
81
99
  string nickname = 1 [(gogoproto.jsontag) = "nickname", (gogoproto.moretags) = "yaml:\"nickname\""];
82
100
  bytes address = 2 [
101
+ (amino.encoding) = "legacy_address",
83
102
  (gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress",
84
103
  (gogoproto.jsontag) = "address",
85
104
  (gogoproto.moretags) = "yaml:\"address\""
86
105
  ];
87
106
  repeated string power_flags = 3 [
107
+ (amino.dont_omitempty) = true,
108
+ (amino.encoding) = "null_slice_as_empty",
109
+ (amino.field_name) = "powerFlags",
88
110
  (gogoproto.customname) = "PowerFlags",
89
111
  (gogoproto.jsontag) = "powerFlags",
90
112
  (gogoproto.moretags) = "yaml:\"powerFlags\""
91
113
  ];
92
114
  bytes submitter = 4 [
115
+ (amino.encoding) = "legacy_address",
93
116
  (gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress",
94
117
  (gogoproto.jsontag) = "submitter",
95
118
  (gogoproto.moretags) = "yaml:\"submitter\""
@@ -101,18 +124,32 @@ message MsgProvisionResponse {}
101
124
 
102
125
  // MsgInstallBundle carries a signed bundle to SwingSet.
103
126
  message MsgInstallBundle {
104
- string bundle = 1 [(gogoproto.jsontag) = "bundle", (gogoproto.moretags) = "yaml:\"bundle\""];
105
- bytes submitter = 2 [
127
+ // Until agoric-upgrade-22 this message didn't have an amino name
128
+ // but no clients actually used amino encoding
129
+ option (amino.name) = "swingset/InstallBundle";
130
+
131
+ string bundle = 1
132
+ [(amino.dont_omitempty) = true, (gogoproto.jsontag) = "bundle", (gogoproto.moretags) = "yaml:\"bundle\""];
133
+ bytes submitter = 2 [
134
+ (amino.encoding) = "legacy_address",
106
135
  (gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress",
107
136
  (gogoproto.jsontag) = "submitter",
108
137
  (gogoproto.moretags) = "yaml:\"submitter\""
109
138
  ];
110
139
  // Either bundle or compressed_bundle will be set.
111
140
  // Default compression algorithm is gzip.
112
- bytes compressed_bundle = 3
113
- [(gogoproto.jsontag) = "compressedBundle", (gogoproto.moretags) = "yaml:\"compressedBundle\""];
141
+ bytes compressed_bundle = 3 [
142
+ (amino.dont_omitempty) = true,
143
+ (amino.field_name) = "compressedBundle",
144
+ (gogoproto.jsontag) = "compressedBundle",
145
+ (gogoproto.moretags) = "yaml:\"compressedBundle\""
146
+ ];
114
147
  // Size in bytes of uncompression of compressed_bundle.
115
- int64 uncompressed_size = 4 [(gogoproto.jsontag) = "uncompressedSize"];
148
+ int64 uncompressed_size = 4 [
149
+ (amino.dont_omitempty) = true,
150
+ (amino.field_name) = "uncompressedSize",
151
+ (gogoproto.jsontag) = "uncompressedSize"
152
+ ];
116
153
  }
117
154
 
118
155
  // MsgInstallBundleResponse is an empty acknowledgement that an install bundle
@@ -3,6 +3,8 @@ package agoric.swingset;
3
3
 
4
4
  import "gogoproto/gogo.proto";
5
5
  import "cosmos/base/v1beta1/coin.proto";
6
+ import "cosmos_proto/cosmos.proto";
7
+ import "amino/amino.proto";
6
8
 
7
9
  option go_package = "github.com/Agoric/agoric-sdk/golang/cosmos/x/swingset/types";
8
10
 
@@ -10,6 +12,9 @@ option go_package = "github.com/Agoric/agoric-sdk/golang/cosmos/x/swingset/types
10
12
  // core.
11
13
  // See `bridgeCoreEval` in agoric-sdk packages/vats/src/core/chain-behaviors.js.
12
14
  message CoreEvalProposal {
15
+ option (cosmos_proto.implements_interface) = "cosmos.gov.v1beta1.Content";
16
+ option (amino.name) = "swingset/CoreEvalProposal";
17
+
13
18
  option (gogoproto.goproto_getters) = false;
14
19
 
15
20
  string title = 1;
@@ -101,7 +106,7 @@ message StringBeans {
101
106
  string key = 1;
102
107
 
103
108
  // The actual bean value.
104
- string beans = 2 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Uint", (gogoproto.nullable) = false];
109
+ string beans = 2 [(gogoproto.customtype) = "cosmossdk.io/math.Uint", (gogoproto.nullable) = false];
105
110
  }
106
111
 
107
112
  // Map a provisioning power flag to its corresponding fee.
@@ -131,7 +136,7 @@ message QueueSize {
131
136
  message UintMapEntry {
132
137
  option (gogoproto.equal) = true;
133
138
  string key = 1;
134
- string value = 2 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Uint", (gogoproto.nullable) = false];
139
+ string value = 2 [(gogoproto.customtype) = "cosmossdk.io/math.Uint", (gogoproto.nullable) = false];
135
140
  }
136
141
 
137
142
  // Egress is the format for a swingset egress.
@@ -21,7 +21,7 @@ message Params {
21
21
  // per-block distribution.
22
22
  string per_epoch_reward_fraction = 2 [
23
23
  (gogoproto.moretags) = "yaml:\"discrete_epoch_reward_fraction\"",
24
- (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec",
24
+ (gogoproto.customtype) = "cosmossdk.io/math.LegacyDec",
25
25
  (gogoproto.nullable) = false
26
26
  ];
27
27
 
@@ -1,6 +1,7 @@
1
1
  syntax = "proto3";
2
2
  package agoric.vibc;
3
3
 
4
+ import "amino/amino.proto";
4
5
  import "gogoproto/gogo.proto";
5
6
  import "ibc/core/channel/v1/channel.proto";
6
7
 
@@ -15,10 +16,13 @@ service Msg {
15
16
  // MsgSendPacket is an SDK message for sending an outgoing IBC packet
16
17
  message MsgSendPacket {
17
18
  option (gogoproto.equal) = false;
19
+ option (amino.name) = "vibc/SendPacket";
18
20
 
19
21
  ibc.core.channel.v1.Packet packet = 1
20
22
  [(gogoproto.nullable) = false, (gogoproto.jsontag) = "packet", (gogoproto.moretags) = "yaml:\"packet\""];
21
23
  bytes sender = 2 [
24
+ (amino.encoding) = "legacy_address",
25
+ (amino.field_name) = "submitter",
22
26
  (gogoproto.casttype) = "github.com/cosmos/cosmos-sdk/types.AccAddress",
23
27
  (gogoproto.jsontag) = "submitter",
24
28
  (gogoproto.moretags) = "yaml:\"submitter\""
@@ -0,0 +1,172 @@
1
+ package vbank_test
2
+
3
+ import (
4
+ "cosmossdk.io/math"
5
+ "github.com/stretchr/testify/suite"
6
+
7
+ "github.com/cometbft/cometbft/crypto/secp256k1"
8
+ "github.com/cosmos/cosmos-sdk/testutil/network"
9
+ sdk "github.com/cosmos/cosmos-sdk/types"
10
+ banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
11
+ )
12
+
13
+ // Generate test accounts using secp256k1 keys
14
+ var (
15
+ priv1 = secp256k1.GenPrivKey()
16
+ priv2 = secp256k1.GenPrivKey()
17
+ addr1 = sdk.AccAddress(priv1.PubKey().Address()).String()
18
+ addr2 = sdk.AccAddress(priv2.PubKey().Address()).String()
19
+ )
20
+
21
+ type E2ETestSuite struct {
22
+ suite.Suite
23
+ cfg network.Config
24
+ network *network.Network
25
+ }
26
+
27
+ func NewE2ETestSuite(cfg network.Config) *E2ETestSuite {
28
+ return &E2ETestSuite{cfg: cfg}
29
+ }
30
+
31
+ func (s *E2ETestSuite) SetupSuite() {
32
+ s.T().Log("setting up e2e test suite")
33
+
34
+ genesisState := s.cfg.GenesisState
35
+ bankGenesis := banktypes.DefaultGenesisState()
36
+
37
+ bankGenesis.DenomMetadata = []banktypes.Metadata{
38
+ {
39
+ Name: "Agoric",
40
+ Symbol: "BLD",
41
+ Description: "AgorickToken",
42
+ DenomUnits: []*banktypes.DenomUnit{
43
+ {
44
+ Denom: "ulbd",
45
+ Exponent: 0,
46
+ Aliases: []string{"microlbd"},
47
+ },
48
+ {
49
+ Denom: "lbd",
50
+ Exponent: 6,
51
+ Aliases: []string{"LBD"},
52
+ },
53
+ },
54
+ Base: "ulbd",
55
+ Display: "lbd",
56
+ },
57
+ }
58
+
59
+ // Add two accounts with 10000 lbd each (10000 * 10^6 ulbd = 10000000000 ulbd)
60
+ // Using generated addresses from testutil
61
+ bankGenesis.Balances = []banktypes.Balance{
62
+ {
63
+ Address: addr1,
64
+ Coins: sdk.NewCoins(
65
+ sdk.NewCoin("ulbd", math.NewInt(10000000000)), // 10000 lbd
66
+ ),
67
+ },
68
+ {
69
+ Address: addr2,
70
+ Coins: sdk.NewCoins(
71
+ sdk.NewCoin("ulbd", math.NewInt(10000000000)), // 10000 lbd
72
+ ),
73
+ },
74
+ }
75
+
76
+ genesisState[banktypes.ModuleName] = s.cfg.Codec.MustMarshalJSON(bankGenesis)
77
+ s.cfg.GenesisState = genesisState
78
+
79
+ var err error
80
+ s.network, err = network.New(s.T(), s.T().TempDir(), s.cfg)
81
+ s.Require().NoError(err)
82
+
83
+ _, err = s.network.WaitForHeight(1)
84
+ s.Require().NoError(err)
85
+ }
86
+
87
+ func (s *E2ETestSuite) TearDownSuite() {
88
+ s.T().Log("tearing down e2e test suite")
89
+ s.network.Cleanup()
90
+ }
91
+
92
+ func (s *E2ETestSuite) TestSendTokens() {
93
+ s.T().Log("testing token transfer")
94
+
95
+ val := s.network.Validators[0]
96
+ ctx := val.ClientCtx
97
+
98
+ // Generate a new recipient account
99
+ recipientPriv := secp256k1.GenPrivKey()
100
+ recipientAddr := sdk.AccAddress(recipientPriv.PubKey().Address())
101
+
102
+ // Get the app instance for direct keeper access
103
+ app := val.ClientCtx.InterfaceRegistry
104
+ s.Require().NotNil(app)
105
+
106
+ // Create a send message for 1000 lbd (1000000000 ulbd)
107
+ sendAmount := sdk.NewCoins(sdk.NewCoin("ulbd", math.NewInt(1000000000))) // 1000 lbd
108
+
109
+ msgSend := &banktypes.MsgSend{
110
+ FromAddress: addr1,
111
+ ToAddress: recipientAddr.String(),
112
+ Amount: sendAmount,
113
+ }
114
+
115
+ s.T().Logf("Sending %s from %s to %s", sendAmount, addr1, recipientAddr.String())
116
+
117
+ // Create and broadcast the transaction
118
+ txBuilder := ctx.TxConfig.NewTxBuilder()
119
+ err := txBuilder.SetMsgs(msgSend)
120
+ s.Require().NoError(err)
121
+
122
+ // Set gas and fees
123
+ txBuilder.SetGasLimit(200000)
124
+ fees := sdk.NewCoins(sdk.NewCoin("ulbd", math.NewInt(100000))) // Fee in ulbd
125
+ txBuilder.SetFeeAmount(fees)
126
+
127
+ // For this test, we'll broadcast using the validator's address as a proxy
128
+ // In a real scenario, we'd sign with the actual sender's private key
129
+ txBuilder.SetFeeGranter(val.Address)
130
+
131
+ // Build and encode the transaction
132
+ txBytes, err := ctx.TxConfig.TxEncoder()(txBuilder.GetTx())
133
+ s.Require().NoError(err)
134
+ s.Require().NotNil(txBytes)
135
+
136
+ s.T().Logf("Transaction created successfully with size: %d bytes", len(txBytes))
137
+
138
+ // Broadcast the transaction
139
+ res, err := ctx.BroadcastTx(txBytes)
140
+ s.Require().NoError(err)
141
+ s.T().Logf("Transaction broadcast result: %+v", res)
142
+
143
+ // Wait for the transaction to be processed
144
+ s.Require().NoError(s.network.WaitForNextBlock())
145
+
146
+ // Query the recipient's balance to verify they received the tokens
147
+ queryClient := banktypes.NewQueryClient(ctx)
148
+ balanceReq := &banktypes.QueryAllBalancesRequest{
149
+ Address: recipientAddr.String(),
150
+ }
151
+
152
+ balanceResp, err := queryClient.AllBalances(val.ClientCtx.CmdContext, balanceReq)
153
+ s.Require().NoError(err)
154
+
155
+ // Verify the recipient received exactly 1000 lbd (1000000000 ulbd)
156
+ expectedAmount := math.NewInt(1000000000)
157
+ found := false
158
+ actualBalance := math.ZeroInt()
159
+
160
+ for _, coin := range balanceResp.Balances {
161
+ if coin.Denom == "ulbd" {
162
+ actualBalance = coin.Amount
163
+ if coin.Amount.Equal(expectedAmount) {
164
+ found = true
165
+ }
166
+ break
167
+ }
168
+ }
169
+
170
+ s.Require().True(found, "Recipient should have received exactly 1000 lbd (1000000000 ulbd), but got %s ulbd", actualBalance.String())
171
+
172
+ }
@@ -0,0 +1,214 @@
1
+ package types_test
2
+
3
+ import (
4
+ "context"
5
+ "encoding/json"
6
+ "reflect"
7
+ "testing"
8
+
9
+ "github.com/stretchr/testify/require"
10
+
11
+ "github.com/cosmos/cosmos-proto/anyutil"
12
+ gogoproto "github.com/cosmos/gogoproto/proto"
13
+ "google.golang.org/protobuf/proto"
14
+ "google.golang.org/protobuf/types/known/anypb"
15
+
16
+ v1beta1 "cosmossdk.io/api/cosmos/base/v1beta1"
17
+ txv1beta1 "cosmossdk.io/api/cosmos/tx/v1beta1"
18
+ signing_testutil "cosmossdk.io/x/tx/signing/testutil"
19
+ codectypes "github.com/cosmos/cosmos-sdk/codec/types"
20
+ sdk "github.com/cosmos/cosmos-sdk/types"
21
+ "github.com/cosmos/cosmos-sdk/types/module/testutil"
22
+ signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing"
23
+ "github.com/cosmos/cosmos-sdk/x/auth"
24
+ "github.com/cosmos/cosmos-sdk/x/auth/migrations/legacytx"
25
+ "github.com/cosmos/cosmos-sdk/x/auth/signing"
26
+ "github.com/cosmos/cosmos-sdk/x/auth/tx"
27
+ "github.com/cosmos/cosmos-sdk/x/auth/vesting"
28
+ authzmodule "github.com/cosmos/cosmos-sdk/x/authz/module"
29
+ "github.com/cosmos/cosmos-sdk/x/bank"
30
+ "github.com/cosmos/cosmos-sdk/x/gov"
31
+ govv1beta1 "github.com/cosmos/cosmos-sdk/x/gov/types/v1beta1"
32
+ "github.com/cosmos/cosmos-sdk/x/params"
33
+ "github.com/cosmos/cosmos-sdk/x/params/types/proposal"
34
+ "github.com/cosmos/cosmos-sdk/x/slashing"
35
+ "github.com/cosmos/cosmos-sdk/x/staking"
36
+ clienttypes "github.com/cosmos/ibc-go/v8/modules/core/02-client/types"
37
+ channeltypes "github.com/cosmos/ibc-go/v8/modules/core/04-channel/types"
38
+
39
+ "github.com/Agoric/agoric-sdk/golang/cosmos/app/txconfig"
40
+ "github.com/Agoric/agoric-sdk/golang/cosmos/x/swingset"
41
+ swingsettypes "github.com/Agoric/agoric-sdk/golang/cosmos/x/swingset/types"
42
+ "github.com/Agoric/agoric-sdk/golang/cosmos/x/vbank"
43
+ "github.com/Agoric/agoric-sdk/golang/cosmos/x/vibc"
44
+ "github.com/Agoric/agoric-sdk/golang/cosmos/x/vstorage"
45
+ "github.com/Agoric/agoric-sdk/golang/cosmos/x/vtransfer"
46
+ )
47
+
48
+ func TestAminoJSON_LegacyParity(t *testing.T) {
49
+ encCfg := testutil.MakeTestEncodingConfig(
50
+ auth.AppModuleBasic{},
51
+ vesting.AppModuleBasic{},
52
+ bank.AppModuleBasic{},
53
+ gov.AppModuleBasic{},
54
+ slashing.AppModuleBasic{},
55
+ staking.AppModuleBasic{},
56
+ authzmodule.AppModuleBasic{},
57
+ params.AppModuleBasic{},
58
+ vstorage.AppModuleBasic{},
59
+ swingset.AppModuleBasic{},
60
+ vibc.AppModuleBasic{},
61
+ vbank.AppModuleBasic{},
62
+ vtransfer.AppModuleBasic{},
63
+ )
64
+ legacytx.RegressionTestingAminoCodec = encCfg.Amino
65
+
66
+ signingOpts, err := tx.NewDefaultSigningOptions()
67
+ require.NoError(t, err)
68
+
69
+ handler, aj, err := txconfig.NewAminoHandlerWithCustomEncoders(signingOpts, txconfig.CustomAminoFieldEncoders)
70
+ require.NoError(t, err)
71
+
72
+ addr1 := sdk.AccAddress("addr1")
73
+ deliverMessages := &swingsettypes.Messages{Messages: []string{"{}"}, Nums: []uint64{2}, Ack: 1}
74
+ emptyDeliverMessages := &swingsettypes.Messages{Messages: []string{}, Nums: []uint64{}, Ack: 1}
75
+ zeroDeliverMessages := &swingsettypes.Messages{Messages: []string{"{}"}, Nums: []uint64{2}, Ack: 0}
76
+ coins := sdk.Coins{sdk.NewInt64Coin("uatom", 1000)}
77
+
78
+ installBundleMsg := swingsettypes.NewMsgInstallBundle("{}", addr1)
79
+ err = installBundleMsg.ValidateBasic()
80
+ require.NoError(t, err)
81
+
82
+ compressedInstallBundleMsg := new(swingsettypes.MsgInstallBundle)
83
+ *compressedInstallBundleMsg = *installBundleMsg
84
+ err = compressedInstallBundleMsg.Compress()
85
+ require.NoError(t, err)
86
+
87
+ coreEvalProposal := swingsettypes.NewCoreEvalProposal("test core eval", "Some core eval", []swingsettypes.CoreEval{{JsonPermits: "true", JsCode: ";"}})
88
+ err = coreEvalProposal.ValidateBasic()
89
+ require.NoError(t, err)
90
+
91
+ coreEvalGovMsg, err := govv1beta1.NewMsgSubmitProposal(coreEvalProposal, coins, addr1)
92
+ require.NoError(t, err)
93
+
94
+ paramsChangeProposal := proposal.NewParameterChangeProposal("title", "description", []proposal.ParamChange{proposal.NewParamChange("swingset", "foo", "bar")})
95
+ err = paramsChangeProposal.ValidateBasic()
96
+ require.NoError(t, err)
97
+
98
+ paramsChangeGovMsg, err := govv1beta1.NewMsgSubmitProposal(paramsChangeProposal, coins, addr1)
99
+ require.NoError(t, err)
100
+
101
+ ibcPacket := channeltypes.NewPacket(
102
+ []byte("data"),
103
+ 987654321098765432,
104
+ "port-src", "channel-13",
105
+ "port-dst", "channel-42",
106
+ clienttypes.Height{},
107
+ 123456789012345678,
108
+ )
109
+
110
+ cases := map[string]struct {
111
+ gogo gogoproto.Message
112
+ // If there are any empty slices, the marshal round trip to bytes will likely transform these into nil slices
113
+ roundTripUnequal bool
114
+ }{
115
+ "swingset/msg_deliver_inbound/normal": {gogo: swingsettypes.NewMsgDeliverInbound(deliverMessages, addr1)},
116
+ "swingset/msg_deliver_inbound/empty": {gogo: swingsettypes.NewMsgDeliverInbound(emptyDeliverMessages, addr1), roundTripUnequal: true},
117
+ "swingset/msg_deliver_inbound/zero": {gogo: swingsettypes.NewMsgDeliverInbound(zeroDeliverMessages, addr1)},
118
+ "swingset/msg_wallet_action": {gogo: swingsettypes.NewMsgWalletAction(addr1, "{}")},
119
+ "swingset/msg_wallet_spend_action": {gogo: swingsettypes.NewMsgWalletSpendAction(addr1, "{}")},
120
+ "swingset/msg_provision/normal": {gogo: swingsettypes.NewMsgProvision("foo", addr1, []string{"bar"}, addr1)},
121
+ "swingset/msg_provision/empty": {gogo: swingsettypes.NewMsgProvision("foo", addr1, []string{}, addr1), roundTripUnequal: true},
122
+ "swingset/msg_install_bundle": {gogo: installBundleMsg},
123
+ "swingset/msg_install_bundle/compressed": {gogo: compressedInstallBundleMsg},
124
+ "swingset/gov/core_eval_proposal": {gogo: coreEvalGovMsg},
125
+ "swingset/gov/params_change_proposal": {gogo: paramsChangeGovMsg},
126
+ "vibc/msg_send_packet": {gogo: vibc.NewMsgSendPacket(ibcPacket, addr1)},
127
+ }
128
+
129
+ for name, tc := range cases {
130
+ t.Run(name, func(t *testing.T) {
131
+ gogoMsg := tc.gogo
132
+
133
+ // Convert gogoproto into new proto msg like tx would
134
+ anyGogoMsg, err := codectypes.NewAnyWithValue(gogoMsg)
135
+ require.NoError(t, err)
136
+
137
+ protoMsg, err := anyutil.Unpack(&anypb.Any{
138
+ TypeUrl: anyGogoMsg.TypeUrl,
139
+ Value: anyGogoMsg.Value,
140
+ }, encCfg.InterfaceRegistry, nil)
141
+ require.NoError(t, err)
142
+
143
+ protoBz, err := proto.Marshal(protoMsg)
144
+ require.NoError(t, err)
145
+
146
+ // Sanity check
147
+ gogoType := reflect.TypeOf(gogoMsg).Elem()
148
+ newGogo := reflect.New(gogoType).Interface().(gogoproto.Message)
149
+ err = encCfg.Codec.Unmarshal(protoBz, newGogo)
150
+ require.NoError(t, err)
151
+ if tc.roundTripUnequal {
152
+ require.NotEqual(t, gogoMsg, newGogo)
153
+ } else {
154
+ require.Equal(t, gogoMsg, newGogo)
155
+ }
156
+
157
+ // Check amino json encoding matches
158
+ anyProtoMsg, err := anyutil.New(protoMsg)
159
+ require.NoError(t, err)
160
+
161
+ legacyAminoJSON, err := encCfg.Amino.MarshalJSON(gogoMsg)
162
+ require.NoError(t, err)
163
+ legacyAminoJSON = sortJSON(t, legacyAminoJSON)
164
+ aminoJSON, err := aj.Marshal(anyProtoMsg)
165
+ require.NoError(t, err)
166
+ require.Equal(t, string(legacyAminoJSON), string(aminoJSON))
167
+
168
+ handlerOptions := signing_testutil.HandlerArgumentOptions{
169
+ ChainID: "test-chain",
170
+ Memo: "sometestmemo",
171
+ Msg: protoMsg,
172
+ AccNum: 1,
173
+ AccSeq: 2,
174
+ SignerAddress: "signerAddress",
175
+ Fee: &txv1beta1.Fee{
176
+ Amount: []*v1beta1.Coin{{Denom: "uatom", Amount: "1000"}},
177
+ },
178
+ }
179
+
180
+ signerData, txData, err := signing_testutil.MakeHandlerArguments(handlerOptions)
181
+ require.NoError(t, err)
182
+
183
+ signBz, err := handler.GetSignBytes(context.Background(), signerData, txData)
184
+ require.NoError(t, err)
185
+
186
+ legacyHandler := tx.NewSignModeLegacyAminoJSONHandler()
187
+ txBuilder := encCfg.TxConfig.NewTxBuilder()
188
+ require.NoError(t, txBuilder.SetMsgs([]sdk.Msg{gogoMsg}...))
189
+ txBuilder.SetMemo(handlerOptions.Memo)
190
+ txBuilder.SetFeeAmount(sdk.Coins{sdk.NewInt64Coin("uatom", 1000)})
191
+ theTx := txBuilder.GetTx()
192
+
193
+ legacySigningData := signing.SignerData{
194
+ ChainID: handlerOptions.ChainID,
195
+ Address: handlerOptions.SignerAddress,
196
+ AccountNumber: handlerOptions.AccNum,
197
+ Sequence: handlerOptions.AccSeq,
198
+ }
199
+ legacySignBz, err := legacyHandler.GetSignBytes(signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON,
200
+ legacySigningData, theTx)
201
+ require.NoError(t, err)
202
+ require.Equal(t, string(legacySignBz), string(signBz))
203
+ })
204
+ }
205
+ }
206
+
207
+ func sortJSON(t require.TestingT, bz []byte) []byte {
208
+ var c interface{}
209
+ err := json.Unmarshal(bz, &c)
210
+ require.NoError(t, err)
211
+ bz, err = json.Marshal(c)
212
+ require.NoError(t, err)
213
+ return bz
214
+ }