@typeberry/lib 0.5.10-9567cee → 0.5.10-9ffd7ac

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 (470) hide show
  1. package/README.md +2 -2
  2. package/bin/lib/examples/pvm-usage.test.js +2 -2
  3. package/package.json +1 -1
  4. package/packages/core/codec/descriptor.js +1 -1
  5. package/packages/core/codec/descriptors.js +7 -4
  6. package/packages/core/codec/index.test.js +1 -1
  7. package/packages/core/codec/skip.d.ts +2 -1
  8. package/packages/core/codec/skip.d.ts.map +1 -1
  9. package/packages/core/codec/skip.js +3 -0
  10. package/packages/core/codec/view.js +2 -2
  11. package/packages/core/collections/multi-map.d.ts +2 -1
  12. package/packages/core/collections/multi-map.d.ts.map +1 -1
  13. package/packages/core/collections/multi-map.js +3 -0
  14. package/packages/core/collections/multi-map.test.js +2 -2
  15. package/packages/core/concurrent/parent.js +4 -1
  16. package/packages/core/crypto/ed25519.d.ts +2 -5
  17. package/packages/core/crypto/ed25519.d.ts.map +1 -1
  18. package/packages/core/crypto/ed25519.js +4 -1
  19. package/packages/core/hash/hash.d.ts +4 -2
  20. package/packages/core/hash/hash.d.ts.map +1 -1
  21. package/packages/core/hash/hash.js +6 -1
  22. package/packages/core/networking/quic-network.d.ts +3 -2
  23. package/packages/core/networking/quic-network.d.ts.map +1 -1
  24. package/packages/core/networking/quic-network.js +3 -0
  25. package/packages/core/networking/quic-peer.d.ts +2 -1
  26. package/packages/core/networking/quic-peer.d.ts.map +1 -1
  27. package/packages/core/networking/quic-peer.js +5 -2
  28. package/packages/core/networking/quic-stream.d.ts +2 -1
  29. package/packages/core/networking/quic-stream.d.ts.map +1 -1
  30. package/packages/core/networking/quic-stream.js +3 -0
  31. package/packages/core/networking/setup.js +2 -2
  32. package/packages/core/pvm-host-calls/bin.js +2 -2
  33. package/packages/core/pvm-host-calls/ecalli-trace-logger.test.js +1 -1
  34. package/packages/core/pvm-host-calls/host-call-memory.d.ts +2 -1
  35. package/packages/core/pvm-host-calls/host-call-memory.d.ts.map +1 -1
  36. package/packages/core/pvm-host-calls/host-call-memory.js +3 -0
  37. package/packages/core/pvm-host-calls/host-call-memory.test.js +1 -1
  38. package/packages/core/pvm-host-calls/host-call-registers.d.ts +5 -1
  39. package/packages/core/pvm-host-calls/host-call-registers.d.ts.map +1 -1
  40. package/packages/core/pvm-host-calls/host-call-registers.js +11 -1
  41. package/packages/core/pvm-host-calls/host-call-registers.test.js +2 -2
  42. package/packages/core/pvm-host-calls/host-calls-executor.d.ts +2 -1
  43. package/packages/core/pvm-host-calls/host-calls-executor.d.ts.map +1 -1
  44. package/packages/core/pvm-host-calls/host-calls-executor.js +5 -2
  45. package/packages/core/pvm-host-calls/host-calls.d.ts +4 -2
  46. package/packages/core/pvm-host-calls/host-calls.d.ts.map +1 -1
  47. package/packages/core/pvm-host-calls/host-calls.js +9 -4
  48. package/packages/core/pvm-host-calls/pvm-instance-manager.js +1 -1
  49. package/packages/core/pvm-interpreter/args-decoder/args-decoder.js +1 -1
  50. package/packages/core/pvm-interpreter/args-decoder/args-decoder.test.js +3 -3
  51. package/packages/core/pvm-interpreter/args-decoder/args-decoding-results.js +11 -11
  52. package/packages/core/pvm-interpreter/args-decoder/decoders/extended-with-immediate-decoder.d.ts +2 -1
  53. package/packages/core/pvm-interpreter/args-decoder/decoders/extended-with-immediate-decoder.d.ts.map +1 -1
  54. package/packages/core/pvm-interpreter/args-decoder/decoders/extended-with-immediate-decoder.js +3 -0
  55. package/packages/core/pvm-interpreter/args-decoder/decoders/extended-with-immediate-decoder.test.js +2 -2
  56. package/packages/core/pvm-interpreter/args-decoder/decoders/immediate-decoder.d.ts +2 -1
  57. package/packages/core/pvm-interpreter/args-decoder/decoders/immediate-decoder.d.ts.map +1 -1
  58. package/packages/core/pvm-interpreter/args-decoder/decoders/immediate-decoder.js +3 -0
  59. package/packages/core/pvm-interpreter/args-decoder/decoders/immediate-decoder.test.js +26 -26
  60. package/packages/core/pvm-interpreter/basic-blocks/basic-blocks.test.js +8 -8
  61. package/packages/core/pvm-interpreter/bin.js +1 -1
  62. package/packages/core/pvm-interpreter/debugger-adapter.d.ts +2 -1
  63. package/packages/core/pvm-interpreter/debugger-adapter.d.ts.map +1 -1
  64. package/packages/core/pvm-interpreter/debugger-adapter.js +6 -3
  65. package/packages/core/pvm-interpreter/gas.js +4 -1
  66. package/packages/core/pvm-interpreter/interpreter.d.ts +2 -1
  67. package/packages/core/pvm-interpreter/interpreter.d.ts.map +1 -1
  68. package/packages/core/pvm-interpreter/interpreter.js +19 -16
  69. package/packages/core/pvm-interpreter/memory/memory-builder.js +2 -2
  70. package/packages/core/pvm-interpreter/memory/memory-builder.test.js +7 -7
  71. package/packages/core/pvm-interpreter/memory/memory.d.ts +2 -1
  72. package/packages/core/pvm-interpreter/memory/memory.d.ts.map +1 -1
  73. package/packages/core/pvm-interpreter/memory/memory.js +4 -1
  74. package/packages/core/pvm-interpreter/memory/memory.test.js +31 -31
  75. package/packages/core/pvm-interpreter/memory/pages/readable-page.d.ts +2 -1
  76. package/packages/core/pvm-interpreter/memory/pages/readable-page.d.ts.map +1 -1
  77. package/packages/core/pvm-interpreter/memory/pages/readable-page.js +3 -0
  78. package/packages/core/pvm-interpreter/memory/pages/readable-page.test.js +3 -3
  79. package/packages/core/pvm-interpreter/memory/pages/writeable-page.d.ts +2 -1
  80. package/packages/core/pvm-interpreter/memory/pages/writeable-page.d.ts.map +1 -1
  81. package/packages/core/pvm-interpreter/memory/pages/writeable-page.js +3 -0
  82. package/packages/core/pvm-interpreter/memory/pages/writeable-page.test.js +4 -4
  83. package/packages/core/pvm-interpreter/ops/bit-ops.d.ts +2 -1
  84. package/packages/core/pvm-interpreter/ops/bit-ops.d.ts.map +1 -1
  85. package/packages/core/pvm-interpreter/ops/bit-ops.js +3 -0
  86. package/packages/core/pvm-interpreter/ops/bit-ops.test.js +3 -3
  87. package/packages/core/pvm-interpreter/ops/bit-rotation-ops.d.ts +2 -1
  88. package/packages/core/pvm-interpreter/ops/bit-rotation-ops.d.ts.map +1 -1
  89. package/packages/core/pvm-interpreter/ops/bit-rotation-ops.js +3 -0
  90. package/packages/core/pvm-interpreter/ops/bit-rotation-ops.test.js +5 -5
  91. package/packages/core/pvm-interpreter/ops/boolean-ops.d.ts +2 -1
  92. package/packages/core/pvm-interpreter/ops/boolean-ops.d.ts.map +1 -1
  93. package/packages/core/pvm-interpreter/ops/boolean-ops.js +3 -0
  94. package/packages/core/pvm-interpreter/ops/boolean-ops.test.js +3 -3
  95. package/packages/core/pvm-interpreter/ops/branch-ops.d.ts +2 -1
  96. package/packages/core/pvm-interpreter/ops/branch-ops.d.ts.map +1 -1
  97. package/packages/core/pvm-interpreter/ops/branch-ops.js +3 -0
  98. package/packages/core/pvm-interpreter/ops/branch-ops.test.js +4 -4
  99. package/packages/core/pvm-interpreter/ops/dynamic-jump-ops.d.ts +2 -1
  100. package/packages/core/pvm-interpreter/ops/dynamic-jump-ops.d.ts.map +1 -1
  101. package/packages/core/pvm-interpreter/ops/dynamic-jump-ops.js +3 -0
  102. package/packages/core/pvm-interpreter/ops/dynamic-jump-ops.test.js +5 -5
  103. package/packages/core/pvm-interpreter/ops/host-call-ops.d.ts +2 -1
  104. package/packages/core/pvm-interpreter/ops/host-call-ops.d.ts.map +1 -1
  105. package/packages/core/pvm-interpreter/ops/host-call-ops.js +3 -0
  106. package/packages/core/pvm-interpreter/ops/host-call-ops.test.js +2 -2
  107. package/packages/core/pvm-interpreter/ops/load-ops.d.ts +2 -1
  108. package/packages/core/pvm-interpreter/ops/load-ops.d.ts.map +1 -1
  109. package/packages/core/pvm-interpreter/ops/load-ops.js +3 -0
  110. package/packages/core/pvm-interpreter/ops/load-ops.test.js +10 -10
  111. package/packages/core/pvm-interpreter/ops/math-ops.d.ts +2 -1
  112. package/packages/core/pvm-interpreter/ops/math-ops.d.ts.map +1 -1
  113. package/packages/core/pvm-interpreter/ops/math-ops.js +3 -0
  114. package/packages/core/pvm-interpreter/ops/math-ops.test.js +3 -3
  115. package/packages/core/pvm-interpreter/ops/memory-ops.d.ts +2 -1
  116. package/packages/core/pvm-interpreter/ops/memory-ops.d.ts.map +1 -1
  117. package/packages/core/pvm-interpreter/ops/memory-ops.js +3 -0
  118. package/packages/core/pvm-interpreter/ops/memory-ops.test.js +3 -3
  119. package/packages/core/pvm-interpreter/ops/move-ops.d.ts +2 -1
  120. package/packages/core/pvm-interpreter/ops/move-ops.d.ts.map +1 -1
  121. package/packages/core/pvm-interpreter/ops/move-ops.js +3 -0
  122. package/packages/core/pvm-interpreter/ops/move-ops.test.js +3 -3
  123. package/packages/core/pvm-interpreter/ops/no-args-ops.d.ts +2 -1
  124. package/packages/core/pvm-interpreter/ops/no-args-ops.d.ts.map +1 -1
  125. package/packages/core/pvm-interpreter/ops/no-args-ops.js +3 -0
  126. package/packages/core/pvm-interpreter/ops/no-args-ops.test.js +2 -2
  127. package/packages/core/pvm-interpreter/ops/shift-ops.d.ts +2 -1
  128. package/packages/core/pvm-interpreter/ops/shift-ops.d.ts.map +1 -1
  129. package/packages/core/pvm-interpreter/ops/shift-ops.js +3 -0
  130. package/packages/core/pvm-interpreter/ops/shift-ops.test.js +3 -3
  131. package/packages/core/pvm-interpreter/ops/store-ops.d.ts +2 -1
  132. package/packages/core/pvm-interpreter/ops/store-ops.d.ts.map +1 -1
  133. package/packages/core/pvm-interpreter/ops/store-ops.js +3 -0
  134. package/packages/core/pvm-interpreter/ops/store-ops.test.js +7 -7
  135. package/packages/core/pvm-interpreter/ops-dispatchers/no-args-dispatcher.test.js +1 -1
  136. package/packages/core/pvm-interpreter/ops-dispatchers/one-imm-dispatcher.test.js +4 -4
  137. package/packages/core/pvm-interpreter/ops-dispatchers/one-offset-dispatcher.test.js +2 -2
  138. package/packages/core/pvm-interpreter/ops-dispatchers/one-reg-one-ext-imm-dispatcher.test.js +4 -4
  139. package/packages/core/pvm-interpreter/ops-dispatchers/one-reg-one-imm-dispatcher.test.js +7 -7
  140. package/packages/core/pvm-interpreter/ops-dispatchers/one-reg-one-imm-one-offset-dispatcher.test.js +10 -10
  141. package/packages/core/pvm-interpreter/ops-dispatchers/one-reg-two-imms-dispatcher.test.js +5 -5
  142. package/packages/core/pvm-interpreter/ops-dispatchers/three-regs-dispatcher.test.js +7 -7
  143. package/packages/core/pvm-interpreter/ops-dispatchers/two-imms-dispatcher.test.js +5 -5
  144. package/packages/core/pvm-interpreter/ops-dispatchers/two-regs-dispatcher.test.js +6 -6
  145. package/packages/core/pvm-interpreter/ops-dispatchers/two-regs-one-imm-dispatcher.test.js +11 -11
  146. package/packages/core/pvm-interpreter/ops-dispatchers/two-regs-one-offset-dispatcher.test.js +2 -2
  147. package/packages/core/pvm-interpreter/ops-dispatchers/two-regs-two-imms-dispatcher.test.js +14 -14
  148. package/packages/core/pvm-interpreter/program-decoder/jump-table.d.ts +5 -2
  149. package/packages/core/pvm-interpreter/program-decoder/jump-table.d.ts.map +1 -1
  150. package/packages/core/pvm-interpreter/program-decoder/jump-table.js +9 -4
  151. package/packages/core/pvm-interpreter/program-decoder/jump-table.test.js +6 -6
  152. package/packages/core/pvm-interpreter/program-decoder/mask.d.ts +2 -1
  153. package/packages/core/pvm-interpreter/program-decoder/mask.d.ts.map +1 -1
  154. package/packages/core/pvm-interpreter/program-decoder/mask.js +3 -0
  155. package/packages/core/pvm-interpreter/program-decoder/mask.test.js +10 -10
  156. package/packages/core/pvm-interpreter/program-decoder/program-decoder.d.ts +2 -1
  157. package/packages/core/pvm-interpreter/program-decoder/program-decoder.d.ts.map +1 -1
  158. package/packages/core/pvm-interpreter/program-decoder/program-decoder.js +6 -3
  159. package/packages/core/pvm-interpreter/program-decoder/program-decoder.test.js +5 -5
  160. package/packages/core/pvm-interpreter/program.js +3 -3
  161. package/packages/core/pvm-interpreter/registers.d.ts +5 -2
  162. package/packages/core/pvm-interpreter/registers.d.ts.map +1 -1
  163. package/packages/core/pvm-interpreter/registers.js +10 -6
  164. package/packages/core/pvm-interpreter/registers.test.js +10 -10
  165. package/packages/core/pvm-interpreter/spi-decoder/decode-standard-program.d.ts +6 -3
  166. package/packages/core/pvm-interpreter/spi-decoder/decode-standard-program.d.ts.map +1 -1
  167. package/packages/core/pvm-interpreter/spi-decoder/decode-standard-program.js +11 -2
  168. package/packages/core/pvm-interpreter-ananas/index.d.ts +6 -3
  169. package/packages/core/pvm-interpreter-ananas/index.d.ts.map +1 -1
  170. package/packages/core/pvm-interpreter-ananas/index.js +12 -3
  171. package/packages/core/trie/nodes.d.ts +7 -2
  172. package/packages/core/trie/nodes.d.ts.map +1 -1
  173. package/packages/core/trie/nodes.js +20 -11
  174. package/packages/core/trie/nodesDb.d.ts +3 -1
  175. package/packages/core/trie/nodesDb.d.ts.map +1 -1
  176. package/packages/core/trie/nodesDb.js +6 -0
  177. package/packages/core/trie/trie.js +2 -2
  178. package/packages/extensions/ipc/index.js +5 -2
  179. package/packages/extensions/ipc/jamnp/handler.d.ts +4 -2
  180. package/packages/extensions/ipc/jamnp/handler.d.ts.map +1 -1
  181. package/packages/extensions/ipc/jamnp/handler.js +9 -3
  182. package/packages/extensions/ipc/jamnp/server.js +3 -3
  183. package/packages/extensions/ipc/server.d.ts +2 -1
  184. package/packages/extensions/ipc/server.d.ts.map +1 -1
  185. package/packages/extensions/ipc/server.js +4 -1
  186. package/packages/jam/block/header.js +1 -1
  187. package/packages/jam/block/work-package.d.ts +7 -7
  188. package/packages/jam/block/work-package.d.ts.map +1 -1
  189. package/packages/jam/block/work-package.js +12 -12
  190. package/packages/jam/config/chain-spec.d.ts +2 -1
  191. package/packages/jam/config/chain-spec.d.ts.map +1 -1
  192. package/packages/jam/config/chain-spec.js +5 -2
  193. package/packages/jam/config/network.d.ts +2 -7
  194. package/packages/jam/config/network.d.ts.map +1 -1
  195. package/packages/jam/config/network.js +3 -0
  196. package/packages/jam/config-node/jip-chain-spec.js +1 -1
  197. package/packages/jam/database/blocks.test.js +1 -1
  198. package/packages/jam/database/states.d.ts +2 -1
  199. package/packages/jam/database/states.d.ts.map +1 -1
  200. package/packages/jam/database/states.js +3 -0
  201. package/packages/jam/database/states.test.js +1 -1
  202. package/packages/jam/database-lmdb/blocks.d.ts +2 -1
  203. package/packages/jam/database-lmdb/blocks.d.ts.map +1 -1
  204. package/packages/jam/database-lmdb/blocks.js +3 -0
  205. package/packages/jam/database-lmdb/root.d.ts +2 -1
  206. package/packages/jam/database-lmdb/root.d.ts.map +1 -1
  207. package/packages/jam/database-lmdb/root.js +3 -0
  208. package/packages/jam/database-lmdb/states.d.ts +2 -1
  209. package/packages/jam/database-lmdb/states.d.ts.map +1 -1
  210. package/packages/jam/database-lmdb/states.js +3 -0
  211. package/packages/jam/database-lmdb/states.test.js +9 -9
  212. package/packages/jam/executor/pvm-executor.d.ts +7 -0
  213. package/packages/jam/executor/pvm-executor.d.ts.map +1 -1
  214. package/packages/jam/executor/pvm-executor.js +36 -21
  215. package/packages/jam/fuzz-proto/v1/handler.d.ts +2 -1
  216. package/packages/jam/fuzz-proto/v1/handler.d.ts.map +1 -1
  217. package/packages/jam/fuzz-proto/v1/handler.js +3 -0
  218. package/packages/jam/fuzz-proto/v1/handler.test.js +10 -10
  219. package/packages/jam/in-core/externalities/refine.d.ts +5 -5
  220. package/packages/jam/in-core/externalities/refine.d.ts.map +1 -1
  221. package/packages/jam/in-core/externalities/refine.js +42 -7
  222. package/packages/jam/in-core/externalities/refine.test.js +119 -1
  223. package/packages/jam/in-core/in-core.d.ts +9 -23
  224. package/packages/jam/in-core/in-core.d.ts.map +1 -1
  225. package/packages/jam/in-core/in-core.js +19 -184
  226. package/packages/jam/in-core/in-core.test.js +52 -20
  227. package/packages/jam/in-core/is-authorized.d.ts +33 -0
  228. package/packages/jam/in-core/is-authorized.d.ts.map +1 -0
  229. package/packages/jam/in-core/is-authorized.js +72 -0
  230. package/packages/jam/in-core/is-authorized.test.d.ts +2 -0
  231. package/packages/jam/in-core/is-authorized.test.d.ts.map +1 -0
  232. package/packages/jam/in-core/is-authorized.test.js +125 -0
  233. package/packages/jam/in-core/refine.d.ts +34 -0
  234. package/packages/jam/in-core/refine.d.ts.map +1 -0
  235. package/packages/jam/in-core/refine.js +176 -0
  236. package/packages/jam/in-core/refine.test.d.ts +2 -0
  237. package/packages/jam/in-core/refine.test.d.ts.map +1 -0
  238. package/packages/jam/in-core/refine.test.js +6 -0
  239. package/packages/jam/jam-host-calls/accumulate/assign.d.ts +2 -1
  240. package/packages/jam/jam-host-calls/accumulate/assign.d.ts.map +1 -1
  241. package/packages/jam/jam-host-calls/accumulate/assign.js +3 -0
  242. package/packages/jam/jam-host-calls/accumulate/assign.test.js +8 -9
  243. package/packages/jam/jam-host-calls/accumulate/bless.d.ts +2 -1
  244. package/packages/jam/jam-host-calls/accumulate/bless.d.ts.map +1 -1
  245. package/packages/jam/jam-host-calls/accumulate/bless.js +12 -9
  246. package/packages/jam/jam-host-calls/accumulate/bless.test.js +11 -12
  247. package/packages/jam/jam-host-calls/accumulate/checkpoint.d.ts +2 -1
  248. package/packages/jam/jam-host-calls/accumulate/checkpoint.d.ts.map +1 -1
  249. package/packages/jam/jam-host-calls/accumulate/checkpoint.js +4 -1
  250. package/packages/jam/jam-host-calls/accumulate/checkpoint.test.js +2 -3
  251. package/packages/jam/jam-host-calls/accumulate/designate.d.ts +2 -1
  252. package/packages/jam/jam-host-calls/accumulate/designate.d.ts.map +1 -1
  253. package/packages/jam/jam-host-calls/accumulate/designate.js +3 -0
  254. package/packages/jam/jam-host-calls/accumulate/designate.test.js +5 -6
  255. package/packages/jam/jam-host-calls/accumulate/eject.d.ts +2 -1
  256. package/packages/jam/jam-host-calls/accumulate/eject.d.ts.map +1 -1
  257. package/packages/jam/jam-host-calls/accumulate/eject.js +3 -0
  258. package/packages/jam/jam-host-calls/accumulate/eject.test.js +8 -9
  259. package/packages/jam/jam-host-calls/accumulate/forget.d.ts +2 -1
  260. package/packages/jam/jam-host-calls/accumulate/forget.d.ts.map +1 -1
  261. package/packages/jam/jam-host-calls/accumulate/forget.js +3 -0
  262. package/packages/jam/jam-host-calls/accumulate/forget.test.js +5 -6
  263. package/packages/jam/jam-host-calls/accumulate/new.d.ts +2 -1
  264. package/packages/jam/jam-host-calls/accumulate/new.d.ts.map +1 -1
  265. package/packages/jam/jam-host-calls/accumulate/new.js +3 -0
  266. package/packages/jam/jam-host-calls/accumulate/new.test.js +9 -10
  267. package/packages/jam/jam-host-calls/accumulate/provide.d.ts +2 -1
  268. package/packages/jam/jam-host-calls/accumulate/provide.d.ts.map +1 -1
  269. package/packages/jam/jam-host-calls/accumulate/provide.js +3 -0
  270. package/packages/jam/jam-host-calls/accumulate/provide.test.js +8 -9
  271. package/packages/jam/jam-host-calls/accumulate/query.d.ts +2 -1
  272. package/packages/jam/jam-host-calls/accumulate/query.d.ts.map +1 -1
  273. package/packages/jam/jam-host-calls/accumulate/query.js +3 -0
  274. package/packages/jam/jam-host-calls/accumulate/query.test.js +8 -9
  275. package/packages/jam/jam-host-calls/accumulate/solicit.d.ts +2 -1
  276. package/packages/jam/jam-host-calls/accumulate/solicit.d.ts.map +1 -1
  277. package/packages/jam/jam-host-calls/accumulate/solicit.js +3 -0
  278. package/packages/jam/jam-host-calls/accumulate/solicit.test.js +7 -8
  279. package/packages/jam/jam-host-calls/accumulate/transfer.d.ts +2 -1
  280. package/packages/jam/jam-host-calls/accumulate/transfer.d.ts.map +1 -1
  281. package/packages/jam/jam-host-calls/accumulate/transfer.js +3 -0
  282. package/packages/jam/jam-host-calls/accumulate/transfer.test.js +9 -10
  283. package/packages/jam/jam-host-calls/accumulate/upgrade.d.ts +2 -1
  284. package/packages/jam/jam-host-calls/accumulate/upgrade.d.ts.map +1 -1
  285. package/packages/jam/jam-host-calls/accumulate/upgrade.js +3 -0
  286. package/packages/jam/jam-host-calls/accumulate/upgrade.test.js +4 -5
  287. package/packages/jam/jam-host-calls/accumulate/yield.d.ts +2 -1
  288. package/packages/jam/jam-host-calls/accumulate/yield.d.ts.map +1 -1
  289. package/packages/jam/jam-host-calls/accumulate/yield.js +3 -0
  290. package/packages/jam/jam-host-calls/accumulate/yield.test.js +4 -5
  291. package/packages/jam/jam-host-calls/externalities/partial-state.d.ts +1 -1
  292. package/packages/jam/jam-host-calls/externalities/refine-externalities.d.ts +1 -1
  293. package/packages/jam/jam-host-calls/externalities/refine-externalities.d.ts.map +1 -1
  294. package/packages/jam/jam-host-calls/externalities/refine-externalities.test.js +9 -9
  295. package/packages/jam/jam-host-calls/externalities/state-update.d.ts +2 -3
  296. package/packages/jam/jam-host-calls/externalities/state-update.d.ts.map +1 -1
  297. package/packages/jam/jam-host-calls/externalities/state-update.js +5 -2
  298. package/packages/jam/jam-host-calls/externalities/test-accounts.js +2 -2
  299. package/packages/jam/jam-host-calls/general/fetch.d.ts +42 -41
  300. package/packages/jam/jam-host-calls/general/fetch.d.ts.map +1 -1
  301. package/packages/jam/jam-host-calls/general/fetch.js +33 -30
  302. package/packages/jam/jam-host-calls/general/fetch.test.js +44 -42
  303. package/packages/jam/jam-host-calls/general/gas.d.ts +2 -1
  304. package/packages/jam/jam-host-calls/general/gas.d.ts.map +1 -1
  305. package/packages/jam/jam-host-calls/general/gas.js +3 -0
  306. package/packages/jam/jam-host-calls/general/gas.test.js +4 -5
  307. package/packages/jam/jam-host-calls/general/info.d.ts +2 -1
  308. package/packages/jam/jam-host-calls/general/info.d.ts.map +1 -1
  309. package/packages/jam/jam-host-calls/general/info.js +3 -0
  310. package/packages/jam/jam-host-calls/general/info.test.js +6 -7
  311. package/packages/jam/jam-host-calls/general/log.d.ts +2 -1
  312. package/packages/jam/jam-host-calls/general/log.d.ts.map +1 -1
  313. package/packages/jam/jam-host-calls/general/log.js +3 -0
  314. package/packages/jam/jam-host-calls/general/lookup.d.ts +2 -1
  315. package/packages/jam/jam-host-calls/general/lookup.d.ts.map +1 -1
  316. package/packages/jam/jam-host-calls/general/lookup.js +3 -0
  317. package/packages/jam/jam-host-calls/general/lookup.test.js +8 -9
  318. package/packages/jam/jam-host-calls/general/read.d.ts +2 -1
  319. package/packages/jam/jam-host-calls/general/read.d.ts.map +1 -1
  320. package/packages/jam/jam-host-calls/general/read.js +3 -0
  321. package/packages/jam/jam-host-calls/general/read.test.js +11 -12
  322. package/packages/jam/jam-host-calls/general/write.d.ts +2 -1
  323. package/packages/jam/jam-host-calls/general/write.d.ts.map +1 -1
  324. package/packages/jam/jam-host-calls/general/write.js +3 -0
  325. package/packages/jam/jam-host-calls/general/write.test.js +10 -11
  326. package/packages/jam/jam-host-calls/refine/export.d.ts +2 -1
  327. package/packages/jam/jam-host-calls/refine/export.d.ts.map +1 -1
  328. package/packages/jam/jam-host-calls/refine/export.js +3 -0
  329. package/packages/jam/jam-host-calls/refine/export.test.js +6 -7
  330. package/packages/jam/jam-host-calls/refine/expunge.d.ts +2 -1
  331. package/packages/jam/jam-host-calls/refine/expunge.d.ts.map +1 -1
  332. package/packages/jam/jam-host-calls/refine/expunge.js +3 -0
  333. package/packages/jam/jam-host-calls/refine/expunge.test.js +3 -4
  334. package/packages/jam/jam-host-calls/refine/historical-lookup.d.ts +2 -1
  335. package/packages/jam/jam-host-calls/refine/historical-lookup.d.ts.map +1 -1
  336. package/packages/jam/jam-host-calls/refine/historical-lookup.js +3 -0
  337. package/packages/jam/jam-host-calls/refine/historical-lookup.test.js +11 -12
  338. package/packages/jam/jam-host-calls/refine/invoke.d.ts +2 -1
  339. package/packages/jam/jam-host-calls/refine/invoke.d.ts.map +1 -1
  340. package/packages/jam/jam-host-calls/refine/invoke.js +4 -1
  341. package/packages/jam/jam-host-calls/refine/invoke.test.js +10 -11
  342. package/packages/jam/jam-host-calls/refine/machine.d.ts +2 -1
  343. package/packages/jam/jam-host-calls/refine/machine.d.ts.map +1 -1
  344. package/packages/jam/jam-host-calls/refine/machine.js +3 -0
  345. package/packages/jam/jam-host-calls/refine/machine.test.js +6 -7
  346. package/packages/jam/jam-host-calls/refine/pages.d.ts +2 -1
  347. package/packages/jam/jam-host-calls/refine/pages.d.ts.map +1 -1
  348. package/packages/jam/jam-host-calls/refine/pages.js +3 -0
  349. package/packages/jam/jam-host-calls/refine/pages.test.js +3 -4
  350. package/packages/jam/jam-host-calls/refine/peek.d.ts +2 -1
  351. package/packages/jam/jam-host-calls/refine/peek.d.ts.map +1 -1
  352. package/packages/jam/jam-host-calls/refine/peek.js +3 -0
  353. package/packages/jam/jam-host-calls/refine/peek.test.js +3 -4
  354. package/packages/jam/jam-host-calls/refine/poke.d.ts +2 -1
  355. package/packages/jam/jam-host-calls/refine/poke.d.ts.map +1 -1
  356. package/packages/jam/jam-host-calls/refine/poke.js +3 -0
  357. package/packages/jam/jam-host-calls/refine/poke.test.js +3 -4
  358. package/packages/jam/jamnp-s/network.js +1 -1
  359. package/packages/jam/jamnp-s/peers.d.ts +2 -1
  360. package/packages/jam/jamnp-s/peers.d.ts.map +1 -1
  361. package/packages/jam/jamnp-s/peers.js +3 -0
  362. package/packages/jam/jamnp-s/protocol/ce-128-block-request.d.ts +4 -2
  363. package/packages/jam/jamnp-s/protocol/ce-128-block-request.d.ts.map +1 -1
  364. package/packages/jam/jamnp-s/protocol/ce-128-block-request.js +6 -0
  365. package/packages/jam/jamnp-s/protocol/ce-128-block-request.test.js +2 -2
  366. package/packages/jam/jamnp-s/protocol/ce-129-state-request.d.ts +4 -2
  367. package/packages/jam/jamnp-s/protocol/ce-129-state-request.d.ts.map +1 -1
  368. package/packages/jam/jamnp-s/protocol/ce-129-state-request.js +6 -0
  369. package/packages/jam/jamnp-s/protocol/ce-129-state-request.test.js +4 -4
  370. package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.d.ts +4 -2
  371. package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.d.ts.map +1 -1
  372. package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.js +6 -0
  373. package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.test.js +2 -2
  374. package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.d.ts +6 -3
  375. package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.d.ts.map +1 -1
  376. package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.js +7 -0
  377. package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.test.js +2 -2
  378. package/packages/jam/jamnp-s/protocol/ce-134-work-package-sharing.d.ts +5 -2
  379. package/packages/jam/jamnp-s/protocol/ce-134-work-package-sharing.d.ts.map +1 -1
  380. package/packages/jam/jamnp-s/protocol/ce-134-work-package-sharing.js +7 -0
  381. package/packages/jam/jamnp-s/protocol/ce-134-work-package-sharing.test.js +2 -2
  382. package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.d.ts +4 -2
  383. package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.d.ts.map +1 -1
  384. package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.js +6 -0
  385. package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.test.js +2 -2
  386. package/packages/jam/jamnp-s/protocol/up-0-block-announcement.d.ts +2 -1
  387. package/packages/jam/jamnp-s/protocol/up-0-block-announcement.d.ts.map +1 -1
  388. package/packages/jam/jamnp-s/protocol/up-0-block-announcement.js +3 -0
  389. package/packages/jam/jamnp-s/stream-manager.d.ts +2 -1
  390. package/packages/jam/jamnp-s/stream-manager.d.ts.map +1 -1
  391. package/packages/jam/jamnp-s/stream-manager.js +4 -1
  392. package/packages/jam/jamnp-s/tasks/sync.js +4 -4
  393. package/packages/jam/jamnp-s/tasks/sync.test.js +4 -4
  394. package/packages/jam/jamnp-s/tasks/ticket-distribution.js +2 -2
  395. package/packages/jam/jamnp-s/tasks/ticket-distribution.test.js +1 -1
  396. package/packages/jam/node/common.d.ts.map +1 -1
  397. package/packages/jam/node/common.js +3 -3
  398. package/packages/jam/rpc-client/index.d.ts +4 -2
  399. package/packages/jam/rpc-client/index.d.ts.map +1 -1
  400. package/packages/jam/rpc-client/index.js +7 -1
  401. package/packages/jam/state/in-memory-state-view.d.ts +2 -1
  402. package/packages/jam/state/in-memory-state-view.d.ts.map +1 -1
  403. package/packages/jam/state/in-memory-state-view.js +3 -0
  404. package/packages/jam/state/in-memory-state.d.ts +16 -21
  405. package/packages/jam/state/in-memory-state.d.ts.map +1 -1
  406. package/packages/jam/state/in-memory-state.js +10 -6
  407. package/packages/jam/state/in-memory-state.test.js +2 -2
  408. package/packages/jam/state/service.d.ts +2 -6
  409. package/packages/jam/state/service.d.ts.map +1 -1
  410. package/packages/jam/state/service.js +3 -0
  411. package/packages/jam/state/test.utils.js +3 -3
  412. package/packages/jam/state-json/accounts.js +5 -5
  413. package/packages/jam/state-merkleization/in-memory-state-codec.d.ts +3 -34
  414. package/packages/jam/state-merkleization/in-memory-state-codec.d.ts.map +1 -1
  415. package/packages/jam/state-merkleization/in-memory-state-codec.js +1 -1
  416. package/packages/jam/state-merkleization/serialized-state-view.d.ts +8 -3
  417. package/packages/jam/state-merkleization/serialized-state-view.d.ts.map +1 -1
  418. package/packages/jam/state-merkleization/serialized-state-view.js +6 -3
  419. package/packages/jam/state-merkleization/serialized-state.d.ts +2 -3
  420. package/packages/jam/state-merkleization/serialized-state.d.ts.map +1 -1
  421. package/packages/jam/state-merkleization/serialized-state.js +10 -2
  422. package/packages/jam/state-merkleization/serialized-state.test.js +1 -1
  423. package/packages/jam/transition/accumulate/accumulate.js +10 -3
  424. package/packages/jam/transition/accumulate/accumulate.test.js +1 -1
  425. package/packages/jam/transition/accumulate/accumulation-result-merge-utils.js +48 -39
  426. package/packages/jam/transition/block-verifier.d.ts +2 -1
  427. package/packages/jam/transition/block-verifier.d.ts.map +1 -1
  428. package/packages/jam/transition/block-verifier.js +3 -0
  429. package/packages/jam/transition/block-verifier.test.js +8 -8
  430. package/packages/jam/transition/chain-stf.d.ts +12 -4
  431. package/packages/jam/transition/chain-stf.d.ts.map +1 -1
  432. package/packages/jam/transition/chain-stf.js +7 -3
  433. package/packages/jam/transition/externalities/accumulate-externalities.d.ts +22 -8
  434. package/packages/jam/transition/externalities/accumulate-externalities.d.ts.map +1 -1
  435. package/packages/jam/transition/externalities/accumulate-externalities.js +49 -29
  436. package/packages/jam/transition/externalities/accumulate-externalities.test.js +661 -101
  437. package/packages/jam/transition/externalities/index.d.ts +1 -0
  438. package/packages/jam/transition/externalities/index.d.ts.map +1 -1
  439. package/packages/jam/transition/externalities/index.js +1 -0
  440. package/packages/jam/transition/externalities/is-authorized-fetch-externalities.d.ts +22 -0
  441. package/packages/jam/transition/externalities/is-authorized-fetch-externalities.d.ts.map +1 -0
  442. package/packages/jam/transition/externalities/is-authorized-fetch-externalities.js +41 -0
  443. package/packages/jam/transition/externalities/refine-fetch-externalities.d.ts +9 -8
  444. package/packages/jam/transition/externalities/refine-fetch-externalities.d.ts.map +1 -1
  445. package/packages/jam/transition/externalities/refine-fetch-externalities.js +20 -9
  446. package/packages/jam/transition/externalities/refine-fetch-externalities.test.js +1 -1
  447. package/packages/jam/transition/hasher.d.ts +2 -1
  448. package/packages/jam/transition/hasher.d.ts.map +1 -1
  449. package/packages/jam/transition/hasher.js +5 -2
  450. package/packages/jam/transition/hasher.test.js +1 -1
  451. package/packages/jam/transition/preimages.test.js +4 -4
  452. package/packages/jam/transition/reports/test.utils.js +1 -1
  453. package/packages/workers/api-node/config.js +4 -4
  454. package/packages/workers/api-node/port.d.ts +2 -1
  455. package/packages/workers/api-node/port.d.ts.map +1 -1
  456. package/packages/workers/api-node/port.js +4 -1
  457. package/packages/workers/api-node/port.test.js +2 -2
  458. package/packages/workers/api-node/protocol.js +2 -2
  459. package/packages/workers/block-authorship/generator.d.ts +13 -2
  460. package/packages/workers/block-authorship/generator.d.ts.map +1 -1
  461. package/packages/workers/block-authorship/generator.js +13 -9
  462. package/packages/workers/block-authorship/generator.test.js +16 -2
  463. package/packages/workers/block-authorship/main.d.ts.map +1 -1
  464. package/packages/workers/block-authorship/main.js +8 -1
  465. package/packages/workers/importer/finality.test.js +1 -1
  466. package/packages/workers/importer/importer.d.ts +23 -6
  467. package/packages/workers/importer/importer.d.ts.map +1 -1
  468. package/packages/workers/importer/importer.js +34 -19
  469. package/packages/workers/importer/main.d.ts.map +1 -1
  470. package/packages/workers/importer/main.js +13 -5
