@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 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-u19.2](https://github.com/Agoric/agoric-sdk/compare/@agoric/cosmos@0.35.0-u19.1...@agoric/cosmos@0.35.0-u19.2) (2025-03-13)
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:** Next Upgrade is agoric-upgrade-19 ([e224889](https://github.com/Agoric/agoric-sdk/commit/e2248899164cf58ecdd086801453a8290fe222df))
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
@@ -894,7 +894,7 @@ func NewAgoricApp(
894
894
  for _, name := range upgradeNamesOfThisVersion {
895
895
  app.UpgradeKeeper.SetUpgradeHandler(
896
896
  name,
897
- upgrade19Handler(app, name),
897
+ upgrade20Handler(app, name),
898
898
  )
899
899
  }
900
900
 
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-mainnet",
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-19-mainnet"),
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
- func buildProposalStepWithArgs(moduleName string, entrypoint string, extra any) (vm.CoreProposalStep, error) {
79
- t := template.Must(template.New("").Parse(`{
80
- "module": "{{.moduleName}}",
81
- "entrypoint": "{{.entrypoint}}",
82
- "args": {{.args}}
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
- var result strings.Builder
104
- err = t.Execute(&result, map[string]any{
105
- "moduleName": moduleName,
106
- "entrypoint": entrypoint,
107
- "args": string(args),
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
- jsonStr := result.String()
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 "agoric-upgrade-19-a3p":
97
+ case "UNRELEASED_A3P_INTEGRATION":
124
98
  return "A3P_INTEGRATION"
125
- case "agoric-upgrade-19-mainnet":
99
+ case "UNRELEASED_main":
126
100
  return "MAINNET"
127
- case "agoric-upgrade-19-devnet":
101
+ case "UNRELEASED_devnet":
128
102
  return "DEVNET"
129
- case "agoric-upgrade-19-emerynet":
103
+ case "UNRELEASED_emerynet":
130
104
  return "EMERYNET"
131
- case "agoric-upgrade-19-basic":
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
- map[string]any{
158
- "variant": variant,
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
- // upgrade19Handler performs standard upgrade actions plus custom actions for upgrade-19.
164
- func upgrade19Handler(app *GaiaApp, targetUpgrade string) func(sdk.Context, upgradetypes.Plan, module.VersionMap) (module.VersionMap, error) {
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
- f0ae74b84c
1
+ 8e4207fa19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agoric/cosmos",
3
- "version": "0.35.0-u19.2",
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": "f0ae74b84cb6de3724bfdcd18b4bea7e8199dee1"
41
+ "gitHead": "8e4207fa19dabf76c1f91f8779b5b5b93570ecea"
42
42
  }
@@ -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 *channeltypes.Packet) (string, error) {
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 = channeltypes.NewPacket(
196
- *newDataP, packet.GetSequence(),
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 := types.SplitHookedAddress(tc.hook)
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 := types.JoinHookedAddress(b.addr, []byte(s.hookStr))
93
+ addrHook, err := agtypes.JoinHookedAddress(b.addr, []byte(s.hookStr))
94
94
  require.NoError(t, err)
95
- addr, err := types.ExtractBaseAddress(addrHook)
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 := types.SplitHookedAddress(addrHook)
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 := types.JoinHookedAddress(cosmosAddr, []byte(cosmosHookStr))
124
+ cosmosHook, err := agtypes.JoinHookedAddress(cosmosAddr, []byte(cosmosHookStr))
125
125
  require.NoError(t, err)
126
- addr, hookData, err := types.SplitHookedAddress(cosmosHook)
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 := types.JoinHookedAddress(agoricAddr, []byte(agoricHookStr))
133
+ agoricHook, err := agtypes.JoinHookedAddress(agoricAddr, []byte(agoricHookStr))
134
134
  require.NoError(t, err)
135
- addr, hookData, err = types.SplitHookedAddress(agoricHook)
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[types.AddressRole]struct{ addr, baseAddr string }
142
+ addrs map[agtypes.AddressRole]struct{ addr, baseAddr string }
143
143
  }{
144
144
  {"sender has params",
145
- map[types.AddressRole]struct{ addr, baseAddr string }{
146
- types.RoleSender: {cosmosHook, "cosmos1qqxuevtt"},
147
- types.RoleReceiver: {"agoric1qqp0e5ys", "agoric1qqp0e5ys"},
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[types.AddressRole]struct{ addr, baseAddr string }{
152
- types.RoleSender: {"cosmos1qqxuevtt", "cosmos1qqxuevtt"},
153
- types.RoleReceiver: {agoricHook, "agoric1qqp0e5ys"},
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[types.AddressRole]struct{ addr, baseAddr string }{
158
- types.RoleSender: {"cosmos1qqxuevtt", "cosmos1qqxuevtt"},
159
- types.RoleReceiver: {"agoric1qqp0e5ys", "agoric1qqp0e5ys"},
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[types.AddressRole]struct{ addr, baseAddr string }{
164
- types.RoleSender: {agoricHook, "agoric1qqp0e5ys"},
165
- types.RoleReceiver: {cosmosHook, "cosmos1qqxuevtt"},
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[types.RoleSender].addr, tc.addrs[types.RoleReceiver].addr, "my-favourite-memo")
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 := channeltypes.NewPacket(packetBz, 1234, "my-port", "my-channel", "their-port", "their-channel", clienttypes.NewHeight(133, 445), 10999)
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 := types.ExtractBaseAddress(addrs.addr)
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 := types.ExtractBaseAddressFromData(cdc, packet.GetData(), role, nil)
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 := types.ExtractBaseAddressFromPacket(cdc, packet, role, nil)
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 channeltypes.Packet
195
- packetBaseAddr2, err := types.ExtractBaseAddressFromPacket(cdc, packet, role, &newPacket)
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 types.RoleSender:
206
+ case agtypes.RoleSender:
207
207
  require.Equal(t, addrs.baseAddr, basePacketData.Sender)
208
208
  packetData.Sender = addrs.addr
209
- case types.RoleReceiver:
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
+ }