@agoric/cosmos 0.34.2-orchestration-dev-096c4e8.0 → 0.34.2-other-dev-3eb1a1d.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 (90) hide show
  1. package/MAINTAINERS.md +3 -0
  2. package/Makefile +38 -34
  3. package/ante/ante.go +1 -4
  4. package/ante/inbound_test.go +2 -2
  5. package/app/app.go +198 -137
  6. package/app/upgrade.go +248 -0
  7. package/cmd/agd/agvm.go +3 -3
  8. package/cmd/agd/find_binary.go +2 -2
  9. package/cmd/agd/main.go +9 -10
  10. package/cmd/libdaemon/main.go +13 -13
  11. package/daemon/cmd/root.go +235 -92
  12. package/daemon/cmd/root_test.go +189 -1
  13. package/daemon/main.go +3 -2
  14. package/git-revision.txt +1 -1
  15. package/go.mod +14 -11
  16. package/go.sum +20 -19
  17. package/index.cjs +1 -1
  18. package/package.json +4 -3
  19. package/proto/agoric/swingset/genesis.proto +4 -0
  20. package/proto/agoric/swingset/swingset.proto +26 -1
  21. package/proto/agoric/vbank/vbank.proto +7 -0
  22. package/proto/agoric/vtransfer/genesis.proto +18 -0
  23. package/scripts/protocgen.sh +7 -8
  24. package/types/kv_entry_helpers.go +42 -0
  25. package/upgradegaia.sh +8 -8
  26. package/util/util.go +21 -0
  27. package/vm/action.go +1 -1
  28. package/vm/client.go +15 -13
  29. package/vm/client_test.go +34 -36
  30. package/vm/controller.go +3 -38
  31. package/vm/core_proposals.go +22 -2
  32. package/vm/proto_json.go +38 -0
  33. package/vm/proto_json_test.go +103 -0
  34. package/vm/server.go +106 -5
  35. package/x/swingset/alias.go +2 -0
  36. package/x/swingset/config.go +234 -0
  37. package/x/swingset/genesis.go +178 -40
  38. package/x/swingset/keeper/extension_snapshotter.go +2 -2
  39. package/x/swingset/keeper/keeper.go +24 -27
  40. package/x/swingset/keeper/swing_store_exports_handler.go +14 -3
  41. package/x/swingset/keeper/test_utils.go +16 -0
  42. package/x/swingset/module.go +24 -9
  43. package/x/swingset/testing/queue.go +17 -0
  44. package/x/swingset/types/default-params.go +31 -5
  45. package/x/swingset/types/expected_keepers.go +2 -2
  46. package/x/swingset/types/genesis.pb.go +78 -25
  47. package/x/swingset/types/msgs.go +53 -12
  48. package/x/swingset/types/params.go +53 -43
  49. package/x/swingset/types/params_test.go +75 -9
  50. package/x/swingset/types/swingset.pb.go +387 -57
  51. package/x/vbank/README.md +6 -1
  52. package/x/vbank/genesis.go +0 -2
  53. package/x/vbank/keeper/keeper.go +4 -9
  54. package/x/vbank/keeper/migrations.go +30 -0
  55. package/x/vbank/module.go +8 -7
  56. package/x/vbank/types/key.go +3 -3
  57. package/x/vbank/types/msgs.go +0 -12
  58. package/x/vbank/types/params.go +43 -2
  59. package/x/vbank/types/vbank.pb.go +105 -36
  60. package/x/vbank/vbank.go +8 -13
  61. package/x/vbank/vbank_test.go +14 -9
  62. package/x/vibc/alias.go +1 -1
  63. package/x/vibc/module.go +2 -7
  64. package/x/vibc/types/ibc_module.go +9 -3
  65. package/x/vibc/types/receiver.go +17 -7
  66. package/x/vlocalchain/handler.go +2 -1
  67. package/x/vlocalchain/keeper/keeper.go +24 -8
  68. package/x/vlocalchain/keeper/keeper_test.go +65 -1
  69. package/x/vlocalchain/types/expected_keepers.go +12 -0
  70. package/x/vlocalchain/vlocalchain.go +27 -22
  71. package/x/vlocalchain/vlocalchain_test.go +163 -8
  72. package/x/vstorage/keeper/grpc_query.go +0 -1
  73. package/x/vstorage/keeper/keeper.go +9 -17
  74. package/x/vstorage/module.go +0 -5
  75. package/x/vstorage/testing/queue.go +28 -0
  76. package/x/vtransfer/alias.go +13 -0
  77. package/x/vtransfer/genesis.go +39 -0
  78. package/x/vtransfer/genesis_test.go +12 -0
  79. package/x/vtransfer/handler.go +20 -0
  80. package/x/vtransfer/ibc_middleware.go +186 -0
  81. package/x/vtransfer/ibc_middleware_test.go +449 -0
  82. package/x/vtransfer/keeper/keeper.go +282 -0
  83. package/x/vtransfer/module.go +124 -0
  84. package/x/vtransfer/types/baseaddr.go +156 -0
  85. package/x/vtransfer/types/baseaddr_test.go +167 -0
  86. package/x/vtransfer/types/expected_keepers.go +38 -0
  87. package/x/vtransfer/types/genesis.pb.go +328 -0
  88. package/x/vtransfer/types/key.go +9 -0
  89. package/x/vtransfer/types/msgs.go +9 -0
  90. package/ante/fee.go +0 -97
