@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/app/encoding.go CHANGED
@@ -4,14 +4,17 @@ import (
4
4
  "github.com/Agoric/agoric-sdk/golang/cosmos/app/params"
5
5
 
6
6
  "github.com/cosmos/cosmos-sdk/std"
7
+ "github.com/cosmos/cosmos-sdk/types/module"
7
8
  )
8
9
 
9
10
  // MakeEncodingConfig creates an EncodingConfig for testing
10
- func MakeEncodingConfig() params.EncodingConfig {
11
+ func MakeEncodingConfig(basicManager module.BasicManager) params.EncodingConfig {
11
12
  encodingConfig := params.MakeEncodingConfig()
12
13
  std.RegisterLegacyAminoCodec(encodingConfig.Amino)
13
14
  std.RegisterInterfaces(encodingConfig.InterfaceRegistry)
14
- ModuleBasics.RegisterLegacyAminoCodec(encodingConfig.Amino)
15
- ModuleBasics.RegisterInterfaces(encodingConfig.InterfaceRegistry)
15
+ if basicManager != nil {
16
+ basicManager.RegisterLegacyAminoCodec(encodingConfig.Amino)
17
+ basicManager.RegisterInterfaces(encodingConfig.InterfaceRegistry)
18
+ }
16
19
  return encodingConfig
17
20
  }
package/app/export.go CHANGED
@@ -5,7 +5,7 @@ import (
5
5
  "fmt"
6
6
  "log"
7
7
 
8
- tmproto "github.com/cometbft/cometbft/proto/tendermint/types"
8
+ storetypes "cosmossdk.io/store/types"
9
9
 
10
10
  servertypes "github.com/cosmos/cosmos-sdk/server/types"
11
11
  sdk "github.com/cosmos/cosmos-sdk/types"
@@ -20,26 +20,30 @@ func (app *GaiaApp) ExportAppStateAndValidators(
20
20
  forZeroHeight bool, jailAllowedAddrs []string, modulesToExport []string,
21
21
  ) (servertypes.ExportedApp, error) {
22
22
  // as if they could withdraw from the start of the next block
23
- ctx := app.NewContext(true, tmproto.Header{Height: app.LastBlockHeight()})
23
+ ctx := app.NewContext(true)
24
24
 
25
- // We export at last height + 1, because that's the height at which
26
- // Tendermint will start InitChain.
27
- height := app.LastBlockHeight() + 1
25
+ height := app.LastBlockHeight()
28
26
  if forZeroHeight {
29
27
  return servertypes.ExportedApp{}, fmt.Errorf("forZeroHeight not supported")
30
28
  }
31
29
 
32
- genState := app.ModuleManager.ExportGenesisForModules(ctx, app.appCodec, modulesToExport)
30
+ ctx = ctx.WithBlockHeight(height)
31
+ genState, err := app.ModuleManager.ExportGenesis(ctx, app.appCodec)
32
+ if err != nil {
33
+ return servertypes.ExportedApp{}, err
34
+ }
35
+
33
36
  appState, err := json.MarshalIndent(genState, "", " ")
34
37
  if err != nil {
35
38
  return servertypes.ExportedApp{}, err
36
39
  }
37
40
 
38
- validators, err := staking.WriteValidators(ctx, &app.StakingKeeper)
41
+ validators, err := staking.WriteValidators(ctx, app.StakingKeeper)
42
+
39
43
  return servertypes.ExportedApp{
40
44
  AppState: appState,
41
45
  Validators: validators,
42
- Height: height,
46
+ Height: height + 1,
43
47
  ConsensusParams: app.BaseApp.GetConsensusParams(ctx),
44
48
  }, err
45
49
  }
@@ -70,12 +74,20 @@ func (app *GaiaApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [
70
74
 
71
75
  // withdraw all validator commission
72
76
  app.StakingKeeper.IterateValidators(ctx, func(_ int64, val stakingtypes.ValidatorI) (stop bool) {
73
- _, _ = app.DistrKeeper.WithdrawValidatorCommission(ctx, val.GetOperator())
77
+ addr, err := sdk.ValAddressFromBech32(val.GetOperator())
78
+ if err != nil {
79
+ panic(err)
80
+ }
81
+ _, _ = app.DistrKeeper.WithdrawValidatorCommission(ctx, addr)
74
82
  return false
75
83
  })
76
84
 
77
85
  // withdraw all delegator rewards
78
- dels := app.StakingKeeper.GetAllDelegations(ctx)
86
+ dels, err := app.StakingKeeper.GetAllDelegations(ctx)
87
+ if err != nil {
88
+ panic(err)
89
+ }
90
+
79
91
  for _, delegation := range dels {
80
92
  valAddr, err := sdk.ValAddressFromBech32(delegation.ValidatorAddress)
81
93
  if err != nil {
@@ -102,12 +114,28 @@ func (app *GaiaApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [
102
114
  // reinitialize all validators
103
115
  app.StakingKeeper.IterateValidators(ctx, func(_ int64, val stakingtypes.ValidatorI) (stop bool) {
104
116
  // donate any unwithdrawn outstanding reward fraction tokens to the community pool
105
- scraps := app.DistrKeeper.GetValidatorOutstandingRewardsCoins(ctx, val.GetOperator())
106
- feePool := app.DistrKeeper.GetFeePool(ctx)
117
+ addr, err := sdk.ValAddressFromBech32(val.GetOperator())
118
+ if err != nil {
119
+ panic(err)
120
+ }
121
+ scraps, err := app.DistrKeeper.GetValidatorOutstandingRewardsCoins(ctx, addr)
122
+ if err != nil {
123
+ panic(err)
124
+ }
125
+
126
+ feePool, err := app.DistrKeeper.FeePool.Get(ctx)
127
+ if err != nil {
128
+ panic(err)
129
+ }
107
130
  feePool.CommunityPool = feePool.CommunityPool.Add(scraps...)
108
- app.DistrKeeper.SetFeePool(ctx, feePool)
109
131
 
110
- if err := app.DistrKeeper.Hooks().AfterValidatorCreated(ctx, val.GetOperator()); err != nil {
132
+ var err_ error
133
+ err_ = app.DistrKeeper.FeePool.Set(ctx, feePool)
134
+ if err_ != nil {
135
+ panic(err_)
136
+ }
137
+
138
+ if err := app.DistrKeeper.Hooks().AfterValidatorCreated(ctx, addr); err != nil {
111
139
  panic(err)
112
140
  }
113
141
  return false
@@ -157,13 +185,13 @@ func (app *GaiaApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [
157
185
  // Iterate through validators by power descending, reset bond heights, and
158
186
  // update bond intra-tx counters.
159
187
  store := ctx.KVStore(app.keys[stakingtypes.StoreKey])
160
- iter := sdk.KVStoreReversePrefixIterator(store, stakingtypes.ValidatorsKey)
188
+ iter := storetypes.KVStoreReversePrefixIterator(store, stakingtypes.ValidatorsKey)
161
189
  counter := int16(0)
162
190
 
163
191
  for ; iter.Valid(); iter.Next() {
164
192
  addr := sdk.ValAddress(stakingtypes.AddressFromValidatorsKey(iter.Key()))
165
- validator, found := app.StakingKeeper.GetValidator(ctx, addr)
166
- if !found {
193
+ validator, err := app.StakingKeeper.GetValidator(ctx, addr)
194
+ if err != nil {
167
195
  panic("expected validator, not found")
168
196
  }
169
197
 
@@ -178,11 +206,12 @@ func (app *GaiaApp) prepForZeroHeightGenesis(ctx sdk.Context, jailAllowedAddrs [
178
206
 
179
207
  iter.Close()
180
208
 
181
- _, err := app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx)
182
- if err != nil {
183
- log.Fatal(err)
184
- }
209
+ var err_ error
185
210
 
211
+ _, err_ = app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx)
212
+ if err_ != nil {
213
+ log.Fatal(err_)
214
+ }
186
215
  /* Handle slashing state. */
187
216
 
188
217
  // reset start height on signing infos
package/app/genesis.go CHANGED
@@ -2,6 +2,9 @@ package gaia
2
2
 
3
3
  import (
4
4
  "encoding/json"
5
+
6
+ "github.com/cosmos/cosmos-sdk/codec"
7
+ "github.com/cosmos/cosmos-sdk/types/module"
5
8
  )
6
9
 
7
10
  // The genesis state of the blockchain is represented here as a map of raw json
@@ -14,11 +17,10 @@ import (
14
17
  type GenesisState map[string]json.RawMessage
15
18
 
16
19
  // NewDefaultGenesisState generates the default state for the application.
17
- func NewDefaultGenesisState() GenesisState {
18
- encCfg := MakeEncodingConfig()
19
- return ModuleBasics.DefaultGenesis(encCfg.Marshaler)
20
+ func NewDefaultGenesisState(appCodec codec.Codec, basicManager module.BasicManager) GenesisState {
21
+ return basicManager.DefaultGenesis(appCodec)
20
22
  }
21
23
 
22
- func (_app *GaiaApp) DefaultGenesis() GenesisState {
23
- return NewDefaultGenesisState()
24
+ func (app *GaiaApp) DefaultGenesis() GenesisState {
25
+ return NewDefaultGenesisState(app.appCodec, app.BasicModuleManager)
24
26
  }
@@ -10,7 +10,7 @@ import (
10
10
  // This is provided for compatibility between protobuf and amino implementations.
11
11
  type EncodingConfig struct {
12
12
  InterfaceRegistry types.InterfaceRegistry
13
- Marshaler codec.Codec
13
+ Codec codec.Codec
14
14
  TxConfig client.TxConfig
15
15
  Amino *codec.LegacyAmino
16
16
  }
@@ -1,6 +1,7 @@
1
1
  package params
2
2
 
3
3
  import (
4
+ "github.com/Agoric/agoric-sdk/golang/cosmos/app/txconfig"
4
5
  "github.com/cosmos/cosmos-sdk/codec"
5
6
  "github.com/cosmos/cosmos-sdk/codec/types"
6
7
  "github.com/cosmos/cosmos-sdk/x/auth/tx"
@@ -10,12 +11,13 @@ import (
10
11
  func MakeEncodingConfig() EncodingConfig {
11
12
  amino := codec.NewLegacyAmino()
12
13
  interfaceRegistry := types.NewInterfaceRegistry()
13
- marshaler := codec.NewProtoCodec(interfaceRegistry)
14
- txCfg := tx.NewTxConfig(marshaler, tx.DefaultSignModes)
15
-
14
+ codec := codec.NewProtoCodec(interfaceRegistry)
15
+ txCfg, _ := txconfig.NewTxConfigWithOptionsWithCustomEncoders(codec, tx.ConfigOptions{
16
+ EnabledSignModes: tx.DefaultSignModes,
17
+ })
16
18
  return EncodingConfig{
17
19
  InterfaceRegistry: interfaceRegistry,
18
- Marshaler: marshaler,
20
+ Codec: codec,
19
21
  TxConfig: txCfg,
20
22
  Amino: amino,
21
23
  }
package/app/sim_test.go CHANGED
@@ -9,27 +9,24 @@ import (
9
9
  "strings"
10
10
  "testing"
11
11
 
12
- dbm "github.com/cometbft/cometbft-db"
12
+ "cosmossdk.io/log"
13
13
  abci "github.com/cometbft/cometbft/abci/types"
14
- "github.com/cometbft/cometbft/libs/log"
15
- tmproto "github.com/cometbft/cometbft/proto/tendermint/types"
14
+ dbm "github.com/cosmos/cosmos-db"
16
15
  "github.com/stretchr/testify/require"
17
16
 
17
+ storetypes "cosmossdk.io/store/types"
18
18
  "github.com/cosmos/cosmos-sdk/client/flags"
19
19
  "github.com/cosmos/cosmos-sdk/server"
20
- storetypes "github.com/cosmos/cosmos-sdk/store/types"
21
20
 
21
+ "cosmossdk.io/store"
22
+ evidencetypes "cosmossdk.io/x/evidence/types"
22
23
  "github.com/cosmos/cosmos-sdk/baseapp"
23
- "github.com/cosmos/cosmos-sdk/store"
24
24
  simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims"
25
- sdk "github.com/cosmos/cosmos-sdk/types"
26
25
  simtypes "github.com/cosmos/cosmos-sdk/types/simulation"
27
26
  authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
28
27
  authzkeeper "github.com/cosmos/cosmos-sdk/x/authz/keeper"
29
28
  banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
30
- capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types"
31
29
  distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types"
32
- evidencetypes "github.com/cosmos/cosmos-sdk/x/evidence/types"
33
30
  govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
34
31
  minttypes "github.com/cosmos/cosmos-sdk/x/mint/types"
35
32
  paramtypes "github.com/cosmos/cosmos-sdk/x/params/types"
@@ -37,6 +34,7 @@ import (
37
34
  simcli "github.com/cosmos/cosmos-sdk/x/simulation/client/cli"
38
35
  slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types"
39
36
  stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
37
+ capabilitytypes "github.com/cosmos/ibc-go/modules/capability/types"
40
38
  )
41
39
 
42
40
  // SimAppChainID hardcoded chainID for simulation
@@ -187,8 +185,8 @@ func TestAppImportExport(t *testing.T) {
187
185
  }
188
186
  }()
189
187
 
190
- ctxA := app.NewContext(true, tmproto.Header{Height: app.LastBlockHeight()})
191
- ctxB := newApp.NewContext(true, tmproto.Header{Height: app.LastBlockHeight()})
188
+ ctxA := app.NewContext(true)
189
+ ctxB := newApp.NewContext(true)
192
190
  newApp.ModuleManager.InitGenesis(ctxB, app.AppCodec(), genesisState)
193
191
  newApp.StoreConsensusParams(ctxB, exported.ConsensusParams)
194
192
 
@@ -218,7 +216,7 @@ func TestAppImportExport(t *testing.T) {
218
216
  storeA := ctxA.KVStore(skp.A)
219
217
  storeB := ctxB.KVStore(skp.B)
220
218
 
221
- failedKVAs, failedKVBs := sdk.DiffKVStores(storeA, storeB, skp.Prefixes)
219
+ failedKVAs, failedKVBs := simtestutil.DiffKVStores(storeA, storeB, skp.Prefixes)
222
220
  require.Equal(t, len(failedKVAs), len(failedKVBs), "unequal sets of key-values to compare")
223
221
 
224
222
  fmt.Printf("compared %d different key/value pairs between %s and %s\n", len(failedKVAs), skp.A, skp.B)
@@ -293,7 +291,7 @@ func TestAppSimulationAfterImport(t *testing.T) {
293
291
  newApp := NewSimApp(log.NewNopLogger(), newDB, nil, true, appOptions, fauxMerkleModeOpt, baseapp.SetChainID(SimAppChainID))
294
292
  require.Equal(t, "SimApp", newApp.Name())
295
293
 
296
- newApp.InitChain(abci.RequestInitChain{
294
+ newApp.InitChain(&abci.RequestInitChain{
297
295
  ChainId: SimAppChainID,
298
296
  AppStateBytes: exported.AppState,
299
297
  })
@@ -349,7 +347,7 @@ func TestAppStateDeterminism(t *testing.T) {
349
347
  for j := 0; j < numTimesToRunPerSeed; j++ {
350
348
  var logger log.Logger
351
349
  if simcli.FlagVerboseValue {
352
- logger = log.TestingLogger()
350
+ logger = log.NewTestLogger(t)
353
351
  } else {
354
352
  logger = log.NewNopLogger()
355
353
  }
@@ -0,0 +1,169 @@
1
+ package txconfig
2
+
3
+ import (
4
+ "fmt"
5
+
6
+ txsigning "cosmossdk.io/x/tx/signing"
7
+ "cosmossdk.io/x/tx/signing/aminojson"
8
+ "cosmossdk.io/x/tx/signing/direct"
9
+ "cosmossdk.io/x/tx/signing/directaux"
10
+ "cosmossdk.io/x/tx/signing/textual"
11
+ agorictypes "github.com/Agoric/agoric-sdk/golang/cosmos/types"
12
+ "github.com/cosmos/cosmos-sdk/client"
13
+ "github.com/cosmos/cosmos-sdk/codec"
14
+ sdk "github.com/cosmos/cosmos-sdk/types"
15
+ signingtypes "github.com/cosmos/cosmos-sdk/types/tx/signing"
16
+ "github.com/cosmos/cosmos-sdk/x/auth/tx"
17
+ )
18
+
19
+ var legacyAddress = "legacy_address"
20
+ var nullSliceAsEmpty = "null_slice_as_empty"
21
+
22
+ type configTx struct {
23
+ decoder sdk.TxDecoder
24
+ encoder sdk.TxEncoder
25
+ jsonDecoder sdk.TxDecoder
26
+ jsonEncoder sdk.TxEncoder
27
+ protoCodec codec.Codec
28
+ }
29
+
30
+ // CustomAminoFieldEncoders is a map of custom amino field encoders for amino json
31
+ var CustomAminoFieldEncoders = map[string]aminojson.FieldEncoder{
32
+ legacyAddress: agorictypes.LegacyAddressEncoder,
33
+ nullSliceAsEmpty: aminojson.NullSliceAsEmptyEncoder,
34
+ }
35
+
36
+ // NewTxConfigWithOptions returns a new protobuf TxConfig using the provided ProtoCodec, ConfigOptions and
37
+ // custom sign mode handlers. If ConfigOptions is an empty struct then default values will be used.
38
+ func NewTxConfigWithOptionsWithCustomEncoders(protoCodec codec.Codec, configOptions tx.ConfigOptions) (client.TxConfig, error) {
39
+ txConfig := &configTx{
40
+ protoCodec: protoCodec,
41
+ decoder: configOptions.ProtoDecoder,
42
+ encoder: configOptions.ProtoEncoder,
43
+ jsonDecoder: configOptions.JSONDecoder,
44
+ jsonEncoder: configOptions.JSONEncoder,
45
+ }
46
+ if configOptions.ProtoDecoder == nil {
47
+ txConfig.decoder = tx.DefaultTxDecoder(protoCodec)
48
+ }
49
+ if configOptions.ProtoEncoder == nil {
50
+ txConfig.encoder = tx.DefaultTxEncoder()
51
+ }
52
+ if configOptions.JSONDecoder == nil {
53
+ txConfig.jsonDecoder = tx.DefaultJSONTxDecoder(protoCodec)
54
+ }
55
+ if configOptions.JSONEncoder == nil {
56
+ txConfig.jsonEncoder = tx.DefaultJSONTxEncoder(protoCodec)
57
+ }
58
+
59
+ var err error
60
+ if configOptions.SigningContext == nil {
61
+ if configOptions.SigningOptions == nil {
62
+ configOptions.SigningOptions, err = tx.NewDefaultSigningOptions()
63
+ if err != nil {
64
+ return nil, err
65
+ }
66
+ }
67
+ if configOptions.SigningOptions.FileResolver == nil {
68
+ configOptions.SigningOptions.FileResolver = protoCodec.InterfaceRegistry()
69
+ }
70
+ configOptions.SigningContext, err = txsigning.NewContext(*configOptions.SigningOptions)
71
+ if err != nil {
72
+ return nil, err
73
+ }
74
+ }
75
+
76
+ configOptions.SigningHandler, err = NewSigningHandlerMap(configOptions)
77
+
78
+ if err != nil {
79
+ return nil, err
80
+ }
81
+ return tx.NewTxConfigWithOptions(txConfig.protoCodec, configOptions)
82
+
83
+ }
84
+
85
+ func NewSigningHandlerMap(configOpts tx.ConfigOptions) (*txsigning.HandlerMap, error) {
86
+ var err error
87
+ if configOpts.SigningOptions == nil {
88
+ configOpts.SigningOptions, err = tx.NewDefaultSigningOptions()
89
+ if err != nil {
90
+ return nil, err
91
+ }
92
+ }
93
+
94
+ if configOpts.SigningContext == nil {
95
+ configOpts.SigningContext, err = txsigning.NewContext(*configOpts.SigningOptions)
96
+ if err != nil {
97
+ return nil, err
98
+ }
99
+ }
100
+
101
+ signingOpts := configOpts.SigningOptions
102
+
103
+ if len(configOpts.EnabledSignModes) == 0 {
104
+ configOpts.EnabledSignModes = tx.DefaultSignModes
105
+ }
106
+
107
+ lenSignModes := len(configOpts.EnabledSignModes)
108
+ handlers := make([]txsigning.SignModeHandler, lenSignModes+len(configOpts.CustomSignModes))
109
+ for i, m := range configOpts.EnabledSignModes {
110
+ var err error
111
+ switch m {
112
+ case signingtypes.SignMode_SIGN_MODE_DIRECT:
113
+ handlers[i] = &direct.SignModeHandler{}
114
+ case signingtypes.SignMode_SIGN_MODE_DIRECT_AUX:
115
+ handlers[i], err = directaux.NewSignModeHandler(directaux.SignModeHandlerOptions{
116
+ TypeResolver: signingOpts.TypeResolver,
117
+ SignersContext: configOpts.SigningContext,
118
+ })
119
+ if err != nil {
120
+ return nil, err
121
+ }
122
+ case signingtypes.SignMode_SIGN_MODE_LEGACY_AMINO_JSON:
123
+ // AGORIC: We inject custom amino field encoders for amino json
124
+ //
125
+ aminoHandler, _, err := NewAminoHandlerWithCustomEncoders(configOpts.SigningOptions, CustomAminoFieldEncoders)
126
+ if err != nil {
127
+ return nil, err
128
+ }
129
+ // -------------------------------------------------
130
+ handlers[i] = aminoHandler
131
+ case signingtypes.SignMode_SIGN_MODE_TEXTUAL:
132
+ handlers[i], err = textual.NewSignModeHandler(textual.SignModeOptions{
133
+ CoinMetadataQuerier: configOpts.TextualCoinMetadataQueryFn,
134
+ FileResolver: signingOpts.FileResolver,
135
+ TypeResolver: signingOpts.TypeResolver,
136
+ })
137
+ if configOpts.TextualCoinMetadataQueryFn == nil {
138
+ return nil, fmt.Errorf("cannot enable SIGN_MODE_TEXTUAL without a TextualCoinMetadataQueryFn")
139
+ }
140
+ if err != nil {
141
+ return nil, err
142
+ }
143
+ }
144
+ }
145
+ for i, m := range configOpts.CustomSignModes {
146
+ handlers[i+lenSignModes] = m
147
+ }
148
+ handler := txsigning.NewHandlerMap(handlers...)
149
+ return handler, nil
150
+
151
+ }
152
+
153
+ func NewAminoHandlerWithCustomEncoders(signingOpts *txsigning.Options, fieldEncoders map[string]aminojson.FieldEncoder) (*aminojson.SignModeHandler, aminojson.Encoder, error) {
154
+ encoderOptions := aminojson.EncoderOptions{
155
+ FileResolver: signingOpts.FileResolver,
156
+ TypeResolver: signingOpts.TypeResolver,
157
+ EnumAsString: false, // ensure enum as string is disabled
158
+ }
159
+ encoder := aminojson.NewEncoder(encoderOptions)
160
+ for name, customFieldEncoder := range fieldEncoders {
161
+ encoder.DefineFieldEncoding(name, customFieldEncoder)
162
+ }
163
+ aminoHandler := aminojson.NewSignModeHandler(aminojson.SignModeHandlerOptions{
164
+ FileResolver: signingOpts.FileResolver,
165
+ TypeResolver: signingOpts.TypeResolver,
166
+ Encoder: &encoder,
167
+ })
168
+ return aminoHandler, encoder, nil
169
+ }