@@ -1,18 +1,13 @@
1
- import { tryAsCoreIndex, tryAsServiceGas, } from "#@typeberry/block";
2
- import { W_C } from "#@typeberry/block/gp-constants.js";
3
- import { WorkPackageInfo, } from "#@typeberry/block/refine-context.js";
1
+ import { WorkPackageInfo } from "#@typeberry/block/refine-context.js";
4
2
  import { WorkPackageSpec, WorkReport } from "#@typeberry/block/work-report.js";
5
- import { WorkExecResult, WorkExecResultKind, WorkRefineLoad, WorkResult } from "#@typeberry/block/work-result.js";
6
- import { Bytes, BytesBlob } from "#@typeberry/bytes";
7
- import { codec, Encoder } from "#@typeberry/codec";
3
+ import { Bytes } from "#@typeberry/bytes";
8
4
  import { asKnownSize, FixedSizeArray } from "#@typeberry/collections";
9
- import { PvmExecutor, ReturnStatus } from "#@typeberry/executor";
10
5
  import { HASH_SIZE } from "#@typeberry/hash";
11
6
  import { Logger } from "#@typeberry/logger";
12
7
  import { tryAsU8, tryAsU16, tryAsU32 } from "#@typeberry/numbers";
13
- import { RefineFetchExternalities } from "#@typeberry/transition/externalities/refine-fetch-externalities.js";
14
- import { assertEmpty, assertNever, Result } from "#@typeberry/utils";
15
- import { RefineExternalitiesImpl } from "./externalities/refine.js";
8
+ import { assertEmpty, Result } from "#@typeberry/utils";
9
+ import { AuthorizationError, IsAuthorized } from "./is-authorized.js";
10
+ import { Refine } from "./refine.js";
16
11
  export var RefineError;
