@agoric/cosmos 0.34.2-upgrade-19-dev-ae3bcff.0 → 0.34.2-upgrade-20-dev-31be299.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/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
+ unreleasedUpgradeHandler(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,12 @@ 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
+ "UNRELEASED_BASIC", // no-frills
16
+ "UNRELEASED_A3P_INTEGRATION",
17
+ "UNRELEASED_main",
18
+ "UNRELEASED_devnet",
19
+ "UNRELEASED_emerynet",
20
+ "UNRELEASED_REAPPLY",
23
21
  }
24
22
 
25
23
  // isUpgradeNameOfThisVersion returns whether the provided plan name is a
@@ -53,12 +51,14 @@ func isPrimaryUpgradeName(name string) bool {
53
51
  return false
54
52
  }
55
53
  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"):
54
+ case validUpgradeName("UNRELEASED_BASIC"),
55
+ validUpgradeName("UNRELEASED_A3P_INTEGRATION"),
56
+ validUpgradeName("UNRELEASED_main"),
57
+ validUpgradeName("UNRELEASED_devnet"),
58
+ validUpgradeName("UNRELEASED_emerynet"):
61
59
  return true
60
+ case validUpgradeName("UNRELEASED_REAPPLY"):
61
+ return false
62
62
  default:
63
63
  panic(fmt.Errorf("unexpected upgrade name %s", validUpgradeName(name)))
64
64
  }
@@ -75,60 +75,45 @@ func isFirstTimeUpgradeOfThisVersion(app *GaiaApp, ctx sdk.Context) bool {
75
75
  return true
76
76
  }
77
77
 
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
- }
78
+ // buildProposalStepWithArgs returns a CoreProposal representing invocation of
79
+ // the specified module-specific entry point with arbitrary Jsonable arguments
80
+ // provided after core-eval powers.
81
+ func buildProposalStepWithArgs(moduleName string, entrypoint string, args ...vm.Jsonable) (vm.CoreProposalStep, error) {
82
+ argsBz, err := json.Marshal(args)
99
83
  if err != nil {
100
84
  return nil, err
101
85
  }
102
86
 
103
- var result strings.Builder
104
- err = t.Execute(&result, map[string]any{
105
- "moduleName": moduleName,
106
- "entrypoint": entrypoint,
107
- "args": string(args),
108
- })
87
+ mea := struct {
88
+ Module string `json:"module"`
89
+ Entrypoint string `json:"entrypoint"`
90
+ Args json.RawMessage `json:"args"`
91
+ }{
92
+ Module: moduleName,
93
+ Entrypoint: entrypoint,
94
+ Args: argsBz,
95
+ }
96
+
97
+ jsonBz, err := json.Marshal(mea)
109
98
  if err != nil {
110
99
  return nil, err
111
100
  }
112
- jsonStr := result.String()
113
- jsonBz := []byte(jsonStr)
114
- if !json.Valid(jsonBz) {
115
- return nil, fmt.Errorf("invalid JSON: %s", jsonStr)
116
- }
101
+
117
102
  proposal := vm.ArbitraryCoreProposal{Json: jsonBz}
118
103
  return vm.CoreProposalStepForModules(proposal), nil
119
104
  }
120
105
 
