@agoric/cosmos 0.35.0-upgrade-14-dev-c8f9e7b.0 → 0.35.0-upgrade-16a-dev-fb592e4.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 (133) hide show
  1. package/CHANGELOG.md +121 -77
  2. package/MAINTAINERS.md +3 -0
  3. package/Makefile +36 -26
  4. package/ante/ante.go +7 -9
  5. package/ante/inbound_test.go +3 -2
  6. package/ante/vm_admission.go +2 -1
  7. package/app/app.go +212 -140
  8. package/app/upgrade.go +76 -0
  9. package/cmd/agd/agvm.go +42 -0
  10. package/cmd/agd/main.go +130 -11
  11. package/cmd/libdaemon/main.go +64 -53
  12. package/cmd/libdaemon/main_test.go +2 -1
  13. package/daemon/cmd/root.go +171 -74
  14. package/daemon/cmd/root_test.go +189 -1
  15. package/daemon/main.go +4 -2
  16. package/e2e_test/Makefile +29 -0
  17. package/e2e_test/README.md +100 -0
  18. package/e2e_test/go.mod +217 -0
  19. package/e2e_test/go.sum +1323 -0
  20. package/e2e_test/ibc_conformance_test.go +56 -0
  21. package/e2e_test/pfm_test.go +613 -0
  22. package/e2e_test/util.go +271 -0
  23. package/git-revision.txt +1 -1
  24. package/go.mod +22 -11
  25. package/go.sum +17 -13
  26. package/package.json +9 -5
  27. package/proto/agoric/swingset/genesis.proto +4 -0
  28. package/proto/agoric/swingset/swingset.proto +1 -1
  29. package/proto/agoric/vlocalchain/.clang-format +7 -0
  30. package/proto/agoric/vlocalchain/vlocalchain.proto +31 -0
  31. package/proto/agoric/vtransfer/genesis.proto +18 -0
  32. package/scripts/protocgen.sh +7 -8
  33. package/types/kv_entry_helpers.go +42 -0
  34. package/upgradegaia.sh +8 -8
  35. package/vm/action.go +5 -4
  36. package/vm/action_test.go +31 -11
  37. package/vm/client.go +113 -0
  38. package/vm/client_test.go +182 -0
  39. package/vm/controller.go +17 -40
  40. package/vm/core_proposals.go +22 -2
  41. package/vm/jsonrpcconn/jsonrpcconn.go +160 -0
  42. package/vm/jsonrpcconn/jsonrpcconn_test.go +126 -0
  43. package/vm/proto_json.go +38 -0
  44. package/vm/proto_json_test.go +103 -0
  45. package/vm/server.go +124 -0
  46. package/x/swingset/abci.go +10 -10
  47. package/x/swingset/alias.go +2 -0
  48. package/x/swingset/client/cli/tx.go +4 -0
  49. package/x/swingset/genesis.go +84 -24
  50. package/x/swingset/handler.go +2 -1
  51. package/x/swingset/keeper/extension_snapshotter.go +2 -2
  52. package/x/swingset/keeper/keeper.go +13 -25
  53. package/x/swingset/keeper/msg_server.go +18 -18
  54. package/x/swingset/keeper/proposal.go +3 -3
  55. package/x/swingset/keeper/querier.go +12 -11
  56. package/x/swingset/keeper/swing_store_exports_handler.go +21 -6
  57. package/x/swingset/keeper/test_utils.go +16 -0
  58. package/x/swingset/module.go +7 -7
  59. package/x/swingset/proposal_handler.go +2 -1
  60. package/x/swingset/testing/queue.go +17 -0
  61. package/x/swingset/types/default-params.go +1 -1
  62. package/x/swingset/types/expected_keepers.go +3 -2
  63. package/x/swingset/types/genesis.pb.go +78 -25
  64. package/x/swingset/types/msgs.go +44 -24
  65. package/x/swingset/types/params.go +2 -1
  66. package/x/swingset/types/proposal.go +5 -4
  67. package/x/swingset/types/swingset.pb.go +1 -1
  68. package/x/vbank/genesis.go +0 -2
  69. package/x/vbank/handler.go +2 -1
  70. package/x/vbank/keeper/querier.go +4 -3
  71. package/x/vbank/module.go +0 -5
  72. package/x/vbank/types/msgs.go +0 -12
  73. package/x/vbank/vbank.go +9 -9
  74. package/x/vbank/vbank_test.go +2 -2
  75. package/x/vibc/alias.go +3 -0
  76. package/x/vibc/handler.go +16 -9
  77. package/x/vibc/keeper/keeper.go +102 -65
  78. package/x/vibc/keeper/triggers.go +101 -0
  79. package/x/vibc/module.go +5 -8
  80. package/x/vibc/types/expected_keepers.go +13 -0
  81. package/x/vibc/types/ibc_module.go +336 -0
  82. package/x/vibc/types/receiver.go +170 -0
  83. package/x/vlocalchain/alias.go +19 -0
  84. package/x/vlocalchain/handler.go +21 -0
  85. package/x/vlocalchain/keeper/keeper.go +279 -0
  86. package/x/vlocalchain/keeper/keeper_test.go +97 -0
  87. package/x/vlocalchain/types/codec.go +34 -0
  88. package/x/vlocalchain/types/key.go +27 -0
  89. package/x/vlocalchain/types/msgs.go +16 -0
  90. package/x/vlocalchain/types/vlocalchain.pb.go +1072 -0
  91. package/x/vlocalchain/vlocalchain.go +114 -0
  92. package/x/vlocalchain/vlocalchain_test.go +434 -0
  93. package/x/vstorage/handler.go +2 -1
  94. package/x/vstorage/keeper/grpc_query.go +0 -1
  95. package/x/vstorage/keeper/keeper.go +13 -20
  96. package/x/vstorage/keeper/querier.go +6 -5
  97. package/x/vstorage/keeper/querier_test.go +4 -3
  98. package/x/vstorage/module.go +0 -5
  99. package/x/vstorage/testing/queue.go +27 -0
  100. package/x/vtransfer/alias.go +13 -0
  101. package/x/vtransfer/genesis.go +39 -0
  102. package/x/vtransfer/genesis_test.go +12 -0
  103. package/x/vtransfer/handler.go +20 -0
  104. package/x/vtransfer/ibc_middleware.go +186 -0
  105. package/x/vtransfer/ibc_middleware_test.go +448 -0
  106. package/x/vtransfer/keeper/keeper.go +281 -0
  107. package/x/vtransfer/module.go +124 -0
  108. package/x/vtransfer/types/expected_keepers.go +38 -0
  109. package/x/vtransfer/types/genesis.pb.go +327 -0
  110. package/x/vtransfer/types/key.go +9 -0
  111. package/x/vtransfer/types/msgs.go +9 -0
  112. package/ante/fee.go +0 -96
  113. package/proto/agoric/lien/genesis.proto +0 -25
  114. package/proto/agoric/lien/lien.proto +0 -25
  115. package/x/lien/alias.go +0 -17
  116. package/x/lien/genesis.go +0 -58
  117. package/x/lien/genesis_test.go +0 -101
  118. package/x/lien/keeper/account.go +0 -290
  119. package/x/lien/keeper/keeper.go +0 -255
  120. package/x/lien/keeper/keeper_test.go +0 -623
  121. package/x/lien/lien.go +0 -205
  122. package/x/lien/lien_test.go +0 -533
  123. package/x/lien/module.go +0 -115
  124. package/x/lien/spec/01_concepts.md +0 -146
  125. package/x/lien/spec/02_messages.md +0 -96
  126. package/x/lien/types/accountkeeper.go +0 -81
  127. package/x/lien/types/accountstate.go +0 -27
  128. package/x/lien/types/expected_keepers.go +0 -18
  129. package/x/lien/types/genesis.pb.go +0 -567
  130. package/x/lien/types/key.go +0 -25
  131. package/x/lien/types/lien.pb.go +0 -403
  132. package/x/vibc/ibc.go +0 -394
  133. /package/{src/index.cjs → index.cjs} +0 -0
