@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.
- package/CHANGELOG.md +11 -187
- package/Makefile +2 -2
- package/ante/ante.go +2 -2
- package/ante/inbound.go +1 -2
- package/ante/inbound_test.go +3 -1
- package/ante/vm_admission.go +1 -2
- package/app/app.go +255 -174
- package/app/encoding.go +6 -3
- package/app/export.go +50 -21
- package/app/genesis.go +7 -5
- package/app/params/encoding.go +1 -1
- package/app/params/proto.go +6 -4
- package/app/sim_test.go +11 -13
- package/app/txconfig/tx_config.go +169 -0
- package/app/upgrade.go +52 -97
- package/app/upgrade_test.go +1 -1
- package/cmd/agd/agvm.go +1 -1
- package/cmd/agd/main.go +1 -1
- package/cmd/libdaemon/main.go +2 -2
- package/daemon/cmd/root.go +99 -30
- package/daemon/cmd/root_test.go +12 -27
- package/daemon/main.go +2 -9
- package/git-revision.txt +1 -1
- package/go.mod +129 -109
- package/go.sum +228 -469
- package/package.json +2 -2
- package/proto/agoric/swingset/msgs.proto +46 -9
- package/proto/agoric/swingset/swingset.proto +7 -2
- package/proto/agoric/vbank/vbank.proto +1 -1
- package/proto/agoric/vibc/msgs.proto +4 -0
- package/tests/e2e/vbank/vbank_test.go +172 -0
- package/tests/integrations/types/aminojson_test.go +214 -0
- package/tests/integrations/vbank/vbank_test.go +348 -0
- package/third_party/proto/amino/amino.proto +6 -1
- package/third_party/proto/cosmos/base/v1beta1/coin.proto +18 -5
- package/third_party/proto/cosmos/upgrade/v1beta1/upgrade.proto +4 -8
- package/third_party/proto/ibc/core/channel/v1/channel.proto +42 -17
- package/third_party/proto/ibc/core/client/v1/client.proto +48 -40
- package/types/address_hooks.go +2 -2
- package/types/address_hooks_test.go +3 -3
- package/types/ibc_packet.go +3 -3
- package/types/ibc_packet_test.go +3 -3
- package/types/kv_entry_helpers.go +3 -3
- package/types/kv_entry_helpers_test.go +2 -2
- package/types/legacy_address_encoder.go +58 -0
- package/vm/proto_json_test.go +1 -1
- package/vm/server.go +2 -1
- package/x/swingset/abci.go +2 -2
- package/x/swingset/client/cli/tx.go +16 -14
- package/x/swingset/config.go +1 -1
- package/x/swingset/genesis.go +2 -1
- package/x/swingset/handler.go +2 -1
- package/x/swingset/keeper/extension_snapshotter.go +14 -5
- package/x/swingset/keeper/extension_snapshotter_test.go +1 -1
- package/x/swingset/keeper/keeper.go +21 -17
- package/x/swingset/keeper/keeper_test.go +10 -7
- package/x/swingset/keeper/msg_server.go +26 -5
- package/x/swingset/keeper/swing_store_exports_handler.go +1 -1
- package/x/swingset/keeper/swing_store_exports_handler_test.go +1 -1
- package/x/swingset/module.go +20 -22
- package/x/swingset/types/codec.go +10 -5
- package/x/swingset/types/default-params.go +13 -12
- package/x/swingset/types/expected_keepers.go +5 -4
- package/x/swingset/types/msgs.go +50 -36
- package/x/swingset/types/msgs.pb.go +60 -51
- package/x/swingset/types/params_test.go +21 -20
- package/x/swingset/types/swingset.pb.go +67 -61
- package/x/vbank/genesis.go +12 -8
- package/x/vbank/handler.go +2 -1
- package/x/vbank/keeper/grpc_query.go +4 -1
- package/x/vbank/keeper/keeper.go +108 -23
- package/x/vbank/keeper/querier.go +4 -1
- package/x/vbank/keeper/rewards.go +6 -2
- package/x/vbank/module.go +47 -75
- package/x/vbank/types/expected_keepers.go +15 -10
- package/x/vbank/types/key.go +3 -0
- package/x/vbank/types/params.go +4 -3
- package/x/vbank/types/vbank.pb.go +41 -40
- package/x/vbank/vbank.go +25 -10
- package/x/vbank/vbank_test.go +213 -154
- package/x/vibc/handler.go +2 -1
- package/x/vibc/keeper/keeper.go +10 -10
- package/x/vibc/keeper/migrations.go +1 -1
- package/x/vibc/keeper/triggers.go +1 -1
- package/x/vibc/module.go +5 -22
- package/x/vibc/types/codec.go +2 -1
- package/x/vibc/types/expected_keepers.go +7 -5
- package/x/vibc/types/ibc_module.go +5 -5
- package/x/vibc/types/msgs.go +30 -7
- package/x/vibc/types/msgs.pb.go +29 -25
- package/x/vibc/types/receiver.go +2 -2
- package/x/vlocalchain/handler.go +2 -1
- package/x/vlocalchain/keeper/keeper.go +17 -5
- package/x/vlocalchain/keeper/keeper_test.go +3 -2
- package/x/vlocalchain/types/expected_keepers.go +7 -4
- package/x/vlocalchain/vlocalchain_test.go +38 -26
- package/x/vstorage/genesis.go +10 -10
- package/x/vstorage/handler.go +2 -1
- package/x/vstorage/keeper/keeper.go +68 -46
- package/x/vstorage/keeper/keeper_test.go +35 -19
- package/x/vstorage/module.go +27 -13
- package/x/vstorage/testing/queue.go +5 -3
- package/x/vstorage/vstorage.go +2 -1
- package/x/vstorage/vstorage_test.go +21 -17
- package/x/vtransfer/genesis.go +1 -3
- package/x/vtransfer/handler.go +3 -2
- package/x/vtransfer/ibc_middleware.go +5 -5
- package/x/vtransfer/ibc_middleware_test.go +43 -29
- package/x/vtransfer/keeper/keeper.go +35 -33
- package/x/vtransfer/module.go +8 -11
- package/x/vtransfer/types/expected_keepers.go +3 -3
- package/x/vtransfer/utils_test.go +26 -11
- 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
|
-
|
|
15
|
-
|
|
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
|
-
|
|
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
|
|
23
|
+
ctx := app.NewContext(true)
|
|
24
24
|
|
|
25
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
106
|
-
|
|
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
|
-
|
|
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 :=
|
|
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,
|
|
166
|
-
if
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
23
|
-
return NewDefaultGenesisState()
|
|
24
|
+
func (app *GaiaApp) DefaultGenesis() GenesisState {
|
|
25
|
+
return NewDefaultGenesisState(app.appCodec, app.BasicModuleManager)
|
|
24
26
|
}
|
package/app/params/encoding.go
CHANGED
|
@@ -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
|
-
|
|
13
|
+
Codec codec.Codec
|
|
14
14
|
TxConfig client.TxConfig
|
|
15
15
|
Amino *codec.LegacyAmino
|
|
16
16
|
}
|
package/app/params/proto.go
CHANGED
|
@@ -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
|
-
|
|
14
|
-
txCfg :=
|
|
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
|
-
|
|
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
|
-
|
|
12
|
+
"cosmossdk.io/log"
|
|
13
13
|
abci "github.com/cometbft/cometbft/abci/types"
|
|
14
|
-
"github.com/
|
|
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
|
|
191
|
-
ctxB := newApp.NewContext(true
|
|
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 :=
|
|
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.
|
|
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
|
+
}
|