17
12
  (function (RefineError) {
18
13
  /** State for context anchor block or lookup anchor is not found in the DB. */
@@ -24,39 +19,20 @@ export var RefineError;
24
19
  /** Authorization error. */
25
20
  RefineError[RefineError["AuthorizationError"] = 3] = "AuthorizationError";
26
21
  })(RefineError || (RefineError = {}));
27
- var ServiceCodeError;
28
- (function (ServiceCodeError) {
29
- /** Service id is not found in the state. */
30
- ServiceCodeError[ServiceCodeError["ServiceNotFound"] = 0] = "ServiceNotFound";
31
- /** Expected service code does not match the state one. */
32
- ServiceCodeError[ServiceCodeError["ServiceCodeMismatch"] = 1] = "ServiceCodeMismatch";
33
- /** Code preimage missing. */
34
- ServiceCodeError[ServiceCodeError["ServiceCodeMissing"] = 2] = "ServiceCodeMissing";
35
- /** Code blob is too big. */
36
- ServiceCodeError[ServiceCodeError["ServiceCodeTooBig"] = 3] = "ServiceCodeTooBig";
37
- })(ServiceCodeError || (ServiceCodeError = {}));
38
- var AuthorizationError;
39
- (function (AuthorizationError) {
40
- })(AuthorizationError || (AuthorizationError = {}));
41
22
  const logger = Logger.new(import.meta.filename, "refine");
