@agoric/cosmos 0.35.0-u19.2 → 0.35.0-u20.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 +6 -18
- package/app/app.go +1 -1
- package/app/upgrade.go +38 -93
- package/app/upgrade_test.go +63 -0
- package/git-revision.txt +1 -1
- package/package.json +2 -2
- package/types/address_hooks.go +3 -10
- package/types/address_hooks_test.go +31 -31
- package/types/codec.go +23 -0
- package/types/ibc_packet.go +64 -0
- package/types/ibc_packet_test.go +117 -0
- package/x/vibc/keeper/triggers.go +5 -31
- package/x/vibc/types/expected_keepers.go +1 -0
- package/x/vibc/types/ibc_module.go +26 -16
- package/x/vibc/types/receiver.go +15 -15
- package/x/vstorage/README.md +0 -8
- package/x/vstorage/keeper/keeper.go +38 -4
- package/x/vstorage/types/path_keys.go +7 -8
- package/x/vtransfer/handler.go +4 -2
- package/x/vtransfer/ibc_middleware_test.go +4 -5
- package/x/vtransfer/keeper/keeper.go +33 -43
- package/e2e_test/Makefile +0 -29
- package/e2e_test/README.md +0 -100
- package/e2e_test/go.mod +0 -239
- package/e2e_test/go.sum +0 -1323
- package/e2e_test/ibc_conformance_test.go +0 -56
- package/e2e_test/pfm_test.go +0 -613
- package/e2e_test/util.go +0 -271
package/CHANGELOG.md
CHANGED
|
@@ -3,23 +3,7 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
-
## [0.35.0-
|
|
7
|
-
|
|
8
|
-
**Note:** Version bump only for package @agoric/cosmos
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
## [0.35.0-u19.1](https://github.com/Agoric/agoric-sdk/compare/@agoric/cosmos@0.35.0-u19.0...@agoric/cosmos@0.35.0-u19.1) (2025-03-03)
|
|
15
|
-
|
|
16
|
-
**Note:** Version bump only for package @agoric/cosmos
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
## [0.35.0-u19.0](https://github.com/Agoric/agoric-sdk/compare/@agoric/cosmos@0.34.1...@agoric/cosmos@0.35.0-u19.0) (2025-02-24)
|
|
6
|
+
## [0.35.0-u20.0](https://github.com/Agoric/agoric-sdk/compare/@agoric/cosmos@0.34.1...@agoric/cosmos@0.35.0-u20.0) (2025-04-16)
|
|
23
7
|
|
|
24
8
|
|
|
25
9
|
### ⚠ BREAKING CHANGES
|
|
@@ -64,7 +48,8 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline
|
|
|
64
48
|
* **cosmos:** impose defaults when sending VM actions ([a710d68](https://github.com/Agoric/agoric-sdk/commit/a710d68512cf9983bdf5230e2e99f267521c7210))
|
|
65
49
|
* **cosmos:** KVEntry implements json Marshaler and Unmarshaller ([1bba859](https://github.com/Agoric/agoric-sdk/commit/1bba8592eee0e24e480c407095f0f63ccca4a242))
|
|
66
50
|
* **cosmos:** make vm comms use `context.Context` ([fa1754c](https://github.com/Agoric/agoric-sdk/commit/fa1754c791ba6c848e6b94f3a75051c6b4cc69f6))
|
|
67
|
-
* **cosmos:**
|
|
51
|
+
* **cosmos:** new `IBCPacket` helpers to tame JSON ([f5a10b6](https://github.com/Agoric/agoric-sdk/commit/f5a10b6457501c9be9ae396bd1c7a8d43ea42dd6))
|
|
52
|
+
* **cosmos:** Next upgrade is agoric-upgrade-20 ([2631f84](https://github.com/Agoric/agoric-sdk/commit/2631f847b827a284c4ad11632c7f0ee914f78950))
|
|
68
53
|
* **cosmos:** prevent VM port handlers from panicking ([afd6017](https://github.com/Agoric/agoric-sdk/commit/afd60170d453865cfa871a01e8d8a74ffef9221a))
|
|
69
54
|
* **cosmos:** propagate and handle shutdown message ([ac12e6d](https://github.com/Agoric/agoric-sdk/commit/ac12e6d57b3a50e079744f7a6faced7f4bebb957))
|
|
70
55
|
* **cosmos:** separate swing-store export data from genesis file ([f476bd5](https://github.com/Agoric/agoric-sdk/commit/f476bd50fb3ca5df0c4f43b20e059e05a2659b4c))
|
|
@@ -74,8 +59,10 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline
|
|
|
74
59
|
* **cosmos:** support core proposals set by upgrade handler ([605eb4b](https://github.com/Agoric/agoric-sdk/commit/605eb4b8f33d7646c3a9084d43ecd51029e12b80))
|
|
75
60
|
* **cosmos:** support snapshot export ([4386f8e](https://github.com/Agoric/agoric-sdk/commit/4386f8e67136f184b94febb5d65990a26e101cf3))
|
|
76
61
|
* **cosmos:** un-wire x/crisis ([#8582](https://github.com/Agoric/agoric-sdk/issues/8582)) ([7153535](https://github.com/Agoric/agoric-sdk/commit/7153535c5c10fed309dc60f12f981c81841fdb93))
|
|
62
|
+
* **cosmos:** upgrade IBC vat for next release ([c994490](https://github.com/Agoric/agoric-sdk/commit/c99449081560480e7e2dd6fc069b12dbcc630370))
|
|
77
63
|
* **cosmos:** upgrade provisioning vat ([#8901](https://github.com/Agoric/agoric-sdk/issues/8901)) ([174e37d](https://github.com/Agoric/agoric-sdk/commit/174e37d7499b372c33ecaf6e05f82f43ebfff902))
|
|
78
64
|
* **cosmos:** upgrade skips proposals with no variant ([4ce1372](https://github.com/Agoric/agoric-sdk/commit/4ce13721201d9a62a40352d909f97a44d8e5b25d))
|
|
65
|
+
* **cosmos:** upgrade vat-bank ([8727b79](https://github.com/Agoric/agoric-sdk/commit/8727b79cf7b9e520630b793ea963a9f375d9707a))
|
|
79
66
|
* **cosmos:** use `x/vbank` ConsensusVersion to upgrade monitoring ([0e367d3](https://github.com/Agoric/agoric-sdk/commit/0e367d3e9870622acc8a38afe57c2b6cbe629341))
|
|
80
67
|
* **cosmos:** use operational artifact level for swingset state export/restore ([161ddd3](https://github.com/Agoric/agoric-sdk/commit/161ddd34ca6c16da0ad3ef716fa5da3d2ba86b68))
|
|
81
68
|
* **cosmos:** wire in vlocalchain to the Cosmos app ([3ea527d](https://github.com/Agoric/agoric-sdk/commit/3ea527d9844dcf2b5f2c60d1bfb1760e064ec0f7))
|
|
@@ -138,6 +125,7 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline
|
|
|
138
125
|
* **builders:** use proper `oracleBrand` subkey case ([52f02b7](https://github.com/Agoric/agoric-sdk/commit/52f02b75b6706ee455a32ff83617dd5afb7342a7))
|
|
139
126
|
* **cosmic-swingset:** add missing bits for maxVatsOnline ([8c0c177](https://github.com/Agoric/agoric-sdk/commit/8c0c17752f7439db6f7aee9f88be1dedce2a1bf1))
|
|
140
127
|
* **cosmic-swingset:** plumbing for maxVatsOnline ([45a759a](https://github.com/Agoric/agoric-sdk/commit/45a759a71c8abc724618a12dfd8ae72552b9783e))
|
|
128
|
+
* **cosmos-vstorage:** split 'size_delta' counter into 'size_increase' and 'size_decrease' ([#11063](https://github.com/Agoric/agoric-sdk/issues/11063)) ([3825031](https://github.com/Agoric/agoric-sdk/commit/38250315cedf68dc801b75bee867818a3846fae7)), closes [#11062](https://github.com/Agoric/agoric-sdk/issues/11062) [#10938](https://github.com/Agoric/agoric-sdk/issues/10938) [/github.com/Agoric/agoric-sdk/pull/10997#discussion_r1956583919](https://github.com/Agoric//github.com/Agoric/agoric-sdk/pull/10997/issues/discussion_r1956583919)
|
|
141
129
|
* **cosmos:** add action context to core evals ([7cfae88](https://github.com/Agoric/agoric-sdk/commit/7cfae88a1d2c31d91030a8742972d9f03d331059))
|
|
142
130
|
* **cosmos:** Add support for iavl options ([c6770ec](https://github.com/Agoric/agoric-sdk/commit/c6770ece8dd7f3f56c40b3cb80be245a99e01c9d))
|
|
143
131
|
* **cosmos:** correctly detect presence of Agoric VM ([c7e266e](https://github.com/Agoric/agoric-sdk/commit/c7e266e035cc454bf74e88e96959f862ece146f8))
|
package/app/app.go
CHANGED
package/app/upgrade.go
CHANGED
|
@@ -3,9 +3,6 @@ package gaia
|
|
|
3
3
|
import (
|
|
4
4
|
"encoding/json"
|
|
5
5
|
"fmt"
|
|
6
|
-
"reflect"
|
|
7
|
-
"strings"
|
|
8
|
-
"text/template"
|
|
9
6
|
|
|
10
7
|
"github.com/Agoric/agoric-sdk/golang/cosmos/vm"
|
|
11
8
|
swingsetkeeper "github.com/Agoric/agoric-sdk/golang/cosmos/x/swingset/keeper"
|
|
@@ -15,11 +12,7 @@ import (
|
|
|
15
12
|
)
|
|
16
13
|
|
|
17
14
|
var upgradeNamesOfThisVersion = []string{
|
|
18
|
-
"agoric-upgrade-
|
|
19
|
-
"agoric-upgrade-19-devnet",
|
|
20
|
-
"agoric-upgrade-19-emerynet",
|
|
21
|
-
"agoric-upgrade-19-a3p",
|
|
22
|
-
"agoric-upgrade-19-basic",
|
|
15
|
+
"agoric-upgrade-20",
|
|
23
16
|
}
|
|
24
17
|
|
|
25
18
|
// isUpgradeNameOfThisVersion returns whether the provided plan name is a
|
|
@@ -53,11 +46,7 @@ func isPrimaryUpgradeName(name string) bool {
|
|
|
53
46
|
return false
|
|
54
47
|
}
|
|
55
48
|
switch name {
|
|
56
|
-
case validUpgradeName("agoric-upgrade-
|
|
57
|
-
validUpgradeName("agoric-upgrade-19-devnet"),
|
|
58
|
-
validUpgradeName("agoric-upgrade-19-emerynet"),
|
|
59
|
-
validUpgradeName("agoric-upgrade-19-a3p"),
|
|
60
|
-
validUpgradeName("agoric-upgrade-19-basic"):
|
|
49
|
+
case validUpgradeName("agoric-upgrade-20"):
|
|
61
50
|
return true
|
|
62
51
|
default:
|
|
63
52
|
panic(fmt.Errorf("unexpected upgrade name %s", validUpgradeName(name)))
|
|
@@ -75,60 +64,45 @@ func isFirstTimeUpgradeOfThisVersion(app *GaiaApp, ctx sdk.Context) bool {
|
|
|
75
64
|
return true
|
|
76
65
|
}
|
|
77
66
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
}`))
|
|
84
|
-
|
|
85
|
-
var args []byte
|
|
86
|
-
var err error
|
|
87
|
-
if extra == nil {
|
|
88
|
-
// The specified entrypoint will be called with no extra arguments after powers.
|
|
89
|
-
args = []byte(`[]`)
|
|
90
|
-
} else if reflect.TypeOf(extra).Kind() == reflect.Map && reflect.TypeOf(extra).Key().Kind() == reflect.String {
|
|
91
|
-
// The specified entrypoint will be called with this options argument after powers.
|
|
92
|
-
args, err = json.Marshal([]any{extra})
|
|
93
|
-
} else if reflect.TypeOf(extra).Kind() == reflect.Slice {
|
|
94
|
-
// The specified entrypoint will be called with each of these arguments after powers.
|
|
95
|
-
args, err = json.Marshal(extra)
|
|
96
|
-
} else {
|
|
97
|
-
return nil, fmt.Errorf("proposal extra must be nil, array, or string map, not %v", extra)
|
|
98
|
-
}
|
|
67
|
+
// buildProposalStepWithArgs returns a CoreProposal representing invocation of
|
|
68
|
+
// the specified module-specific entry point with arbitrary Jsonable arguments
|
|
69
|
+
// provided after core-eval powers.
|
|
70
|
+
func buildProposalStepWithArgs(moduleName string, entrypoint string, args ...vm.Jsonable) (vm.CoreProposalStep, error) {
|
|
71
|
+
argsBz, err := json.Marshal(args)
|
|
99
72
|
if err != nil {
|
|
100
73
|
return nil, err
|
|
101
74
|
}
|
|
102
75
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
"
|
|
106
|
-
"
|
|
107
|
-
|
|
108
|
-
|
|
76
|
+
mea := struct {
|
|
77
|
+
Module string `json:"module"`
|
|
78
|
+
Entrypoint string `json:"entrypoint"`
|
|
79
|
+
Args json.RawMessage `json:"args"`
|
|
80
|
+
}{
|
|
81
|
+
Module: moduleName,
|
|
82
|
+
Entrypoint: entrypoint,
|
|
83
|
+
Args: argsBz,
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
jsonBz, err := json.Marshal(mea)
|
|
109
87
|
if err != nil {
|
|
110
88
|
return nil, err
|
|
111
89
|
}
|
|
112
|
-
|
|
113
|
-
jsonBz := []byte(jsonStr)
|
|
114
|
-
if !json.Valid(jsonBz) {
|
|
115
|
-
return nil, fmt.Errorf("invalid JSON: %s", jsonStr)
|
|
116
|
-
}
|
|
90
|
+
|
|
117
91
|
proposal := vm.ArbitraryCoreProposal{Json: jsonBz}
|
|
118
92
|
return vm.CoreProposalStepForModules(proposal), nil
|
|
119
93
|
}
|
|
120
94
|
|
|
121
95
|
func getVariantFromUpgradeName(upgradeName string) string {
|
|
122
96
|
switch upgradeName {
|
|
123
|
-
case "
|
|
97
|
+
case "UNRELEASED_A3P_INTEGRATION":
|
|
124
98
|
return "A3P_INTEGRATION"
|
|
125
|
-
case "
|
|
99
|
+
case "UNRELEASED_main":
|
|
126
100
|
return "MAINNET"
|
|
127
|
-
case "
|
|
101
|
+
case "UNRELEASED_devnet":
|
|
128
102
|
return "DEVNET"
|
|
129
|
-
case "
|
|
103
|
+
case "UNRELEASED_emerynet":
|
|
130
104
|
return "EMERYNET"
|
|
131
|
-
case "
|
|
105
|
+
case "UNRELEASED_BASIC":
|
|
132
106
|
// Noupgrade for this version.
|
|
133
107
|
return ""
|
|
134
108
|
default:
|
|
@@ -136,14 +110,6 @@ func getVariantFromUpgradeName(upgradeName string) string {
|
|
|
136
110
|
}
|
|
137
111
|
}
|
|
138
112
|
|
|
139
|
-
func upgradeMintHolderCoreProposal(targetUpgrade string) (vm.CoreProposalStep, error) {
|
|
140
|
-
return buildProposalStepFromScript(targetUpgrade, "@agoric/builders/scripts/vats/upgrade-mintHolder.js")
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
func restartFeeDistributorCoreProposal(targetUpgrade string) (vm.CoreProposalStep, error) {
|
|
144
|
-
return buildProposalStepFromScript(targetUpgrade, "@agoric/builders/scripts/inter-protocol/replace-feeDistributor-combo.js")
|
|
145
|
-
}
|
|
146
|
-
|
|
147
113
|
func buildProposalStepFromScript(targetUpgrade string, builderScript string) (vm.CoreProposalStep, error) {
|
|
148
114
|
variant := getVariantFromUpgradeName(targetUpgrade)
|
|
149
115
|
|
|
@@ -154,14 +120,17 @@ func buildProposalStepFromScript(targetUpgrade string, builderScript string) (vm
|
|
|
154
120
|
return buildProposalStepWithArgs(
|
|
155
121
|
builderScript,
|
|
156
122
|
"defaultProposalBuilder",
|
|
157
|
-
|
|
158
|
-
|
|
123
|
+
// Map iteration is randomised; use an anonymous struct instead.
|
|
124
|
+
struct {
|
|
125
|
+
Variant string `json:"variant"`
|
|
126
|
+
}{
|
|
127
|
+
Variant: variant,
|
|
159
128
|
},
|
|
160
129
|
)
|
|
161
130
|
}
|
|
162
131
|
|
|
163
|
-
//
|
|
164
|
-
func
|
|
132
|
+
// upgrade20Handler performs standard upgrade actions plus custom actions for upgrade-20.
|
|
133
|
+
func upgrade20Handler(app *GaiaApp, targetUpgrade string) func(sdk.Context, upgradetypes.Plan, module.VersionMap) (module.VersionMap, error) {
|
|
165
134
|
return func(ctx sdk.Context, plan upgradetypes.Plan, fromVm module.VersionMap) (module.VersionMap, error) {
|
|
166
135
|
app.CheckControllerInited(false)
|
|
167
136
|
|
|
@@ -180,6 +149,11 @@ func upgrade19Handler(app *GaiaApp, targetUpgrade string) func(sdk.Context, upgr
|
|
|
180
149
|
// Each CoreProposalStep runs sequentially, and can be constructed from
|
|
181
150
|
// one or more modules executing in parallel within the step.
|
|
182
151
|
CoreProposalSteps = append(CoreProposalSteps,
|
|
152
|
+
// Orchestration vats: Fix memory leak in vow tools
|
|
153
|
+
// vat-ibc (included in orchestration): Accommodate string sequence numbers.
|
|
154
|
+
vm.CoreProposalStepForModules(
|
|
155
|
+
"@agoric/builders/scripts/vats/upgrade-orchestration.js",
|
|
156
|
+
),
|
|
183
157
|
// Register a new ZCF to be used for all future contract instances and upgrades
|
|
184
158
|
vm.CoreProposalStepForModules(
|
|
185
159
|
"@agoric/builders/scripts/vats/upgrade-zcf.js",
|
|
@@ -189,40 +163,11 @@ func upgrade19Handler(app *GaiaApp, targetUpgrade string) func(sdk.Context, upgr
|
|
|
189
163
|
vm.CoreProposalStepForModules(
|
|
190
164
|
"@agoric/builders/scripts/smart-wallet/build-wallet-factory2-upgrade.js",
|
|
191
165
|
),
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
upgradeMintHolderStep, err := upgradeMintHolderCoreProposal(targetUpgrade)
|
|
195
|
-
if err != nil {
|
|
196
|
-
return nil, err
|
|
197
|
-
} else if upgradeMintHolderStep != nil {
|
|
198
|
-
CoreProposalSteps = append(CoreProposalSteps, upgradeMintHolderStep)
|
|
199
|
-
}
|
|
200
|
-
restartFeeDistributorStep, err := restartFeeDistributorCoreProposal(targetUpgrade)
|
|
201
|
-
if err != nil {
|
|
202
|
-
return nil, err
|
|
203
|
-
} else if restartFeeDistributorStep != nil {
|
|
204
|
-
CoreProposalSteps = append(CoreProposalSteps, restartFeeDistributorStep)
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
CoreProposalSteps = append(CoreProposalSteps,
|
|
208
|
-
vm.CoreProposalStepForModules(
|
|
209
|
-
"@agoric/builders/scripts/vats/upgrade-paRegistry.js",
|
|
210
|
-
),
|
|
211
|
-
vm.CoreProposalStepForModules(
|
|
212
|
-
"@agoric/builders/scripts/vats/upgrade-provisionPool.js",
|
|
213
|
-
),
|
|
166
|
+
// vat-bank is slowly leaking, possibly because of the liveslots resolved promise leak
|
|
167
|
+
// (https://github.com/Agoric/agoric-sdk/issues/11118). Restart to pick up the fix.
|
|
214
168
|
vm.CoreProposalStepForModules(
|
|
215
169
|
"@agoric/builders/scripts/vats/upgrade-bank.js",
|
|
216
170
|
),
|
|
217
|
-
vm.CoreProposalStepForModules(
|
|
218
|
-
"@agoric/builders/scripts/vats/upgrade-agoricNames.js",
|
|
219
|
-
),
|
|
220
|
-
vm.CoreProposalStepForModules(
|
|
221
|
-
"@agoric/builders/scripts/vats/upgrade-asset-reserve.js",
|
|
222
|
-
),
|
|
223
|
-
vm.CoreProposalStepForModules(
|
|
224
|
-
"@agoric/builders/scripts/vats/upgrade-psm.js",
|
|
225
|
-
),
|
|
226
171
|
)
|
|
227
172
|
}
|
|
228
173
|
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
package gaia
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"testing"
|
|
5
|
+
|
|
6
|
+
"github.com/Agoric/agoric-sdk/golang/cosmos/vm"
|
|
7
|
+
"github.com/stretchr/testify/assert"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
func TestBuildProposalSteps(t *testing.T) {
|
|
11
|
+
testCases := []struct {
|
|
12
|
+
name string
|
|
13
|
+
makeStep func() (vm.CoreProposalStep, error)
|
|
14
|
+
expectedJson string
|
|
15
|
+
}{
|
|
16
|
+
{
|
|
17
|
+
"buildProposalStepFromScript",
|
|
18
|
+
func() (vm.CoreProposalStep, error) {
|
|
19
|
+
return buildProposalStepFromScript(
|
|
20
|
+
"UNRELEASED_A3P_INTEGRATION",
|
|
21
|
+
"@agoric/builders/scripts/vats/upgrade-orchestration.js",
|
|
22
|
+
)
|
|
23
|
+
},
|
|
24
|
+
`{"module":"@agoric/builders/scripts/vats/upgrade-orchestration.js",` +
|
|
25
|
+
`"entrypoint":"defaultProposalBuilder",` +
|
|
26
|
+
`"args":[{"variant":"A3P_INTEGRATION"}]}`,
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"buildProposalStepWithArgs",
|
|
30
|
+
func() (vm.CoreProposalStep, error) {
|
|
31
|
+
return buildProposalStepWithArgs(
|
|
32
|
+
"@agoric/builders/scripts/vats/upgrade-vats.js",
|
|
33
|
+
"upgradeVatsProposalBuilder",
|
|
34
|
+
// Map iteration is randomised; use an anonymous struct instead.
|
|
35
|
+
struct {
|
|
36
|
+
Ibc string `json:"ibc"`
|
|
37
|
+
}{
|
|
38
|
+
Ibc: "@agoric/vats/src/vat-ibc.js",
|
|
39
|
+
},
|
|
40
|
+
)
|
|
41
|
+
},
|
|
42
|
+
`{"module":"@agoric/builders/scripts/vats/upgrade-vats.js",` +
|
|
43
|
+
`"entrypoint":"upgradeVatsProposalBuilder",` +
|
|
44
|
+
`"args":[{"ibc":"@agoric/vats/src/vat-ibc.js"}]}`,
|
|
45
|
+
},
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
for _, tc := range testCases {
|
|
49
|
+
t.Run(tc.name, func(t *testing.T) {
|
|
50
|
+
ps, err := tc.makeStep()
|
|
51
|
+
|
|
52
|
+
assert.NoError(t, err)
|
|
53
|
+
expected := vm.CoreProposalStepForModules(*vm.NewArbitraryCoreProposal(
|
|
54
|
+
tc.expectedJson,
|
|
55
|
+
))
|
|
56
|
+
|
|
57
|
+
assert.EqualValues(t, len(expected), len(ps), "Expected length %d to be %d", len(expected), len(ps))
|
|
58
|
+
for i, prop := range ps {
|
|
59
|
+
assert.EqualValues(t, expected[i], prop, "Expected %d to be %v, got %v", i, expected[i], prop)
|
|
60
|
+
}
|
|
61
|
+
})
|
|
62
|
+
}
|
|
63
|
+
}
|
package/git-revision.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
8e4207fa19
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agoric/cosmos",
|
|
3
|
-
"version": "0.35.0-
|
|
3
|
+
"version": "0.35.0-u20.0",
|
|
4
4
|
"description": "Connect JS to the Cosmos blockchain SDK",
|
|
5
5
|
"parsers": {
|
|
6
6
|
"js": "mjs"
|
|
@@ -38,5 +38,5 @@
|
|
|
38
38
|
"typeCoverage": {
|
|
39
39
|
"atLeast": 0
|
|
40
40
|
},
|
|
41
|
-
"gitHead": "
|
|
41
|
+
"gitHead": "8e4207fa19dabf76c1f91f8779b5b5b93570ecea"
|
|
42
42
|
}
|
package/types/address_hooks.go
CHANGED
|
@@ -8,8 +8,6 @@ import (
|
|
|
8
8
|
"github.com/cosmos/cosmos-sdk/types/bech32"
|
|
9
9
|
|
|
10
10
|
transfertypes "github.com/cosmos/ibc-go/v6/modules/apps/transfer/types"
|
|
11
|
-
clienttypes "github.com/cosmos/ibc-go/v6/modules/core/02-client/types"
|
|
12
|
-
channeltypes "github.com/cosmos/ibc-go/v6/modules/core/04-channel/types"
|
|
13
11
|
ibcexported "github.com/cosmos/ibc-go/v6/modules/core/exported"
|
|
14
12
|
)
|
|
15
13
|
|
|
@@ -176,7 +174,7 @@ func extractBaseTransferData(transferData transfertypes.FungibleTokenPacketData,
|
|
|
176
174
|
// address is exactly the original address.
|
|
177
175
|
// If newPacket is not nil, it is populated with a new transfer packet whose
|
|
178
176
|
// corresponding Sender or Receiver is replaced with the extracted base address.
|
|
179
|
-
func ExtractBaseAddressFromPacket(cdc codec.Codec, packet ibcexported.PacketI, role AddressRole, newPacket *
|
|
177
|
+
func ExtractBaseAddressFromPacket(cdc codec.Codec, packet ibcexported.PacketI, role AddressRole, newPacket *IBCPacket) (string, error) {
|
|
180
178
|
var newDataP *[]byte
|
|
181
179
|
if newPacket != nil {
|
|
182
180
|
// Capture the data for the new packet.
|
|
@@ -192,13 +190,8 @@ func ExtractBaseAddressFromPacket(cdc codec.Codec, packet ibcexported.PacketI, r
|
|
|
192
190
|
}
|
|
193
191
|
|
|
194
192
|
// Create a new packet with the new transfer packet data.
|
|
195
|
-
*newPacket =
|
|
196
|
-
|
|
197
|
-
packet.GetSourcePort(), packet.GetSourceChannel(),
|
|
198
|
-
packet.GetDestPort(), packet.GetDestChannel(),
|
|
199
|
-
clienttypes.MustParseHeight(packet.GetTimeoutHeight().String()),
|
|
200
|
-
packet.GetTimeoutTimestamp(),
|
|
201
|
-
)
|
|
193
|
+
*newPacket = CopyToIBCPacket(packet)
|
|
194
|
+
newPacket.Data = *newDataP
|
|
202
195
|
|
|
203
196
|
return target, nil
|
|
204
197
|
}
|
|
@@ -12,7 +12,7 @@ import (
|
|
|
12
12
|
clienttypes "github.com/cosmos/ibc-go/v6/modules/core/02-client/types"
|
|
13
13
|
channeltypes "github.com/cosmos/ibc-go/v6/modules/core/04-channel/types"
|
|
14
14
|
|
|
15
|
-
"github.com/Agoric/agoric-sdk/golang/cosmos/types"
|
|
15
|
+
agtypes "github.com/Agoric/agoric-sdk/golang/cosmos/types"
|
|
16
16
|
)
|
|
17
17
|
|
|
18
18
|
func TestSplitHookedAddress(t *testing.T) {
|
|
@@ -49,7 +49,7 @@ func TestSplitHookedAddress(t *testing.T) {
|
|
|
49
49
|
for _, tc := range cases {
|
|
50
50
|
tc := tc
|
|
51
51
|
t.Run(tc.name, func(t *testing.T) {
|
|
52
|
-
baseAddr, hookData, err :=
|
|
52
|
+
baseAddr, hookData, err := agtypes.SplitHookedAddress(tc.hook)
|
|
53
53
|
if len(tc.err) > 0 {
|
|
54
54
|
require.Error(t, err)
|
|
55
55
|
require.Equal(t, tc.err, err.Error())
|
|
@@ -90,9 +90,9 @@ func TestExtractBaseAddress(t *testing.T) {
|
|
|
90
90
|
for _, s := range suffixes {
|
|
91
91
|
s := s
|
|
92
92
|
t.Run(b.name+" "+s.hookStr, func(t *testing.T) {
|
|
93
|
-
addrHook, err :=
|
|
93
|
+
addrHook, err := agtypes.JoinHookedAddress(b.addr, []byte(s.hookStr))
|
|
94
94
|
require.NoError(t, err)
|
|
95
|
-
addr, err :=
|
|
95
|
+
addr, err := agtypes.ExtractBaseAddress(addrHook)
|
|
96
96
|
if s.isErr {
|
|
97
97
|
require.Error(t, err)
|
|
98
98
|
} else {
|
|
@@ -101,7 +101,7 @@ func TestExtractBaseAddress(t *testing.T) {
|
|
|
101
101
|
require.NotEqual(t, b.addr, addr)
|
|
102
102
|
} else {
|
|
103
103
|
require.Equal(t, b.addr, addr)
|
|
104
|
-
addr, hookData, err :=
|
|
104
|
+
addr, hookData, err := agtypes.SplitHookedAddress(addrHook)
|
|
105
105
|
require.NoError(t, err)
|
|
106
106
|
require.Equal(t, b.addr, addr)
|
|
107
107
|
require.Equal(t, s.hookStr, string(hookData))
|
|
@@ -121,48 +121,48 @@ func TestExtractBaseAddressFromPacket(t *testing.T) {
|
|
|
121
121
|
|
|
122
122
|
cosmosAddr := "cosmos1qqxuevtt"
|
|
123
123
|
cosmosHookStr := "?foo=bar&baz=bot#fragment"
|
|
124
|
-
cosmosHook, err :=
|
|
124
|
+
cosmosHook, err := agtypes.JoinHookedAddress(cosmosAddr, []byte(cosmosHookStr))
|
|
125
125
|
require.NoError(t, err)
|
|
126
|
-
addr, hookData, err :=
|
|
126
|
+
addr, hookData, err := agtypes.SplitHookedAddress(cosmosHook)
|
|
127
127
|
require.NoError(t, err)
|
|
128
128
|
require.Equal(t, cosmosAddr, addr)
|
|
129
129
|
require.Equal(t, cosmosHookStr, string(hookData))
|
|
130
130
|
|
|
131
131
|
agoricAddr := "agoric1qqp0e5ys"
|
|
132
132
|
agoricHookStr := "?bingo=again"
|
|
133
|
-
agoricHook, err :=
|
|
133
|
+
agoricHook, err := agtypes.JoinHookedAddress(agoricAddr, []byte(agoricHookStr))
|
|
134
134
|
require.NoError(t, err)
|
|
135
|
-
addr, hookData, err =
|
|
135
|
+
addr, hookData, err = agtypes.SplitHookedAddress(agoricHook)
|
|
136
136
|
require.NoError(t, err)
|
|
137
137
|
require.Equal(t, agoricAddr, addr)
|
|
138
138
|
require.Equal(t, agoricHookStr, string(hookData))
|
|
139
139
|
|
|
140
140
|
cases := []struct {
|
|
141
141
|
name string
|
|
142
|
-
addrs map[
|
|
142
|
+
addrs map[agtypes.AddressRole]struct{ addr, baseAddr string }
|
|
143
143
|
}{
|
|
144
144
|
{"sender has params",
|
|
145
|
-
map[
|
|
146
|
-
|
|
147
|
-
|
|
145
|
+
map[agtypes.AddressRole]struct{ addr, baseAddr string }{
|
|
146
|
+
agtypes.RoleSender: {cosmosHook, "cosmos1qqxuevtt"},
|
|
147
|
+
agtypes.RoleReceiver: {"agoric1qqp0e5ys", "agoric1qqp0e5ys"},
|
|
148
148
|
},
|
|
149
149
|
},
|
|
150
150
|
{"receiver has params",
|
|
151
|
-
map[
|
|
152
|
-
|
|
153
|
-
|
|
151
|
+
map[agtypes.AddressRole]struct{ addr, baseAddr string }{
|
|
152
|
+
agtypes.RoleSender: {"cosmos1qqxuevtt", "cosmos1qqxuevtt"},
|
|
153
|
+
agtypes.RoleReceiver: {agoricHook, "agoric1qqp0e5ys"},
|
|
154
154
|
},
|
|
155
155
|
},
|
|
156
156
|
{"both are base",
|
|
157
|
-
map[
|
|
158
|
-
|
|
159
|
-
|
|
157
|
+
map[agtypes.AddressRole]struct{ addr, baseAddr string }{
|
|
158
|
+
agtypes.RoleSender: {"cosmos1qqxuevtt", "cosmos1qqxuevtt"},
|
|
159
|
+
agtypes.RoleReceiver: {"agoric1qqp0e5ys", "agoric1qqp0e5ys"},
|
|
160
160
|
},
|
|
161
161
|
},
|
|
162
162
|
{"both have params",
|
|
163
|
-
map[
|
|
164
|
-
|
|
165
|
-
|
|
163
|
+
map[agtypes.AddressRole]struct{ addr, baseAddr string }{
|
|
164
|
+
agtypes.RoleSender: {agoricHook, "agoric1qqp0e5ys"},
|
|
165
|
+
agtypes.RoleReceiver: {cosmosHook, "cosmos1qqxuevtt"},
|
|
166
166
|
},
|
|
167
167
|
},
|
|
168
168
|
}
|
|
@@ -170,29 +170,29 @@ func TestExtractBaseAddressFromPacket(t *testing.T) {
|
|
|
170
170
|
for _, tc := range cases {
|
|
171
171
|
tc := tc
|
|
172
172
|
t.Run(tc.name, func(t *testing.T) {
|
|
173
|
-
ftPacketData := transfertypes.NewFungibleTokenPacketData("denom", "100", tc.addrs[
|
|
173
|
+
ftPacketData := transfertypes.NewFungibleTokenPacketData("denom", "100", tc.addrs[agtypes.RoleSender].addr, tc.addrs[agtypes.RoleReceiver].addr, "my-favourite-memo")
|
|
174
174
|
packetBz := ftPacketData.GetBytes()
|
|
175
|
-
packet :=
|
|
175
|
+
packet := agtypes.MakeIBCPacket(packetBz, 1234, "my-port", "my-channel", "their-port", "their-channel", clienttypes.NewHeight(133, 445), 10999)
|
|
176
176
|
|
|
177
177
|
for role, addrs := range tc.addrs {
|
|
178
178
|
addrs := addrs
|
|
179
179
|
role := role
|
|
180
180
|
|
|
181
181
|
t.Run(string(role), func(t *testing.T) {
|
|
182
|
-
baseAddr, err :=
|
|
182
|
+
baseAddr, err := agtypes.ExtractBaseAddress(addrs.addr)
|
|
183
183
|
require.NoError(t, err)
|
|
184
184
|
require.Equal(t, addrs.baseAddr, baseAddr)
|
|
185
185
|
|
|
186
|
-
packetBaseAddr0, err :=
|
|
186
|
+
packetBaseAddr0, err := agtypes.ExtractBaseAddressFromData(cdc, packet.GetData(), role, nil)
|
|
187
187
|
require.NoError(t, err)
|
|
188
188
|
require.Equal(t, addrs.baseAddr, packetBaseAddr0)
|
|
189
189
|
|
|
190
|
-
packetBaseAddr1, err :=
|
|
190
|
+
packetBaseAddr1, err := agtypes.ExtractBaseAddressFromPacket(cdc, packet, role, nil)
|
|
191
191
|
require.NoError(t, err)
|
|
192
192
|
require.Equal(t, addrs.baseAddr, packetBaseAddr1)
|
|
193
193
|
|
|
194
|
-
var newPacket
|
|
195
|
-
packetBaseAddr2, err :=
|
|
194
|
+
var newPacket agtypes.IBCPacket
|
|
195
|
+
packetBaseAddr2, err := agtypes.ExtractBaseAddressFromPacket(cdc, packet, role, &newPacket)
|
|
196
196
|
require.NoError(t, err)
|
|
197
197
|
require.Equal(t, addrs.baseAddr, packetBaseAddr2)
|
|
198
198
|
|
|
@@ -203,10 +203,10 @@ func TestExtractBaseAddressFromPacket(t *testing.T) {
|
|
|
203
203
|
// Check that the only difference between the packet data is the baseAddr.
|
|
204
204
|
packetData := basePacketData
|
|
205
205
|
switch role {
|
|
206
|
-
case
|
|
206
|
+
case agtypes.RoleSender:
|
|
207
207
|
require.Equal(t, addrs.baseAddr, basePacketData.Sender)
|
|
208
208
|
packetData.Sender = addrs.addr
|
|
209
|
-
case
|
|
209
|
+
case agtypes.RoleReceiver:
|
|
210
210
|
require.Equal(t, addrs.baseAddr, basePacketData.Receiver)
|
|
211
211
|
packetData.Receiver = addrs.addr
|
|
212
212
|
default:
|
package/types/codec.go
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
package types
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"github.com/cosmos/cosmos-sdk/codec"
|
|
5
|
+
cdctypes "github.com/cosmos/cosmos-sdk/codec/types"
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
var (
|
|
9
|
+
// packageCdc is the codec used for proto3 JSON serialization of proto.Message
|
|
10
|
+
// data structures that wouldn't otherwise survive round-tripping via a
|
|
11
|
+
// regular "encoding/json" Marshal->JSON.parse.
|
|
12
|
+
//
|
|
13
|
+
// The naïve json.Marshal output for an int64 (64-bit precision) is a JSON
|
|
14
|
+
// number, which is subject to rounding errors when parsed by JavaScript
|
|
15
|
+
// (whose numbers are IEEE 754 binary64 values with only 53-bit precision).
|
|
16
|
+
// The codec.ProtoCodec uses a custom JSON marshaller that converts each int64
|
|
17
|
+
// to and from a string with no loss of precision.
|
|
18
|
+
//
|
|
19
|
+
// The current package's IBCPacket was one such affected data structure, which
|
|
20
|
+
// now implements Marshaler and Unmarshaler interfaces for "encoding/json" to
|
|
21
|
+
// take advantage of the packageCdc.
|
|
22
|
+
packageCdc = codec.NewProtoCodec(cdctypes.NewInterfaceRegistry())
|
|
23
|
+
)
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
package types
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"encoding/json"
|
|
5
|
+
|
|
6
|
+
clienttypes "github.com/cosmos/ibc-go/v6/modules/core/02-client/types"
|
|
7
|
+
channeltypes "github.com/cosmos/ibc-go/v6/modules/core/04-channel/types"
|
|
8
|
+
"github.com/cosmos/ibc-go/v6/modules/core/exported"
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
var _ json.Marshaler = IBCPacket{}
|
|
12
|
+
var _ json.Unmarshaler = (*IBCPacket)(nil)
|
|
13
|
+
var _ exported.PacketI = IBCPacket{}
|
|
14
|
+
|
|
15
|
+
type IBCPacket struct {
|
|
16
|
+
channeltypes.Packet
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
func (p IBCPacket) MarshalJSON() ([]byte, error) {
|
|
20
|
+
return packageCdc.MarshalJSON(&p.Packet)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
func (p *IBCPacket) UnmarshalJSON(bz []byte) error {
|
|
24
|
+
return packageCdc.UnmarshalJSON(bz, &p.Packet)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
func MakeIBCPacket(
|
|
28
|
+
data []byte,
|
|
29
|
+
sequence uint64,
|
|
30
|
+
sourcePort string,
|
|
31
|
+
sourceChannel string,
|
|
32
|
+
destPort string,
|
|
33
|
+
destChannel string,
|
|
34
|
+
timeoutHeight clienttypes.Height,
|
|
35
|
+
timeoutTimestamp uint64,
|
|
36
|
+
) IBCPacket {
|
|
37
|
+
cp := channeltypes.NewPacket(
|
|
38
|
+
data, sequence,
|
|
39
|
+
sourcePort, sourceChannel,
|
|
40
|
+
destPort, destChannel,
|
|
41
|
+
timeoutHeight, timeoutTimestamp,
|
|
42
|
+
)
|
|
43
|
+
return IBCPacket{Packet: cp}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
func CopyToChannelPacket(packet exported.PacketI) channeltypes.Packet {
|
|
47
|
+
timeoutHeight := clienttypes.MustParseHeight(packet.GetTimeoutHeight().String())
|
|
48
|
+
return channeltypes.NewPacket(
|
|
49
|
+
packet.GetData(), packet.GetSequence(),
|
|
50
|
+
packet.GetSourcePort(), packet.GetSourceChannel(),
|
|
51
|
+
packet.GetDestPort(), packet.GetDestChannel(),
|
|
52
|
+
timeoutHeight, packet.GetTimeoutTimestamp(),
|
|
53
|
+
)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
func CopyToIBCPacket(packet exported.PacketI) IBCPacket {
|
|
57
|
+
timeoutHeight := clienttypes.MustParseHeight(packet.GetTimeoutHeight().String())
|
|
58
|
+
return MakeIBCPacket(
|
|
59
|
+
packet.GetData(), packet.GetSequence(),
|
|
60
|
+
packet.GetSourcePort(), packet.GetSourceChannel(),
|
|
61
|
+
packet.GetDestPort(), packet.GetDestChannel(),
|
|
62
|
+
timeoutHeight, packet.GetTimeoutTimestamp(),
|
|
63
|
+
)
|
|
64
|
+
}
|