@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.
Files changed (270) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/sdk/actions/kontor/public/call-view.js.map +1 -1
  3. package/dist/cjs/sdk/chains/definitions/signet.js +2 -2
  4. package/dist/cjs/sdk/test/e2e.test-deprecated.js +2 -0
  5. package/dist/cjs/sdk/test/e2e.test-deprecated.js.map +1 -0
  6. package/dist/cjs/sdk/utils/wit/codecs/bool.js +9 -21
  7. package/dist/cjs/sdk/utils/wit/codecs/bool.js.map +1 -1
  8. package/dist/cjs/sdk/utils/wit/codecs/contract-address.js +92 -0
  9. package/dist/cjs/sdk/utils/wit/codecs/contract-address.js.map +1 -0
  10. package/dist/cjs/sdk/utils/wit/codecs/index.js +29 -0
  11. package/dist/cjs/sdk/utils/wit/codecs/index.js.map +1 -0
  12. package/dist/cjs/sdk/utils/wit/codecs/list.js +21 -95
  13. package/dist/cjs/sdk/utils/wit/codecs/list.js.map +1 -1
  14. package/dist/cjs/sdk/utils/wit/codecs/numerics.js +228 -0
  15. package/dist/cjs/sdk/utils/wit/codecs/numerics.js.map +1 -0
  16. package/dist/cjs/sdk/utils/wit/codecs/option.js +21 -72
  17. package/dist/cjs/sdk/utils/wit/codecs/option.js.map +1 -1
  18. package/dist/cjs/sdk/utils/wit/codecs/result.js +32 -0
  19. package/dist/cjs/sdk/utils/wit/codecs/result.js.map +1 -0
  20. package/dist/cjs/sdk/utils/wit/codecs/string.js +16 -21
  21. package/dist/cjs/sdk/utils/wit/codecs/string.js.map +1 -1
  22. package/dist/cjs/sdk/utils/wit/codecs/unit.js +11 -19
  23. package/dist/cjs/sdk/utils/wit/codecs/unit.js.map +1 -1
  24. package/dist/cjs/sdk/utils/wit/codecs/util.js +185 -0
  25. package/dist/cjs/sdk/utils/wit/codecs/util.js.map +1 -0
  26. package/dist/cjs/sdk/utils/wit/decode-wit-parameter.js +297 -163
  27. package/dist/cjs/sdk/utils/wit/decode-wit-parameter.js.map +1 -1
  28. package/dist/cjs/sdk/utils/wit/encode-wit-parameters.js +214 -221
  29. package/dist/cjs/sdk/utils/wit/encode-wit-parameters.js.map +1 -1
  30. package/dist/cjs/tsconfig.build.tsbuildinfo +1 -1
  31. package/dist/cjs/wit/built-ins.js +19 -0
  32. package/dist/cjs/wit/built-ins.js.map +1 -0
  33. package/dist/cjs/wit/regex.js +1 -1
  34. package/dist/cjs/wit/regex.js.map +1 -1
  35. package/dist/cjs/wit/wit-parser/core/errors/signature.js +17 -2
  36. package/dist/cjs/wit/wit-parser/core/errors/signature.js.map +1 -1
  37. package/dist/cjs/wit/wit-parser/core/signatures.js +18 -0
  38. package/dist/cjs/wit/wit-parser/core/signatures.js.map +1 -1
  39. package/dist/cjs/wit/wit-parser/core/types/{records.js → user-defined.js} +1 -1
  40. package/dist/cjs/wit/wit-parser/core/types/user-defined.js.map +1 -0
  41. package/dist/cjs/wit/wit-parser/core/user-defined.js +271 -0
  42. package/dist/cjs/wit/wit-parser/core/user-defined.js.map +1 -0
  43. package/dist/cjs/wit/wit-parser/core/utils.js +29 -7
  44. package/dist/cjs/wit/wit-parser/core/utils.js.map +1 -1
  45. package/dist/cjs/wit/wit-parser/parse-wit-parameter.js +9 -3
  46. package/dist/cjs/wit/wit-parser/parse-wit-parameter.js.map +1 -1
  47. package/dist/cjs/wit/wit-parser/parse-wit.js +7 -3
  48. package/dist/cjs/wit/wit-parser/parse-wit.js.map +1 -1
  49. package/dist/esm/sdk/actions/kontor/public/call-view.js.map +1 -1
  50. package/dist/esm/sdk/chains/definitions/signet.js +2 -2
  51. package/dist/esm/sdk/test/e2e.test-deprecated.js +197 -0
  52. package/dist/esm/sdk/test/e2e.test-deprecated.js.map +1 -0
  53. package/dist/esm/sdk/utils/wit/codecs/bool.js +9 -21
  54. package/dist/esm/sdk/utils/wit/codecs/bool.js.map +1 -1
  55. package/dist/esm/sdk/utils/wit/codecs/contract-address.js +92 -0
  56. package/dist/esm/sdk/utils/wit/codecs/contract-address.js.map +1 -0
  57. package/dist/esm/sdk/utils/wit/codecs/index.js +9 -0
  58. package/dist/esm/sdk/utils/wit/codecs/index.js.map +1 -0
  59. package/dist/esm/sdk/utils/wit/codecs/list.js +20 -114
  60. package/dist/esm/sdk/utils/wit/codecs/list.js.map +1 -1
  61. package/dist/esm/sdk/utils/wit/codecs/numerics.js +234 -0
  62. package/dist/esm/sdk/utils/wit/codecs/numerics.js.map +1 -0
  63. package/dist/esm/sdk/utils/wit/codecs/option.js +21 -88
  64. package/dist/esm/sdk/utils/wit/codecs/option.js.map +1 -1
  65. package/dist/esm/sdk/utils/wit/codecs/result.js +29 -0
  66. package/dist/esm/sdk/utils/wit/codecs/result.js.map +1 -0
  67. package/dist/esm/sdk/utils/wit/codecs/string.js +22 -22
  68. package/dist/esm/sdk/utils/wit/codecs/string.js.map +1 -1
  69. package/dist/esm/sdk/utils/wit/codecs/unit.js +12 -21
  70. package/dist/esm/sdk/utils/wit/codecs/unit.js.map +1 -1
  71. package/dist/esm/sdk/utils/wit/codecs/util.js +181 -0
  72. package/dist/esm/sdk/utils/wit/codecs/util.js.map +1 -0
  73. package/dist/esm/sdk/utils/wit/decode-wit-parameter.js +322 -188
  74. package/dist/esm/sdk/utils/wit/decode-wit-parameter.js.map +1 -1
  75. package/dist/esm/sdk/utils/wit/encode-wit-parameters.js +230 -233
  76. package/dist/esm/sdk/utils/wit/encode-wit-parameters.js.map +1 -1
  77. package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
  78. package/dist/esm/wit/built-ins.js +16 -0
  79. package/dist/esm/wit/built-ins.js.map +1 -0
  80. package/dist/esm/wit/regex.js +1 -1
  81. package/dist/esm/wit/regex.js.map +1 -1
  82. package/dist/esm/wit/wit-parser/core/errors/signature.js +15 -1
  83. package/dist/esm/wit/wit-parser/core/errors/signature.js.map +1 -1
  84. package/dist/esm/wit/wit-parser/core/signatures.js +14 -0
  85. package/dist/esm/wit/wit-parser/core/signatures.js.map +1 -1
  86. package/dist/esm/wit/wit-parser/core/types/signatures.js.map +1 -1
  87. package/dist/esm/wit/wit-parser/core/types/user-defined.js +2 -0
  88. package/dist/esm/wit/wit-parser/core/types/user-defined.js.map +1 -0
  89. package/dist/esm/wit/wit-parser/core/types/utils.js +25 -0
  90. package/dist/esm/wit/wit-parser/core/types/utils.js.map +1 -1
  91. package/dist/esm/wit/wit-parser/core/user-defined.js +280 -0
  92. package/dist/esm/wit/wit-parser/core/user-defined.js.map +1 -0
  93. package/dist/esm/wit/wit-parser/core/utils.js +33 -36
  94. package/dist/esm/wit/wit-parser/core/utils.js.map +1 -1
  95. package/dist/esm/wit/wit-parser/parse-wit-parameter.js +10 -4
  96. package/dist/esm/wit/wit-parser/parse-wit-parameter.js.map +1 -1
  97. package/dist/esm/wit/wit-parser/parse-wit.js +8 -4
  98. package/dist/esm/wit/wit-parser/parse-wit.js.map +1 -1
  99. package/dist/types/sdk/actions/kontor/public/call-view.d.ts +2 -1
  100. package/dist/types/sdk/actions/kontor/public/call-view.d.ts.map +1 -1
  101. package/dist/types/sdk/chains/definitions/signet.d.ts +2 -2
  102. package/dist/types/sdk/test/e2e.test-deprecated.d.ts +2 -0
  103. package/dist/types/sdk/test/e2e.test-deprecated.d.ts.map +1 -0
  104. package/dist/types/sdk/types/contract.d.ts +5 -5
  105. package/dist/types/sdk/types/contract.d.ts.map +1 -1
  106. package/dist/types/sdk/utils/wit/codecs/bool.d.ts +2 -2
  107. package/dist/types/sdk/utils/wit/codecs/bool.d.ts.map +1 -1
  108. package/dist/types/sdk/utils/wit/codecs/contract-address.d.ts +5 -0
  109. package/dist/types/sdk/utils/wit/codecs/contract-address.d.ts.map +1 -0
  110. package/dist/types/sdk/utils/wit/codecs/index.d.ts +9 -0
  111. package/dist/types/sdk/utils/wit/codecs/index.d.ts.map +1 -0
  112. package/dist/types/sdk/utils/wit/codecs/list.d.ts +2 -16
  113. package/dist/types/sdk/utils/wit/codecs/list.d.ts.map +1 -1
  114. package/dist/types/sdk/utils/wit/codecs/numerics.d.ts +14 -0
  115. package/dist/types/sdk/utils/wit/codecs/numerics.d.ts.map +1 -0
  116. package/dist/types/sdk/utils/wit/codecs/option.d.ts +3 -23
  117. package/dist/types/sdk/utils/wit/codecs/option.d.ts.map +1 -1
  118. package/dist/types/sdk/utils/wit/codecs/result.d.ts +4 -0
  119. package/dist/types/sdk/utils/wit/codecs/result.d.ts.map +1 -0
  120. package/dist/types/sdk/utils/wit/codecs/string.d.ts +6 -2
  121. package/dist/types/sdk/utils/wit/codecs/string.d.ts.map +1 -1
  122. package/dist/types/sdk/utils/wit/codecs/types.d.ts +4 -0
  123. package/dist/types/sdk/utils/wit/codecs/types.d.ts.map +1 -1
  124. package/dist/types/sdk/utils/wit/codecs/unit.d.ts +2 -11
  125. package/dist/types/sdk/utils/wit/codecs/unit.d.ts.map +1 -1
  126. package/dist/types/sdk/utils/wit/codecs/util.d.ts +12 -0
  127. package/dist/types/sdk/utils/wit/codecs/util.d.ts.map +1 -0
  128. package/dist/types/sdk/utils/wit/decode-wit-parameter.d.ts +9 -31
  129. package/dist/types/sdk/utils/wit/decode-wit-parameter.d.ts.map +1 -1
  130. package/dist/types/sdk/utils/wit/encode-wit-parameters.d.ts +9 -1
  131. package/dist/types/sdk/utils/wit/encode-wit-parameters.d.ts.map +1 -1
  132. package/dist/types/wit/built-ins.d.ts +6 -0
  133. package/dist/types/wit/built-ins.d.ts.map +1 -0
  134. package/dist/types/wit/regex.d.ts.map +1 -1
  135. package/dist/types/wit/utils.d.ts +53 -33
  136. package/dist/types/wit/utils.d.ts.map +1 -1
  137. package/dist/types/wit/wit-parser/core/errors/signature.d.ts +7 -1
  138. package/dist/types/wit/wit-parser/core/errors/signature.d.ts.map +1 -1
  139. package/dist/types/wit/wit-parser/core/signatures.d.ts +10 -0
  140. package/dist/types/wit/wit-parser/core/signatures.d.ts.map +1 -1
  141. package/dist/types/wit/wit-parser/core/types/signatures.d.ts +6 -2
  142. package/dist/types/wit/wit-parser/core/types/signatures.d.ts.map +1 -1
  143. package/dist/types/wit/wit-parser/core/types/user-defined.d.ts +134 -0
  144. package/dist/types/wit/wit-parser/core/types/user-defined.d.ts.map +1 -0
  145. package/dist/types/wit/wit-parser/core/types/utils.d.ts +86 -11
  146. package/dist/types/wit/wit-parser/core/types/utils.d.ts.map +1 -1
  147. package/dist/types/wit/wit-parser/core/user-defined.d.ts +19 -0
  148. package/dist/types/wit/wit-parser/core/user-defined.d.ts.map +1 -0
  149. package/dist/types/wit/wit-parser/core/utils.d.ts +8 -4
  150. package/dist/types/wit/wit-parser/core/utils.d.ts.map +1 -1
  151. package/dist/types/wit/wit-parser/parse-wit-parameter.d.ts +11 -5
  152. package/dist/types/wit/wit-parser/parse-wit-parameter.d.ts.map +1 -1
  153. package/dist/types/wit/wit-parser/parse-wit.d.ts +7 -3
  154. package/dist/types/wit/wit-parser/parse-wit.d.ts.map +1 -1
  155. package/dist/types/wit/wit.d.ts +20 -12
  156. package/dist/types/wit/wit.d.ts.map +1 -1
  157. package/package.json +1 -1
  158. package/src/sdk/actions/get-contract.test-d.ts +430 -50
  159. package/src/sdk/actions/get-contract.test.ts +324 -24
  160. package/src/sdk/actions/kontor/public/call-view.ts +2 -1
  161. package/src/sdk/actions/kontor/public/proc-contract.test-d.ts +107 -0
  162. package/src/sdk/actions/kontor/public/proc-contract.test.ts +234 -21
  163. package/src/sdk/actions/kontor/public/view-contract.test-d.ts +240 -0
  164. package/src/sdk/actions/kontor/public/view-contract.test.ts +613 -18
  165. package/src/sdk/chains/definitions/signet.ts +2 -2
  166. package/src/sdk/clients/base/create-rpc-client.test.ts +2 -2
  167. package/src/sdk/clients/create-public-client.test.ts +2 -2
  168. package/src/sdk/clients/kontor/create-public-client.test.ts +2 -2
  169. package/src/sdk/clients/transports/http-rpc.test.ts +0 -24
  170. package/src/sdk/test/e2e.test-deprecated.ts +195 -0
  171. package/src/sdk/types/contract.test-d.ts +489 -55
  172. package/src/sdk/types/contract.ts +6 -7
  173. package/src/sdk/utils/wit/codecs/bool.test.ts +29 -0
  174. package/src/sdk/utils/wit/codecs/bool.ts +10 -25
  175. package/src/sdk/utils/wit/codecs/contract-address.test.ts +37 -0
  176. package/src/sdk/utils/wit/codecs/contract-address.ts +114 -0
  177. package/src/sdk/utils/wit/codecs/index.ts +20 -0
  178. package/src/sdk/utils/wit/codecs/list.test-d.ts +13 -0
  179. package/src/sdk/utils/wit/codecs/list.test.ts +55 -0
  180. package/src/sdk/utils/wit/codecs/list.ts +21 -150
  181. package/src/sdk/utils/wit/codecs/numerics.test.ts +399 -0
  182. package/src/sdk/utils/wit/codecs/numerics.ts +304 -0
  183. package/src/sdk/utils/wit/codecs/option.test.ts +71 -0
  184. package/src/sdk/utils/wit/codecs/option.ts +21 -120
  185. package/src/sdk/utils/wit/codecs/result.test.ts +82 -0
  186. package/src/sdk/utils/wit/codecs/result.ts +37 -0
  187. package/src/sdk/utils/wit/codecs/string.test.ts +62 -0
  188. package/src/sdk/utils/wit/codecs/string.ts +23 -25
  189. package/src/sdk/utils/wit/codecs/types.ts +5 -0
  190. package/src/sdk/utils/wit/codecs/unit.test.ts +27 -0
  191. package/src/sdk/utils/wit/codecs/unit.ts +14 -38
  192. package/src/sdk/utils/wit/codecs/util.test.ts +221 -0
  193. package/src/sdk/utils/wit/codecs/util.ts +193 -0
  194. package/src/sdk/utils/wit/decode-wit-parameter.test.ts +1264 -32
  195. package/src/sdk/utils/wit/decode-wit-parameter.ts +508 -211
  196. package/src/sdk/utils/wit/encode-wit-parameters.test.ts +955 -91
  197. package/src/sdk/utils/wit/encode-wit-parameters.ts +277 -274
  198. package/src/sdk/utils/wit/get-wit-item.test.ts +1 -1
  199. package/src/wit/built-ins.ts +23 -0
  200. package/src/wit/regex.ts +1 -1
  201. package/src/wit/utils.ts +120 -74
  202. package/src/wit/wit-parser/core/errors/signature.ts +13 -2
  203. package/src/wit/wit-parser/core/signatures.ts +28 -0
  204. package/src/wit/wit-parser/core/types/signatures.test-d.ts +21 -0
  205. package/src/wit/wit-parser/core/types/signatures.ts +19 -2
  206. package/src/wit/wit-parser/core/types/user-defined.test-d.ts +1308 -0
  207. package/src/wit/wit-parser/core/types/user-defined.ts +412 -0
  208. package/src/wit/wit-parser/core/types/utils.test-d.ts +43 -2
  209. package/src/wit/wit-parser/core/types/utils.ts +143 -14
  210. package/src/wit/wit-parser/core/user-defined.test.ts +609 -0
  211. package/src/wit/wit-parser/core/user-defined.ts +392 -0
  212. package/src/wit/wit-parser/core/utils.test.ts +334 -115
  213. package/src/wit/wit-parser/core/utils.ts +54 -38
  214. package/src/wit/wit-parser/parse-wit-parameter.test.ts +282 -4
  215. package/src/wit/wit-parser/parse-wit-parameter.ts +37 -11
  216. package/src/wit/wit-parser/parse-wit.test.ts +738 -12
  217. package/src/wit/wit-parser/parse-wit.ts +25 -10
  218. package/src/wit/wit.ts +37 -16
  219. package/vitest.config.ts +5 -0
  220. package/dist/cjs/sdk/utils/wit/codecs/decimal.js +0 -148
  221. package/dist/cjs/sdk/utils/wit/codecs/decimal.js.map +0 -1
  222. package/dist/cjs/sdk/utils/wit/codecs/enum.js +0 -94
  223. package/dist/cjs/sdk/utils/wit/codecs/enum.js.map +0 -1
  224. package/dist/cjs/sdk/utils/wit/codecs/integer.js +0 -125
  225. package/dist/cjs/sdk/utils/wit/codecs/integer.js.map +0 -1
  226. package/dist/cjs/sdk/utils/wit/codecs/s64.js +0 -57
  227. package/dist/cjs/sdk/utils/wit/codecs/s64.js.map +0 -1
  228. package/dist/cjs/sdk/utils/wit/codecs/u64.js +0 -56
  229. package/dist/cjs/sdk/utils/wit/codecs/u64.js.map +0 -1
  230. package/dist/cjs/wit/wit-parser/core/records.js +0 -70
  231. package/dist/cjs/wit/wit-parser/core/records.js.map +0 -1
  232. package/dist/cjs/wit/wit-parser/core/types/records.js.map +0 -1
  233. package/dist/esm/sdk/utils/wit/codecs/decimal.js +0 -165
  234. package/dist/esm/sdk/utils/wit/codecs/decimal.js.map +0 -1
  235. package/dist/esm/sdk/utils/wit/codecs/enum.js +0 -104
  236. package/dist/esm/sdk/utils/wit/codecs/enum.js.map +0 -1
  237. package/dist/esm/sdk/utils/wit/codecs/integer.js +0 -167
  238. package/dist/esm/sdk/utils/wit/codecs/integer.js.map +0 -1
  239. package/dist/esm/sdk/utils/wit/codecs/s64.js +0 -65
  240. package/dist/esm/sdk/utils/wit/codecs/s64.js.map +0 -1
  241. package/dist/esm/sdk/utils/wit/codecs/u64.js +0 -63
  242. package/dist/esm/sdk/utils/wit/codecs/u64.js.map +0 -1
  243. package/dist/esm/wit/wit-parser/core/records.js +0 -73
  244. package/dist/esm/wit/wit-parser/core/records.js.map +0 -1
  245. package/dist/esm/wit/wit-parser/core/types/records.js +0 -2
  246. package/dist/esm/wit/wit-parser/core/types/records.js.map +0 -1
  247. package/dist/types/sdk/utils/wit/codecs/decimal.d.ts +0 -42
  248. package/dist/types/sdk/utils/wit/codecs/decimal.d.ts.map +0 -1
  249. package/dist/types/sdk/utils/wit/codecs/enum.d.ts +0 -49
  250. package/dist/types/sdk/utils/wit/codecs/enum.d.ts.map +0 -1
  251. package/dist/types/sdk/utils/wit/codecs/integer.d.ts +0 -36
  252. package/dist/types/sdk/utils/wit/codecs/integer.d.ts.map +0 -1
  253. package/dist/types/sdk/utils/wit/codecs/s64.d.ts +0 -23
  254. package/dist/types/sdk/utils/wit/codecs/s64.d.ts.map +0 -1
  255. package/dist/types/sdk/utils/wit/codecs/u64.d.ts +0 -23
  256. package/dist/types/sdk/utils/wit/codecs/u64.d.ts.map +0 -1
  257. package/dist/types/wit/wit-parser/core/records.d.ts +0 -4
  258. package/dist/types/wit/wit-parser/core/records.d.ts.map +0 -1
  259. package/dist/types/wit/wit-parser/core/types/records.d.ts +0 -51
  260. package/dist/types/wit/wit-parser/core/types/records.d.ts.map +0 -1
  261. package/src/sdk/test/e2e.test.ts +0 -194
  262. package/src/sdk/utils/wit/codecs/decimal.ts +0 -215
  263. package/src/sdk/utils/wit/codecs/enum.ts +0 -114
  264. package/src/sdk/utils/wit/codecs/integer.ts +0 -193
  265. package/src/sdk/utils/wit/codecs/s64.ts +0 -76
  266. package/src/sdk/utils/wit/codecs/u64.ts +0 -73
  267. package/src/wit/wit-parser/core/records.test.ts +0 -69
  268. package/src/wit/wit-parser/core/records.ts +0 -101
  269. package/src/wit/wit-parser/core/types/records.test-d.ts +0 -331
  270. 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
- WaveExpr,
3
- CodecConstructor,
4
- CodecInstance,
5
- CodecJs,
6
- CodecInst,
7
- CodecWave,
8
- } from "./types.js";
9
-
10
- // The JS-side shape we expose for list<T>
11
- export type ListJs<T> = T[];
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
- toJs(): ListJs<CodecJs<InnerC>> {
80
- return this._impl.toJs();
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
- return ListCodecClass as unknown as CodecConstructor<
149
- ListJs<CodecJs<InnerC>>,
150
- ListCodecFactory<InnerC>,
151
- string[]
152
- >;
153
- }
20
+ encodeWave(value: T[]): string {
21
+ const items = value.map((v) => inner.encodeWave(v)).join(", ");
22
+ return `[${items}]`;
23
+ },
24
+ };
154
25
  }