42
- /** https://graypaper.fluffylabs.dev/#/ab2cdbd/2ffe002ffe00?v=0.7.2 */
43
- const ARGS_CODEC = codec.object({
44
- core: codec.varU32.convert((x) => tryAsU32(x), (x) => tryAsCoreIndex(x)),
45
- workItemIndex: codec.varU32,
46
- serviceId: codec.varU32.asOpaque(),
47
- payloadLength: codec.varU32,
48
- packageHash: codec.bytes(HASH_SIZE).asOpaque(),
49
- });
50
23
  export class InCore {
51
24
  chainSpec;
52
25
  states;
53
- pvmBackend;
54
- blake2b;
26
+ isAuthorized;
27
+ refineItem;
28
+ static new(chainSpec, states, pvmBackend, blake2b) {
29
+ return new InCore(chainSpec, states, pvmBackend, blake2b);
30
+ }
55
31
  constructor(chainSpec, states, pvmBackend, blake2b) {
56
32
  this.chainSpec = chainSpec;
57
33
  this.states = states;
58
- this.pvmBackend = pvmBackend;
59
- this.blake2b = blake2b;
34
+ this.isAuthorized = new IsAuthorized(chainSpec, pvmBackend, blake2b);
35
+ this.refineItem = new Refine(chainSpec, pvmBackend, blake2b);
60
36
  }
61
37
  /**
62
38
  * Work-report computation function.
@@ -70,13 +46,14 @@ export class InCore {
70
46
  */
71
47
  async refine(workPackageAndHash, core, imports, extrinsics) {
72
48
  const workPackageHash = workPackageAndHash.hash;
73
- const { context, authorization, authCodeHash, authCodeHost, parametrization, items, ...rest } = workPackageAndHash.data;
49
+ const { context, authToken, authCodeHash, authCodeHost, authConfiguration, items, ...rest } = workPackageAndHash.data;
74
50
  assertEmpty(rest);
75
51
  // TODO [ToDr] Verify BEEFY root
76
52
  // TODO [ToDr] Verify prerequisites
77
53
  logger.log `[core:${core}] Attempting to refine work package with ${items.length} items.`;
78
- // TODO [ToDr] GP link
79
54
  // Verify anchor block
55
+ // https://graypaper.fluffylabs.dev/#/ab2cdbd/15cd0215cd02?v=0.7.2
56
+ // TODO [ToDr] Validation
80
57
  const state = this.states.getState(context.anchor);
81
58
  if (state === null) {
82
59
  return Result.error(RefineError.StateMissing, () => `State at anchor block ${context.anchor} is missing.`);
@@ -96,7 +73,7 @@ export class InCore {
96
73
  return Result.error(RefineError.InvalidLookupAnchorSlot, () => `Lookup anchor slot does not match the one is state. Ours: ${lookupState.timeslot}, expected: ${context.lookupAnchorSlot}`);
97
74
  }
98
75
  // Check authorization
99
- const authResult = await this.authorizePackage(authorization, authCodeHost, authCodeHash, parametrization);
76
+ const authResult = await this.isAuthorized.invoke(state, core, authToken, authCodeHost, authCodeHash, authConfiguration);
100
77
  if (authResult.isError) {
101
78
  return Result.error(RefineError.AuthorizationError, () => `Authorization error: ${AuthorizationError[authResult.error]}: ${authResult.details()}.`);
102
79
  }
@@ -106,14 +83,14 @@ export class InCore {
106
83
  const refineResults = [];
107
84
  for (const [idx, item] of items.entries()) {
108
85
  logger.info `[core:${core}][i:${idx}] Refining item for service ${item.service}.`;
109
- const result = await this.refineItem(state, lookupState, idx, item, imports, extrinsics, core, workPackageHash, exportOffset);
86
+ const result = await this.refineItem.invoke(state, lookupState, idx, item, imports, extrinsics, core, workPackageHash, exportOffset);
110
87
  refineResults.push(result);
111
88
  exportOffset += result.exports.length;
112
89
  }
113
90
  // amalgamate the work report now
114
- return Result.ok(this.amalgamateWorkReport(asKnownSize(refineResults), authResult.ok, workPackageHash, context, core));
91
+ return Result.ok(InCore.amalgamateWorkReport(asKnownSize(refineResults), authResult.ok, workPackageHash, context, core));
115
92
  }
116
- amalgamateWorkReport(refineResults, authResult, workPackageHash, context, coreIndex) {
93
+ static amalgamateWorkReport(refineResults, authResult, workPackageHash, context, coreIndex) {
117
94
  // unzip exports and work results for each work item
118
95
  const exports = refineResults.map((x) => x.exports);
119
96
  const results = refineResults.map((x) => x.result);
@@ -156,146 +133,4 @@ export class InCore {
156
133
  exports: asKnownSize(exports),
157
134
  };
158
135
  }
159
- async authorizePackage(_authorization, _authCodeHost, _authCodeHash, _parametrization) {
160
- // TODO [ToDr] Check authorization?
161
- const authorizerHash = Bytes.zero(HASH_SIZE).asOpaque();
162
- const authorizationGasUsed = tryAsServiceGas(0);
163
- const authorizationOutput = BytesBlob.empty();
164
- return Result.ok({
165
- authorizerHash,
166
- authorizationGasUsed,
167
- authorizationOutput,
168
- });
169
- }
170
- async refineItem(state, lookupState, idx, item, allImports, allExtrinsics, coreIndex, workPackageHash, exportOffset) {
171
- const payloadHash = this.blake2b.hashBytes(item.payload);
172
- const baseResult = {
173
- serviceId: item.service,
174
- codeHash: item.codeHash,
175
- payloadHash,
176
- gas: item.refineGasLimit,
177
- };
178
- const imports = allImports[idx];
179
- const extrinsics = allExtrinsics[idx];
180
- const baseLoad = {
181
- importedSegments: tryAsU32(imports.length),
182
- extrinsicCount: tryAsU32(extrinsics.length),
183
- extrinsicSize: tryAsU32(extrinsics.reduce((acc, x) => acc + x.length, 0)),
184
- };
185
- const maybeCode = this.getServiceCode(state, idx, item);
186
- if (maybeCode.isError) {
187
- const error = maybeCode.error === ServiceCodeError.ServiceCodeTooBig
188
- ? WorkExecResultKind.codeOversize
189
- : WorkExecResultKind.badCode;
190
- return {
191
- exports: [],
192
- result: WorkResult.create({
193
- ...baseResult,
194
- result: WorkExecResult.error(error),
195
- load: WorkRefineLoad.create({
196
- ...baseLoad,
197
- gasUsed: tryAsServiceGas(item.refineGasLimit),
198
- exportedSegments: tryAsU32(0),
199
- }),
200
- }),
201
- };
202
- }
203
- const code = maybeCode.ok;
204
- const externalities = this.createRefineExternalities({
205
- payload: item.payload,
206
- imports: allImports,
207
- extrinsics: allExtrinsics,
208
- currentServiceId: item.service,
209
- lookupState,
210
- exportOffset,
211
- });
212
- const executor = await PvmExecutor.createRefineExecutor(item.service, code, externalities, this.pvmBackend);
213
- const args = Encoder.encodeObject(ARGS_CODEC, {
214
- serviceId: item.service,
215
- core: coreIndex,
216
- workItemIndex: tryAsU32(idx),
217
- payloadLength: tryAsU32(item.payload.length),
218
- packageHash: workPackageHash,
219
- });
220
- const execResult = await executor.run(args, item.refineGasLimit);
221
- const exports = externalities.refine.getExportedSegments();
222
- if (exports.length !== item.exportCount) {
223
- return {
224
- exports,
225
- result: WorkResult.create({
226
- ...baseResult,
227
- result: WorkExecResult.error(WorkExecResultKind.incorrectNumberOfExports),
228
- load: WorkRefineLoad.create({
229
- ...baseLoad,
230
- gasUsed: tryAsServiceGas(item.refineGasLimit),
231
- exportedSegments: tryAsU32(0),
232
- }),
233
- }),
234
- };
235
- }
236
- const result = this.extractWorkResult(execResult);
237
- return {
238
- exports,
239
- result: WorkResult.create({
240
- ...baseResult,
241
- result,
242
- load: WorkRefineLoad.create({
243
- ...baseLoad,
244
- gasUsed: tryAsServiceGas(execResult.consumedGas),
245
- exportedSegments: tryAsU32(exports.length),
246
- }),
247
- }),
248
- };
249
- }
250
- extractWorkResult(execResult) {
251
- if (execResult.status === ReturnStatus.OK) {
252
- const slice = execResult.memorySlice;
253
- // TODO [ToDr] Verify the output size and change digestTooBig?
254
- return WorkExecResult.ok(BytesBlob.blobFrom(slice));
255
- }
256
- switch (execResult.status) {
257
- case ReturnStatus.OOG:
258
- return WorkExecResult.error(WorkExecResultKind.outOfGas);
259
- case ReturnStatus.PANIC:
260
- return WorkExecResult.error(WorkExecResultKind.panic);
261
- default:
262
- assertNever(execResult);
263
- }
264
- }
265
- getServiceCode(state, idx, item) {
266
- const serviceId = item.service;
267
- const service = state.getService(serviceId);
268
- // TODO [ToDr] GP link
269
- // missing service
270
- if (service === null) {
271
- return Result.error(ServiceCodeError.ServiceNotFound, () => `[i:${idx}] Service ${serviceId} is missing in state.`);
272
- }
273
- // TODO [ToDr] GP link
274
- // TODO [ToDr] shall we rather use the old codehash instead
275
- if (!service.getInfo().codeHash.isEqualTo(item.codeHash)) {
276
- return Result.error(ServiceCodeError.ServiceCodeMismatch, () => `[i:${idx}] Service ${serviceId} has invalid code hash. Ours: ${service.getInfo().codeHash}, expected: ${item.codeHash}`);
277
- }
278
- const code = service.getPreimage(item.codeHash.asOpaque());
279
- if (code === null) {
280
- return Result.error(ServiceCodeError.ServiceCodeMissing, () => `[i:${idx}] Code ${item.codeHash} for service ${serviceId} was not found.`);
281
- }
282
- if (code.length > W_C) {
283
- return Result.error(ServiceCodeError.ServiceCodeTooBig, () => `[i:${idx}] Code ${item.codeHash} for service ${serviceId} is too big! ${code.length} bytes vs ${W_C} bytes max.`);
284
- }
285
- return Result.ok(code);
286
- }
287
- createRefineExternalities(args) {
288
- // TODO [ToDr] Pass all required fetch data
289
- const fetchExternalities = new RefineFetchExternalities(this.chainSpec);
290
- const refine = RefineExternalitiesImpl.create({
291
- currentServiceId: args.currentServiceId,
292
- lookupState: args.lookupState,
293
- exportOffset: args.exportOffset,
294
- pvmBackend: this.pvmBackend,
295
- });
296
- return {
297
- fetchExternalities,
298
- refine,
299
- };
300
- }
301
136
  }
@@ -1,4 +1,6 @@
1
1
  import assert from "node:assert";
2
+ import { readFileSync } from "node:fs";
3
+ import { resolve } from "node:path";
2
4
  import { before, describe, it } from "node:test";
3
5
  import { tryAsCoreIndex, tryAsServiceGas, tryAsServiceId, tryAsTimeSlot } from "#@typeberry/block";
4
6
  import { RefineContext } from "#@typeberry/block/refine-context.js";
@@ -6,21 +8,46 @@ import { WorkItem } from "#@typeberry/block/work-item.js";
6
8
  import { tryAsWorkItemsCount, WorkPackage } from "#@typeberry/block/work-package.js";
7
9
  import { Bytes, BytesBlob } from "#@typeberry/bytes";
8
10
  import { Encoder } from "#@typeberry/codec";
9
- import { asKnownSize, FixedSizeArray } from "#@typeberry/collections";
11
+ import { asKnownSize, FixedSizeArray, HashDictionary } from "#@typeberry/collections";
10
12
  import { PvmBackend, tinyChainSpec } from "#@typeberry/config";
11
13
  import { InMemoryStates } from "#@typeberry/database";
12
14
  import { Blake2b, HASH_SIZE, WithHash } from "#@typeberry/hash";
13
- import { tryAsU16 } from "#@typeberry/numbers";
14
- import { testState } from "#@typeberry/state/test.utils.js";
15
+ import { tryAsU16, tryAsU32, tryAsU64 } from "#@typeberry/numbers";
16
+ import { InMemoryService, InMemoryState, PreimageItem, ServiceAccountInfo } from "#@typeberry/state";
15
17
  import { InCore, RefineError } from "./in-core.js";
18
+ // Load the authorizer PVM fixture (checks authToken === authConfiguration).
19
+ const AUTHORIZER_PVM = BytesBlob.blobFrom(readFileSync(resolve(import.meta.dirname, "fixtures/authorizer.pvm")));
20
+ const AUTH_SERVICE_ID = tryAsServiceId(1);
16
21
  let blake2b;
17
22
  before(async () => {
18
23
  blake2b = await Blake2b.createHasher();
19
24
  });
20
- function createWorkItem(serviceId = 1) {
25
+ function getAuthCodeHash() {
26
+ return blake2b.hashBytes(AUTHORIZER_PVM).asOpaque();
27
+ }
28
+ function createService(serviceId, codeHash, code) {
29
+ return InMemoryService.new(serviceId, {
30
+ info: ServiceAccountInfo.create({
31
+ codeHash: codeHash.asOpaque(),
32
+ balance: tryAsU64(10_000_000_000),
33
+ accumulateMinGas: tryAsServiceGas(0n),
34
+ onTransferMinGas: tryAsServiceGas(0n),
35
+ storageUtilisationBytes: tryAsU64(0),
36
+ storageUtilisationCount: tryAsU32(0),
37
+ gratisStorage: tryAsU64(0),
38
+ created: tryAsTimeSlot(0),
39
+ lastAccumulation: tryAsTimeSlot(0),
40
+ parentService: tryAsServiceId(0),
41
+ }),
42
+ preimages: HashDictionary.fromEntries([PreimageItem.create({ hash: codeHash.asOpaque(), blob: code })].map((x) => [x.hash, x])),
43
+ lookupHistory: HashDictionary.fromEntries([]),
44
+ storage: new Map(),
45
+ });
46
+ }
47
+ function createWorkItem(codeHash, serviceId = 1) {
21
48
  return WorkItem.create({
22
49
  service: tryAsServiceId(serviceId),
23
- codeHash: Bytes.zero(HASH_SIZE).asOpaque(),
50
+ codeHash,
24
51
  payload: BytesBlob.empty(),
25
52
  refineGasLimit: tryAsServiceGas(1_000_000),
26
53
  accumulateGasLimit: tryAsServiceGas(1_000_000),
@@ -29,12 +56,12 @@ function createWorkItem(serviceId = 1) {
29
56
  exportCount: tryAsU16(0),
30
57
  });
31
58
  }
32
- function createWorkPackage(anchorHash, stateRoot, lookupAnchorSlot = 0) {
59
+ function createWorkPackage(anchorHash, stateRoot, authCodeHash, lookupAnchorSlot = 0) {
33
60
  return WorkPackage.create({
34
- authorization: BytesBlob.empty(),
35
- authCodeHost: tryAsServiceId(1),
36
- authCodeHash: Bytes.zero(HASH_SIZE).asOpaque(),
37
- parametrization: BytesBlob.empty(),
61
+ authToken: BytesBlob.empty(),
62
+ authCodeHost: AUTH_SERVICE_ID,
63
+ authCodeHash,
64
+ authConfiguration: BytesBlob.empty(),
38
65
  context: RefineContext.create({
39
66
  anchor: anchorHash,
40
67
  stateRoot,
@@ -43,38 +70,43 @@ function createWorkPackage(anchorHash, stateRoot, lookupAnchorSlot = 0) {
43
70
  lookupAnchorSlot: tryAsTimeSlot(lookupAnchorSlot),
44
71
  prerequisites: [],
45
72
  }),
46
- items: FixedSizeArray.new([createWorkItem()], tryAsWorkItemsCount(1)),
73
+ items: FixedSizeArray.new([createWorkItem(authCodeHash)], tryAsWorkItemsCount(1)),
47
74
  });
48
75
  }
49
76
  function hashWorkPackage(spec, workPackage) {
50
77
  const workPackageHash = blake2b
51
78
  .hashBytes(Encoder.encodeObject(WorkPackage.Codec, workPackage, spec))
52
79
  .asOpaque();
53
- return new WithHash(workPackageHash, workPackage);
80
+ return WithHash.new(workPackageHash, workPackage);
54
81
  }
55
82
  describe("InCore", () => {
56
83
  it("should return StateMissing error when anchor block state is not in DB", async () => {
57
84
  const spec = tinyChainSpec;
58
- const states = new InMemoryStates(spec);
59
- const inCore = new InCore(spec, states, PvmBackend.BuiltIn, blake2b);
85
+ const states = InMemoryStates.new(spec);
86
+ const inCore = InCore.new(spec, states, PvmBackend.BuiltIn, blake2b);
60
87
  const anchorHash = Bytes.fill(HASH_SIZE, 1).asOpaque();
61
88
  const stateRoot = Bytes.zero(HASH_SIZE).asOpaque();
62
- const workPackage = createWorkPackage(anchorHash, stateRoot);
89
+ const authCodeHash = getAuthCodeHash();
90
+ const workPackage = createWorkPackage(anchorHash, stateRoot, authCodeHash);
63
91
  const result = await inCore.refine(hashWorkPackage(spec, workPackage), tryAsCoreIndex(0), asKnownSize([[]]), asKnownSize([[]]));
64
92
  assert.strictEqual(result.isError, true);
65
93
  assert.strictEqual(result.error, RefineError.StateMissing);
66
94
  });
67
95
  it("should refine work package and produce a report when state is set up", async () => {
68
96
  const spec = tinyChainSpec;
69
- const states = new InMemoryStates(spec);
70
- const inCore = new InCore(spec, states, PvmBackend.BuiltIn, blake2b);
97
+ const states = InMemoryStates.new(spec);
98
+ const inCore = InCore.new(spec, states, PvmBackend.BuiltIn, blake2b);
99
+ const authCodeHash = getAuthCodeHash();
71
100
  const anchorHash = Bytes.fill(HASH_SIZE, 1).asOpaque();
72
- const state = testState();
101
+ const state = InMemoryState.partial(spec, {
102
+ timeslot: tryAsTimeSlot(16),
103
+ services: new Map([[AUTH_SERVICE_ID, createService(AUTH_SERVICE_ID, authCodeHash, AUTHORIZER_PVM)]]),
104
+ });
73
105
  await states.insertInitialState(anchorHash, state);
74
106
  const correctStateRoot = await states.getStateRoot(state);
75
- const workPackage = createWorkPackage(anchorHash, correctStateRoot, state.timeslot);
107
+ const workPackage = createWorkPackage(anchorHash, correctStateRoot, authCodeHash, state.timeslot);
76
108
  const result = await inCore.refine(hashWorkPackage(spec, workPackage), tryAsCoreIndex(0), asKnownSize([[]]), asKnownSize([[]]));
77
- assert.strictEqual(result.isOk, true);
109
+ assert.strictEqual(result.isOk, true, `Expected OK but got error: ${result.isError ? result.details() : ""}`);
78
110
  assert.strictEqual(result.ok.report.coreIndex, 0);
79
111
  assert.strictEqual(result.ok.report.results.length, 1);
80
112
  });
@@ -0,0 +1,33 @@
1
+ import { type CodeHash, type CoreIndex, type ServiceGas, type ServiceId } from "#@typeberry/block";
2
+ import type { AuthorizerHash } from "#@typeberry/block/refine-context.js";
3
+ import { BytesBlob } from "#@typeberry/bytes";
4
+ import type { ChainSpec, PvmBackend } from "#@typeberry/config";
5
+ import type { Blake2b } from "#@typeberry/hash";
6
+ import type { State } from "#@typeberry/state";
7
+ import { Result } from "#@typeberry/utils";
8
+ export declare enum AuthorizationError {
9
+ /** BAD: authorizer code not found (service or preimage missing). */
10
+ CodeNotFound = 0,
11
+ /** BIG: authorizer code exceeds W_A limit. */
12
+ CodeTooBig = 1,
13
+ /** PANIC/OOG: PVM execution failed. */
14
+ PvmFailed = 2
15
+ }
16
+ export type AuthorizationOk = {
17
+ authorizerHash: AuthorizerHash;
18
+ authorizationGasUsed: ServiceGas;
19
+ authorizationOutput: BytesBlob;
20
+ };
21
+ /**
22
+ * IsAuthorized PVM invocation (Psi_I).
23
+ *
24
+ * https://graypaper.fluffylabs.dev/#/ab2cdbd/2e64002e6400?v=0.7.2
25
+ */
26
+ export declare class IsAuthorized {
27
+ private readonly chainSpec;
28
+ private readonly pvmBackend;
29
+ private readonly blake2b;
30
+ constructor(chainSpec: ChainSpec, pvmBackend: PvmBackend, blake2b: Blake2b);
31
+ invoke(state: State, coreIndex: CoreIndex, authToken: BytesBlob, authCodeHost: ServiceId, authCodeHash: CodeHash, authConfiguration: BytesBlob): Promise<Result<AuthorizationOk, AuthorizationError>>;
32
+ }
33
+ //# sourceMappingURL=is-authorized.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-authorized.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/in-core/is-authorized.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAmB,MAAM,kBAAkB,CAAC;AAEnH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,oBAAY,kBAAkB;IAC5B,oEAAoE;IACpE,YAAY,IAAI;IAChB,8CAA8C;IAC9C,UAAU,IAAI;IACd,uCAAuC;IACvC,SAAS,IAAI;CACd;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,cAAc,EAAE,cAAc,CAAC;IAC/B,oBAAoB,EAAE,UAAU,CAAC;IACjC,mBAAmB,EAAE,SAAS,CAAC;CAChC,CAAC;AAMF;;;;GAIG;AACH,qBAAa,YAAY;IAErB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAFP,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,OAAO;IAG7B,MAAM,CACV,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,SAAS,EACvB,YAAY,EAAE,QAAQ,EACtB,iBAAiB,EAAE,SAAS,GAC3B,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;CA+DxD"}
@@ -0,0 +1,72 @@
1
+ import { tryAsServiceGas } from "#@typeberry/block";
2
+ import { G_I, W_A } from "#@typeberry/block/gp-constants.js";
3
+ import { BytesBlob } from "#@typeberry/bytes";
4
+ import { codec, Encoder } from "#@typeberry/codec";
5
+ import { PvmExecutor, ReturnStatus } from "#@typeberry/executor";
6
+ import { IsAuthorizedFetchExternalities } from "#@typeberry/transition/externalities/is-authorized-fetch-externalities.js";
7
+ import { Result } from "#@typeberry/utils";
8
+ export var AuthorizationError;
9
+ (function (AuthorizationError) {
10
+ /** BAD: authorizer code not found (service or preimage missing). */
11
+ AuthorizationError[AuthorizationError["CodeNotFound"] = 0] = "CodeNotFound";
12
+ /** BIG: authorizer code exceeds W_A limit. */
13
+ AuthorizationError[AuthorizationError["CodeTooBig"] = 1] = "CodeTooBig";
14
+ /** PANIC/OOG: PVM execution failed. */
15
+ AuthorizationError[AuthorizationError["PvmFailed"] = 2] = "PvmFailed";
16
+ })(AuthorizationError || (AuthorizationError = {}));
17
+ const AUTH_ARGS_CODEC = codec.object({
18
+ coreIndex: codec.u16,
19
+ });
20
+ /**
21
+ * IsAuthorized PVM invocation (Psi_I).
22
+ *
23
+ * https://graypaper.fluffylabs.dev/#/ab2cdbd/2e64002e6400?v=0.7.2
24
+ */
25
+ export class IsAuthorized {
26
+ chainSpec;
27
+ pvmBackend;
28
+ blake2b;
29
+ constructor(chainSpec, pvmBackend, blake2b) {
30
+ this.chainSpec = chainSpec;
31
+ this.pvmBackend = pvmBackend;
32
+ this.blake2b = blake2b;
33
+ }
34
+ async invoke(state, coreIndex, authToken, authCodeHost, authCodeHash, authConfiguration) {
35
+ // Look up the authorizer code from the auth code host service
36
+ const service = state.getService(authCodeHost);
37
+ // https://graypaper.fluffylabs.dev/#/ab2cdbd/2eca002eca00?v=0.7.2
38
+ if (service === null) {
39
+ return Result.error(AuthorizationError.CodeNotFound, () => `Auth code host service ${authCodeHost} not found in state.`);
40
+ }
41
+ const code = service.getPreimage(authCodeHash.asOpaque());
42
+ if (code === null) {
43
+ return Result.error(AuthorizationError.CodeNotFound, () => `Auth code preimage ${authCodeHash} not found in service ${authCodeHost}.`);
44
+ }
45
+ // BIG: code exceeds W_A
46
+ // https://graypaper.fluffylabs.dev/#/ab2cdbd/2ed6002ed600?v=0.7.2
47
+ if (code.length > W_A) {
48
+ return Result.error(AuthorizationError.CodeTooBig, () => `Auth code is too big: ${code.length} bytes vs ${W_A} max.`);
49
+ }
50
+ // Prepare fetch externalities and executor
51
+ const fetchExternalities = new IsAuthorizedFetchExternalities(this.chainSpec, {
52
+ authToken,
53
+ authConfiguration,
54
+ });
55
+ const executor = await PvmExecutor.createIsAuthorizedExecutor(authCodeHost, code, { fetchExternalities }, this.pvmBackend);
56
+ const args = Encoder.encodeObject(AUTH_ARGS_CODEC, {
57
+ coreIndex,
58
+ });
59
+ // Run PVM with gas budget G_I
60
+ const gasLimit = tryAsServiceGas(G_I);
61
+ const execResult = await executor.run(args, gasLimit);
62
+ if (execResult.status !== ReturnStatus.OK) {
63
+ return Result.error(AuthorizationError.PvmFailed, () => `IsAuthorized PVM ${ReturnStatus[execResult.status]} (gas used: ${execResult.consumedGas}).`);
64
+ }
65
+ // Compute authorizer hash: H(code_hash ++ configuration)
66
+ // https://graypaper.fluffylabs.dev/#/ab2cdbd/1b81011b8401?v=0.7.2
67
+ const authorizerHash = this.blake2b.hashBlobs([authCodeHash, authConfiguration]);
68
+ const authorizationOutput = BytesBlob.blobFrom(execResult.memorySlice);
69
+ const authorizationGasUsed = tryAsServiceGas(execResult.consumedGas);
70
+ return Result.ok({ authorizerHash, authorizationGasUsed, authorizationOutput });
71
+ }
72
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=is-authorized.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-authorized.test.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/in-core/is-authorized.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,125 @@
1
+ import assert from "node:assert";
2
+ import { readFileSync } from "node:fs";
3
+ import { resolve } from "node:path";
4
+ import { before, describe, it } from "node:test";
5
+ import { tryAsCoreIndex, tryAsServiceGas, tryAsServiceId, tryAsTimeSlot } from "#@typeberry/block";
6
+ import { Bytes, BytesBlob } from "#@typeberry/bytes";
7
+ import { HashDictionary } from "#@typeberry/collections";
8
+ import { PvmBackend, tinyChainSpec } from "#@typeberry/config";
9
+ import { Blake2b, HASH_SIZE } from "#@typeberry/hash";
10
+ import { tryAsU32, tryAsU64 } from "#@typeberry/numbers";
11
+ import { InMemoryService, InMemoryState, PreimageItem, ServiceAccountInfo } from "#@typeberry/state";
12
+ import { AuthorizationError, IsAuthorized } from "./is-authorized.js";
13
+ let blake2b;
14
+ before(async () => {
15
+ blake2b = await Blake2b.createHasher();
16
+ });
17
+ // Load the authorizer PVM fixture.
18
+ // This authorizer checks that authToken === authConfiguration and returns "Auth=<token>".
19
+ // https://github.com/tomusdrw/as-lan/blob/main/examples/authorizer/assembly/authorize.ts
20
+ const AUTHORIZER_PVM = BytesBlob.blobFrom(readFileSync(resolve(import.meta.dirname, "fixtures/authorizer.pvm")));
21
+ const AUTH_SERVICE_ID = tryAsServiceId(42);
22
+ function createService(serviceId, codeHash, code) {
23
+ return InMemoryService.new(serviceId, {
24
+ info: ServiceAccountInfo.create({
25
+ codeHash: codeHash.asOpaque(),
26
+ balance: tryAsU64(10_000_000_000),
27
+ accumulateMinGas: tryAsServiceGas(0n),
28
+ onTransferMinGas: tryAsServiceGas(0n),
29
+ storageUtilisationBytes: tryAsU64(0),
30
+ storageUtilisationCount: tryAsU32(0),
31
+ gratisStorage: tryAsU64(0),
32
+ created: tryAsTimeSlot(0),
33
+ lastAccumulation: tryAsTimeSlot(0),
34
+ parentService: tryAsServiceId(0),
35
+ }),
36
+ preimages: HashDictionary.fromEntries([PreimageItem.create({ hash: codeHash.asOpaque(), blob: code })].map((x) => [x.hash, x])),
37
+ lookupHistory: HashDictionary.fromEntries([]),
38
+ storage: new Map(),
39
+ });
40
+ }
41
+ describe("IsAuthorized", () => {
42
+ const spec = tinyChainSpec;
43
+ function getAuthCodeHash() {
44
+ return blake2b.hashBytes(AUTHORIZER_PVM).asOpaque();
45
+ }
46
+ function createStateWithService(codeHash, code) {
47
+ return InMemoryState.partial(spec, {
48
+ timeslot: tryAsTimeSlot(16),
49
+ services: new Map([[AUTH_SERVICE_ID, createService(AUTH_SERVICE_ID, codeHash, code)]]),
50
+ });
51
+ }
52
+ it("should authorize when token matches configuration", async () => {
53
+ const authCodeHash = getAuthCodeHash();
54
+ const state = createStateWithService(authCodeHash, AUTHORIZER_PVM);
55
+ const isAuthorized = new IsAuthorized(spec, PvmBackend.BuiltIn, blake2b);
56
+ const token = BytesBlob.blobFromString("hello");
57
+ const result = await isAuthorized.invoke(state, tryAsCoreIndex(0), token, AUTH_SERVICE_ID, authCodeHash, token);
58
+ assert.strictEqual(result.isOk, true, `Expected OK but got error: ${result.isError ? result.details() : ""}`);
59
+ // Verify the authorization output starts with "Auth=<hello>"
60
+ const outputStr = Buffer.from(result.ok.authorizationOutput.raw).toString("utf8");
61
+ assert.ok(outputStr.startsWith("Auth=<hello>"), `Expected "Auth=<hello>" prefix but got "${outputStr.slice(0, 30)}"`);
62
+ // Verify the authorizer hash is H(code_hash ++ configuration)
63
+ const expectedHash = blake2b.hashBlobs([authCodeHash, token]);
64
+ assert.ok(result.ok.authorizerHash.isEqualTo(expectedHash), "authorizerHash should be H(code_hash || config)");
65
+ // Verify gas was consumed
66
+ assert.ok(Number(result.ok.authorizationGasUsed) > 0, "should have consumed some gas");
67
+ });
68
+ it("should authorize with empty token and configuration", async () => {
69
+ const authCodeHash = getAuthCodeHash();
70
+ const state = createStateWithService(authCodeHash, AUTHORIZER_PVM);
71
+ const isAuthorized = new IsAuthorized(spec, PvmBackend.BuiltIn, blake2b);
72
+ const result = await isAuthorized.invoke(state, tryAsCoreIndex(0), BytesBlob.empty(), AUTH_SERVICE_ID, authCodeHash, BytesBlob.empty());
73
+ assert.strictEqual(result.isOk, true, `Expected OK but got error: ${result.isError ? result.details() : ""}`);
74
+ const outputStr = Buffer.from(result.ok.authorizationOutput.raw).toString("utf8");
75
+ assert.ok(outputStr.startsWith("Auth=<>"), `Expected "Auth=<>" prefix but got "${outputStr.slice(0, 30)}"`);
76
+ });
77
+ it("should fail when token does not match configuration", async () => {
78
+ const authCodeHash = getAuthCodeHash();
79
+ const state = createStateWithService(authCodeHash, AUTHORIZER_PVM);
80
+ const isAuthorized = new IsAuthorized(spec, PvmBackend.BuiltIn, blake2b);
81
+ const result = await isAuthorized.invoke(state, tryAsCoreIndex(0), BytesBlob.blobFromString("wrong"), AUTH_SERVICE_ID, authCodeHash, BytesBlob.blobFromString("right"));
82
+ assert.strictEqual(result.isError, true);
83
+ assert.strictEqual(result.error, AuthorizationError.PvmFailed);
84
+ });
85
+ it("should fail when auth code host service is missing", async () => {
86
+ const authCodeHash = getAuthCodeHash();
87
+ const state = InMemoryState.partial(spec, {
88
+ timeslot: tryAsTimeSlot(16),
89
+ services: new Map(),
90
+ });
91
+ const isAuthorized = new IsAuthorized(spec, PvmBackend.BuiltIn, blake2b);
92
+ const result = await isAuthorized.invoke(state, tryAsCoreIndex(0), BytesBlob.empty(), AUTH_SERVICE_ID, authCodeHash, BytesBlob.empty());
93
+ assert.strictEqual(result.isError, true);
94
+ assert.strictEqual(result.error, AuthorizationError.CodeNotFound);
95
+ });
96
+ it("should fail when auth code preimage is missing", async () => {
97
+ const authCodeHash = getAuthCodeHash();
98
+ // Service exists but with no preimages
99
+ const emptyService = InMemoryService.new(AUTH_SERVICE_ID, {
100
+ info: ServiceAccountInfo.create({
101
+ codeHash: Bytes.zero(HASH_SIZE).asOpaque(),
102
+ balance: tryAsU64(0),
103
+ accumulateMinGas: tryAsServiceGas(0n),
104
+ onTransferMinGas: tryAsServiceGas(0n),
105
+ storageUtilisationBytes: tryAsU64(0),
106
+ storageUtilisationCount: tryAsU32(0),
107
+ gratisStorage: tryAsU64(0),
108
+ created: tryAsTimeSlot(0),
109
+ lastAccumulation: tryAsTimeSlot(0),
110
+ parentService: tryAsServiceId(0),
111
+ }),
112
+ preimages: HashDictionary.fromEntries([]),
113
+ lookupHistory: HashDictionary.fromEntries([]),
114
+ storage: new Map(),
115
+ });
116
+ const state = InMemoryState.partial(spec, {
117
+ timeslot: tryAsTimeSlot(16),
118
+ services: new Map([[AUTH_SERVICE_ID, emptyService]]),
119
+ });
120
+ const isAuthorized = new IsAuthorized(spec, PvmBackend.BuiltIn, blake2b);
121
+ const result = await isAuthorized.invoke(state, tryAsCoreIndex(0), BytesBlob.empty(), AUTH_SERVICE_ID, authCodeHash, BytesBlob.empty());
122
+ assert.strictEqual(result.isError, true);
123
+ assert.strictEqual(result.error, AuthorizationError.CodeNotFound);
124
+ });
125
+ });