package/app/upgrade.go ADDED
@@ -0,0 +1,248 @@
1
+ package gaia
2
+
3
+ import (
4
+ "encoding/json"
5
+ "fmt"
6
+ "strings"
7
+ "text/template"
8
+
9
+ "github.com/Agoric/agoric-sdk/golang/cosmos/vm"
10
+ swingsetkeeper "github.com/Agoric/agoric-sdk/golang/cosmos/x/swingset/keeper"
11
+ sdk "github.com/cosmos/cosmos-sdk/types"
12
+ "github.com/cosmos/cosmos-sdk/types/module"
13
+ upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
14
+ )
15
+
16
+ var upgradeNamesOfThisVersion = []string{
17
+ "UNRELEASED_BASIC", // no-frills
18
+ "UNRELEASED_A3P_INTEGRATION",
19
+ "UNRELEASED_main",
20
+ "UNRELEASED_devnet",
21
+ "UNRELEASED_emerynet",
22
+ "UNRELEASED_REAPPLY",
23
+ }
24
+
25
+ // isUpgradeNameOfThisVersion returns whether the provided plan name is a
26
+ // known upgrade name of this software version
27
+ func isUpgradeNameOfThisVersion(name string) bool {
28
+ for _, upgradeName := range upgradeNamesOfThisVersion {
29
+ if upgradeName == name {
30
+ return true
31
+ }
32
+ }
33
+ return false
34
+ }
35
+
36
+ // validUpgradeName is an identity function that asserts the provided name
37
+ // is an upgrade name of this software version. It can be used as a sort of
38
+ // dynamic enum check.
39
+ func validUpgradeName(name string) string {
40
+ if !isUpgradeNameOfThisVersion(name) {
41
+ panic(fmt.Errorf("invalid upgrade name: %s", name))
42
+ }
43
+ return name
44
+ }
45
+
46
+ // isPrimaryUpgradeName returns wether the provided plan name is considered a
47
+ // primary for the purpose of applying store migrations for the first upgrade
48
+ // of this version.
49
+ // It is expected that only primary plan names are used for non testing chains.
50
+ func isPrimaryUpgradeName(name string) bool {
51
+ if name == "" {
52
+ // An empty upgrade name can happen if there are no upgrade in progress
53
+ return false
54
+ }
55
+ switch name {
56
+ case validUpgradeName("UNRELEASED_BASIC"),
57
+ validUpgradeName("UNRELEASED_A3P_INTEGRATION"),
58
+ validUpgradeName("UNRELEASED_main"),
59
+ validUpgradeName("UNRELEASED_devnet"),
60
+ validUpgradeName("UNRELEASED_emerynet"):
61
+ return true
62
+ case validUpgradeName("UNRELEASED_REAPPLY"):
63
+ return false
64
+ default:
65
+ panic(fmt.Errorf("unexpected upgrade name %s", validUpgradeName(name)))
66
+ }
67
+ }
68
+
69
+ // isFirstTimeUpgradeOfThisVersion looks up in the upgrade store whether no
70
+ // upgrade plan name of this version have previously been applied.
71
+ func isFirstTimeUpgradeOfThisVersion(app *GaiaApp, ctx sdk.Context) bool {
72
+ for _, name := range upgradeNamesOfThisVersion {
73
+ if app.UpgradeKeeper.GetDoneHeight(ctx, name) != 0 {
74
+ return false
75
+ }
76
+ }
77
+ return true
78
+ }
79
+
80
+ func buildProposalStepWithArgs(moduleName string, entrypoint string, opts map[string]any) (vm.CoreProposalStep, error) {
81
+ t := template.Must(template.New("").Parse(`{
82
+ "module": "{{.moduleName}}",
83
+ "entrypoint": "{{.entrypoint}}",
84
+ "args": [ {{.optsArg}} ]
85
+ }`))
86
+
87
+ optsArg, err := json.Marshal(opts)
88
+ if err != nil {
89
+ return nil, err
90
+ }
91
+
92
+ var result strings.Builder
93
+ err = t.Execute(&result, map[string]any{
94
+ "moduleName": moduleName,
95
+ "entrypoint": entrypoint,
96
+ "optsArg": string(optsArg),
97
+ })
98
+ if err != nil {
99
+ return nil, err
100
+ }
101
+ jsonStr := result.String()
102
+ jsonBz := []byte(jsonStr)
103
+ if !json.Valid(jsonBz) {
104
+ return nil, fmt.Errorf("invalid JSON: %s", jsonStr)
105
+ }
106
+ proposal := vm.ArbitraryCoreProposal{Json: jsonBz}
107
+ return vm.CoreProposalStepForModules(proposal), nil
108
+ }
109
+
110
+ func getVariantFromUpgradeName(upgradeName string) string {
111
+ switch upgradeName {
112
+ case "UNRELEASED_A3P_INTEGRATION":
113
+ return "A3P_INTEGRATION"
114
+ case "UNRELEASED_main":
115
+ return "MAINNET"
116
+ case "UNRELEASED_devnet":
117
+ return "DEVNET"
118
+ case "UNRELEASED_emerynet":
119
+ return "EMERYNET"
120
+ // Noupgrade for this version.
121
+ case "UNRELEASED_BASIC":
122
+ return ""
123
+ default:
124
+ return ""
125
+ }
126
+ }
127
+
128
+ func replaceElectorateCoreProposalStep(upgradeName string) (vm.CoreProposalStep, error) {
129
+ variant := getVariantFromUpgradeName(upgradeName)
130
+
131
+ if variant == "" {
132
+ return nil, nil
133
+ }
134
+
135
+ return buildProposalStepWithArgs(
136
+ "@agoric/builders/scripts/inter-protocol/replace-electorate-core.js",
137
+ "defaultProposalBuilder",
138
+ map[string]any{
139
+ "variant": variant,
140
+ },
141
+ )
142
+ }
143
+
144
+ func replacePriceFeedsCoreProposal(upgradeName string) (vm.CoreProposalStep, error) {
145
+ variant := getVariantFromUpgradeName(upgradeName)
146
+
147
+ if variant == "" {
148
+ return nil, nil
149
+ }
150
+
151
+ return buildProposalStepWithArgs(
152
+ "@agoric/builders/scripts/inter-protocol/updatePriceFeeds.js",
153
+ "defaultProposalBuilder",
154
+ map[string]any{
155
+ "variant": variant,
156
+ },
157
+ )
158
+ }
159
+
160
+ // unreleasedUpgradeHandler performs standard upgrade actions plus custom actions for the unreleased upgrade.
161
+ func unreleasedUpgradeHandler(app *GaiaApp, targetUpgrade string) func(sdk.Context, upgradetypes.Plan, module.VersionMap) (module.VersionMap, error) {
162
+ return func(ctx sdk.Context, plan upgradetypes.Plan, fromVm module.VersionMap) (module.VersionMap, error) {
163
+ app.CheckControllerInited(false)
164
+
165
+ CoreProposalSteps := []vm.CoreProposalStep{}
166
+
167
+ // These CoreProposalSteps are not idempotent and should only be executed
168
+ // as part of the first upgrade using this handler on any given chain.
169
+ if isFirstTimeUpgradeOfThisVersion(app, ctx) {
170
+ // The storeUpgrades defined in app.go only execute for the primary upgrade name
171
+ // If we got here and this first upgrade of this version does not use the
172
+ // primary upgrade name, stores have not been initialized correctly.
173
+ if !isPrimaryUpgradeName(plan.Name) {
174
+ return module.VersionMap{}, fmt.Errorf("cannot run %s as first upgrade", plan.Name)
175
+ }
176
+
177
+ replaceElectorateStep, err := replaceElectorateCoreProposalStep(targetUpgrade)
178
+ if err != nil {
179
+ return nil, err
180
+ } else if replaceElectorateStep != nil {
181
+ CoreProposalSteps = append(CoreProposalSteps, replaceElectorateStep)
182
+ }
183
+
184
+ priceFeedUpdate, err := replacePriceFeedsCoreProposal(targetUpgrade)
185
+ if err != nil {
186
+ return nil, err
187
+ } else if priceFeedUpdate != nil {
188
+ CoreProposalSteps = append(CoreProposalSteps,
189
+ priceFeedUpdate,
190
+ // The following have a dependency onto the price feed proposal
191
+ vm.CoreProposalStepForModules(
192
+ "@agoric/builders/scripts/vats/add-auction.js",
193
+ ),
194
+ vm.CoreProposalStepForModules(
195
+ "@agoric/builders/scripts/vats/upgradeVaults.js",
196
+ ),
197
+ )
198
+ }
199
+
200
+ // Each CoreProposalStep runs sequentially, and can be constructed from
201
+ // one or more modules executing in parallel within the step.
202
+ CoreProposalSteps = append(CoreProposalSteps,
203
+ vm.CoreProposalStepForModules(
204
+ // Upgrade Zoe (no new ZCF needed).
205
+ "@agoric/builders/scripts/vats/upgrade-zoe.js",
206
+ ),
207
+ // Revive KREAd characters
208
+ vm.CoreProposalStepForModules(
209
+ "@agoric/builders/scripts/vats/revive-kread.js",
210
+ ),
211
+ vm.CoreProposalStepForModules(
212
+ // Upgrade to include a cleanup from https://github.com/Agoric/agoric-sdk/pull/10319
213
+ "@agoric/builders/scripts/smart-wallet/build-wallet-factory2-upgrade.js",
214
+ ),
215
+ )
216
+
217
+ // CoreProposals for Upgrade 19
218
+ CoreProposalSteps = append(CoreProposalSteps,
219
+ vm.CoreProposalStepForModules(
220
+ "@agoric/builders/scripts/inter-protocol/replace-feeDistributor.js",
221
+ ),
222
+ )
223
+ }
224
+
225
+ app.upgradeDetails = &upgradeDetails{
226
+ // Record the plan to send to SwingSet
227
+ Plan: plan,
228
+ // Core proposals that should run during the upgrade block
229
+ // These will be merged with any coreProposals specified in the
230
+ // upgradeInfo field of the upgrade plan ran as subsequent steps
231
+ CoreProposals: vm.CoreProposalsFromSteps(CoreProposalSteps...),
232
+ }
233
+
234
+ // Always run module migrations
235
+ mvm, err := app.mm.RunMigrations(ctx, app.configurator, fromVm)
236
+ if err != nil {
237
+ return mvm, err
238
+ }
239
+
240
+ m := swingsetkeeper.NewMigrator(app.SwingSetKeeper)
241
+ err = m.MigrateParams(ctx)
242
+ if err != nil {
243
+ return mvm, err
244
+ }
245
+
246
+ return mvm, nil
247
+ }
248
+ }
package/cmd/agd/agvm.go CHANGED
@@ -27,9 +27,9 @@ func NewVMCommand(logger log.Logger, binary string, args []string, vmFromAgd, vm
27
27
  fdToAgd := fdFromAgd + 1
28
28
 
29
29
  // ExtraFiles begins at fd numStdFiles, so we need to compute the array.
30
- cmd.ExtraFiles = make([]*os.File, fdToAgd - numStdFiles + 1)
31
- cmd.ExtraFiles[fdFromAgd - numStdFiles] = vmFromAgd
32
- cmd.ExtraFiles[fdToAgd - numStdFiles] = vmToAgd
30
+ cmd.ExtraFiles = make([]*os.File, fdToAgd-numStdFiles+1)
31
+ cmd.ExtraFiles[fdFromAgd-numStdFiles] = vmFromAgd
32
+ cmd.ExtraFiles[fdToAgd-numStdFiles] = vmToAgd
33
33
 
34
34
  // Pass the file descriptor numbers in the environment.
35
35
  cmd.Env = append(
@@ -8,7 +8,7 @@ import (
8
8
 
9
9
  // FindBinaryNextToMe looks for binName next to the current executable.
10
10
  // It returns an absolute filename for binName, or an error.
11
- func FindBinaryNextToMe(walkUp int, path... string) (string, error) {
11
+ func FindBinaryNextToMe(walkUp int, path ...string) (string, error) {
12
12
  ex, err := os.Executable()
13
13
  if err != nil {
14
14
  return "", err
@@ -32,7 +32,7 @@ func FindBinaryNextToMe(walkUp int, path... string) (string, error) {
32
32
  if _, err = os.Stat(bin); err != nil {
33
33
  return "", err
34
34
  }
35
-
35
+
36
36
  return bin, nil
37
37
  }
38
38
 
package/cmd/agd/main.go CHANGED
@@ -49,7 +49,6 @@ func makeShutdown(cmd *exec.Cmd, writer *os.File) func() error {
49
49
  }
50
50
  }
51
51
 
52
-
53
52
  // main is the entry point of the agd daemon. It determines whether to
54
53
  // initialize JSON-RPC communications with the separate `--split-vm` VM process,
55
54
  // or just to give up control entirely to another binary.
@@ -58,12 +57,12 @@ func main() {
58
57
  var shutdown func() error
59
58
 
60
59
  nodePort := 1
61
- sendToNode := func(ctx context.Context, needReply bool, str string) (string, error) {
60
+ var sendToNode vm.Sender = func(ctx context.Context, needReply bool, jsonRequest string) (jsonReply string, err error) {
62
61
  if vmClient == nil {
63
62
  return "", errors.New("sendToVM called without VM client set up")
64
63
  }
65
64
 
66
- if str == "shutdown" {
65
+ if jsonRequest == "shutdown" {
67
66
  // We could ask nicely, but don't bother.
68
67
  if shutdown != nil {
69
68
  return "", shutdown()
@@ -72,17 +71,17 @@ func main() {
72
71
  }
73
72
 
74
73
  msg := vm.Message{
75
- Port: nodePort,
74
+ Port: nodePort,
76
75
  NeedsReply: needReply,
77
- Data: str,
76
+ Data: jsonRequest,
78
77
  }
79
78
  var reply string
80
- err := vmClient.Call(vm.ReceiveMessageMethod, msg, &reply)
79
+ err = vmClient.Call(vm.ReceiveMessageMethod, msg, &reply)
81
80
  return reply, err
82
81
  }
83
82
 
84
83
  exitCode := 0
85
- launchVM := func(logger log.Logger, appOpts servertypes.AppOptions) error {
84
+ launchVM := func(agdServer *vm.AgdServer, logger log.Logger, appOpts servertypes.AppOptions) error {
86
85
  args := []string{"ag-chain-cosmos", "--home", gaia.DefaultNodeHome}
87
86
  args = append(args, os.Args[1:]...)
88
87
 
@@ -129,7 +128,7 @@ func main() {
129
128
 
130
129
  // Set up the VM server.
131
130
  vmServer := rpc.NewServer()
132
- if err := vmServer.RegisterName("agd", vm.NewAgdServer()); err != nil {
131
+ if err := vmServer.RegisterName("agd", agdServer); err != nil {
133
132
  return err
134
133
  }
135
134
  go vmServer.ServeCodec(jsonrpc.NewServerCodec(serverConn))
@@ -147,11 +146,11 @@ func main() {
147
146
  }
148
147
 
149
148
  daemoncmd.OnExportHook = launchVM
150
- daemoncmd.OnStartHook = func (logger log.Logger, appOpts servertypes.AppOptions) error {
149
+ daemoncmd.OnStartHook = func(agdServer *vm.AgdServer, logger log.Logger, appOpts servertypes.AppOptions) error {
151
150
  // We tried running start, which should never exit, so exit with non-zero
152
151
  // code if we do.
153
152
  exitCode = 99
154
- return launchVM(logger, appOpts)
153
+ return launchVM(agdServer, logger, appOpts)
155
154
  }
156
155
 
157
156
  daemon.RunWithController(sendToNode)
@@ -37,22 +37,22 @@ var agdServer *vm.AgdServer
37
37
 
38
38
  // ConnectVMClientCodec creates an RPC client codec and a sender to the
39
39
  // in-process implementation of the VM.
40
- func ConnectVMClientCodec(ctx context.Context, nodePort int, sendFunc func(int, int, string)) (*vm.ClientCodec, daemoncmd.Sender) {
41
- vmClientCodec = vm.NewClientCodec(context.Background(), sendFunc)
40
+ func ConnectVMClientCodec(ctx context.Context, nodePort int, sendFunc func(int, int, string)) (*vm.ClientCodec, vm.Sender) {
41
+ vmClientCodec = vm.NewClientCodec(ctx, sendFunc)
42
42
  vmClient := rpc.NewClientWithCodec(vmClientCodec)
43
43
 
44
- sendToNode := func(ctx context.Context, needReply bool, str string) (string, error) {
45
- if str == "shutdown" {
44
+ var sendToNode vm.Sender = func(ctx context.Context, needReply bool, jsonRequest string) (jsonReply string, err error) {
45
+ if jsonRequest == "shutdown" {
46
46
  return "", vmClientCodec.Close()
47
47
  }
48
48
 
49
49
  msg := vm.Message{
50
- Port: nodePort,
50
+ Port: nodePort,
51
51
  NeedsReply: needReply,
52
- Data: str,
52
+ Data: jsonRequest,
53
53
  }
54
54
  var reply string
55
- err := vmClient.Call(vm.ReceiveMessageMethod, msg, &reply)
55
+ err = vmClient.Call(vm.ReceiveMessageMethod, msg, &reply)
56
56
  return reply, err
57
57
  }
58
58
 
@@ -72,7 +72,7 @@ func RunAgCosmosDaemon(nodePort C.int, toNode C.sendFunc, cosmosArgs []*C.char)
72
72
  panic(err)
73
73
  }
74
74
 
75
- var sendToNode daemoncmd.Sender
75
+ var sendToNode vm.Sender
76
76
 
77
77
  sendFunc := func(port int, reply int, str string) {
78
78
  C.invokeSendFunc(toNode, C.int(port), C.int(reply), C.CString(str))
@@ -83,7 +83,6 @@ func RunAgCosmosDaemon(nodePort C.int, toNode C.sendFunc, cosmosArgs []*C.char)
83
83
  int(nodePort),
84
84
  sendFunc,
85
85
  )
86
- agdServer = vm.NewAgdServer()
87
86
 
88
87
  args := make([]string, len(cosmosArgs))
89
88
  for i, s := range cosmosArgs {
@@ -96,7 +95,8 @@ func RunAgCosmosDaemon(nodePort C.int, toNode C.sendFunc, cosmosArgs []*C.char)
96
95
  // We run in the background, but exit when the job is over.
97
96
  // swingset.SendToNode("hello from Initial Go!")
98
97
  exitCode := 0
99
- daemoncmd.OnStartHook = func(logger log.Logger, appOpts servertypes.AppOptions) error {
98
+ daemoncmd.OnStartHook = func(srv *vm.AgdServer, logger log.Logger, appOpts servertypes.AppOptions) error {
99
+ agdServer = srv
100
100
  // We tried running start, which should never exit, so exit with non-zero
101
101
  // code if we ever stop.
102
102
  exitCode = 99
@@ -130,11 +130,11 @@ func SendToGo(port C.int, msg C.Body) C.Body {
130
130
  // fmt.Fprintln(os.Stderr, "Send to Go", msgStr)
131
131
  var respStr string
132
132
  message := &vm.Message{
133
- Port: int(port),
133
+ Port: int(port),
134
134
  NeedsReply: true,
135
- Data: msgStr,
135
+ Data: msgStr,
136
136
  }
137
-
137
+
138
138
  err := agdServer.ReceiveMessage(message, &respStr)
139
139
  if err == nil {
140
140
  return C.CString(respStr)