@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
@@ -1,19 +1,20 @@
1
1
  package vtransfer_test
2
2
 
3
3
  import (
4
+ "encoding/hex"
4
5
  "fmt"
5
6
  "strconv"
6
7
 
7
- sdk "github.com/cosmos/cosmos-sdk/types"
8
- clienttypes "github.com/cosmos/ibc-go/v7/modules/core/02-client/types"
9
- channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types"
10
- host "github.com/cosmos/ibc-go/v7/modules/core/24-host"
11
- ibctesting "github.com/cosmos/ibc-go/v7/testing"
8
+ abci "github.com/cometbft/cometbft/abci/types"
9
+ clienttypes "github.com/cosmos/ibc-go/v8/modules/core/02-client/types"
10
+ channeltypes "github.com/cosmos/ibc-go/v8/modules/core/04-channel/types"
11
+ host "github.com/cosmos/ibc-go/v8/modules/core/24-host"
12
+ ibctesting "github.com/cosmos/ibc-go/v8/testing"
12
13
  )
13
14
 
14
15
  // acknowledgePacketWithResult sends a MsgAcknowledgement to the channel associated with the endpoint.
15
16
  // [AGORIC] Would be nice to create a new ibctesting.AcknowledgePacketWithResult
16
- func acknowledgePacketWithResult(endpoint *ibctesting.Endpoint, packet channeltypes.Packet, ack []byte) (*sdk.Result, error) {
17
+ func acknowledgePacketWithResult(endpoint *ibctesting.Endpoint, packet channeltypes.Packet, ack []byte) (*abci.ExecTxResult, error) {
17
18
  // get proof of acknowledgement on counterparty
18
19
  packetKey := host.PacketAcknowledgementKey(packet.GetDestPort(), packet.GetDestChannel(), packet.GetSequence())
19
20
  proof, proofHeight := endpoint.Counterparty.QueryProof(packetKey)
@@ -26,17 +27,24 @@ func acknowledgePacketWithResult(endpoint *ibctesting.Endpoint, packet channelty
26
27
  // ParseAckFromEvents parses events emitted from a MsgRecvPacket and returns the
27
28
  // acknowledgement.
28
29
  // [AGORIC] Signature taken from ibctesting.ParseAckFromEvents
29
- func ParseAckFromEvents(events sdk.Events) ([]byte, error) {
30
+ func ParseAckFromEvents(events []abci.Event) ([]byte, error) {
30
31
  return ParseAckFromFilteredEvents(events, channeltypes.EventTypeWriteAck)
31
32
  }
32
33
 
33
34
  // ParseAckFromFilteredEvents parses events emitted matching filteredType and returns the acknowledgement.
34
35
  // [AGORIC] Would be nice to improve the implementation and upstream it
35
- func ParseAckFromFilteredEvents(events sdk.Events, filteredType string) ([]byte, error) {
36
+ func ParseAckFromFilteredEvents(events []abci.Event, filteredType string) ([]byte, error) {
36
37
  for _, ev := range events {
37
38
  if ev.Type == filteredType {
38
39
  for _, attr := range ev.Attributes {
39
- if attr.Key == channeltypes.AttributeKeyAck { //nolint:staticcheck // DEPRECATED
40
+ switch attr.Key {
41
+ case channeltypes.AttributeKeyAckHex:
42
+ hexAck, err := hex.DecodeString(attr.Value)
43
+ if err != nil {
44
+ return nil, fmt.Errorf("failed to parse hex ack: %w", err)
45
+ }
46
+ return hexAck, nil
47
+ case channeltypes.AttributeKeyAck: //nolint:staticcheck // DEPRECATED
40
48
  return []byte(attr.Value), nil
41
49
  }
42
50
  }
@@ -48,18 +56,25 @@ func ParseAckFromFilteredEvents(events sdk.Events, filteredType string) ([]byte,
48
56
  // ParsePacketFromEvents parses the send_packet type events emitted by the IBC
49
57
  // module and returns the packet.
50
58
  // [AGORIC] Signature taken from ibctesting.ParsePacketFromEvents
51
- func ParsePacketFromEvents(events sdk.Events) (channeltypes.Packet, error) {
59
+ func ParsePacketFromEvents(events []abci.Event) (channeltypes.Packet, error) {
52
60
  return ParsePacketFromFilteredEvents(events, channeltypes.EventTypeSendPacket)
53
61
  }
54
62
 
55
63
  // ParsePacketFromFilteredEvents parses events emitted matching filteredType and returns the packet.
56
64
  // [AGORIC] Would be nice to improve the implementation and upstream it
57
- func ParsePacketFromFilteredEvents(events sdk.Events, filteredType string) (channeltypes.Packet, error) {
65
+ func ParsePacketFromFilteredEvents(events []abci.Event, filteredType string) (channeltypes.Packet, error) {
58
66
  for _, ev := range events {
59
67
  if ev.Type == filteredType {
60
68
  packet := channeltypes.Packet{}
61
69
  for _, attr := range ev.Attributes {
62
70
  switch attr.Key {
71
+ case channeltypes.AttributeKeyDataHex:
72
+ hexData, err := hex.DecodeString(attr.Value)
73
+ if err != nil {
74
+ return channeltypes.Packet{}, fmt.Errorf("failed to parse hex data: %w", err)
75
+ }
76
+ packet.Data = hexData
77
+
63
78
  case channeltypes.AttributeKeyData: //nolint:staticcheck // DEPRECATED
64
79
  packet.Data = []byte(attr.Value)
65
80
 
@@ -1,539 +0,0 @@
1
- package cmd
2
-
3
- // DONTCOVER
4
-
5
- import (
6
- "bufio"
7
- "encoding/json"
8
- "fmt"
9
- "net"
10
- "os"
11
- "path/filepath"
12
-
13
- tmconfig "github.com/cometbft/cometbft/config"
14
- tmrand "github.com/cometbft/cometbft/libs/rand"
15
- "github.com/cometbft/cometbft/types"
16
- tmtime "github.com/cometbft/cometbft/types/time"
17
- "github.com/spf13/cobra"
18
- "github.com/spf13/pflag"
19
-
20
- "cosmossdk.io/math"
21
-
22
- "cosmossdk.io/simapp"
23
- "github.com/cosmos/cosmos-sdk/client"
24
- "github.com/cosmos/cosmos-sdk/client/flags"
25
- "github.com/cosmos/cosmos-sdk/client/tx"
26
- "github.com/cosmos/cosmos-sdk/crypto/hd"
27
- "github.com/cosmos/cosmos-sdk/crypto/keyring"
28
- cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types"
29
- "github.com/cosmos/cosmos-sdk/server"
30
- srvconfig "github.com/cosmos/cosmos-sdk/server/config"
31
- "github.com/cosmos/cosmos-sdk/testutil"
32
- "github.com/cosmos/cosmos-sdk/testutil/network"
33
- sdk "github.com/cosmos/cosmos-sdk/types"
34
- "github.com/cosmos/cosmos-sdk/types/module"
35
- authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
36
- banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
37
- "github.com/cosmos/cosmos-sdk/x/genutil"
38
- genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types"
39
- stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
40
- )
41
-
42
- var (
43
- flagNodeDirPrefix = "node-dir-prefix"
44
- flagNumValidators = "validator-count"
45
- flagOutputDir = "output-dir"
46
- flagNodeDaemonHome = "node-daemon-home"
47
- flagStartingIPAddress = "starting-ip-address"
48
- flagEnableLogging = "enable-logging"
49
- flagGRPCAddress = "grpc.address"
50
- flagRPCAddress = "rpc.address"
51
- flagAPIAddress = "api.address"
52
- flagPrintMnemonic = "print-mnemonic"
53
-
54
- shortFlagNumValidators = "c"
55
- flagDeprecatedNumValidators = "v"
56
- )
57
-
58
- type initArgs struct {
59
- algo string
60
- chainID string
61
- keyringBackend string
62
- minGasPrices string
63
- nodeDaemonHome string
64
- nodeDirPrefix string
65
- numValidators int
66
- outputDir string
67
- startingIPAddress string
68
- }
69
-
70
- type startArgs struct {
71
- algo string
72
- apiAddress string
73
- chainID string
74
- enableLogging bool
75
- grpcAddress string
76
- minGasPrices string
77
- numValidators int
78
- outputDir string
79
- printMnemonic bool
80
- rpcAddress string
81
- }
82
-
83
- func addTestnetFlagsToCmd(cmd *cobra.Command) {
84
- cmd.Flags().IntP(flagNumValidators, shortFlagNumValidators, 4, "Number of validators to initialize the testnet with")
85
- cmd.Flags().Int(flagDeprecatedNumValidators, 4, "Number of validators to initialize the testnet with")
86
- cmd.Flags().MarkDeprecated(flagDeprecatedNumValidators, fmt.Sprintf("use -%s or --%s", shortFlagNumValidators, flagNumValidators))
87
- cmd.Flags().StringP(flagOutputDir, "o", "./.testnets", "Directory to store initialization data for the testnet")
88
- cmd.Flags().String(flags.FlagChainID, "", "genesis file chain-id, if left blank will be randomly created")
89
- cmd.Flags().String(server.FlagMinGasPrices, fmt.Sprintf("0.000006%s", sdk.DefaultBondDenom), "Minimum gas prices to accept for transactions; All fees in a tx must meet this minimum (e.g. 0.01photino,0.001stake)")
90
- cmd.Flags().String(flags.FlagKeyType, string(hd.Secp256k1Type), "Key signing algorithm to generate keys for")
91
-
92
- // support old flags name for backwards compatibility
93
- cmd.Flags().SetNormalizeFunc(func(f *pflag.FlagSet, name string) pflag.NormalizedName {
94
- if name == "algo" {
95
- name = flags.FlagKeyType
96
- }
97
-
98
- return pflag.NormalizedName(name)
99
- })
100
- }
101
-
102
- // NewTestnetCmd creates a root testnet command with subcommands to run an in-process testnet or initialize
103
- // validator configuration files for running a multi-validator testnet in a separate process
104
- func NewTestnetCmd(mbm module.BasicManager, genBalIterator banktypes.GenesisBalancesIterator, appName string) *cobra.Command {
105
- testnetCmd := &cobra.Command{
106
- Use: "testnet",
107
- Short: "subcommands for starting or configuring local testnets",
108
- DisableFlagParsing: true,
109
- SuggestionsMinimumDistance: 2,
110
- RunE: client.ValidateCmd,
111
- }
112
-
113
- testnetCmd.AddCommand(testnetStartCmd(appName))
114
- testnetCmd.AddCommand(testnetInitFilesCmd(mbm, genBalIterator, appName))
115
-
116
- return testnetCmd
117
- }
118
-
119
- // testnetInitFilesCmd returns a cmd to initialize all files for tendermint testnet and application
120
- func testnetInitFilesCmd(mbm module.BasicManager, genBalIterator banktypes.GenesisBalancesIterator, appName string) *cobra.Command {
121
- cmd := &cobra.Command{
122
- Use: "init-files",
123
- Short: "Initialize config directories & files for a multi-validator testnet running locally via separate processes (e.g. Docker Compose or similar)",
124
- Long: fmt.Sprintf(`init-files will setup a number of directories (specified by "-%[2]s") and populate each with
125
- necessary files (private validator, genesis, config, etc.) for running validator nodes.
126
-
127
- Booting up a network with these validator folders is intended to be used with Docker Compose,
128
- or a similar setup where each node has a manually configurable IP address.
129
-
130
- Note, strict routability for addresses is turned off in the config file.
131
-
132
- Example:
133
- %[1]s testnet init-files -%[2]s 4 --output-dir ./.testnets --starting-ip-address 192.168.10.2
134
- `, appName, shortFlagNumValidators),
135
- RunE: func(cmd *cobra.Command, _ []string) error {
136
- clientCtx, err := client.GetClientQueryContext(cmd)
137
- if err != nil {
138
- return err
139
- }
140
-
141
- serverCtx := server.GetServerContextFromCmd(cmd)
142
- config := serverCtx.Config
143
-
144
- args := initArgs{}
145
- args.outputDir, _ = cmd.Flags().GetString(flagOutputDir)
146
- args.keyringBackend, _ = cmd.Flags().GetString(flags.FlagKeyringBackend)
147
- args.chainID, _ = cmd.Flags().GetString(flags.FlagChainID)
148
- args.minGasPrices, _ = cmd.Flags().GetString(server.FlagMinGasPrices)
149
- args.nodeDirPrefix, _ = cmd.Flags().GetString(flagNodeDirPrefix)
150
- args.nodeDaemonHome, _ = cmd.Flags().GetString(flagNodeDaemonHome)
151
- args.startingIPAddress, _ = cmd.Flags().GetString(flagStartingIPAddress)
152
- args.numValidators, _ = cmd.Flags().GetInt(flagNumValidators)
153
- args.algo, _ = cmd.Flags().GetString(flags.FlagKeyType)
154
-
155
- return initTestnetFiles(clientCtx, cmd, config, mbm, genBalIterator, args)
156
- },
157
- }
158
-
159
- addTestnetFlagsToCmd(cmd)
160
- cmd.Flags().String(flagNodeDirPrefix, "node", "Prefix the directory name for each node with (node results in node0, node1, ...)")
161
- cmd.Flags().String(flagNodeDaemonHome, appName, "Home directory of the node's daemon configuration")
162
- cmd.Flags().String(flagStartingIPAddress, "192.168.0.1", "Starting IP address (192.168.0.1 results in persistent peers list ID0@192.168.0.1:46656, ID1@192.168.0.2:46656, ...)")
163
- cmd.Flags().String(flags.FlagKeyringBackend, flags.DefaultKeyringBackend, "Select keyring's backend (os|file|test)")
164
-
165
- return cmd
166
- }
167
-
168
- // testnetStartCmd returns a cmd to start multi validator in-process testnet
169
- func testnetStartCmd(appName string) *cobra.Command {
170
- cmd := &cobra.Command{
171
- Use: "start",
172
- Short: "Launch an in-process multi-validator testnet",
173
- Long: fmt.Sprintf(`testnet will launch an in-process multi-validator testnet,
174
- and generate a number of directories (specified by "-%[2]s"), populated with necessary validator configuration files
175
- (private validator, genesis, config, etc.).
176
-
177
- Example:
178
- %[1]s testnet start -%[2]s 4 --output-dir ./.testnets
179
- `, appName, shortFlagNumValidators),
180
- RunE: func(cmd *cobra.Command, _ []string) error {
181
- args := startArgs{}
182
- args.outputDir, _ = cmd.Flags().GetString(flagOutputDir)
183
- args.chainID, _ = cmd.Flags().GetString(flags.FlagChainID)
184
- args.minGasPrices, _ = cmd.Flags().GetString(server.FlagMinGasPrices)
185
- args.numValidators, _ = cmd.Flags().GetInt(flagNumValidators)
186
- args.algo, _ = cmd.Flags().GetString(flags.FlagKeyType)
187
- args.enableLogging, _ = cmd.Flags().GetBool(flagEnableLogging)
188
- args.rpcAddress, _ = cmd.Flags().GetString(flagRPCAddress)
189
- args.apiAddress, _ = cmd.Flags().GetString(flagAPIAddress)
190
- args.grpcAddress, _ = cmd.Flags().GetString(flagGRPCAddress)
191
- args.printMnemonic, _ = cmd.Flags().GetBool(flagPrintMnemonic)
192
-
193
- return startTestnet(cmd, args)
194
- },
195
- }
196
-
197
- addTestnetFlagsToCmd(cmd)
198
- cmd.Flags().Bool(flagEnableLogging, false, "Enable INFO logging of tendermint validator nodes")
199
- cmd.Flags().String(flagRPCAddress, "tcp://0.0.0.0:26657", "the RPC address to listen on")
200
- cmd.Flags().String(flagAPIAddress, "tcp://0.0.0.0:1317", "the address to listen on for REST API")
201
- cmd.Flags().String(flagGRPCAddress, "0.0.0.0:9090", "the gRPC server address to listen on")
202
- cmd.Flags().Bool(flagPrintMnemonic, true, "print mnemonic of first validator to stdout for manual testing")
203
- return cmd
204
- }
205
-
206
- const nodeDirPerm = 0o755
207
-
208
- // initTestnetFiles initializes testnet files for a testnet to be run in a separate process
209
- func initTestnetFiles(
210
- clientCtx client.Context,
211
- cmd *cobra.Command,
212
- nodeConfig *tmconfig.Config,
213
- mbm module.BasicManager,
214
- genBalIterator banktypes.GenesisBalancesIterator,
215
- args initArgs,
216
- ) error {
217
- if args.chainID == "" {
218
- args.chainID = "chain-" + tmrand.Str(6)
219
- }
220
- nodeIDs := make([]string, args.numValidators)
221
- valPubKeys := make([]cryptotypes.PubKey, args.numValidators)
222
-
223
- simappConfig := srvconfig.DefaultConfig()
224
- simappConfig.MinGasPrices = args.minGasPrices
225
- simappConfig.API.Enable = true
226
- simappConfig.Telemetry.Enabled = true
227
- simappConfig.Telemetry.PrometheusRetentionTime = 60
228
- simappConfig.Telemetry.EnableHostnameLabel = false
229
- simappConfig.Telemetry.GlobalLabels = [][]string{{"chain_id", args.chainID}}
230
-
231
- var (
232
- genAccounts []authtypes.GenesisAccount
233
- genBalances []banktypes.Balance
234
- genFiles []string
235
- )
236
-
237
- inBuf := bufio.NewReader(cmd.InOrStdin())
238
- // generate private keys, node IDs, and initial transactions
239
- for i := 0; i < args.numValidators; i++ {
240
- nodeDirName := fmt.Sprintf("%s%d", args.nodeDirPrefix, i)
241
- nodeDir := filepath.Join(args.outputDir, nodeDirName, args.nodeDaemonHome)
242
- gentxsDir := filepath.Join(args.outputDir, "gentxs")
243
-
244
- nodeConfig.SetRoot(nodeDir)
245
- nodeConfig.Moniker = nodeDirName
246
- nodeConfig.RPC.ListenAddress = "tcp://0.0.0.0:26657"
247
-
248
- if err := os.MkdirAll(filepath.Join(nodeDir, "config"), nodeDirPerm); err != nil {
249
- _ = os.RemoveAll(args.outputDir)
250
- return err
251
- }
252
-
253
- ip, err := getIP(i, args.startingIPAddress)
254
- if err != nil {
255
- _ = os.RemoveAll(args.outputDir)
256
- return err
257
- }
258
-
259
- nodeIDs[i], valPubKeys[i], err = genutil.InitializeNodeValidatorFiles(nodeConfig)
260
- if err != nil {
261
- _ = os.RemoveAll(args.outputDir)
262
- return err
263
- }
264
-
265
- memo := fmt.Sprintf("%s@%s:26656", nodeIDs[i], ip)
266
- genFiles = append(genFiles, nodeConfig.GenesisFile())
267
-
268
- kb, err := keyring.New(sdk.KeyringServiceName(), args.keyringBackend, nodeDir, inBuf, clientCtx.Codec)
269
- if err != nil {
270
- return err
271
- }
272
-
273
- keyringAlgos, _ := kb.SupportedAlgorithms()
274
- algo, err := keyring.NewSigningAlgoFromString(args.algo, keyringAlgos)
275
- if err != nil {
276
- return err
277
- }
278
-
279
- addr, secret, err := testutil.GenerateSaveCoinKey(kb, nodeDirName, "", true, algo)
280
- if err != nil {
281
- _ = os.RemoveAll(args.outputDir)
282
- return err
283
- }
284
-
285
- info := map[string]string{"secret": secret}
286
-
287
- cliPrint, err := json.Marshal(info)
288
- if err != nil {
289
- return err
290
- }
291
-
292
- // save private key seed words
293
- if err := writeFile(fmt.Sprintf("%v.json", "key_seed"), nodeDir, cliPrint); err != nil {
294
- return err
295
- }
296
-
297
- accTokens := sdk.TokensFromConsensusPower(1000, sdk.DefaultPowerReduction)
298
- accStakingTokens := sdk.TokensFromConsensusPower(500, sdk.DefaultPowerReduction)
299
- coins := sdk.Coins{
300
- sdk.NewCoin("testtoken", accTokens),
301
- sdk.NewCoin(sdk.DefaultBondDenom, accStakingTokens),
302
- }
303
-
304
- genBalances = append(genBalances, banktypes.Balance{Address: addr.String(), Coins: coins.Sort()})
305
- genAccounts = append(genAccounts, authtypes.NewBaseAccount(addr, nil, 0, 0))
306
-
307
- valTokens := sdk.TokensFromConsensusPower(100, sdk.DefaultPowerReduction)
308
- createValMsg, err := stakingtypes.NewMsgCreateValidator(
309
- sdk.ValAddress(addr),
310
- valPubKeys[i],
311
- sdk.NewCoin(sdk.DefaultBondDenom, valTokens),
312
- stakingtypes.NewDescription(nodeDirName, "", "", "", ""),
313
- stakingtypes.NewCommissionRates(math.LegacyOneDec(), math.LegacyOneDec(), math.LegacyOneDec()),
314
- math.OneInt(),
315
- )
316
- if err != nil {
317
- return err
318
- }
319
-
320
- txBuilder := clientCtx.TxConfig.NewTxBuilder()
321
- if err := txBuilder.SetMsgs(createValMsg); err != nil {
322
- return err
323
- }
324
-
325
- txBuilder.SetMemo(memo)
326
-
327
- txFactory := tx.Factory{}
328
- txFactory = txFactory.
329
- WithChainID(args.chainID).
330
- WithMemo(memo).
331
- WithKeybase(kb).
332
- WithTxConfig(clientCtx.TxConfig)
333
-
334
- if err := tx.Sign(txFactory, nodeDirName, txBuilder, true); err != nil {
335
- return err
336
- }
337
-
338
- txBz, err := clientCtx.TxConfig.TxJSONEncoder()(txBuilder.GetTx())
339
- if err != nil {
340
- return err
341
- }
342
-
343
- if err := writeFile(fmt.Sprintf("%v.json", nodeDirName), gentxsDir, txBz); err != nil {
344
- return err
345
- }
346
-
347
- srvconfig.WriteConfigFile(filepath.Join(nodeDir, "config", "app.toml"), simappConfig)
348
- }
349
-
350
- if err := initGenFiles(clientCtx, mbm, args.chainID, genAccounts, genBalances, genFiles, args.numValidators); err != nil {
351
- return err
352
- }
353
-
354
- err := collectGenFiles(
355
- clientCtx, nodeConfig, args.chainID, nodeIDs, valPubKeys, args.numValidators,
356
- args.outputDir, args.nodeDirPrefix, args.nodeDaemonHome, genBalIterator,
357
- )
358
- if err != nil {
359
- return err
360
- }
361
-
362
- cmd.PrintErrf("Successfully initialized %d node directories\n", args.numValidators)
363
- return nil
364
- }
365
-
366
- func initGenFiles(
367
- clientCtx client.Context, mbm module.BasicManager, chainID string,
368
- genAccounts []authtypes.GenesisAccount, genBalances []banktypes.Balance,
369
- genFiles []string, numValidators int,
370
- ) error {
371
- appGenState := mbm.DefaultGenesis(clientCtx.Codec)
372
-
373
- // set the accounts in the genesis state
374
- var authGenState authtypes.GenesisState
375
- clientCtx.Codec.MustUnmarshalJSON(appGenState[authtypes.ModuleName], &authGenState)
376
-
377
- accounts, err := authtypes.PackAccounts(genAccounts)
378
- if err != nil {
379
- return err
380
- }
381
-
382
- authGenState.Accounts = accounts
383
- appGenState[authtypes.ModuleName] = clientCtx.Codec.MustMarshalJSON(&authGenState)
384
-
385
- // set the balances in the genesis state
386
- var bankGenState banktypes.GenesisState
387
- clientCtx.Codec.MustUnmarshalJSON(appGenState[banktypes.ModuleName], &bankGenState)
388
-
389
- bankGenState.Balances = banktypes.SanitizeGenesisBalances(genBalances)
390
- for _, bal := range bankGenState.Balances {
391
- bankGenState.Supply = bankGenState.Supply.Add(bal.Coins...)
392
- }
393
- appGenState[banktypes.ModuleName] = clientCtx.Codec.MustMarshalJSON(&bankGenState)
394
-
395
- appGenStateJSON, err := json.MarshalIndent(appGenState, "", " ")
396
- if err != nil {
397
- return err
398
- }
399
-
400
- genDoc := types.GenesisDoc{
401
- ChainID: chainID,
402
- AppState: appGenStateJSON,
403
- Validators: nil,
404
- }
405
-
406
- // generate empty genesis files for each validator and save
407
- for i := 0; i < numValidators; i++ {
408
- if err := genDoc.SaveAs(genFiles[i]); err != nil {
409
- return err
410
- }
411
- }
412
- return nil
413
- }
414
-
415
- func collectGenFiles(
416
- clientCtx client.Context, nodeConfig *tmconfig.Config, chainID string,
417
- nodeIDs []string, valPubKeys []cryptotypes.PubKey, numValidators int,
418
- outputDir, nodeDirPrefix, nodeDaemonHome string, genBalIterator banktypes.GenesisBalancesIterator,
419
- ) error {
420
- var appState json.RawMessage
421
- genTime := tmtime.Now()
422
-
423
- for i := 0; i < numValidators; i++ {
424
- nodeDirName := fmt.Sprintf("%s%d", nodeDirPrefix, i)
425
- nodeDir := filepath.Join(outputDir, nodeDirName, nodeDaemonHome)
426
- gentxsDir := filepath.Join(outputDir, "gentxs")
427
- nodeConfig.Moniker = nodeDirName
428
-
429
- nodeConfig.SetRoot(nodeDir)
430
-
431
- nodeID, valPubKey := nodeIDs[i], valPubKeys[i]
432
- initCfg := genutiltypes.NewInitConfig(chainID, gentxsDir, nodeID, valPubKey)
433
-
434
- genDoc, err := types.GenesisDocFromFile(nodeConfig.GenesisFile())
435
- if err != nil {
436
- return err
437
- }
438
-
439
- nodeAppState, err := genutil.GenAppStateFromConfig(clientCtx.Codec, clientCtx.TxConfig, nodeConfig, initCfg, *genDoc, genBalIterator, genutiltypes.DefaultMessageValidator)
440
- if err != nil {
441
- return err
442
- }
443
-
444
- if appState == nil {
445
- // set the canonical application state (they should not differ)
446
- appState = nodeAppState
447
- }
448
-
449
- genFile := nodeConfig.GenesisFile()
450
-
451
- // overwrite each validator's genesis file to have a canonical genesis time
452
- if err := genutil.ExportGenesisFileWithTime(genFile, chainID, nil, appState, genTime); err != nil {
453
- return err
454
- }
455
- }
456
-
457
- return nil
458
- }
459
-
460
- func getIP(i int, startingIPAddr string) (ip string, err error) {
461
- if len(startingIPAddr) == 0 {
462
- ip, err = server.ExternalIP()
463
- if err != nil {
464
- return "", err
465
- }
466
- return ip, nil
467
- }
468
- return calculateIP(startingIPAddr, i)
469
- }
470
-
471
- func calculateIP(ip string, i int) (string, error) {
472
- ipv4 := net.ParseIP(ip).To4()
473
- if ipv4 == nil {
474
- return "", fmt.Errorf("%v: non ipv4 address", ip)
475
- }
476
-
477
- for j := 0; j < i; j++ {
478
- ipv4[3]++
479
- }
480
-
481
- return ipv4.String(), nil
482
- }
483
-
484
- func writeFile(name string, dir string, contents []byte) error {
485
- file := filepath.Join(dir, name)
486
-
487
- if err := os.MkdirAll(dir, 0o755); err != nil {
488
- return fmt.Errorf("could not create directory %q: %s", dir, err)
489
- }
490
-
491
- if err := os.WriteFile(file, contents, 0o644); err != nil { //nolint: gosec
492
- return err
493
- }
494
-
495
- return nil
496
- }
497
-
498
- // startTestnet starts an in-process testnet
499
- func startTestnet(cmd *cobra.Command, args startArgs) error {
500
- networkConfig := network.DefaultConfig(simapp.NewTestNetworkFixture)
501
-
502
- // Default networkConfig.ChainID is random, and we should only override it if chainID provided
503
- // is non-empty
504
- if args.chainID != "" {
505
- networkConfig.ChainID = args.chainID
506
- }
507
- networkConfig.SigningAlgo = args.algo
508
- networkConfig.MinGasPrices = args.minGasPrices
509
- networkConfig.NumValidators = args.numValidators
510
- networkConfig.EnableTMLogging = args.enableLogging
511
- networkConfig.RPCAddress = args.rpcAddress
512
- networkConfig.APIAddress = args.apiAddress
513
- networkConfig.GRPCAddress = args.grpcAddress
514
- networkConfig.PrintMnemonic = args.printMnemonic
515
- networkLogger := network.NewCLILogger(cmd)
516
-
517
- baseDir := fmt.Sprintf("%s/%s", args.outputDir, networkConfig.ChainID)
518
- if _, err := os.Stat(baseDir); !os.IsNotExist(err) {
519
- return fmt.Errorf(
520
- "testnests directory already exists for chain-id '%s': %s, please remove or select a new --chain-id",
521
- networkConfig.ChainID, baseDir)
522
- }
523
-
524
- testnet, err := network.New(networkLogger, baseDir, networkConfig)
525
- if err != nil {
526
- return err
527
- }
528
-
529
- if _, err := testnet.WaitForHeight(1); err != nil {
530
- return err
531
- }
532
- cmd.Println("press the Enter Key to terminate")
533
- if _, err := fmt.Scanln(); err != nil { // wait for Enter Key
534
- return err
535
- }
536
- testnet.Cleanup()
537
-
538
- return nil
539
- }