@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 +1 -1
- package/package.json +2 -2
- package/types/address_hooks.go +14 -6
- package/types/address_hooks_test.go +47 -0
package/git-revision.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
ddff762
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agoric/cosmos",
|
|
3
|
-
"version": "0.34.2-dev-
|
|
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": "
|
|
42
|
+
"gitHead": "ddff762be0166b7973abca7bb202901afa494e53"
|
|
43
43
|
}
|
package/types/address_hooks.go
CHANGED
|
@@ -23,9 +23,9 @@ const (
|
|
|
23
23
|
BaseAddressLengthBytes = 2
|
|
24
24
|
)
|
|
25
25
|
|
|
26
|
-
//
|
|
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
|
|
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
|
-
|
|
55
|
-
|
|
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(
|
|
101
|
-
payload = append(payload,
|
|
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
|