@amadeus-protocol/sdk 1.0.8 → 1.1.1
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/README.md +215 -30
- package/dist/api/chain.d.ts +144 -117
- package/dist/api/chain.d.ts.map +1 -1
- package/dist/api/chain.js +175 -146
- package/dist/api/chain.js.map +1 -1
- package/dist/api/contract.d.ts +78 -60
- package/dist/api/contract.d.ts.map +1 -1
- package/dist/api/contract.js +102 -75
- package/dist/api/contract.js.map +1 -1
- package/dist/api/epoch.d.ts +65 -66
- package/dist/api/epoch.d.ts.map +1 -1
- package/dist/api/epoch.js +90 -98
- package/dist/api/epoch.js.map +1 -1
- package/dist/api/peer.d.ts +77 -78
- package/dist/api/peer.d.ts.map +1 -1
- package/dist/api/peer.js +93 -94
- package/dist/api/peer.js.map +1 -1
- package/dist/api/proof.d.ts +44 -23
- package/dist/api/proof.d.ts.map +1 -1
- package/dist/api/proof.js +56 -29
- package/dist/api/proof.js.map +1 -1
- package/dist/api/transaction.d.ts +68 -69
- package/dist/api/transaction.d.ts.map +1 -1
- package/dist/api/transaction.js +84 -84
- package/dist/api/transaction.js.map +1 -1
- package/dist/api/wallet.d.ts +36 -37
- package/dist/api/wallet.d.ts.map +1 -1
- package/dist/api/wallet.js +47 -50
- package/dist/api/wallet.js.map +1 -1
- package/dist/client.d.ts +66 -68
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +231 -276
- package/dist/client.js.map +1 -1
- package/dist/constants.d.ts +13 -10
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +49 -45
- package/dist/constants.js.map +1 -1
- package/dist/contract-state.d.ts +6 -3
- package/dist/contract-state.d.ts.map +1 -1
- package/dist/contract-state.js +88 -106
- package/dist/contract-state.js.map +1 -1
- package/dist/contracts/abi-types.d.ts +32 -32
- package/dist/contracts/abi-types.d.ts.map +1 -1
- package/dist/contracts/coin.d.ts +13 -20
- package/dist/contracts/coin.d.ts.map +1 -1
- package/dist/contracts/coin.js +42 -38
- package/dist/contracts/coin.js.map +1 -1
- package/dist/contracts/contract-call.d.ts +14 -16
- package/dist/contracts/contract-call.d.ts.map +1 -1
- package/dist/contracts/contract-call.js +45 -54
- package/dist/contracts/contract-call.js.map +1 -1
- package/dist/contracts/contract.d.ts +24 -55
- package/dist/contracts/contract.d.ts.map +1 -1
- package/dist/contracts/contract.js +63 -101
- package/dist/contracts/contract.js.map +1 -1
- package/dist/contracts/lockup/abi.d.ts +54 -51
- package/dist/contracts/lockup/abi.d.ts.map +1 -1
- package/dist/contracts/lockup/abi.js +65 -74
- package/dist/contracts/lockup/abi.js.map +1 -1
- package/dist/contracts/lockup/helpers.d.ts +22 -18
- package/dist/contracts/lockup/helpers.d.ts.map +1 -1
- package/dist/contracts/lockup/helpers.js +44 -47
- package/dist/contracts/lockup/helpers.js.map +1 -1
- package/dist/contracts/lockup/parsers.d.ts +7 -3
- package/dist/contracts/lockup/parsers.d.ts.map +1 -1
- package/dist/contracts/lockup/parsers.js +51 -55
- package/dist/contracts/lockup/parsers.js.map +1 -1
- package/dist/contracts/lockup/storage-keys.d.ts +5 -2
- package/dist/contracts/lockup/storage-keys.d.ts.map +1 -1
- package/dist/contracts/lockup/storage-keys.js +54 -70
- package/dist/contracts/lockup/storage-keys.js.map +1 -1
- package/dist/contracts/lockup/types.d.ts +73 -70
- package/dist/contracts/lockup/types.d.ts.map +1 -1
- package/dist/contracts/lockup-prime/abi.d.ts +328 -325
- package/dist/contracts/lockup-prime/abi.d.ts.map +1 -1
- package/dist/contracts/lockup-prime/abi.js +397 -417
- package/dist/contracts/lockup-prime/abi.js.map +1 -1
- package/dist/contracts/lockup-prime/helpers.d.ts +35 -31
- package/dist/contracts/lockup-prime/helpers.d.ts.map +1 -1
- package/dist/contracts/lockup-prime/helpers.js +131 -137
- package/dist/contracts/lockup-prime/helpers.js.map +1 -1
- package/dist/contracts/lockup-prime/parsers.d.ts +9 -5
- package/dist/contracts/lockup-prime/parsers.d.ts.map +1 -1
- package/dist/contracts/lockup-prime/parsers.js +61 -61
- package/dist/contracts/lockup-prime/parsers.js.map +1 -1
- package/dist/contracts/lockup-prime/storage-keys.d.ts +7 -4
- package/dist/contracts/lockup-prime/storage-keys.d.ts.map +1 -1
- package/dist/contracts/lockup-prime/storage-keys.js +64 -80
- package/dist/contracts/lockup-prime/storage-keys.js.map +1 -1
- package/dist/contracts/lockup-prime/types.d.ts +92 -89
- package/dist/contracts/lockup-prime/types.d.ts.map +1 -1
- package/dist/contracts/lockup-prime/types.js +12 -13
- package/dist/contracts/lockup-prime/types.js.map +1 -1
- package/dist/contracts/nft/abi.d.ts +104 -0
- package/dist/contracts/nft/abi.d.ts.map +1 -0
- package/dist/contracts/nft/abi.js +135 -0
- package/dist/contracts/nft/abi.js.map +1 -0
- package/dist/contracts/nft/helpers.d.ts +21 -0
- package/dist/contracts/nft/helpers.d.ts.map +1 -0
- package/dist/contracts/nft/helpers.js +61 -0
- package/dist/contracts/nft/helpers.js.map +1 -0
- package/dist/contracts/nft/types.d.ts +47 -0
- package/dist/contracts/nft/types.d.ts.map +1 -0
- package/dist/conversion.d.ts +5 -2
- package/dist/conversion.d.ts.map +1 -1
- package/dist/conversion.js +45 -50
- package/dist/conversion.js.map +1 -1
- package/dist/crypto.d.ts +14 -16
- package/dist/crypto.d.ts.map +1 -1
- package/dist/crypto.js +121 -140
- package/dist/crypto.js.map +1 -1
- package/dist/encoding.d.ts +11 -8
- package/dist/encoding.d.ts.map +1 -1
- package/dist/encoding.js +123 -144
- package/dist/encoding.js.map +1 -1
- package/dist/encryption.d.ts +15 -12
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +119 -117
- package/dist/encryption.js.map +1 -1
- package/dist/explorer.d.ts +10 -7
- package/dist/explorer.d.ts.map +1 -1
- package/dist/explorer.js +51 -48
- package/dist/explorer.js.map +1 -1
- package/dist/formatters.d.ts +8 -5
- package/dist/formatters.d.ts.map +1 -1
- package/dist/formatters.js +67 -68
- package/dist/formatters.js.map +1 -1
- package/dist/index.d.ts +42 -55
- package/dist/index.js +39 -55
- package/dist/mnemonic.d.ts +12 -9
- package/dist/mnemonic.d.ts.map +1 -1
- package/dist/mnemonic.js +105 -114
- package/dist/mnemonic.js.map +1 -1
- package/dist/networks.d.ts +14 -17
- package/dist/networks.d.ts.map +1 -1
- package/dist/networks.js +40 -36
- package/dist/networks.js.map +1 -1
- package/dist/schemas.js +75 -79
- package/dist/schemas.js.map +1 -1
- package/dist/sdk.d.ts +69 -65
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +126 -117
- package/dist/sdk.js.map +1 -1
- package/dist/serialization.d.ts +8 -18
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +207 -260
- package/dist/serialization.js.map +1 -1
- package/dist/signing.js +67 -67
- package/dist/signing.js.map +1 -1
- package/dist/transaction-builder.d.ts +175 -184
- package/dist/transaction-builder.d.ts.map +1 -1
- package/dist/transaction-builder.js +295 -344
- package/dist/transaction-builder.js.map +1 -1
- package/dist/transaction-errors.d.ts +10 -12
- package/dist/transaction-errors.d.ts.map +1 -1
- package/dist/transaction-errors.js +145 -166
- package/dist/transaction-errors.js.map +1 -1
- package/dist/types.d.ts +530 -450
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +169 -183
- package/dist/types.js.map +1 -1
- package/dist/validation.d.ts +24 -26
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +194 -192
- package/dist/validation.js.map +1 -1
- package/package.json +4 -3
- package/dist/api/index.d.ts +0 -8
- package/dist/api/index.d.ts.map +0 -1
- package/dist/api/index.js +0 -8
- package/dist/api/index.js.map +0 -1
- package/dist/contracts/abi-types.js +0 -8
- package/dist/contracts/abi-types.js.map +0 -1
- package/dist/contracts/index.d.ts +0 -7
- package/dist/contracts/index.d.ts.map +0 -1
- package/dist/contracts/index.js +0 -7
- package/dist/contracts/index.js.map +0 -1
- package/dist/contracts/lockup/calls.d.ts +0 -23
- package/dist/contracts/lockup/calls.d.ts.map +0 -1
- package/dist/contracts/lockup/calls.js +0 -25
- package/dist/contracts/lockup/calls.js.map +0 -1
- package/dist/contracts/lockup/index.d.ts +0 -6
- package/dist/contracts/lockup/index.d.ts.map +0 -1
- package/dist/contracts/lockup/index.js +0 -6
- package/dist/contracts/lockup/index.js.map +0 -1
- package/dist/contracts/lockup/types.js +0 -7
- package/dist/contracts/lockup/types.js.map +0 -1
- package/dist/contracts/lockup-prime/calls.d.ts +0 -53
- package/dist/contracts/lockup-prime/calls.d.ts.map +0 -1
- package/dist/contracts/lockup-prime/calls.js +0 -60
- package/dist/contracts/lockup-prime/calls.js.map +0 -1
- package/dist/contracts/lockup-prime/index.d.ts +0 -6
- package/dist/contracts/lockup-prime/index.d.ts.map +0 -1
- package/dist/contracts/lockup-prime/index.js +0 -6
- package/dist/contracts/lockup-prime/index.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/schemas.d.ts +0 -67
- package/dist/schemas.d.ts.map +0 -1
- package/dist/signing.d.ts +0 -39
- package/dist/signing.d.ts.map +0 -1
package/dist/serialization.d.ts
CHANGED
|
@@ -1,18 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* This module implements the VecPack canonical serialization format used by Amadeus.
|
|
5
|
-
* VecPack provides deterministic, canonical encoding of values for use in cryptographic
|
|
6
|
-
* operations (e.g., transaction signing). It ensures that equivalent data structures
|
|
7
|
-
* always serialize to the same byte sequence through canonical ordering of map keys.
|
|
8
|
-
*
|
|
9
|
-
* Format specification:
|
|
10
|
-
* - Supports: null, booleans, integers (varint), bytes, lists, and maps
|
|
11
|
-
* - Maps/objects are sorted by their encoded key bytes for canonical ordering
|
|
12
|
-
* - Varints are limited to 16 bytes maximum
|
|
13
|
-
* - Zero values are encoded as a single 0x00 byte
|
|
14
|
-
*/
|
|
15
|
-
import type { DecodedValue, SerializableValue } from './types';
|
|
1
|
+
import { DecodedValue, SerializableValue } from "./types.js";
|
|
2
|
+
|
|
3
|
+
//#region src/serialization.d.ts
|
|
16
4
|
/**
|
|
17
5
|
* Encode a value into canonical serialization format
|
|
18
6
|
*
|
|
@@ -25,7 +13,7 @@ import type { DecodedValue, SerializableValue } from './types';
|
|
|
25
13
|
* const encoded = encode({ foo: 'bar', count: 42 })
|
|
26
14
|
* ```
|
|
27
15
|
*/
|
|
28
|
-
|
|
16
|
+
declare function encode(term: SerializableValue): Uint8Array;
|
|
29
17
|
/**
|
|
30
18
|
* Decode a value from canonical serialization format
|
|
31
19
|
*
|
|
@@ -38,7 +26,7 @@ export declare function encode(term: SerializableValue): Uint8Array;
|
|
|
38
26
|
* const decoded = decode(encodedBytes)
|
|
39
27
|
* ```
|
|
40
28
|
*/
|
|
41
|
-
|
|
29
|
+
declare function decode(bytes: Uint8Array | number[]): DecodedValue;
|
|
42
30
|
/**
|
|
43
31
|
* Decode VecPack-encoded contract state into key-value pairs
|
|
44
32
|
*
|
|
@@ -60,5 +48,7 @@ export declare function decode(bytes: Uint8Array | number[]): DecodedValue;
|
|
|
60
48
|
* }
|
|
61
49
|
* ```
|
|
62
50
|
*/
|
|
63
|
-
|
|
51
|
+
declare function decodeContractState(bytes: Uint8Array | ArrayBuffer): Array<[Uint8Array, Uint8Array]>;
|
|
52
|
+
//#endregion
|
|
53
|
+
export { decode, decodeContractState, encode };
|
|
64
54
|
//# sourceMappingURL=serialization.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialization.d.ts","
|
|
1
|
+
{"version":3,"file":"serialization.d.ts","names":[],"sources":["../src/serialization.ts"],"mappings":";;;;;;;;;AA0FA;;;;;;iBAjDgB,MAAA,CAAO,IAAA,EAAM,iBAAA,GAAoB,UAAA;;;;;;;;;;;;;iBAkBjC,MAAA,CAAO,KAAA,EAAO,UAAA,cAAwB,YAAA;;;;;;;;;;;;;;;;;;;;;;iBA+BtC,mBAAA,CACf,KAAA,EAAO,UAAA,GAAa,WAAA,GAClB,KAAA,EAAO,UAAA,EAAY,UAAA"}
|
package/dist/serialization.js
CHANGED
|
@@ -1,284 +1,231 @@
|
|
|
1
|
+
//#region src/serialization.ts
|
|
1
2
|
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const TYPE_NULL =
|
|
16
|
-
const TYPE_TRUE =
|
|
17
|
-
const TYPE_FALSE =
|
|
18
|
-
const TYPE_INT =
|
|
19
|
-
const TYPE_BYTES =
|
|
20
|
-
const TYPE_LIST =
|
|
21
|
-
const TYPE_MAP =
|
|
3
|
+
* VecPack Canonical Serialization Format
|
|
4
|
+
*
|
|
5
|
+
* This module implements the VecPack canonical serialization format used by Amadeus.
|
|
6
|
+
* VecPack provides deterministic, canonical encoding of values for use in cryptographic
|
|
7
|
+
* operations (e.g., transaction signing). It ensures that equivalent data structures
|
|
8
|
+
* always serialize to the same byte sequence through canonical ordering of map keys.
|
|
9
|
+
*
|
|
10
|
+
* Format specification:
|
|
11
|
+
* - Supports: null, booleans, integers (varint), bytes, lists, and maps
|
|
12
|
+
* - Maps/objects are sorted by their encoded key bytes for canonical ordering
|
|
13
|
+
* - Varints are limited to 16 bytes maximum
|
|
14
|
+
* - Zero values are encoded as a single 0x00 byte
|
|
15
|
+
*/
|
|
16
|
+
const TYPE_NULL = 0;
|
|
17
|
+
const TYPE_TRUE = 1;
|
|
18
|
+
const TYPE_FALSE = 2;
|
|
19
|
+
const TYPE_INT = 3;
|
|
20
|
+
const TYPE_BYTES = 5;
|
|
21
|
+
const TYPE_LIST = 6;
|
|
22
|
+
const TYPE_MAP = 7;
|
|
22
23
|
/**
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
24
|
+
* Encode a value into canonical serialization format
|
|
25
|
+
*
|
|
26
|
+
* @param term - The value to encode
|
|
27
|
+
* @returns Encoded bytes as Uint8Array
|
|
28
|
+
* @throws Error if the value contains unsupported types
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* const encoded = encode({ foo: 'bar', count: 42 })
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
function encode(term) {
|
|
36
|
+
const bytesOut = [];
|
|
37
|
+
encodeTerm(term, bytesOut);
|
|
38
|
+
return new Uint8Array(bytesOut);
|
|
38
39
|
}
|
|
39
40
|
/**
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
return value;
|
|
41
|
+
* Decode a value from canonical serialization format
|
|
42
|
+
*
|
|
43
|
+
* @param bytes - The encoded bytes to decode
|
|
44
|
+
* @returns Decoded value
|
|
45
|
+
* @throws Error if the bytes are invalid or contain trailing bytes
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```ts
|
|
49
|
+
* const decoded = decode(encodedBytes)
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
function decode(bytes) {
|
|
53
|
+
const data = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);
|
|
54
|
+
const ref = { offset: 0 };
|
|
55
|
+
const value = decodeTerm(data, ref);
|
|
56
|
+
if (ref.offset !== data.length) throw new Error("trailing_bytes");
|
|
57
|
+
return value;
|
|
59
58
|
}
|
|
60
59
|
/**
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
throw new Error('Expected Uint8Array for key and value');
|
|
91
|
-
}
|
|
92
|
-
result.push([key, value]);
|
|
93
|
-
}
|
|
94
|
-
return result;
|
|
60
|
+
* Decode VecPack-encoded contract state into key-value pairs
|
|
61
|
+
*
|
|
62
|
+
* Contract state prefix queries return a VecPack-encoded map where both
|
|
63
|
+
* keys and values are binary (Uint8Array). This convenience function decodes
|
|
64
|
+
* the binary data and returns the entries as an array of tuples.
|
|
65
|
+
*
|
|
66
|
+
* @param bytes - VecPack-encoded bytes (Uint8Array or ArrayBuffer)
|
|
67
|
+
* @returns Array of [key, value] tuples
|
|
68
|
+
* @throws Error if the data is not a valid VecPack map or entries are not binary
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```ts
|
|
72
|
+
* const response = await fetch('/contract/state/prefix?prefix=...')
|
|
73
|
+
* const buffer = await response.arrayBuffer()
|
|
74
|
+
* const entries = decodeContractState(buffer)
|
|
75
|
+
* for (const [key, value] of entries) {
|
|
76
|
+
* console.log(key, value)
|
|
77
|
+
* }
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
function decodeContractState(bytes) {
|
|
81
|
+
const decoded = decode(bytes instanceof ArrayBuffer ? new Uint8Array(bytes) : bytes);
|
|
82
|
+
if (!(decoded instanceof Map)) throw new Error(`Expected MAP type, got ${typeof decoded}`);
|
|
83
|
+
const result = [];
|
|
84
|
+
for (const [key, value] of decoded.entries()) {
|
|
85
|
+
if (!(key instanceof Uint8Array) || !(value instanceof Uint8Array)) throw new Error("Expected Uint8Array for key and value");
|
|
86
|
+
result.push([key, value]);
|
|
87
|
+
}
|
|
88
|
+
return result;
|
|
95
89
|
}
|
|
96
|
-
/*
|
|
97
|
-
* Helper functions for encoding and decoding
|
|
98
|
-
*/
|
|
99
90
|
function appendBytes(out, bytes) {
|
|
100
|
-
|
|
101
|
-
out.push(b);
|
|
102
|
-
}
|
|
91
|
+
for (const b of bytes) out.push(b);
|
|
103
92
|
}
|
|
104
93
|
function compareBytes(a, b) {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
return a[i] - b[i];
|
|
109
|
-
}
|
|
110
|
-
return a.length - b.length; // shorter wins if prefix equal
|
|
94
|
+
const n = Math.min(a.length, b.length);
|
|
95
|
+
for (let i = 0; i < n; i++) if (a[i] !== b[i]) return a[i] - b[i];
|
|
96
|
+
return a.length - b.length;
|
|
111
97
|
}
|
|
112
98
|
function encodeKeyBytes(k) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
99
|
+
const tmp = [];
|
|
100
|
+
encodeTerm(k, tmp);
|
|
101
|
+
return tmp;
|
|
116
102
|
}
|
|
117
103
|
function encodeVarint(n, out) {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
// Rust also rejects leading zero in decode; we don't generate those here
|
|
138
|
-
if (magBytes[0] === 0) {
|
|
139
|
-
throw new Error('varint_leading_zero');
|
|
140
|
-
}
|
|
141
|
-
const header = ((isNegative ? 1 : 0) << 7) | len;
|
|
142
|
-
out.push(header);
|
|
143
|
-
appendBytes(out, magBytes);
|
|
104
|
+
let value = typeof n === "bigint" ? n : BigInt(n);
|
|
105
|
+
if (value === 0n) {
|
|
106
|
+
out.push(0);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const isNegative = value < 0n;
|
|
110
|
+
if (isNegative) value = -value;
|
|
111
|
+
const magBytes = [];
|
|
112
|
+
while (value > 0n) {
|
|
113
|
+
magBytes.push(Number(value & 255n));
|
|
114
|
+
value >>= 8n;
|
|
115
|
+
}
|
|
116
|
+
magBytes.reverse();
|
|
117
|
+
const len = magBytes.length;
|
|
118
|
+
if (len === 0 || len > 16) throw new Error("bad_varint_length");
|
|
119
|
+
if (magBytes[0] === 0) throw new Error("varint_leading_zero");
|
|
120
|
+
const header = (isNegative ? 1 : 0) << 7 | len;
|
|
121
|
+
out.push(header);
|
|
122
|
+
appendBytes(out, magBytes);
|
|
144
123
|
}
|
|
145
124
|
function decodeVarint(data, ref) {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
mag = (mag << 8n) | BigInt(data[ref.offset++]);
|
|
156
|
-
}
|
|
157
|
-
if (signBit === 1) {
|
|
158
|
-
return -mag;
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
return mag;
|
|
162
|
-
}
|
|
125
|
+
const header = data[ref.offset++];
|
|
126
|
+
if (header === 0) return 0n;
|
|
127
|
+
if (header === 128) throw new Error("noncanonical_zero");
|
|
128
|
+
const signBit = header >> 7;
|
|
129
|
+
const length = header & 127;
|
|
130
|
+
let mag = 0n;
|
|
131
|
+
for (let i = 0; i < length; i++) mag = mag << 8n | BigInt(data[ref.offset++]);
|
|
132
|
+
if (signBit === 1) return -mag;
|
|
133
|
+
else return mag;
|
|
163
134
|
}
|
|
164
135
|
function decodeVarintGteZero(data, ref) {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
if (n > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
170
|
-
throw new Error('length_overflow');
|
|
171
|
-
}
|
|
172
|
-
return Number(n);
|
|
136
|
+
const n = decodeVarint(data, ref);
|
|
137
|
+
if (n < 0n) throw new Error("length_is_negative");
|
|
138
|
+
if (n > BigInt(Number.MAX_SAFE_INTEGER)) throw new Error("length_overflow");
|
|
139
|
+
return Number(n);
|
|
173
140
|
}
|
|
174
141
|
function encodeTerm(value, out) {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
out.push(TYPE_MAP);
|
|
221
|
-
encodeVarint(entries.length, out);
|
|
222
|
-
for (const entry of entries) {
|
|
223
|
-
encodeTerm(entry.k, out);
|
|
224
|
-
encodeTerm(entry.v, out);
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
else {
|
|
228
|
-
throw new Error(`Unsupported type: ${typeof value}`);
|
|
229
|
-
}
|
|
142
|
+
if (value === null) out.push(TYPE_NULL);
|
|
143
|
+
else if (typeof value === "boolean") out.push(value ? TYPE_TRUE : TYPE_FALSE);
|
|
144
|
+
else if (typeof value === "number" || typeof value === "bigint") {
|
|
145
|
+
out.push(TYPE_INT);
|
|
146
|
+
encodeVarint(value, out);
|
|
147
|
+
} else if (typeof value === "string") {
|
|
148
|
+
out.push(TYPE_BYTES);
|
|
149
|
+
const utf8 = new TextEncoder().encode(value);
|
|
150
|
+
encodeVarint(utf8.length, out);
|
|
151
|
+
appendBytes(out, utf8);
|
|
152
|
+
} else if (value instanceof Uint8Array) {
|
|
153
|
+
out.push(TYPE_BYTES);
|
|
154
|
+
encodeVarint(value.length, out);
|
|
155
|
+
appendBytes(out, value);
|
|
156
|
+
} else if (Array.isArray(value)) {
|
|
157
|
+
out.push(TYPE_LIST);
|
|
158
|
+
encodeVarint(value.length, out);
|
|
159
|
+
for (const element of value) encodeTerm(element, out);
|
|
160
|
+
} else if (value instanceof Map || typeof value === "object" && !Array.isArray(value) && !(value instanceof Uint8Array)) {
|
|
161
|
+
const entries = [];
|
|
162
|
+
if (value instanceof Map) for (const [k, v] of value.entries()) {
|
|
163
|
+
const bytes = encodeKeyBytes(k);
|
|
164
|
+
entries.push({
|
|
165
|
+
k,
|
|
166
|
+
v,
|
|
167
|
+
bytes
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
else for (const k of Object.keys(value)) {
|
|
171
|
+
const v = value[k];
|
|
172
|
+
const bytes = encodeKeyBytes(k);
|
|
173
|
+
entries.push({
|
|
174
|
+
k,
|
|
175
|
+
v,
|
|
176
|
+
bytes
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
entries.sort((a, b) => compareBytes(a.bytes, b.bytes));
|
|
180
|
+
out.push(TYPE_MAP);
|
|
181
|
+
encodeVarint(entries.length, out);
|
|
182
|
+
for (const entry of entries) {
|
|
183
|
+
encodeTerm(entry.k, out);
|
|
184
|
+
encodeTerm(entry.v, out);
|
|
185
|
+
}
|
|
186
|
+
} else throw new Error(`Unsupported type: ${typeof value}`);
|
|
230
187
|
}
|
|
231
188
|
function decodeTerm(data, ref) {
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
if (compareBytes(keyBytes, prevKeyBytes) <= 0) {
|
|
271
|
-
throw new Error('map_not_canonical');
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
prevKeyBytes = keyBytes;
|
|
275
|
-
const value = decodeTerm(data, ref);
|
|
276
|
-
map.set(key, value);
|
|
277
|
-
}
|
|
278
|
-
return map;
|
|
279
|
-
}
|
|
280
|
-
default:
|
|
281
|
-
throw new Error('decodeBytes: Unknown type');
|
|
282
|
-
}
|
|
189
|
+
if (ref.offset >= data.length) throw new Error("decodeBytes: Out of bounds read");
|
|
190
|
+
switch (data[ref.offset++]) {
|
|
191
|
+
case TYPE_NULL: return null;
|
|
192
|
+
case TYPE_TRUE: return true;
|
|
193
|
+
case TYPE_FALSE: return false;
|
|
194
|
+
case TYPE_INT: return decodeVarint(data, ref);
|
|
195
|
+
case TYPE_BYTES: {
|
|
196
|
+
const length = decodeVarintGteZero(data, ref);
|
|
197
|
+
const bytes = data.slice(ref.offset, ref.offset + length);
|
|
198
|
+
ref.offset += length;
|
|
199
|
+
return bytes;
|
|
200
|
+
}
|
|
201
|
+
case TYPE_LIST: {
|
|
202
|
+
const count = decodeVarintGteZero(data, ref);
|
|
203
|
+
const items = new Array(count);
|
|
204
|
+
for (let i = 0; i < count; i++) items[i] = decodeTerm(data, ref);
|
|
205
|
+
return items;
|
|
206
|
+
}
|
|
207
|
+
case TYPE_MAP: {
|
|
208
|
+
const count = decodeVarintGteZero(data, ref);
|
|
209
|
+
let prevKeyBytes = null;
|
|
210
|
+
const map = /* @__PURE__ */ new Map();
|
|
211
|
+
for (let idx = 0; idx < count; idx++) {
|
|
212
|
+
const kStart = ref.offset;
|
|
213
|
+
const key = decodeTerm(data, ref);
|
|
214
|
+
const kEnd = ref.offset;
|
|
215
|
+
const keyBytes = data.slice(kStart, kEnd);
|
|
216
|
+
if (prevKeyBytes !== null) {
|
|
217
|
+
if (compareBytes(keyBytes, prevKeyBytes) <= 0) throw new Error("map_not_canonical");
|
|
218
|
+
}
|
|
219
|
+
prevKeyBytes = keyBytes;
|
|
220
|
+
const value = decodeTerm(data, ref);
|
|
221
|
+
map.set(key, value);
|
|
222
|
+
}
|
|
223
|
+
return map;
|
|
224
|
+
}
|
|
225
|
+
default: throw new Error("decodeBytes: Unknown type");
|
|
226
|
+
}
|
|
283
227
|
}
|
|
228
|
+
//#endregion
|
|
229
|
+
export { decode, decodeContractState, encode };
|
|
230
|
+
|
|
284
231
|
//# sourceMappingURL=serialization.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialization.js","sourceRoot":"","sources":["../src/serialization.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"serialization.js","names":[],"sources":["../src/serialization.ts"],"sourcesContent":["/**\n * VecPack Canonical Serialization Format\n *\n * This module implements the VecPack canonical serialization format used by Amadeus.\n * VecPack provides deterministic, canonical encoding of values for use in cryptographic\n * operations (e.g., transaction signing). It ensures that equivalent data structures\n * always serialize to the same byte sequence through canonical ordering of map keys.\n *\n * Format specification:\n * - Supports: null, booleans, integers (varint), bytes, lists, and maps\n * - Maps/objects are sorted by their encoded key bytes for canonical ordering\n * - Varints are limited to 16 bytes maximum\n * - Zero values are encoded as a single 0x00 byte\n */\n\nconst TYPE_NULL = 0x00\nconst TYPE_TRUE = 0x01\nconst TYPE_FALSE = 0x02\nconst TYPE_INT = 0x03\nconst TYPE_BYTES = 0x05\nconst TYPE_LIST = 0x06\nconst TYPE_MAP = 0x07\n\nimport type { DecodedValue, SerializableValue } from './types'\n\ninterface DecodeRef {\n\toffset: number\n}\n\n/**\n * Encode a value into canonical serialization format\n *\n * @param term - The value to encode\n * @returns Encoded bytes as Uint8Array\n * @throws Error if the value contains unsupported types\n *\n * @example\n * ```ts\n * const encoded = encode({ foo: 'bar', count: 42 })\n * ```\n */\nexport function encode(term: SerializableValue): Uint8Array {\n\tconst bytesOut: number[] = []\n\tencodeTerm(term, bytesOut)\n\treturn new Uint8Array(bytesOut)\n}\n\n/**\n * Decode a value from canonical serialization format\n *\n * @param bytes - The encoded bytes to decode\n * @returns Decoded value\n * @throws Error if the bytes are invalid or contain trailing bytes\n *\n * @example\n * ```ts\n * const decoded = decode(encodedBytes)\n * ```\n */\nexport function decode(bytes: Uint8Array | number[]): DecodedValue {\n\tconst data = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes)\n\tconst ref: DecodeRef = { offset: 0 }\n\tconst value = decodeTerm(data, ref)\n\tif (ref.offset !== data.length) {\n\t\tthrow new Error('trailing_bytes')\n\t}\n\treturn value\n}\n\n/**\n * Decode VecPack-encoded contract state into key-value pairs\n *\n * Contract state prefix queries return a VecPack-encoded map where both\n * keys and values are binary (Uint8Array). This convenience function decodes\n * the binary data and returns the entries as an array of tuples.\n *\n * @param bytes - VecPack-encoded bytes (Uint8Array or ArrayBuffer)\n * @returns Array of [key, value] tuples\n * @throws Error if the data is not a valid VecPack map or entries are not binary\n *\n * @example\n * ```ts\n * const response = await fetch('/contract/state/prefix?prefix=...')\n * const buffer = await response.arrayBuffer()\n * const entries = decodeContractState(buffer)\n * for (const [key, value] of entries) {\n * console.log(key, value)\n * }\n * ```\n */\nexport function decodeContractState(\n\tbytes: Uint8Array | ArrayBuffer\n): Array<[Uint8Array, Uint8Array]> {\n\tconst data = bytes instanceof ArrayBuffer ? new Uint8Array(bytes) : bytes\n\tconst decoded = decode(data)\n\n\tif (!(decoded instanceof Map)) {\n\t\tthrow new Error(`Expected MAP type, got ${typeof decoded}`)\n\t}\n\n\tconst result: Array<[Uint8Array, Uint8Array]> = []\n\tfor (const [key, value] of decoded.entries()) {\n\t\tif (!(key instanceof Uint8Array) || !(value instanceof Uint8Array)) {\n\t\t\tthrow new Error('Expected Uint8Array for key and value')\n\t\t}\n\t\tresult.push([key, value])\n\t}\n\n\treturn result\n}\n\n/*\n * Helper functions for encoding and decoding\n */\nfunction appendBytes(out: number[], bytes: Uint8Array | number[]): void {\n\tfor (const b of bytes) {\n\t\tout.push(b)\n\t}\n}\n\nfunction compareBytes(a: Uint8Array | number[], b: Uint8Array | number[]): number {\n\tconst n = Math.min(a.length, b.length)\n\tfor (let i = 0; i < n; i++) {\n\t\tif (a[i] !== b[i]) return a[i] - b[i]\n\t}\n\treturn a.length - b.length // shorter wins if prefix equal\n}\n\nfunction encodeKeyBytes(k: SerializableValue): number[] {\n\tconst tmp: number[] = []\n\tencodeTerm(k, tmp)\n\treturn tmp\n}\n\nfunction encodeVarint(n: number | bigint, out: number[]): void {\n\tlet value = typeof n === 'bigint' ? n : BigInt(n)\n\n\tif (value === 0n) {\n\t\tout.push(0)\n\t\treturn\n\t}\n\n\tconst isNegative = value < 0n\n\tif (isNegative) value = -value\n\n\t// build big-endian magnitude\n\tconst magBytes: number[] = []\n\twhile (value > 0n) {\n\t\tmagBytes.push(Number(value & 0xffn))\n\t\tvalue >>= 8n\n\t}\n\tmagBytes.reverse() // now big-endian\n\n\tconst len = magBytes.length\n\tif (len === 0 || len > 16) {\n\t\tthrow new Error('bad_varint_length')\n\t}\n\n\t// Rust also rejects leading zero in decode; we don't generate those here\n\tif (magBytes[0] === 0) {\n\t\tthrow new Error('varint_leading_zero')\n\t}\n\n\tconst header = ((isNegative ? 1 : 0) << 7) | len\n\tout.push(header)\n\tappendBytes(out, magBytes)\n}\n\nfunction decodeVarint(data: Uint8Array, ref: DecodeRef): bigint {\n\tconst header = data[ref.offset++]\n\tif (header === 0) return 0n\n\tif (header === 0x80) throw new Error('noncanonical_zero')\n\n\tconst signBit = header >> 7\n\tconst length = header & 0x7f\n\n\tlet mag = 0n\n\tfor (let i = 0; i < length; i++) {\n\t\tmag = (mag << 8n) | BigInt(data[ref.offset++])\n\t}\n\n\tif (signBit === 1) {\n\t\treturn -mag\n\t} else {\n\t\treturn mag\n\t}\n}\n\nfunction decodeVarintGteZero(data: Uint8Array, ref: DecodeRef): number {\n\tconst n = decodeVarint(data, ref)\n\tif (n < 0n) {\n\t\tthrow new Error('length_is_negative')\n\t}\n\tif (n > BigInt(Number.MAX_SAFE_INTEGER)) {\n\t\tthrow new Error('length_overflow')\n\t}\n\treturn Number(n)\n}\n\nfunction encodeTerm(value: SerializableValue, out: number[]): void {\n\tif (value === null) {\n\t\tout.push(TYPE_NULL)\n\t} else if (typeof value === 'boolean') {\n\t\tout.push(value ? TYPE_TRUE : TYPE_FALSE)\n\t} else if (typeof value === 'number' || typeof value === 'bigint') {\n\t\tout.push(TYPE_INT)\n\t\tencodeVarint(value, out)\n\t} else if (typeof value === 'string') {\n\t\tout.push(TYPE_BYTES)\n\t\tconst utf8 = new TextEncoder().encode(value)\n\t\tencodeVarint(utf8.length, out)\n\t\tappendBytes(out, utf8)\n\t} else if (value instanceof Uint8Array) {\n\t\tout.push(TYPE_BYTES)\n\t\tencodeVarint(value.length, out)\n\t\tappendBytes(out, value)\n\t} else if (Array.isArray(value)) {\n\t\tout.push(TYPE_LIST)\n\t\tencodeVarint(value.length, out)\n\t\tfor (const element of value) {\n\t\t\tencodeTerm(element, out)\n\t\t}\n\t} else if (\n\t\tvalue instanceof Map ||\n\t\t(typeof value === 'object' && !Array.isArray(value) && !(value instanceof Uint8Array))\n\t) {\n\t\tconst entries: Array<{ k: SerializableValue; v: SerializableValue; bytes: number[] }> = []\n\t\tif (value instanceof Map) {\n\t\t\tfor (const [k, v] of value.entries()) {\n\t\t\t\tconst bytes = encodeKeyBytes(k) // encodes key as Term\n\t\t\t\tentries.push({ k, v, bytes })\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const k of Object.keys(value)) {\n\t\t\t\tconst v = value[k]\n\t\t\t\tconst bytes = encodeKeyBytes(k) // k is string; still encoded via encodeValue\n\t\t\t\tentries.push({ k, v, bytes })\n\t\t\t}\n\t\t}\n\t\tentries.sort((a, b) => compareBytes(a.bytes, b.bytes))\n\n\t\tout.push(TYPE_MAP)\n\t\tencodeVarint(entries.length, out)\n\t\tfor (const entry of entries) {\n\t\t\tencodeTerm(entry.k, out)\n\t\t\tencodeTerm(entry.v, out)\n\t\t}\n\t} else {\n\t\tthrow new Error(`Unsupported type: ${typeof value}`)\n\t}\n}\n\nfunction decodeTerm(data: Uint8Array, ref: DecodeRef): DecodedValue {\n\tif (ref.offset >= data.length) {\n\t\tthrow new Error('decodeBytes: Out of bounds read')\n\t}\n\n\tconst type = data[ref.offset++]\n\n\tswitch (type) {\n\t\tcase TYPE_NULL:\n\t\t\treturn null\n\t\tcase TYPE_TRUE:\n\t\t\treturn true\n\t\tcase TYPE_FALSE:\n\t\t\treturn false\n\t\tcase TYPE_INT:\n\t\t\treturn decodeVarint(data, ref)\n\t\tcase TYPE_BYTES: {\n\t\t\tconst length = decodeVarintGteZero(data, ref)\n\t\t\tconst bytes = data.slice(ref.offset, ref.offset + length)\n\t\t\tref.offset += length\n\t\t\treturn bytes\n\t\t}\n\t\tcase TYPE_LIST: {\n\t\t\tconst count = decodeVarintGteZero(data, ref)\n\t\t\tconst items: DecodedValue[] = new Array(count)\n\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\titems[i] = decodeTerm(data, ref)\n\t\t\t}\n\t\t\treturn items\n\t\t}\n\t\tcase TYPE_MAP: {\n\t\t\tconst count = decodeVarintGteZero(data, ref)\n\n\t\t\tlet prevKeyBytes: Uint8Array | null = null\n\t\t\tconst map = new Map<DecodedValue, DecodedValue>()\n\n\t\t\tfor (let idx = 0; idx < count; idx++) {\n\t\t\t\t// canonical check: track raw key bytes\n\t\t\t\tconst kStart = ref.offset\n\t\t\t\tconst key = decodeTerm(data, ref)\n\t\t\t\tconst kEnd = ref.offset\n\t\t\t\tconst keyBytes = data.slice(kStart, kEnd)\n\n\t\t\t\tif (prevKeyBytes !== null) {\n\t\t\t\t\tif (compareBytes(keyBytes, prevKeyBytes) <= 0) {\n\t\t\t\t\t\tthrow new Error('map_not_canonical')\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tprevKeyBytes = keyBytes\n\n\t\t\t\tconst value = decodeTerm(data, ref)\n\t\t\t\tmap.set(key, value)\n\t\t\t}\n\t\t\treturn map\n\t\t}\n\t\tdefault:\n\t\t\tthrow new Error('decodeBytes: Unknown type')\n\t}\n}\n"],"mappings":"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"}
|