121
106
  func getVariantFromUpgradeName(upgradeName string) string {
122
107
  switch upgradeName {
123
- case "agoric-upgrade-19-a3p":
108
+ case "UNRELEASED_A3P_INTEGRATION":
124
109
  return "A3P_INTEGRATION"
125
- case "agoric-upgrade-19-mainnet":
110
+ case "UNRELEASED_main":
126
111
  return "MAINNET"
127
- case "agoric-upgrade-19-devnet":
112
+ case "UNRELEASED_devnet":
128
113
  return "DEVNET"
129
- case "agoric-upgrade-19-emerynet":
114
+ case "UNRELEASED_emerynet":
130
115
  return "EMERYNET"
131
- case "agoric-upgrade-19-basic":
116
+ case "UNRELEASED_BASIC":
132
117
  // Noupgrade for this version.
133
118
  return ""
134
119
  default:
@@ -136,14 +121,6 @@ func getVariantFromUpgradeName(upgradeName string) string {
136
121
  }
137
122
  }
138
123
 
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
124
  func buildProposalStepFromScript(targetUpgrade string, builderScript string) (vm.CoreProposalStep, error) {
148
125
  variant := getVariantFromUpgradeName(targetUpgrade)
149
126
 
@@ -154,14 +131,17 @@ func buildProposalStepFromScript(targetUpgrade string, builderScript string) (vm
154
131
  return buildProposalStepWithArgs(
155
132
  builderScript,
156
133
  "defaultProposalBuilder",
157
- map[string]any{
158
- "variant": variant,
134
+ // Map iteration is randomised; use an anonymous struct instead.
135
+ struct {
136
+ Variant string `json:"variant"`
137
+ }{
138
+ Variant: variant,
159
139
  },
160
140
  )
161
141
  }
162
142
 
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) {
143
+ // unreleasedUpgradeHandler performs standard upgrade actions plus custom actions for the unreleased upgrade.
144
+ func unreleasedUpgradeHandler(app *GaiaApp, targetUpgrade string) func(sdk.Context, upgradetypes.Plan, module.VersionMap) (module.VersionMap, error) {
165
145
  return func(ctx sdk.Context, plan upgradetypes.Plan, fromVm module.VersionMap) (module.VersionMap, error) {
166
146
  app.CheckControllerInited(false)
167
147
 
@@ -180,6 +160,11 @@ func upgrade19Handler(app *GaiaApp, targetUpgrade string) func(sdk.Context, upgr
180
160
  // Each CoreProposalStep runs sequentially, and can be constructed from
181
161
  // one or more modules executing in parallel within the step.
182
162
  CoreProposalSteps = append(CoreProposalSteps,
163
+ // Orchestration vats: Fix memory leak in vow tools
164
+ // vat-ibc (included in orchestration): Accommodate string sequence numbers.
165
+ vm.CoreProposalStepForModules(
166
+ "@agoric/builders/scripts/vats/upgrade-orchestration.js",
167
+ ),
183
168
  // Register a new ZCF to be used for all future contract instances and upgrades
184
169
  vm.CoreProposalStepForModules(
185
170
  "@agoric/builders/scripts/vats/upgrade-zcf.js",
@@ -189,40 +174,11 @@ func upgrade19Handler(app *GaiaApp, targetUpgrade string) func(sdk.Context, upgr
189
174
  vm.CoreProposalStepForModules(
190
175
  "@agoric/builders/scripts/smart-wallet/build-wallet-factory2-upgrade.js",
191
176
  ),
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
- ),
177
+ // vat-bank is slowly leaking, possibly because of the liveslots resolved promise leak
178
+ // (https://github.com/Agoric/agoric-sdk/issues/11118). Restart to pick up the fix.
214
179
  vm.CoreProposalStepForModules(
215
180
  "@agoric/builders/scripts/vats/upgrade-bank.js",
216
181
  ),
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
182
  )
227
183
  }
228
184
 
@@ -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
- ae3bcff
1
+ 31be299
package/go.mod CHANGED
@@ -204,7 +204,7 @@ replace (
204
204
  github.com/cosmos/iavl => github.com/cosmos/iavl v0.19.7
205
205
 
206
206
  // Use a version of ibc-go that is compatible with the above forks.
207
- github.com/cosmos/ibc-go/v6 => github.com/agoric-labs/ibc-go/v6 v6.3.1-alpha.agoric.2
207
+ github.com/cosmos/ibc-go/v6 => github.com/agoric-labs/ibc-go/v6 v6.3.1-alpha.agoric.4
208
208
 
209
209
  // use cometbft
210
210
  // Use our fork at least until post-v0.34.14 is released with
package/go.sum CHANGED
@@ -235,8 +235,8 @@ github.com/agoric-labs/cosmos-sdk v0.46.16-alpha.agoric.2.5 h1:cwbONQaVbGEPzfVqv
235
235
  github.com/agoric-labs/cosmos-sdk v0.46.16-alpha.agoric.2.5/go.mod h1:Yny/YE+GJ+y/++UgvraITGzfLhXCnwETSWw3dAY5NDg=
236
236
  github.com/agoric-labs/cosmos-sdk/ics23/go v0.8.0-alpha.agoric.1 h1:2jvHI/2d+psWAZy6FQ0vXJCHUtfU3ZbbW+pQFL04arQ=
237
237
  github.com/agoric-labs/cosmos-sdk/ics23/go v0.8.0-alpha.agoric.1/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg=
238
- github.com/agoric-labs/ibc-go/v6 v6.3.1-alpha.agoric.2 h1:vEzy4JaExzlWNHV3ZSVXEVZcRE9loEFUjieE2TXwDdI=
239
- github.com/agoric-labs/ibc-go/v6 v6.3.1-alpha.agoric.2/go.mod h1:L1xcBjCLIHN7Wd9j6cAQvZertn56pq+eRGFZjRO5bsY=
238
+ github.com/agoric-labs/ibc-go/v6 v6.3.1-alpha.agoric.4 h1:dlzsn/JzNsMWFh14lRn+pjog4L4C72SH3PNNO93xN+4=
239
+ github.com/agoric-labs/ibc-go/v6 v6.3.1-alpha.agoric.4/go.mod h1:pNhYr/yk5M0b4tWX6Nh+SopaE/YaY0oigx1qwepLlLg=
240
240
  github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
241
241
  github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
242
242
  github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agoric/cosmos",
3
- "version": "0.34.2-upgrade-19-dev-ae3bcff.0+ae3bcff",
3
+ "version": "0.34.2-upgrade-20-dev-31be299.0+31be299",
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": "ae3bcff04c91eee841d9ab310aca64ee903ca12b"
41
+ "gitHead": "31be2992aec21c06633699b7d8095423845b0530"
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
+ }