@kontor/kontor-sdk 1.0.0-alpha.39 → 1.0.0-alpha.40
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 +1 -1
- package/dist/cjs/sdk/actions/kontor/public/call-view.js.map +1 -1
- package/dist/cjs/sdk/chains/definitions/signet.js +2 -2
- package/dist/cjs/sdk/test/e2e.test-deprecated.js +2 -0
- package/dist/cjs/sdk/test/e2e.test-deprecated.js.map +1 -0
- package/dist/cjs/sdk/utils/wit/codecs/bool.js +9 -21
- package/dist/cjs/sdk/utils/wit/codecs/bool.js.map +1 -1
- package/dist/cjs/sdk/utils/wit/codecs/contract-address.js +92 -0
- package/dist/cjs/sdk/utils/wit/codecs/contract-address.js.map +1 -0
- package/dist/cjs/sdk/utils/wit/codecs/index.js +29 -0
- package/dist/cjs/sdk/utils/wit/codecs/index.js.map +1 -0
- package/dist/cjs/sdk/utils/wit/codecs/list.js +21 -95
- package/dist/cjs/sdk/utils/wit/codecs/list.js.map +1 -1
- package/dist/cjs/sdk/utils/wit/codecs/numerics.js +228 -0
- package/dist/cjs/sdk/utils/wit/codecs/numerics.js.map +1 -0
- package/dist/cjs/sdk/utils/wit/codecs/option.js +21 -72
- package/dist/cjs/sdk/utils/wit/codecs/option.js.map +1 -1
- package/dist/cjs/sdk/utils/wit/codecs/result.js +32 -0
- package/dist/cjs/sdk/utils/wit/codecs/result.js.map +1 -0
- package/dist/cjs/sdk/utils/wit/codecs/string.js +16 -21
- package/dist/cjs/sdk/utils/wit/codecs/string.js.map +1 -1
- package/dist/cjs/sdk/utils/wit/codecs/unit.js +11 -19
- package/dist/cjs/sdk/utils/wit/codecs/unit.js.map +1 -1
- package/dist/cjs/sdk/utils/wit/codecs/util.js +185 -0
- package/dist/cjs/sdk/utils/wit/codecs/util.js.map +1 -0
- package/dist/cjs/sdk/utils/wit/decode-wit-parameter.js +297 -163
- package/dist/cjs/sdk/utils/wit/decode-wit-parameter.js.map +1 -1
- package/dist/cjs/sdk/utils/wit/encode-wit-parameters.js +214 -221
- package/dist/cjs/sdk/utils/wit/encode-wit-parameters.js.map +1 -1
- package/dist/cjs/tsconfig.build.tsbuildinfo +1 -1
- package/dist/cjs/wit/built-ins.js +19 -0
- package/dist/cjs/wit/built-ins.js.map +1 -0
- package/dist/cjs/wit/regex.js +1 -1
- package/dist/cjs/wit/regex.js.map +1 -1
- package/dist/cjs/wit/wit-parser/core/errors/signature.js +17 -2
- package/dist/cjs/wit/wit-parser/core/errors/signature.js.map +1 -1
- package/dist/cjs/wit/wit-parser/core/signatures.js +18 -0
- package/dist/cjs/wit/wit-parser/core/signatures.js.map +1 -1
- package/dist/cjs/wit/wit-parser/core/types/{records.js → user-defined.js} +1 -1
- package/dist/cjs/wit/wit-parser/core/types/user-defined.js.map +1 -0
- package/dist/cjs/wit/wit-parser/core/user-defined.js +271 -0
- package/dist/cjs/wit/wit-parser/core/user-defined.js.map +1 -0
- package/dist/cjs/wit/wit-parser/core/utils.js +29 -7
- package/dist/cjs/wit/wit-parser/core/utils.js.map +1 -1
- package/dist/cjs/wit/wit-parser/parse-wit-parameter.js +9 -3
- package/dist/cjs/wit/wit-parser/parse-wit-parameter.js.map +1 -1
- package/dist/cjs/wit/wit-parser/parse-wit.js +7 -3
- package/dist/cjs/wit/wit-parser/parse-wit.js.map +1 -1
- package/dist/esm/sdk/actions/kontor/public/call-view.js.map +1 -1
- package/dist/esm/sdk/chains/definitions/signet.js +2 -2
- package/dist/esm/sdk/test/e2e.test-deprecated.js +197 -0
- package/dist/esm/sdk/test/e2e.test-deprecated.js.map +1 -0
- package/dist/esm/sdk/utils/wit/codecs/bool.js +9 -21
- package/dist/esm/sdk/utils/wit/codecs/bool.js.map +1 -1
- package/dist/esm/sdk/utils/wit/codecs/contract-address.js +92 -0
- package/dist/esm/sdk/utils/wit/codecs/contract-address.js.map +1 -0
- package/dist/esm/sdk/utils/wit/codecs/index.js +9 -0
- package/dist/esm/sdk/utils/wit/codecs/index.js.map +1 -0
- package/dist/esm/sdk/utils/wit/codecs/list.js +20 -114
- package/dist/esm/sdk/utils/wit/codecs/list.js.map +1 -1
- package/dist/esm/sdk/utils/wit/codecs/numerics.js +234 -0
- package/dist/esm/sdk/utils/wit/codecs/numerics.js.map +1 -0
- package/dist/esm/sdk/utils/wit/codecs/option.js +21 -88
- package/dist/esm/sdk/utils/wit/codecs/option.js.map +1 -1
- package/dist/esm/sdk/utils/wit/codecs/result.js +29 -0
- package/dist/esm/sdk/utils/wit/codecs/result.js.map +1 -0
- package/dist/esm/sdk/utils/wit/codecs/string.js +22 -22
- package/dist/esm/sdk/utils/wit/codecs/string.js.map +1 -1
- package/dist/esm/sdk/utils/wit/codecs/unit.js +12 -21
- package/dist/esm/sdk/utils/wit/codecs/unit.js.map +1 -1
- package/dist/esm/sdk/utils/wit/codecs/util.js +181 -0
- package/dist/esm/sdk/utils/wit/codecs/util.js.map +1 -0
- package/dist/esm/sdk/utils/wit/decode-wit-parameter.js +322 -188
- package/dist/esm/sdk/utils/wit/decode-wit-parameter.js.map +1 -1
- package/dist/esm/sdk/utils/wit/encode-wit-parameters.js +230 -233
- package/dist/esm/sdk/utils/wit/encode-wit-parameters.js.map +1 -1
- package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
- package/dist/esm/wit/built-ins.js +16 -0
- package/dist/esm/wit/built-ins.js.map +1 -0
- package/dist/esm/wit/regex.js +1 -1
- package/dist/esm/wit/regex.js.map +1 -1
- package/dist/esm/wit/wit-parser/core/errors/signature.js +15 -1
- package/dist/esm/wit/wit-parser/core/errors/signature.js.map +1 -1
- package/dist/esm/wit/wit-parser/core/signatures.js +14 -0
- package/dist/esm/wit/wit-parser/core/signatures.js.map +1 -1
- package/dist/esm/wit/wit-parser/core/types/signatures.js.map +1 -1
- package/dist/esm/wit/wit-parser/core/types/user-defined.js +2 -0
- package/dist/esm/wit/wit-parser/core/types/user-defined.js.map +1 -0
- package/dist/esm/wit/wit-parser/core/types/utils.js +25 -0
- package/dist/esm/wit/wit-parser/core/types/utils.js.map +1 -1
- package/dist/esm/wit/wit-parser/core/user-defined.js +280 -0
- package/dist/esm/wit/wit-parser/core/user-defined.js.map +1 -0
- package/dist/esm/wit/wit-parser/core/utils.js +33 -36
- package/dist/esm/wit/wit-parser/core/utils.js.map +1 -1
- package/dist/esm/wit/wit-parser/parse-wit-parameter.js +10 -4
- package/dist/esm/wit/wit-parser/parse-wit-parameter.js.map +1 -1
- package/dist/esm/wit/wit-parser/parse-wit.js +8 -4
- package/dist/esm/wit/wit-parser/parse-wit.js.map +1 -1
- package/dist/types/sdk/actions/kontor/public/call-view.d.ts +2 -1
- package/dist/types/sdk/actions/kontor/public/call-view.d.ts.map +1 -1
- package/dist/types/sdk/chains/definitions/signet.d.ts +2 -2
- package/dist/types/sdk/test/e2e.test-deprecated.d.ts +2 -0
- package/dist/types/sdk/test/e2e.test-deprecated.d.ts.map +1 -0
- package/dist/types/sdk/types/contract.d.ts +5 -5
- package/dist/types/sdk/types/contract.d.ts.map +1 -1
- package/dist/types/sdk/utils/wit/codecs/bool.d.ts +2 -2
- package/dist/types/sdk/utils/wit/codecs/bool.d.ts.map +1 -1
- package/dist/types/sdk/utils/wit/codecs/contract-address.d.ts +5 -0
- package/dist/types/sdk/utils/wit/codecs/contract-address.d.ts.map +1 -0
- package/dist/types/sdk/utils/wit/codecs/index.d.ts +9 -0
- package/dist/types/sdk/utils/wit/codecs/index.d.ts.map +1 -0
- package/dist/types/sdk/utils/wit/codecs/list.d.ts +2 -16
- package/dist/types/sdk/utils/wit/codecs/list.d.ts.map +1 -1
- package/dist/types/sdk/utils/wit/codecs/numerics.d.ts +14 -0
- package/dist/types/sdk/utils/wit/codecs/numerics.d.ts.map +1 -0
- package/dist/types/sdk/utils/wit/codecs/option.d.ts +3 -23
- package/dist/types/sdk/utils/wit/codecs/option.d.ts.map +1 -1
- package/dist/types/sdk/utils/wit/codecs/result.d.ts +4 -0
- package/dist/types/sdk/utils/wit/codecs/result.d.ts.map +1 -0
- package/dist/types/sdk/utils/wit/codecs/string.d.ts +6 -2
- package/dist/types/sdk/utils/wit/codecs/string.d.ts.map +1 -1
- package/dist/types/sdk/utils/wit/codecs/types.d.ts +4 -0
- package/dist/types/sdk/utils/wit/codecs/types.d.ts.map +1 -1
- package/dist/types/sdk/utils/wit/codecs/unit.d.ts +2 -11
- package/dist/types/sdk/utils/wit/codecs/unit.d.ts.map +1 -1
- package/dist/types/sdk/utils/wit/codecs/util.d.ts +12 -0
- package/dist/types/sdk/utils/wit/codecs/util.d.ts.map +1 -0
- package/dist/types/sdk/utils/wit/decode-wit-parameter.d.ts +9 -31
- package/dist/types/sdk/utils/wit/decode-wit-parameter.d.ts.map +1 -1
- package/dist/types/sdk/utils/wit/encode-wit-parameters.d.ts +9 -1
- package/dist/types/sdk/utils/wit/encode-wit-parameters.d.ts.map +1 -1
- package/dist/types/wit/built-ins.d.ts +6 -0
- package/dist/types/wit/built-ins.d.ts.map +1 -0
- package/dist/types/wit/regex.d.ts.map +1 -1
- package/dist/types/wit/utils.d.ts +53 -33
- package/dist/types/wit/utils.d.ts.map +1 -1
- package/dist/types/wit/wit-parser/core/errors/signature.d.ts +7 -1
- package/dist/types/wit/wit-parser/core/errors/signature.d.ts.map +1 -1
- package/dist/types/wit/wit-parser/core/signatures.d.ts +10 -0
- package/dist/types/wit/wit-parser/core/signatures.d.ts.map +1 -1
- package/dist/types/wit/wit-parser/core/types/signatures.d.ts +6 -2
- package/dist/types/wit/wit-parser/core/types/signatures.d.ts.map +1 -1
- package/dist/types/wit/wit-parser/core/types/user-defined.d.ts +134 -0
- package/dist/types/wit/wit-parser/core/types/user-defined.d.ts.map +1 -0
- package/dist/types/wit/wit-parser/core/types/utils.d.ts +86 -11
- package/dist/types/wit/wit-parser/core/types/utils.d.ts.map +1 -1
- package/dist/types/wit/wit-parser/core/user-defined.d.ts +19 -0
- package/dist/types/wit/wit-parser/core/user-defined.d.ts.map +1 -0
- package/dist/types/wit/wit-parser/core/utils.d.ts +8 -4
- package/dist/types/wit/wit-parser/core/utils.d.ts.map +1 -1
- package/dist/types/wit/wit-parser/parse-wit-parameter.d.ts +11 -5
- package/dist/types/wit/wit-parser/parse-wit-parameter.d.ts.map +1 -1
- package/dist/types/wit/wit-parser/parse-wit.d.ts +7 -3
- package/dist/types/wit/wit-parser/parse-wit.d.ts.map +1 -1
- package/dist/types/wit/wit.d.ts +20 -12
- package/dist/types/wit/wit.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/sdk/actions/get-contract.test-d.ts +430 -50
- package/src/sdk/actions/get-contract.test.ts +324 -24
- package/src/sdk/actions/kontor/public/call-view.ts +2 -1
- package/src/sdk/actions/kontor/public/proc-contract.test-d.ts +107 -0
- package/src/sdk/actions/kontor/public/proc-contract.test.ts +234 -21
- package/src/sdk/actions/kontor/public/view-contract.test-d.ts +240 -0
- package/src/sdk/actions/kontor/public/view-contract.test.ts +613 -18
- package/src/sdk/chains/definitions/signet.ts +2 -2
- package/src/sdk/clients/base/create-rpc-client.test.ts +2 -2
- package/src/sdk/clients/create-public-client.test.ts +2 -2
- package/src/sdk/clients/kontor/create-public-client.test.ts +2 -2
- package/src/sdk/clients/transports/http-rpc.test.ts +0 -24
- package/src/sdk/test/e2e.test-deprecated.ts +195 -0
- package/src/sdk/types/contract.test-d.ts +489 -55
- package/src/sdk/types/contract.ts +6 -7
- package/src/sdk/utils/wit/codecs/bool.test.ts +29 -0
- package/src/sdk/utils/wit/codecs/bool.ts +10 -25
- package/src/sdk/utils/wit/codecs/contract-address.test.ts +37 -0
- package/src/sdk/utils/wit/codecs/contract-address.ts +114 -0
- package/src/sdk/utils/wit/codecs/index.ts +20 -0
- package/src/sdk/utils/wit/codecs/list.test-d.ts +13 -0
- package/src/sdk/utils/wit/codecs/list.test.ts +55 -0
- package/src/sdk/utils/wit/codecs/list.ts +21 -150
- package/src/sdk/utils/wit/codecs/numerics.test.ts +399 -0
- package/src/sdk/utils/wit/codecs/numerics.ts +304 -0
- package/src/sdk/utils/wit/codecs/option.test.ts +71 -0
- package/src/sdk/utils/wit/codecs/option.ts +21 -120
- package/src/sdk/utils/wit/codecs/result.test.ts +82 -0
- package/src/sdk/utils/wit/codecs/result.ts +37 -0
- package/src/sdk/utils/wit/codecs/string.test.ts +62 -0
- package/src/sdk/utils/wit/codecs/string.ts +23 -25
- package/src/sdk/utils/wit/codecs/types.ts +5 -0
- package/src/sdk/utils/wit/codecs/unit.test.ts +27 -0
- package/src/sdk/utils/wit/codecs/unit.ts +14 -38
- package/src/sdk/utils/wit/codecs/util.test.ts +221 -0
- package/src/sdk/utils/wit/codecs/util.ts +193 -0
- package/src/sdk/utils/wit/decode-wit-parameter.test.ts +1264 -32
- package/src/sdk/utils/wit/decode-wit-parameter.ts +508 -211
- package/src/sdk/utils/wit/encode-wit-parameters.test.ts +955 -91
- package/src/sdk/utils/wit/encode-wit-parameters.ts +277 -274
- package/src/sdk/utils/wit/get-wit-item.test.ts +1 -1
- package/src/wit/built-ins.ts +23 -0
- package/src/wit/regex.ts +1 -1
- package/src/wit/utils.ts +120 -74
- package/src/wit/wit-parser/core/errors/signature.ts +13 -2
- package/src/wit/wit-parser/core/signatures.ts +28 -0
- package/src/wit/wit-parser/core/types/signatures.test-d.ts +21 -0
- package/src/wit/wit-parser/core/types/signatures.ts +19 -2
- package/src/wit/wit-parser/core/types/user-defined.test-d.ts +1308 -0
- package/src/wit/wit-parser/core/types/user-defined.ts +412 -0
- package/src/wit/wit-parser/core/types/utils.test-d.ts +43 -2
- package/src/wit/wit-parser/core/types/utils.ts +143 -14
- package/src/wit/wit-parser/core/user-defined.test.ts +609 -0
- package/src/wit/wit-parser/core/user-defined.ts +392 -0
- package/src/wit/wit-parser/core/utils.test.ts +334 -115
- package/src/wit/wit-parser/core/utils.ts +54 -38
- package/src/wit/wit-parser/parse-wit-parameter.test.ts +282 -4
- package/src/wit/wit-parser/parse-wit-parameter.ts +37 -11
- package/src/wit/wit-parser/parse-wit.test.ts +738 -12
- package/src/wit/wit-parser/parse-wit.ts +25 -10
- package/src/wit/wit.ts +37 -16
- package/vitest.config.ts +5 -0
- package/dist/cjs/sdk/utils/wit/codecs/decimal.js +0 -148
- package/dist/cjs/sdk/utils/wit/codecs/decimal.js.map +0 -1
- package/dist/cjs/sdk/utils/wit/codecs/enum.js +0 -94
- package/dist/cjs/sdk/utils/wit/codecs/enum.js.map +0 -1
- package/dist/cjs/sdk/utils/wit/codecs/integer.js +0 -125
- package/dist/cjs/sdk/utils/wit/codecs/integer.js.map +0 -1
- package/dist/cjs/sdk/utils/wit/codecs/s64.js +0 -57
- package/dist/cjs/sdk/utils/wit/codecs/s64.js.map +0 -1
- package/dist/cjs/sdk/utils/wit/codecs/u64.js +0 -56
- package/dist/cjs/sdk/utils/wit/codecs/u64.js.map +0 -1
- package/dist/cjs/wit/wit-parser/core/records.js +0 -70
- package/dist/cjs/wit/wit-parser/core/records.js.map +0 -1
- package/dist/cjs/wit/wit-parser/core/types/records.js.map +0 -1
- package/dist/esm/sdk/utils/wit/codecs/decimal.js +0 -165
- package/dist/esm/sdk/utils/wit/codecs/decimal.js.map +0 -1
- package/dist/esm/sdk/utils/wit/codecs/enum.js +0 -104
- package/dist/esm/sdk/utils/wit/codecs/enum.js.map +0 -1
- package/dist/esm/sdk/utils/wit/codecs/integer.js +0 -167
- package/dist/esm/sdk/utils/wit/codecs/integer.js.map +0 -1
- package/dist/esm/sdk/utils/wit/codecs/s64.js +0 -65
- package/dist/esm/sdk/utils/wit/codecs/s64.js.map +0 -1
- package/dist/esm/sdk/utils/wit/codecs/u64.js +0 -63
- package/dist/esm/sdk/utils/wit/codecs/u64.js.map +0 -1
- package/dist/esm/wit/wit-parser/core/records.js +0 -73
- package/dist/esm/wit/wit-parser/core/records.js.map +0 -1
- package/dist/esm/wit/wit-parser/core/types/records.js +0 -2
- package/dist/esm/wit/wit-parser/core/types/records.js.map +0 -1
- package/dist/types/sdk/utils/wit/codecs/decimal.d.ts +0 -42
- package/dist/types/sdk/utils/wit/codecs/decimal.d.ts.map +0 -1
- package/dist/types/sdk/utils/wit/codecs/enum.d.ts +0 -49
- package/dist/types/sdk/utils/wit/codecs/enum.d.ts.map +0 -1
- package/dist/types/sdk/utils/wit/codecs/integer.d.ts +0 -36
- package/dist/types/sdk/utils/wit/codecs/integer.d.ts.map +0 -1
- package/dist/types/sdk/utils/wit/codecs/s64.d.ts +0 -23
- package/dist/types/sdk/utils/wit/codecs/s64.d.ts.map +0 -1
- package/dist/types/sdk/utils/wit/codecs/u64.d.ts +0 -23
- package/dist/types/sdk/utils/wit/codecs/u64.d.ts.map +0 -1
- package/dist/types/wit/wit-parser/core/records.d.ts +0 -4
- package/dist/types/wit/wit-parser/core/records.d.ts.map +0 -1
- package/dist/types/wit/wit-parser/core/types/records.d.ts +0 -51
- package/dist/types/wit/wit-parser/core/types/records.d.ts.map +0 -1
- package/src/sdk/test/e2e.test.ts +0 -194
- package/src/sdk/utils/wit/codecs/decimal.ts +0 -215
- package/src/sdk/utils/wit/codecs/enum.ts +0 -114
- package/src/sdk/utils/wit/codecs/integer.ts +0 -193
- package/src/sdk/utils/wit/codecs/s64.ts +0 -76
- package/src/sdk/utils/wit/codecs/u64.ts +0 -73
- package/src/wit/wit-parser/core/records.test.ts +0 -69
- package/src/wit/wit-parser/core/records.ts +0 -101
- package/src/wit/wit-parser/core/types/records.test-d.ts +0 -331
- package/src/wit/wit-parser/core/types/records.ts +0 -91
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { ContractAddressCodec } from "./contract-address.js";
|
|
3
|
+
|
|
4
|
+
describe("ContractAddressCodec (i64 wire)", () => {
|
|
5
|
+
it("encodes string -> wave struct (raw asserted)", () => {
|
|
6
|
+
expect(ContractAddressCodec.encodeWave("foo_123_7")).toBe(
|
|
7
|
+
`{name: "foo", height: 123, tx_index: 7}`,
|
|
8
|
+
);
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it("decodes wave struct -> string", () => {
|
|
12
|
+
expect(
|
|
13
|
+
ContractAddressCodec.decodeWave(
|
|
14
|
+
`{name: "foo", height: 123, tx_index: 7}`,
|
|
15
|
+
),
|
|
16
|
+
).toBe("foo_123_7");
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
it("supports negative i64 values (within JS safe integer range)", () => {
|
|
20
|
+
expect(
|
|
21
|
+
ContractAddressCodec.decodeWave(`{name: "foo", height: -1, tx_index: 0}`),
|
|
22
|
+
).toBe("foo_-1_0");
|
|
23
|
+
|
|
24
|
+
expect(ContractAddressCodec.encodeWave("foo_-1_0")).toBe(
|
|
25
|
+
`{name: "foo", height: -1, tx_index: 0}`,
|
|
26
|
+
);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it("rejects i64 values beyond JS safe integer range", () => {
|
|
30
|
+
// 2^63-1 fits i64 but not JS safe int
|
|
31
|
+
expect(() =>
|
|
32
|
+
ContractAddressCodec.decodeWave(
|
|
33
|
+
`{name: "foo", height: 9223372036854775807, tx_index: 0}`,
|
|
34
|
+
),
|
|
35
|
+
).toThrow("height exceeds JS safe integer range");
|
|
36
|
+
});
|
|
37
|
+
});
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { Codec } from "./types.js";
|
|
2
|
+
import { stripOuter, splitTopLevelComma, splitTopLevelColon } from "./util.js";
|
|
3
|
+
import { StringCodec } from "./string.js";
|
|
4
|
+
import type { ResolvedRegister } from "../../../../wit/register.js";
|
|
5
|
+
|
|
6
|
+
export type ContractAddress = ResolvedRegister["contractAddress"];
|
|
7
|
+
|
|
8
|
+
type ContractAddressWave = {
|
|
9
|
+
name: string;
|
|
10
|
+
height: number; // safe JS number
|
|
11
|
+
tx_index: number; // safe JS number
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const I64_MIN = -(1n << 63n);
|
|
15
|
+
const I64_MAX = (1n << 63n) - 1n;
|
|
16
|
+
|
|
17
|
+
function parseI64AsSafeNumber(expr: string, ctx: string): number {
|
|
18
|
+
const s = expr.trim().replace(/_/g, "");
|
|
19
|
+
if (!/^[+-]?\d+$/.test(s)) throw new Error(`invalid integer: ${ctx}`);
|
|
20
|
+
|
|
21
|
+
const bi = BigInt(s);
|
|
22
|
+
if (bi < I64_MIN || bi > I64_MAX) throw new Error(`${ctx} out of range`);
|
|
23
|
+
|
|
24
|
+
// ensure round-trip safe as number
|
|
25
|
+
const n = Number(bi);
|
|
26
|
+
if (!Number.isSafeInteger(n)) {
|
|
27
|
+
throw new Error(`${ctx} exceeds JS safe integer range`);
|
|
28
|
+
}
|
|
29
|
+
return n;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function encodeI64FromSafeNumber(n: number, ctx: string): string {
|
|
33
|
+
if (!Number.isFinite(n) || !Number.isInteger(n)) {
|
|
34
|
+
throw new Error(`invalid integer: ${ctx}`);
|
|
35
|
+
}
|
|
36
|
+
if (!Number.isSafeInteger(n)) {
|
|
37
|
+
throw new Error(`${ctx} exceeds JS safe integer range`);
|
|
38
|
+
}
|
|
39
|
+
const bi = BigInt(n);
|
|
40
|
+
if (bi < I64_MIN || bi > I64_MAX) throw new Error(`${ctx} out of range`);
|
|
41
|
+
return bi.toString(10);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function parseContractAddressWave(expr: string): ContractAddressWave {
|
|
45
|
+
const { inner, hadOuter } = stripOuter(expr, "{", "}");
|
|
46
|
+
if (!hadOuter) throw new Error(`invalid contract address: ${expr}`);
|
|
47
|
+
|
|
48
|
+
const inside = inner.trim();
|
|
49
|
+
if (!inside) throw new Error(`invalid contract address: ${expr}`);
|
|
50
|
+
|
|
51
|
+
const parts = splitTopLevelComma(inside);
|
|
52
|
+
const out: Partial<ContractAddressWave> = {};
|
|
53
|
+
|
|
54
|
+
for (const part of parts) {
|
|
55
|
+
const [k, v] = splitTopLevelColon(part);
|
|
56
|
+
switch (k) {
|
|
57
|
+
case "name":
|
|
58
|
+
out.name = StringCodec.decodeWave(v);
|
|
59
|
+
break;
|
|
60
|
+
case "height":
|
|
61
|
+
out.height = parseI64AsSafeNumber(v, "height");
|
|
62
|
+
break;
|
|
63
|
+
case "tx_index":
|
|
64
|
+
out.tx_index = parseI64AsSafeNumber(v, "tx_index");
|
|
65
|
+
break;
|
|
66
|
+
default:
|
|
67
|
+
throw new Error(`unexpected key "${k}" in contract address`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (out.name === undefined) throw new Error(`missing required key "name"`);
|
|
72
|
+
if (out.height === undefined)
|
|
73
|
+
throw new Error(`missing required key "height"`);
|
|
74
|
+
if (out.tx_index === undefined)
|
|
75
|
+
throw new Error(`missing required key "tx_index"`);
|
|
76
|
+
|
|
77
|
+
return out as ContractAddressWave;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// NOTE: This TS encoding is ambiguous if name contains "_".
|
|
81
|
+
// If underscores are valid in contract names, switch to a different TS representation.
|
|
82
|
+
function toDefaultString(a: ContractAddressWave): ContractAddress {
|
|
83
|
+
if (a.name.includes("_")) throw new Error(`contract name cannot contain "_"`);
|
|
84
|
+
return `${a.name}_${a.height}_${a.tx_index}` as ContractAddress;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function fromDefaultString(s: ContractAddress): ContractAddressWave {
|
|
88
|
+
const raw = String(s);
|
|
89
|
+
const parts = raw.split("_");
|
|
90
|
+
if (parts.length !== 3) throw new Error(`invalid contract address: ${raw}`);
|
|
91
|
+
|
|
92
|
+
const [name, heightStr, txIndexStr] = parts;
|
|
93
|
+
if (!name) throw new Error(`invalid contract address: ${raw}`);
|
|
94
|
+
|
|
95
|
+
const height = parseI64AsSafeNumber(heightStr!, "height");
|
|
96
|
+
const tx_index = parseI64AsSafeNumber(txIndexStr!, "tx_index");
|
|
97
|
+
|
|
98
|
+
return { name, height, tx_index };
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export const ContractAddressCodec: Codec<ContractAddress> = {
|
|
102
|
+
decodeWave(expr: string): ContractAddress {
|
|
103
|
+
return toDefaultString(parseContractAddressWave(expr));
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
encodeWave(value: ContractAddress): string {
|
|
107
|
+
const a = fromDefaultString(value);
|
|
108
|
+
|
|
109
|
+
return `{name: ${StringCodec.encodeWave(a.name)}, height: ${encodeI64FromSafeNumber(
|
|
110
|
+
a.height,
|
|
111
|
+
"height",
|
|
112
|
+
)}, tx_index: ${encodeI64FromSafeNumber(a.tx_index, "tx_index")}}`;
|
|
113
|
+
},
|
|
114
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export { BoolCodec } from "./bool.js";
|
|
2
|
+
export { ListCodec } from "./list.js";
|
|
3
|
+
export {
|
|
4
|
+
IntegerCodec,
|
|
5
|
+
DecimalCodec,
|
|
6
|
+
S8Codec,
|
|
7
|
+
S16Codec,
|
|
8
|
+
S32Codec,
|
|
9
|
+
S64Codec,
|
|
10
|
+
U8Codec,
|
|
11
|
+
U16Codec,
|
|
12
|
+
U32Codec,
|
|
13
|
+
U64Codec,
|
|
14
|
+
} from "./numerics.js";
|
|
15
|
+
|
|
16
|
+
export { OptionCodec } from "./option.js";
|
|
17
|
+
export { ResultCodec } from "./result.js";
|
|
18
|
+
export { StringCodec } from "./string.js";
|
|
19
|
+
export { UnitCodec } from "./unit.js";
|
|
20
|
+
export { ContractAddressCodec } from "./contract-address.js";
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { describe, it, expectTypeOf } from "vitest";
|
|
2
|
+
import type { Codec } from "./types.js";
|
|
3
|
+
import { ListCodec } from "./list.js";
|
|
4
|
+
import { IntegerCodec } from "./numerics.js";
|
|
5
|
+
|
|
6
|
+
describe("ListCodec types", () => {
|
|
7
|
+
it("preserves inner type T", () => {
|
|
8
|
+
const c = ListCodec(IntegerCodec);
|
|
9
|
+
expectTypeOf(c).toEqualTypeOf<Codec<bigint[]>>();
|
|
10
|
+
expectTypeOf(c.decodeWave).returns.toEqualTypeOf<bigint[]>();
|
|
11
|
+
expectTypeOf(c.encodeWave).parameter(0).toEqualTypeOf<bigint[]>();
|
|
12
|
+
});
|
|
13
|
+
});
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { ListCodec } from "./list.js";
|
|
4
|
+
import { IntegerCodec } from "./numerics.js";
|
|
5
|
+
|
|
6
|
+
describe("ListCodec", () => {
|
|
7
|
+
const ListOfInt = ListCodec(IntegerCodec);
|
|
8
|
+
|
|
9
|
+
it("decodes and encodes empty list", () => {
|
|
10
|
+
expect(ListOfInt.decodeWave("[]")).toEqual([]);
|
|
11
|
+
expect(ListOfInt.decodeWave("[ ]")).toEqual([]);
|
|
12
|
+
|
|
13
|
+
expect(ListOfInt.encodeWave([])).toBe("[]");
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it("decodes list of nested wave structs", () => {
|
|
17
|
+
const wave =
|
|
18
|
+
"[{r0: 1, r1: 0, r2: 0, r3: 0, sign: plus}, {r0: 2, r1: 0, r2: 0, r3: 0, sign: minus}]";
|
|
19
|
+
|
|
20
|
+
expect(ListOfInt.decodeWave(wave)).toEqual([1n, -2n]);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("encodes list using the inner codec canonical encoding", () => {
|
|
24
|
+
expect(ListOfInt.encodeWave([1n, -2n])).toBe(
|
|
25
|
+
"[{r0: 1, r1: 0, r2: 0, r3: 0, sign: plus}, {r0: 2, r1: 0, r2: 0, r3: 0, sign: minus}]",
|
|
26
|
+
);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it("round-trips: decode -> encode -> decode", () => {
|
|
30
|
+
const wave =
|
|
31
|
+
"[{r0: 123, r1: 0, r2: 0, r3: 0, sign: plus}, {r0: 0, r1: 0, r2: 0, r3: 0, sign: plus}]";
|
|
32
|
+
|
|
33
|
+
const js1 = ListOfInt.decodeWave(wave);
|
|
34
|
+
const wave2 = ListOfInt.encodeWave(js1);
|
|
35
|
+
const js2 = ListOfInt.decodeWave(wave2);
|
|
36
|
+
|
|
37
|
+
expect(js2).toEqual(js1);
|
|
38
|
+
expect(wave2).toBe(wave);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("throws on non-list input", () => {
|
|
42
|
+
expect(() => ListOfInt.decodeWave("none")).toThrow("invalid list: none");
|
|
43
|
+
expect(() => ListOfInt.decodeWave("{r0: 1}")).toThrow(
|
|
44
|
+
"invalid list: {r0: 1}",
|
|
45
|
+
);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it("handles commas inside nested structures (does not split incorrectly)", () => {
|
|
49
|
+
// Each element is an integer *struct* which itself contains commas.
|
|
50
|
+
const wave =
|
|
51
|
+
"[{r0: 7, r1: 0, r2: 0, r3: 0, sign: plus}, {r0: 8, r1: 0, r2: 0, r3: 0, sign: plus}]";
|
|
52
|
+
|
|
53
|
+
expect(ListOfInt.decodeWave(wave)).toEqual([7n, 8n]);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
@@ -1,154 +1,25 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Instance that represents a decoded list<Inner> value.
|
|
15
|
-
*
|
|
16
|
-
* Generic parameterization is on the *inner codec constructor* so that
|
|
17
|
-
* the JS type of this list instance is always ListJs<CodecJs<InnerC>>.
|
|
18
|
-
*/
|
|
19
|
-
export class ListCodecFactory<
|
|
20
|
-
InnerC extends CodecConstructor<unknown, CodecInstance<unknown>, unknown>,
|
|
21
|
-
> implements CodecInstance<ListJs<CodecJs<InnerC>>>
|
|
22
|
-
{
|
|
23
|
-
constructor(
|
|
24
|
-
private readonly innerCodec: InnerC,
|
|
25
|
-
public readonly data: string[], // array of wave expressions for each element
|
|
26
|
-
) {}
|
|
27
|
-
|
|
28
|
-
toWave(): WaveExpr {
|
|
29
|
-
// Convert array of inner wave expressions back to array syntax
|
|
30
|
-
const innerWaves = this.data.join(", ");
|
|
31
|
-
return `[${innerWaves}]` as WaveExpr;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
toJs(): ListJs<CodecJs<InnerC>> {
|
|
35
|
-
// Decode each element using the inner codec
|
|
36
|
-
return this.data.map((innerWave) => {
|
|
37
|
-
// 1) parse inner WaveExpr → inner WaveData
|
|
38
|
-
const innerWaveData = this.innerCodec.parseWave(
|
|
39
|
-
innerWave,
|
|
40
|
-
) as CodecWave<InnerC>;
|
|
41
|
-
|
|
42
|
-
// 2) WaveData → inner instance
|
|
43
|
-
const innerInst = this.innerCodec.fromKontor(
|
|
44
|
-
innerWaveData,
|
|
45
|
-
) as CodecInst<InnerC>;
|
|
46
|
-
|
|
47
|
-
// 3) instance → JS
|
|
48
|
-
return innerInst.toJs() as CodecJs<InnerC>;
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// ----- Static factory to build a typed list<T> codec constructor -----
|
|
53
|
-
|
|
54
|
-
static create<
|
|
55
|
-
InnerC extends CodecConstructor<unknown, CodecInstance<unknown>, unknown>,
|
|
56
|
-
>(
|
|
57
|
-
innerCodec: InnerC,
|
|
58
|
-
): CodecConstructor<
|
|
59
|
-
// JS type this codec produces:
|
|
60
|
-
ListJs<CodecJs<InnerC>>,
|
|
61
|
-
// instance type:
|
|
62
|
-
ListCodecFactory<InnerC>,
|
|
63
|
-
// wave data type (array of inner wave strings):
|
|
64
|
-
string[]
|
|
65
|
-
> {
|
|
66
|
-
// Class expression implements the static methods required by CodecConstructor
|
|
67
|
-
class ListCodecClass implements CodecInstance<ListJs<CodecJs<InnerC>>> {
|
|
68
|
-
// Internally forward all instance behavior to ListCodecFactory
|
|
69
|
-
private readonly _impl: ListCodecFactory<InnerC>;
|
|
70
|
-
|
|
71
|
-
constructor(data: string[]) {
|
|
72
|
-
this._impl = new ListCodecFactory(innerCodec, data);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
toWave(): WaveExpr {
|
|
76
|
-
return this._impl.toWave();
|
|
1
|
+
import type { Codec } from "./types.js";
|
|
2
|
+
import { stripOuter, splitTopLevelComma } from "./util.js";
|
|
3
|
+
|
|
4
|
+
export function ListCodec<T>(inner: Codec<T>): Codec<T[]> {
|
|
5
|
+
return {
|
|
6
|
+
decodeWave(expr: string): T[] {
|
|
7
|
+
const t = expr.trim();
|
|
8
|
+
if (t === "[]") return [];
|
|
9
|
+
|
|
10
|
+
const { inner: inside, hadOuter } = stripOuter(t, "[", "]");
|
|
11
|
+
if (!hadOuter) {
|
|
12
|
+
throw new Error(`invalid list: ${expr}`);
|
|
77
13
|
}
|
|
14
|
+
if (inside.trim() === "") return [];
|
|
78
15
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
// ----- Static methods required by CodecConstructor -----
|
|
84
|
-
|
|
85
|
-
static fromJs(value: ListJs<CodecJs<InnerC>>): ListCodecClass {
|
|
86
|
-
// Convert JS array to array of wave expressions
|
|
87
|
-
const waveArray = value.map((item) => {
|
|
88
|
-
const innerInst = innerCodec.fromJs(item as any);
|
|
89
|
-
return innerInst.toWave();
|
|
90
|
-
});
|
|
91
|
-
return new ListCodecClass(waveArray);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
static fromKontor(data: string[]): ListCodecClass {
|
|
95
|
-
return new ListCodecClass(data);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
static parseWave(expr: string): string[] {
|
|
99
|
-
// Parse array syntax: "[item1, item2, ...]"
|
|
100
|
-
const trimmed = expr.trim();
|
|
101
|
-
|
|
102
|
-
// Empty array
|
|
103
|
-
if (trimmed === "[]") {
|
|
104
|
-
return [];
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
// Remove brackets
|
|
108
|
-
if (!trimmed.startsWith("[") || !trimmed.endsWith("]")) {
|
|
109
|
-
throw new Error(`Expected array syntax [...], got: ${expr}`);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
const inner = trimmed.slice(1, -1).trim();
|
|
113
|
-
if (inner === "") {
|
|
114
|
-
return [];
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// Split by commas at the top level (respecting nested structures)
|
|
118
|
-
const items: string[] = [];
|
|
119
|
-
let depth = 0;
|
|
120
|
-
let current = "";
|
|
121
|
-
|
|
122
|
-
for (let i = 0; i < inner.length; i++) {
|
|
123
|
-
const char = inner[i];
|
|
124
|
-
|
|
125
|
-
if (char === "{" || char === "[" || char === "(") {
|
|
126
|
-
depth++;
|
|
127
|
-
current += char;
|
|
128
|
-
} else if (char === "}" || char === "]" || char === ")") {
|
|
129
|
-
depth--;
|
|
130
|
-
current += char;
|
|
131
|
-
} else if (char === "," && depth === 0) {
|
|
132
|
-
items.push(current.trim());
|
|
133
|
-
current = "";
|
|
134
|
-
} else {
|
|
135
|
-
current += char;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// Add last item
|
|
140
|
-
if (current.trim()) {
|
|
141
|
-
items.push(current.trim());
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
return items;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
16
|
+
const parts = splitTopLevelComma(inside);
|
|
17
|
+
return parts.map((p) => inner.decodeWave(p));
|
|
18
|
+
},
|
|
147
19
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
}
|
|
20
|
+
encodeWave(value: T[]): string {
|
|
21
|
+
const items = value.map((v) => inner.encodeWave(v)).join(", ");
|
|
22
|
+
return `[${items}]`;
|
|
23
|
+
},
|
|
24
|
+
};
|
|
154
25
|
}
|