package/app/app.go CHANGED
@@ -12,6 +12,7 @@ import (
12
12
  "runtime/debug"
13
13
  "time"
14
14
 
15
+ sdkioerrors "cosmossdk.io/errors"
15
16
  "github.com/cosmos/cosmos-sdk/baseapp"
16
17
  "github.com/cosmos/cosmos-sdk/client"
17
18
  nodeservice "github.com/cosmos/cosmos-sdk/client/grpc/node"
@@ -24,7 +25,6 @@ import (
24
25
  "github.com/cosmos/cosmos-sdk/simapp"
25
26
  storetypes "github.com/cosmos/cosmos-sdk/store/types"
26
27
  sdk "github.com/cosmos/cosmos-sdk/types"
27
- "github.com/cosmos/cosmos-sdk/types/errors"
28
28
  "github.com/cosmos/cosmos-sdk/types/module"
29
29
  "github.com/cosmos/cosmos-sdk/version"
30
30
  "github.com/cosmos/cosmos-sdk/x/auth"
@@ -44,7 +44,6 @@ import (
44
44
  "github.com/cosmos/cosmos-sdk/x/capability"
45
45
  capabilitykeeper "github.com/cosmos/cosmos-sdk/x/capability/keeper"
46
46
  capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types"
47
- crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types"
48
47
  distr "github.com/cosmos/cosmos-sdk/x/distribution"
49
48
  distrclient "github.com/cosmos/cosmos-sdk/x/distribution/client"
50
49
  distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper"
@@ -87,14 +86,14 @@ import (
87
86
  icahostkeeper "github.com/cosmos/ibc-go/v6/modules/apps/27-interchain-accounts/host/keeper"
88
87
  icahosttypes "github.com/cosmos/ibc-go/v6/modules/apps/27-interchain-accounts/host/types"
89
88
  icatypes "github.com/cosmos/ibc-go/v6/modules/apps/27-interchain-accounts/types"
90
- "github.com/cosmos/ibc-go/v6/modules/apps/transfer"
89
+ ibctransfer "github.com/cosmos/ibc-go/v6/modules/apps/transfer"
91
90
  ibctransferkeeper "github.com/cosmos/ibc-go/v6/modules/apps/transfer/keeper"
92
91
  ibctransfertypes "github.com/cosmos/ibc-go/v6/modules/apps/transfer/types"
93
92
  ibc "github.com/cosmos/ibc-go/v6/modules/core"
94
93
  ibcclient "github.com/cosmos/ibc-go/v6/modules/core/02-client"
95
94
  ibcclientclient "github.com/cosmos/ibc-go/v6/modules/core/02-client/client"
96
95
  ibcclienttypes "github.com/cosmos/ibc-go/v6/modules/core/02-client/types"
97
- porttypes "github.com/cosmos/ibc-go/v6/modules/core/05-port/types"
96
+ ibcporttypes "github.com/cosmos/ibc-go/v6/modules/core/05-port/types"
98
97
  ibchost "github.com/cosmos/ibc-go/v6/modules/core/24-host"
99
98
  ibckeeper "github.com/cosmos/ibc-go/v6/modules/core/keeper"
100
99
  "github.com/gorilla/mux"
@@ -111,8 +110,9 @@ import (
111
110
 
112
111
  appante "github.com/Agoric/agoric-sdk/golang/cosmos/ante"
113
112
  agorictypes "github.com/Agoric/agoric-sdk/golang/cosmos/types"
113
+
114
+ // conv "github.com/Agoric/agoric-sdk/golang/cosmos/types/conv"
114
115
  "github.com/Agoric/agoric-sdk/golang/cosmos/vm"
115
- "github.com/Agoric/agoric-sdk/golang/cosmos/x/lien"
116
116
  "github.com/Agoric/agoric-sdk/golang/cosmos/x/swingset"
117
117
  swingsetclient "github.com/Agoric/agoric-sdk/golang/cosmos/x/swingset/client"
118
118
  swingsetkeeper "github.com/Agoric/agoric-sdk/golang/cosmos/x/swingset/keeper"
@@ -120,7 +120,16 @@ import (
120
120
  "github.com/Agoric/agoric-sdk/golang/cosmos/x/vbank"
121
121
  vbanktypes "github.com/Agoric/agoric-sdk/golang/cosmos/x/vbank/types"
122
122
  "github.com/Agoric/agoric-sdk/golang/cosmos/x/vibc"
123
+ "github.com/Agoric/agoric-sdk/golang/cosmos/x/vlocalchain"
123
124
  "github.com/Agoric/agoric-sdk/golang/cosmos/x/vstorage"
125
+ "github.com/Agoric/agoric-sdk/golang/cosmos/x/vtransfer"
126
+ vtransferkeeper "github.com/Agoric/agoric-sdk/golang/cosmos/x/vtransfer/keeper"
127
+ testtypes "github.com/cosmos/ibc-go/v6/testing/types"
128
+
129
+ // Import the packet forward middleware
130
+ packetforward "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v6/packetforward"
131
+ packetforwardkeeper "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v6/packetforward/keeper"
132
+ packetforwardtypes "github.com/cosmos/ibc-apps/middleware/packet-forward-middleware/v6/packetforward/types"
124
133
 
125
134
  // unnamed import of statik for swagger UI support
126
135
  _ "github.com/cosmos/cosmos-sdk/client/docs/statik"
@@ -167,14 +176,15 @@ var (
167
176
  ibc.AppModuleBasic{},
168
177
  upgrade.AppModuleBasic{},
169
178
  evidence.AppModuleBasic{},
170
- transfer.AppModuleBasic{},
179
+ ibctransfer.AppModuleBasic{},
171
180
  vesting.AppModuleBasic{},
172
181
  ica.AppModuleBasic{},
182
+ packetforward.AppModuleBasic{},
173
183
  swingset.AppModuleBasic{},
174
184
  vstorage.AppModuleBasic{},
175
185
  vibc.AppModuleBasic{},
176
186
  vbank.AppModuleBasic{},
177
- lien.AppModuleBasic{},
187
+ vtransfer.AppModuleBasic{},
178
188
  )
179
189
 
180
190
  // module account permissions
@@ -210,11 +220,12 @@ type GaiaApp struct { // nolint: golint
210
220
 
211
221
  controllerInited bool
212
222
  bootstrapNeeded bool
213
- lienPort int
214
223
  swingsetPort int
215
224
  vbankPort int
216
225
  vibcPort int
217
226
  vstoragePort int
227
+ vlocalchainPort int
228
+ vtransferPort int
218
229
 
219
230
  upgradeDetails *upgradeDetails
220
231
 
@@ -225,6 +236,9 @@ type GaiaApp struct { // nolint: golint
225
236
  tkeys map[string]*storetypes.TransientStoreKey
226
237
  memKeys map[string]*storetypes.MemoryStoreKey
227
238
 
239
+ // manage communication from the VM to the ABCI app
240
+ AgdServer *vm.AgdServer
241
+
228
242
  // keepers
229
243
  AccountKeeper authkeeper.AccountKeeper
230
244
  BankKeeper bankkeeper.Keeper
@@ -237,12 +251,13 @@ type GaiaApp struct { // nolint: golint
237
251
  UpgradeKeeper upgradekeeper.Keeper
238
252
  ParamsKeeper paramskeeper.Keeper
239
253
  // IBC Keeper must be a pointer in the app, so we can SetRouter on it correctly
240
- IBCKeeper *ibckeeper.Keeper
241
- ICAHostKeeper icahostkeeper.Keeper
242
- EvidenceKeeper evidencekeeper.Keeper
243
- TransferKeeper ibctransferkeeper.Keeper
244
- FeeGrantKeeper feegrantkeeper.Keeper
245
- AuthzKeeper authzkeeper.Keeper
254
+ IBCKeeper *ibckeeper.Keeper
255
+ ICAHostKeeper icahostkeeper.Keeper
256
+ PacketForwardKeeper *packetforwardkeeper.Keeper
257
+ EvidenceKeeper evidencekeeper.Keeper
258
+ TransferKeeper ibctransferkeeper.Keeper
259
+ FeeGrantKeeper feegrantkeeper.Keeper
260
+ AuthzKeeper authzkeeper.Keeper
246
261
 
247
262
  SwingStoreExportsHandler swingset.SwingStoreExportsHandler
248
263
  SwingSetSnapshotter swingset.ExtensionSnapshotter
@@ -250,7 +265,8 @@ type GaiaApp struct { // nolint: golint
250
265
  VstorageKeeper vstorage.Keeper
251
266
  VibcKeeper vibc.Keeper
252
267
  VbankKeeper vbank.Keeper
253
- LienKeeper lien.Keeper
268
+ VlocalchainKeeper vlocalchain.Keeper
269
+ VtransferKeeper vtransferkeeper.Keeper
254
270
 
255
271
  // make scoped keepers public for test purposes
256
272
  ScopedIBCKeeper capabilitykeeper.ScopedKeeper
@@ -287,19 +303,18 @@ func NewGaiaApp(
287
303
  appOpts servertypes.AppOptions,
288
304
  baseAppOptions ...func(*baseapp.BaseApp),
289
305
  ) *GaiaApp {
290
- defaultController := func(ctx context.Context, needReply bool, str string) (string, error) {
291
- fmt.Fprintln(os.Stderr, "FIXME: Would upcall to controller with", str)
292
- return "", nil
306
+ var defaultController vm.Sender = func(ctx context.Context, needReply bool, jsonRequest string) (jsonReply string, err error) {
307
+ return "", fmt.Errorf("unexpected VM upcall with no controller: %s", jsonRequest)
293
308
  }
294
309
  return NewAgoricApp(
295
- defaultController,
310
+ defaultController, vm.NewAgdServer(),
296
311
  logger, db, traceStore, loadLatest, skipUpgradeHeights,
297
312
  homePath, invCheckPeriod, encodingConfig, appOpts, baseAppOptions...,
298
313
  )
299
314
  }
300
315
 
301
316
  func NewAgoricApp(
302
- sendToController func(context.Context, bool, string) (string, error),
317
+ sendToController vm.Sender, agdServer *vm.AgdServer,
303
318
  logger log.Logger, db dbm.DB, traceStore io.Writer, loadLatest bool, skipUpgradeHeights map[int64]bool,
304
319
  homePath string, invCheckPeriod uint, encodingConfig gaiaappparams.EncodingConfig, appOpts servertypes.AppOptions, baseAppOptions ...func(*baseapp.BaseApp),
305
320
  ) *GaiaApp {
@@ -316,15 +331,17 @@ func NewAgoricApp(
316
331
  authtypes.StoreKey, banktypes.StoreKey, stakingtypes.StoreKey,
317
332
  minttypes.StoreKey, distrtypes.StoreKey, slashingtypes.StoreKey,
318
333
  govtypes.StoreKey, paramstypes.StoreKey, ibchost.StoreKey, upgradetypes.StoreKey,
319
- evidencetypes.StoreKey, ibctransfertypes.StoreKey,
334
+ evidencetypes.StoreKey, ibctransfertypes.StoreKey, packetforwardtypes.StoreKey,
320
335
  capabilitytypes.StoreKey, feegrant.StoreKey, authzkeeper.StoreKey, icahosttypes.StoreKey,
321
- swingset.StoreKey, vstorage.StoreKey, vibc.StoreKey, vbank.StoreKey, lien.StoreKey,
336
+ swingset.StoreKey, vstorage.StoreKey, vibc.StoreKey,
337
+ vlocalchain.StoreKey, vtransfer.StoreKey, vbank.StoreKey,
322
338
  )
323
339
  tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey)
324
340
  memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey)
325
341
 
326
342
  app := &GaiaApp{
327
343
  BaseApp: bApp,
344
+ AgdServer: agdServer,
328
345
  legacyAmino: legacyAmino,
329
346
  appCodec: appCodec,
330
347
  interfaceRegistry: interfaceRegistry,
@@ -355,7 +372,7 @@ func NewAgoricApp(
355
372
  app.CapabilityKeeper.Seal()
356
373
 
357
374
  // add keepers
358
- innerAk := authkeeper.NewAccountKeeper(
375
+ app.AccountKeeper = authkeeper.NewAccountKeeper(
359
376
  appCodec,
360
377
  keys[authtypes.StoreKey],
361
378
  app.GetSubspace(authtypes.ModuleName),
@@ -363,8 +380,7 @@ func NewAgoricApp(
363
380
  maccPerms,
364
381
  appName,
365
382
  )
366
- wrappedAccountKeeper := lien.NewWrappedAccountKeeper(innerAk)
367
- app.AccountKeeper = wrappedAccountKeeper
383
+
368
384
  app.BankKeeper = bankkeeper.NewBaseKeeper(
369
385
  appCodec,
370
386
  keys[banktypes.StoreKey],
@@ -441,11 +457,11 @@ func NewAgoricApp(
441
457
  )
442
458
 
443
459
  // This function is tricky to get right, so we build it ourselves.
444
- callToController := func(ctx sdk.Context, str string) (string, error) {
460
+ callToController := func(ctx sdk.Context, jsonRequest string) (jsonReply string, err error) {
445
461
  app.CheckControllerInited(true)
446
462
  // We use SwingSet-level metering to charge the user for the call.
447
- defer vm.SetControllerContext(ctx)()
448
- return sendToController(sdk.WrapSDKContext(ctx), true, str)
463
+ defer app.AgdServer.SetControllerContext(ctx)()
464
+ return sendToController(sdk.WrapSDKContext(ctx), true, jsonRequest)
449
465
  }
450
466
 
451
467
  setBootstrapNeeded := func() {
@@ -455,7 +471,7 @@ func NewAgoricApp(
455
471
  app.VstorageKeeper = vstorage.NewKeeper(
456
472
  keys[vstorage.StoreKey],
457
473
  )
458
- app.vstoragePort = vm.RegisterPortHandler("vstorage", vstorage.NewStorageHandler(app.VstorageKeeper))
474
+ app.vstoragePort = app.AgdServer.MustRegisterPortHandler("vstorage", vstorage.NewStorageHandler(app.VstorageKeeper))
459
475
 
460
476
  // The SwingSetKeeper is the Keeper from the SwingSet module
461
477
  app.SwingSetKeeper = swingset.NewKeeper(
@@ -464,7 +480,7 @@ func NewAgoricApp(
464
480
  app.VstorageKeeper, vbanktypes.ReservePoolName,
465
481
  callToController,
466
482
  )
467
- app.swingsetPort = vm.RegisterPortHandler("swingset", swingset.NewPortHandler(app.SwingSetKeeper))
483
+ app.swingsetPort = app.AgdServer.MustRegisterPortHandler("swingset", swingset.NewPortHandler(app.SwingSetKeeper))
468
484
 
469
485
  app.SwingStoreExportsHandler = *swingsetkeeper.NewSwingStoreExportsHandler(
470
486
  app.Logger(),
@@ -497,16 +513,26 @@ func NewAgoricApp(
497
513
  )
498
514
 
499
515
  app.VibcKeeper = vibc.NewKeeper(
500
- appCodec, keys[vibc.StoreKey],
516
+ appCodec,
501
517
  app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper,
502
- app.BankKeeper,
503
- scopedVibcKeeper,
518
+ ).WithScope(keys[vibc.StoreKey], scopedVibcKeeper, app.SwingSetKeeper.PushAction)
519
+
520
+ vibcModule := vibc.NewAppModule(app.VibcKeeper, app.BankKeeper)
521
+ vibcIBCModule := vibc.NewIBCModule(app.VibcKeeper)
522
+ app.vibcPort = app.AgdServer.MustRegisterPortHandler("vibc", vibc.NewReceiver(app.VibcKeeper))
523
+
524
+ app.VtransferKeeper = vtransferkeeper.NewKeeper(
525
+ appCodec,
526
+ keys[vtransfer.StoreKey],
527
+ app.VibcKeeper,
528
+ scopedTransferKeeper,
504
529
  app.SwingSetKeeper.PushAction,
505
530
  )
506
531
 
507
- vibcModule := vibc.NewAppModule(app.VibcKeeper)
508
- vibcIBCModule := vibc.NewIBCModule(app.VibcKeeper)
509
- app.vibcPort = vm.RegisterPortHandler("vibc", vibcIBCModule)
532
+ vtransferModule := vtransfer.NewAppModule(app.VtransferKeeper)
533
+ app.vtransferPort = app.AgdServer.MustRegisterPortHandler("vtransfer",
534
+ vibc.NewReceiver(app.VtransferKeeper),
535
+ )
510
536
 
511
537
  app.VbankKeeper = vbank.NewKeeper(
512
538
  appCodec, keys[vbank.StoreKey], app.GetSubspace(vbank.ModuleName),
@@ -514,17 +540,7 @@ func NewAgoricApp(
514
540
  app.SwingSetKeeper.PushAction,
515
541
  )
516
542
  vbankModule := vbank.NewAppModule(app.VbankKeeper)
517
- app.vbankPort = vm.RegisterPortHandler("bank", vbank.NewPortHandler(vbankModule, app.VbankKeeper))
518
-
519
- // Lien keeper, and circular reference back to wrappedAccountKeeper
520
- app.LienKeeper = lien.NewKeeper(
521
- appCodec, keys[lien.StoreKey],
522
- wrappedAccountKeeper, app.BankKeeper, app.StakingKeeper,
523
- app.SwingSetKeeper.PushAction,
524
- )
525
- wrappedAccountKeeper.SetWrapper(app.LienKeeper.GetAccountWrapper())
526
- lienModule := lien.NewAppModule(app.LienKeeper)
527
- app.lienPort = vm.RegisterPortHandler("lien", lien.NewPortHandler(app.LienKeeper))
543
+ app.vbankPort = app.AgdServer.MustRegisterPortHandler("bank", vbank.NewPortHandler(vbankModule, app.VbankKeeper))
528
544
 
529
545
  // register the proposal types
530
546
  govRouter := govv1beta1.NewRouter()
@@ -549,42 +565,91 @@ func NewAgoricApp(
549
565
  govConfig,
550
566
  )
551
567
 
568
+ // Initialize the packet forward middleware Keeper
569
+ // It's important to note that the PFM Keeper must be initialized before the Transfer Keeper
570
+ app.PacketForwardKeeper = packetforwardkeeper.NewKeeper(
571
+ appCodec,
572
+ keys[packetforwardtypes.StoreKey],
573
+ app.GetSubspace(packetforwardtypes.ModuleName),
574
+ app.TransferKeeper, // will be zero-value here, reference is set later on with SetTransferKeeper.
575
+ app.IBCKeeper.ChannelKeeper,
576
+ app.DistrKeeper,
577
+ app.BankKeeper,
578
+ // Make vtransfer the middleware wrapper for the IBCKeeper.
579
+ app.VtransferKeeper.GetICS4Wrapper(),
580
+ )
581
+
552
582
  app.TransferKeeper = ibctransferkeeper.NewKeeper(
553
583
  appCodec,
554
584
  keys[ibctransfertypes.StoreKey],
555
585
  app.GetSubspace(ibctransfertypes.ModuleName),
556
- app.IBCKeeper.ChannelKeeper,
586
+ app.PacketForwardKeeper, // Wire in the middleware ICS4Wrapper.
557
587
  app.IBCKeeper.ChannelKeeper,
558
588
  &app.IBCKeeper.PortKeeper,
559
589
  app.AccountKeeper,
560
590
  app.BankKeeper,
561
591
  scopedTransferKeeper,
562
592
  )
563
- transferModule := transfer.NewAppModule(app.TransferKeeper)
564
- transferIBCModule := transfer.NewIBCModule(app.TransferKeeper)
565
593
 
594
+ app.PacketForwardKeeper.SetTransferKeeper(app.TransferKeeper)
595
+
596
+ // NewAppModule uses a pointer to the host keeper in case there's a need to
597
+ // tie a circular knot with IBC middleware before icahostkeeper.NewKeeper
598
+ // can be called.
566
599
  app.ICAHostKeeper = icahostkeeper.NewKeeper(
567
600
  appCodec, keys[icahosttypes.StoreKey],
568
601
  app.GetSubspace(icahosttypes.SubModuleName),
569
- app.IBCKeeper.ChannelKeeper,
602
+ app.IBCKeeper.ChannelKeeper, // This is where middleware binding would happen.
570
603
  app.IBCKeeper.ChannelKeeper,
571
604
  &app.IBCKeeper.PortKeeper,
572
605
  app.AccountKeeper,
573
606
  scopedICAHostKeeper,
574
607
  app.MsgServiceRouter(),
575
608
  )
576
- icaModule := ica.NewAppModule(nil, &app.ICAHostKeeper)
577
609
  icaHostIBCModule := icahost.NewIBCModule(app.ICAHostKeeper)
610
+ icaModule := ica.NewAppModule(nil, &app.ICAHostKeeper)
611
+
612
+ ics20TransferModule := ibctransfer.NewAppModule(app.TransferKeeper)
613
+
614
+ // Create the IBC router, which maps *module names* (not PortIDs) to modules.
615
+ ibcRouter := ibcporttypes.NewRouter()
616
+
617
+ // Add an IBC route for the ICA Host.
618
+ ibcRouter.AddRoute(icahosttypes.SubModuleName, icaHostIBCModule)
578
619
 
579
- // create static IBC router, add transfer route, then set and seal it
580
- // FIXME: Don't be confused by the name! The port router maps *module names* (not PortIDs) to modules.
581
- ibcRouter := porttypes.NewRouter()
582
- ibcRouter.AddRoute(icahosttypes.SubModuleName, icaHostIBCModule).
583
- AddRoute(ibctransfertypes.ModuleName, transferIBCModule).
584
- AddRoute(vibc.ModuleName, vibcIBCModule)
620
+ // Add an IBC route for vIBC.
621
+ ibcRouter.AddRoute(vibc.ModuleName, vibcIBCModule)
585
622
 
623
+ // Add an IBC route for ICS-20 fungible token transfers, wrapping base
624
+ // Cosmos functionality with middleware (from the inside out, Cosmos
625
+ // packet-forwarding and then our own "vtransfer").
626
+ var ics20TransferIBCModule ibcporttypes.IBCModule = ibctransfer.NewIBCModule(app.TransferKeeper)
627
+ ics20TransferIBCModule = packetforward.NewIBCMiddleware(
628
+ ics20TransferIBCModule,
629
+ app.PacketForwardKeeper,
630
+ 0, // retries on timeout
631
+ packetforwardkeeper.DefaultForwardTransferPacketTimeoutTimestamp, // forward timeout
632
+ packetforwardkeeper.DefaultRefundTransferPacketTimeoutTimestamp, // refund timeout
633
+ )
634
+ ics20TransferIBCModule = vtransfer.NewIBCMiddleware(ics20TransferIBCModule, app.VtransferKeeper)
635
+ ibcRouter.AddRoute(ibctransfertypes.ModuleName, ics20TransferIBCModule)
636
+
637
+ // Seal the router
586
638
  app.IBCKeeper.SetRouter(ibcRouter)
587
639
 
640
+ // The local chain keeper provides ICA/ICQ-like support for the VM to
641
+ // control a fresh account and/or query this Cosmos-SDK instance.
642
+ app.VlocalchainKeeper = vlocalchain.NewKeeper(
643
+ appCodec,
644
+ keys[vlocalchain.StoreKey],
645
+ app.BaseApp.MsgServiceRouter(),
646
+ app.BaseApp.GRPCQueryRouter(),
647
+ )
648
+ app.vlocalchainPort = app.AgdServer.MustRegisterPortHandler(
649
+ "vlocalchain",
650
+ vlocalchain.NewReceiver(app.VlocalchainKeeper),
651
+ )
652
+
588
653
  // create evidence keeper with router
589
654
  evidenceKeeper := evidencekeeper.NewKeeper(
590
655
  appCodec,
@@ -606,11 +671,7 @@ func NewAgoricApp(
606
671
  app.BaseApp.DeliverTx,
607
672
  encodingConfig.TxConfig,
608
673
  ),
609
- // NOTE: using innerAk here instead of app.AccountKeeper
610
- // since migration method doesn't know how to unwrap the account keeper.
611
- // Needs access to some struct fields.
612
- // (Alternative is to add accessor methods to the AccountKeeper interface.)
613
- auth.NewAppModule(appCodec, innerAk, nil),
674
+ auth.NewAppModule(appCodec, app.AccountKeeper, nil),
614
675
  vesting.NewAppModule(app.AccountKeeper, app.BankKeeper, app.StakingKeeper),
615
676
  bank.NewAppModule(appCodec, app.BankKeeper, app.AccountKeeper),
616
677
  capability.NewAppModule(appCodec, *app.CapabilityKeeper),
@@ -625,13 +686,14 @@ func NewAgoricApp(
625
686
  authzmodule.NewAppModule(appCodec, app.AuthzKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry),
626
687
  ibc.NewAppModule(app.IBCKeeper),
627
688
  params.NewAppModule(app.ParamsKeeper),
628
- transferModule,
689
+ ics20TransferModule,
629
690
  icaModule,
691
+ packetforward.NewAppModule(app.PacketForwardKeeper),
630
692
  vstorage.NewAppModule(app.VstorageKeeper),
631
693
  swingset.NewAppModule(app.SwingSetKeeper, &app.SwingStoreExportsHandler, setBootstrapNeeded, app.ensureControllerInited, swingStoreExportDir),
632
694
  vibcModule,
633
695
  vbankModule,
634
- lienModule,
696
+ vtransferModule,
635
697
  )
636
698
 
637
699
  // During begin block slashing happens after distr.BeginBlocker so that
@@ -640,14 +702,19 @@ func NewAgoricApp(
640
702
  // NOTE: staking module is required if HistoricalEntries param > 0
641
703
  // NOTE: capability module's beginblocker must come before any modules using capabilities (e.g. IBC)
642
704
  app.mm.SetOrderBeginBlockers(
705
+ // Cosmos-SDK modules appear roughly in the order used by simapp and gaiad.
643
706
  // upgrades should be run first
644
707
  upgradetypes.ModuleName,
645
708
  capabilitytypes.ModuleName,
709
+ // params influence many other modules, so it should be near the top.
710
+ paramstypes.ModuleName,
646
711
  govtypes.ModuleName,
647
712
  stakingtypes.ModuleName,
713
+ // ibc apps are grouped together
648
714
  ibctransfertypes.ModuleName,
649
715
  ibchost.ModuleName,
650
716
  icatypes.ModuleName,
717
+ packetforwardtypes.ModuleName,
651
718
  authtypes.ModuleName,
652
719
  banktypes.ModuleName,
653
720
  distrtypes.ModuleName,
@@ -657,7 +724,6 @@ func NewAgoricApp(
657
724
  evidencetypes.ModuleName,
658
725
  authz.ModuleName,
659
726
  feegrant.ModuleName,
660
- paramstypes.ModuleName,
661
727
  vestingtypes.ModuleName,
662
728
  vstorage.ModuleName,
663
729
  // This will cause the swingset controller to init if it hadn't yet, passing
@@ -665,17 +731,19 @@ func NewAgoricApp(
665
731
  swingset.ModuleName,
666
732
  vibc.ModuleName,
667
733
  vbank.ModuleName,
668
- lien.ModuleName,
734
+ vtransfer.ModuleName,
669
735
  )
670
736
  app.mm.SetOrderEndBlockers(
671
- vibc.ModuleName,
672
- vbank.ModuleName,
673
- lien.ModuleName,
737
+ // Cosmos-SDK modules appear roughly in the order used by simapp and gaiad.
674
738
  govtypes.ModuleName,
675
739
  stakingtypes.ModuleName,
740
+ // vibc is an Agoric-specific IBC app, so group it here with other IBC apps.
741
+ vibc.ModuleName,
742
+ vtransfer.ModuleName,
676
743
  ibctransfertypes.ModuleName,
677
744
  ibchost.ModuleName,
678
745
  icatypes.ModuleName,
746
+ packetforwardtypes.ModuleName,
679
747
  feegrant.ModuleName,
680
748
  authz.ModuleName,
681
749
  capabilitytypes.ModuleName,
@@ -689,7 +757,11 @@ func NewAgoricApp(
689
757
  paramstypes.ModuleName,
690
758
  upgradetypes.ModuleName,
691
759
  vestingtypes.ModuleName,
692
- // SwingSet needs to be last, for it to capture all the pushed actions.
760
+ // Putting vbank before SwingSet VM will enable vbank to capture all event
761
+ // history that was produced all the other modules, and push those balance
762
+ // changes on the VM's actionQueue.
763
+ vbank.ModuleName,
764
+ // SwingSet VM needs to be last, for it to capture all the pushed actions.
693
765
  swingset.ModuleName,
694
766
  // And then vstorage, to produce SwingSet-induced events.
695
767
  vstorage.ModuleName,
@@ -706,26 +778,28 @@ func NewAgoricApp(
706
778
  capabilitytypes.ModuleName,
707
779
  authtypes.ModuleName,
708
780
  banktypes.ModuleName,
781
+ paramstypes.ModuleName,
709
782
  distrtypes.ModuleName,
710
783
  stakingtypes.ModuleName,
711
784
  slashingtypes.ModuleName,
712
785
  govtypes.ModuleName,
713
786
  minttypes.ModuleName,
714
787
  ibctransfertypes.ModuleName,
788
+ packetforwardtypes.ModuleName,
715
789
  ibchost.ModuleName,
716
790
  icatypes.ModuleName,
717
791
  evidencetypes.ModuleName,
718
792
  feegrant.ModuleName,
719
793
  authz.ModuleName,
720
794
  genutiltypes.ModuleName,
721
- paramstypes.ModuleName,
722
795
  upgradetypes.ModuleName,
723
796
  vestingtypes.ModuleName,
797
+ // Agoric-specific modules go last since they may rely on other SDK modules.
724
798
  vstorage.ModuleName,
725
799
  vbank.ModuleName,
726
800
  vibc.ModuleName,
801
+ vtransfer.ModuleName,
727
802
  swingset.ModuleName,
728
- lien.ModuleName,
729
803
  }
730
804
 
731
805
  app.mm.SetOrderInitGenesis(moduleOrderForGenesisAndUpgrade...)
@@ -754,7 +828,7 @@ func NewAgoricApp(
754
828
  params.NewAppModule(app.ParamsKeeper),
755
829
  evidence.NewAppModule(app.EvidenceKeeper),
756
830
  ibc.NewAppModule(app.IBCKeeper),
757
- transferModule,
831
+ ics20TransferModule,
758
832
  )
759
833
 
760
834
  app.sm.RegisterStoreDecoders()
@@ -788,28 +862,26 @@ func NewAgoricApp(
788
862
  app.SetBeginBlocker(app.BeginBlocker)
789
863
  app.SetEndBlocker(app.EndBlocker)
790
864
 
791
- const (
792
- upgradeName = "agoric-upgrade-14"
793
- upgradeNameTest = "agorictest-upgrade-14"
794
- )
795
-
796
- app.UpgradeKeeper.SetUpgradeHandler(
797
- upgradeName,
798
- upgrade14Handler(app, upgradeName),
799
- )
800
- app.UpgradeKeeper.SetUpgradeHandler(
801
- upgradeNameTest,
802
- upgrade14Handler(app, upgradeNameTest),
803
- )
865
+ for name := range upgradeNamesOfThisVersion {
866
+ app.UpgradeKeeper.SetUpgradeHandler(
867
+ name,
868
+ upgrade16Handler(app, name),
869
+ )
870
+ }
804
871
 
805
872
  upgradeInfo, err := app.UpgradeKeeper.ReadUpgradeInfoFromDisk()
806
873
  if err != nil {
807
874
  panic(err)
808
875
  }
809
- if (upgradeInfo.Name == upgradeName || upgradeInfo.Name == upgradeNameTest) && !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) {
876
+ if upgradeNamesOfThisVersion[upgradeInfo.Name] && !app.UpgradeKeeper.IsSkipHeight(upgradeInfo.Height) {
810
877
  storeUpgrades := storetypes.StoreUpgrades{
878
+ Added: []string{
879
+ packetforwardtypes.ModuleName, // Added PFM
880
+ vlocalchain.ModuleName, // Agoric added vlocalchain
881
+ vtransfer.ModuleName, // Agoric added vtransfer
882
+ },
811
883
  Deleted: []string{
812
- crisistypes.ModuleName, // The SDK discontinued the crisis module in v0.51.0
884
+ "lien", // Agoric removed the lien module
813
885
  },
814
886
  }
815
887
 
@@ -837,45 +909,6 @@ func NewAgoricApp(
837
909
  return app
838
910
  }
839
911
 
840
- // upgrade14Handler performs standard upgrade actions plus custom actions for upgrade-14.
841
- func upgrade14Handler(app *GaiaApp, targetUpgrade string) func(sdk.Context, upgradetypes.Plan, module.VersionMap) (module.VersionMap, error) {
842
- return func(ctx sdk.Context, plan upgradetypes.Plan, fromVm module.VersionMap) (module.VersionMap, error) {
843
- app.CheckControllerInited(false)
844
-
845
- // Each CoreProposalStep runs sequentially, and can be constructed from
846
- // one or more modules executing in parallel within the step.
847
- CoreProposalSteps := []vm.CoreProposalStep{
848
- // First, upgrade wallet factory
849
- vm.CoreProposalStepForModules("@agoric/vats/scripts/build-wallet-factory2-upgrade.js"),
850
- // Then, upgrade Zoe and ZCF
851
- vm.CoreProposalStepForModules("@agoric/vats/scripts/replace-zoe.js"),
852
- }
853
-
854
- app.upgradeDetails = &upgradeDetails{
855
- // Record the plan to send to SwingSet
856
- Plan: plan,
857
- // Core proposals that should run during the upgrade block
858
- // These will be merged with any coreProposals specified in the
859
- // upgradeInfo field of the upgrade plan ran as subsequent steps
860
- CoreProposals: vm.CoreProposalsFromSteps(CoreProposalSteps...),
861
- }
862
-
863
- // Always run module migrations
864
- mvm, err := app.mm.RunMigrations(ctx, app.configurator, fromVm)
865
- if err != nil {
866
- return mvm, err
867
- }
868
-
869
- m := swingsetkeeper.NewMigrator(app.SwingSetKeeper)
870
- err = m.MigrateParams(ctx)
871
- if err != nil {
872
- return mvm, err
873
- }
874
-
875
- return mvm, nil
876
- }
877
- }
878
-
879
912
  // normalizeModuleAccount ensures that the given account is a module account,
880
913
  // initializing or updating it if necessary. The account name must be listed in maccPerms.
881
914
  func normalizeModuleAccount(ctx sdk.Context, ak authkeeper.AccountKeeper, name string) {
@@ -905,11 +938,14 @@ type cosmosInitAction struct {
905
938
  UpgradeDetails *upgradeDetails `json:"upgradeDetails,omitempty"`
906
939
  Params swingset.Params `json:"params"`
907
940
  SupplyCoins sdk.Coins `json:"supplyCoins"`
908
- LienPort int `json:"lienPort"`
909
- StoragePort int `json:"storagePort"`
910
- SwingsetPort int `json:"swingsetPort"`
911
- VbankPort int `json:"vbankPort"`
912
- VibcPort int `json:"vibcPort"`
941
+ // CAVEAT: Every property ending in "Port" is saved in chain-main.js/portNums
942
+ // with a key consisting of this name with the "Port" stripped.
943
+ StoragePort int `json:"storagePort"`
944
+ SwingsetPort int `json:"swingsetPort"`
945
+ VbankPort int `json:"vbankPort"`
946
+ VibcPort int `json:"vibcPort"`
947
+ VlocalchainPort int `json:"vlocalchainPort"`
948
+ VtransferPort int `json:"vtransferPort"`
913
949
  }
914
950
 
915
951
  // Name returns the name of the App
@@ -939,11 +975,13 @@ func (app *GaiaApp) initController(ctx sdk.Context, bootstrap bool) {
939
975
  Params: app.SwingSetKeeper.GetParams(ctx),
940
976
  SupplyCoins: sdk.NewCoins(app.BankKeeper.GetSupply(ctx, "uist")),
941
977
  UpgradeDetails: app.upgradeDetails,
942
- LienPort: app.lienPort,
943
- StoragePort: app.vstoragePort,
944
- SwingsetPort: app.swingsetPort,
945
- VbankPort: app.vbankPort,
946
- VibcPort: app.vibcPort,
978
+ // See CAVEAT in cosmosInitAction.
979
+ StoragePort: app.vstoragePort,
980
+ SwingsetPort: app.swingsetPort,
981
+ VbankPort: app.vbankPort,
982
+ VibcPort: app.vibcPort,
983
+ VlocalchainPort: app.vlocalchainPort,
984
+ VtransferPort: app.vtransferPort,
947
985
  }
948
986
  // This uses `BlockingSend` as a friendly wrapper for `sendToController`
949
987
  //
@@ -955,12 +993,12 @@ func (app *GaiaApp) initController(ctx sdk.Context, bootstrap bool) {
955
993
  // fmt.Fprintf(os.Stderr, "AG_COSMOS_INIT Returned from SwingSet: %s, %v\n", out, err)
956
994
 
957
995
  if err != nil {
958
- panic(errors.Wrap(err, "cannot initialize Controller"))
996
+ panic(sdkioerrors.Wrap(err, "cannot initialize Controller"))
959
997
  }
960
998
  var res bool
961
999
  err = json.Unmarshal([]byte(out), &res)
962
1000
  if err != nil {
963
- panic(errors.Wrapf(err, "cannot unmarshal Controller init response: %s", out))
1001
+ panic(sdkioerrors.Wrapf(err, "cannot unmarshal Controller init response: %s", out))
964
1002
  }
965
1003
  if !res {
966
1004
  panic(fmt.Errorf("controller negative init response"))
@@ -1208,6 +1246,7 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino
1208
1246
  paramsKeeper.Subspace(slashingtypes.ModuleName)
1209
1247
  paramsKeeper.Subspace(govtypes.ModuleName).WithKeyTable(govtypesv1.ParamKeyTable())
1210
1248
  paramsKeeper.Subspace(ibctransfertypes.ModuleName)
1249
+ paramsKeeper.Subspace(packetforwardtypes.ModuleName).WithKeyTable(packetforwardtypes.ParamKeyTable())
1211
1250
  paramsKeeper.Subspace(ibchost.ModuleName)
1212
1251
  paramsKeeper.Subspace(icahosttypes.SubModuleName)
1213
1252
  paramsKeeper.Subspace(swingset.ModuleName)
@@ -1215,3 +1254,36 @@ func initParamsKeeper(appCodec codec.BinaryCodec, legacyAmino *codec.LegacyAmino
1215
1254
 
1216
1255
  return paramsKeeper
1217
1256
  }
1257
+
1258
+ // TestingApp functions
1259
+
1260
+ // GetBaseApp implements the TestingApp interface.
1261
+ func (app *GaiaApp) GetBaseApp() *baseapp.BaseApp {
1262
+ return app.BaseApp
1263
+ }
1264
+
1265
+ // GetStakingKeeper implements the TestingApp interface.
1266
+ func (app *GaiaApp) GetStakingKeeper() testtypes.StakingKeeper {
1267
+ return app.StakingKeeper
1268
+ }
1269
+
1270
+ // GetIBCKeeper implements the TestingApp interface.
1271
+ func (app *GaiaApp) GetIBCKeeper() *ibckeeper.Keeper {
1272
+ return app.IBCKeeper
1273
+ }
1274
+
1275
+ // GetScopedIBCKeeper implements the TestingApp interface.
1276
+ func (app *GaiaApp) GetScopedIBCKeeper() capabilitykeeper.ScopedKeeper {
1277
+ return app.ScopedIBCKeeper
1278
+ }
1279
+
1280
+ // GetTxConfig implements the TestingApp interface.
1281
+ func (app *GaiaApp) GetTxConfig() client.TxConfig {
1282
+ return MakeEncodingConfig().TxConfig
1283
+ }
1284
+
1285
+ // For testing purposes
1286
+ func (app *GaiaApp) SetSwingStoreExportDir(dir string) {
1287
+ module := app.mm.Modules[swingset.ModuleName].(swingset.AppModule)
1288
+ module.SetSwingStoreExportDir(dir)
1289
+ }