@agoric/cosmos 0.34.2-dev-4feddb0.0 → 0.34.2-dev-ddff762.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/git-revision.txt CHANGED
@@ -1 +1 @@
1
- 4feddb0
1
+ ddff762
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agoric/cosmos",
3
- "version": "0.34.2-dev-4feddb0.0+4feddb0",
3
+ "version": "0.34.2-dev-ddff762.0+ddff762",
4
4
  "description": "Connect JS to the Cosmos blockchain SDK",
5
5
  "parsers": {
6
6
  "js": "mjs"
@@ -39,5 +39,5 @@
39
39
  "typeCoverage": {
40
40
  "atLeast": 0
41
41
  },
42
- "gitHead": "4feddb0e0fbdf2343622c7424c6e6d3de013c85d"
42
+ "gitHead": "ddff762be0166b7973abca7bb202901afa494e53"
43
43
  }
@@ -23,9 +23,9 @@ const (
23
23
  BaseAddressLengthBytes = 2
24
24
  )
25
25
 
26
- // AddressHookMagic is a magic byte prefix that identifies a hooked address.
26
+ // AddressHookBytePrefix is a magic prefix that identifies a hooked address.
27
27
  // Chosen to make bech32 address hooks that look like "agoric10rch..."
28
- var AddressHookMagic = []byte{0x78, 0xf1, 0x70 | AddressHookVersion}
28
+ var AddressHookBytePrefix = []byte{0x78, 0xf1, 0x70 /* | AddressHookVersion */}
29
29
 
30
30
  func init() {
31
31
  if AddressHookVersion&0x0f != AddressHookVersion {
@@ -51,12 +51,19 @@ func SplitHookedAddress(addr string) (string, []byte, error) {
51
51
  return "", []byte{}, err
52
52
  }
53
53
 
54
- bz := bytes.TrimPrefix(payload, AddressHookMagic)
55
- if len(bz) == len(payload) {
54
+ lastPrefixHighNibble := AddressHookBytePrefix[len(AddressHookBytePrefix)-1]
55
+ bz := bytes.TrimPrefix(payload, AddressHookBytePrefix[:len(AddressHookBytePrefix)-1])
56
+ if len(bz) == len(payload) || len(bz) == 0 || bz[0]&0xf0 != lastPrefixHighNibble {
56
57
  // Return an unhooked address.
57
58
  return addr, []byte{}, nil
58
59
  }
59
60
 
61
+ version := bz[0] & 0x0f
62
+ bz = bz[1:]
63
+ if version != AddressHookVersion {
64
+ return "", []byte{}, fmt.Errorf("unsupported address hook version %d", version)
65
+ }
66
+
60
67
  if len(bz) < BaseAddressLengthBytes {
61
68
  return "", []byte{}, fmt.Errorf("hooked address must have at least %d bytes", BaseAddressLengthBytes)
62
69
  }
@@ -97,8 +104,9 @@ func JoinHookedAddress(baseAddr string, hookData []byte) (string, error) {
97
104
  return "", fmt.Errorf("base address length 0x%x is longer than the maximum 0x%x", b, maxB)
98
105
  }
99
106
 
100
- payload := make([]byte, 0, len(AddressHookMagic)+b+len(hookData)+BaseAddressLengthBytes)
101
- payload = append(payload, AddressHookMagic...)
107
+ payload := make([]byte, 0, len(AddressHookBytePrefix)+b+len(hookData)+BaseAddressLengthBytes)
108
+ payload = append(payload, AddressHookBytePrefix...)
109
+ payload[len(payload)-1] |= byte(AddressHookVersion)
102
110
  payload = append(payload, bz...)
103
111
  payload = append(payload, hookData...)
104
112
  baLen := make([]byte, BaseAddressLengthBytes)
@@ -15,6 +15,53 @@ import (
15
15
  "github.com/Agoric/agoric-sdk/golang/cosmos/types"
16
16
  )
17
17
 
18
+ func TestSplitHookedAddress(t *testing.T) {
19
+ cases := []struct {
20
+ name string
21
+ hook string
22
+ baseAddr string
23
+ hookData []byte
24
+ err string
25
+ }{
26
+ {"empty", "", "", []byte{}, "decoding bech32 failed: invalid bech32 string length 0"},
27
+ {"no hook", "agoric1qqp0e5ys", "agoric1qqp0e5ys", []byte{}, ""},
28
+ {"Fast USDC", "agoric10rchp4vc53apxn32q42c3zryml8xq3xshyzuhjk6405wtxy7tl3d7e0f8az423padaek6me38qekget2vdhx66mtvy6kg7nrw5uhsaekd4uhwufswqex6dtsv44hxv3cd4jkuqpqvduyhf",
29
+ "agoric16kv2g7snfc4q24vg3pjdlnnqgngtjpwtetd2h689nz09lcklvh5s8u37ek",
30
+ []byte("?EUD=osmo183dejcnmkka5dzcu9xw6mywq0p2m5peks28men"),
31
+ ""},
32
+ {"version 0",
33
+ "agoric10rchqqqpqgpsgpgxquyqjzstpsxsurcszyfpxpqrqgqsq9qx0p9wp",
34
+ "agoric1qqqsyqcyq5rqwzqfpg9scrgwpugpzysn3tn9p0",
35
+ []byte{4, 3, 2, 1},
36
+ ""},
37
+ {"version 1 reject",
38
+ "agoric10rchzqqpqgpsgpgxquyqjzstpsxsurcszyfpxpqrqgqsq9q04n2fg",
39
+ "",
40
+ []byte{},
41
+ "unsupported address hook version 1"},
42
+ {"version 15 reject",
43
+ "agoric10rch7qqpqgpsgpgxquyqjzstpsxsurcszyfpxpqrqgqsq9q25ez2d",
44
+ "",
45
+ []byte{},
46
+ "unsupported address hook version 15"},
47
+ }
48
+
49
+ for _, tc := range cases {
50
+ tc := tc
51
+ t.Run(tc.name, func(t *testing.T) {
52
+ baseAddr, hookData, err := types.SplitHookedAddress(tc.hook)
53
+ if len(tc.err) > 0 {
54
+ require.Error(t, err)
55
+ require.Equal(t, tc.err, err.Error())
56
+ } else {
57
+ require.NoError(t, err)
58
+ require.Equal(t, tc.baseAddr, baseAddr)
59
+ require.Equal(t, string(tc.hookData), string(hookData))
60
+ }
61
+ })
62
+ }
63
+ }
64
+
18
65
  func TestExtractBaseAddress(t *testing.T) {
19
66
  bases := []struct {
20
67
  name string