@typeberry/lib 0.5.10 → 0.5.11-10b197e

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 (496) 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/encoder.d.ts +1 -1
  7. package/packages/core/codec/encoder.d.ts.map +1 -1
  8. package/packages/core/codec/encoder.js +3 -2
  9. package/packages/core/codec/index.test.js +1 -1
  10. package/packages/core/codec/skip.d.ts +2 -1
  11. package/packages/core/codec/skip.d.ts.map +1 -1
  12. package/packages/core/codec/skip.js +3 -0
  13. package/packages/core/codec/view.js +2 -2
  14. package/packages/core/collections/multi-map.d.ts +2 -1
  15. package/packages/core/collections/multi-map.d.ts.map +1 -1
  16. package/packages/core/collections/multi-map.js +3 -0
  17. package/packages/core/collections/multi-map.test.js +2 -2
  18. package/packages/core/concurrent/parent.js +4 -1
  19. package/packages/core/crypto/ed25519.d.ts +2 -5
  20. package/packages/core/crypto/ed25519.d.ts.map +1 -1
  21. package/packages/core/crypto/ed25519.js +4 -1
  22. package/packages/core/hash/hash.d.ts +4 -2
  23. package/packages/core/hash/hash.d.ts.map +1 -1
  24. package/packages/core/hash/hash.js +6 -1
  25. package/packages/core/networking/quic-network.d.ts +3 -2
  26. package/packages/core/networking/quic-network.d.ts.map +1 -1
  27. package/packages/core/networking/quic-network.js +3 -0
  28. package/packages/core/networking/quic-peer.d.ts +2 -1
  29. package/packages/core/networking/quic-peer.d.ts.map +1 -1
  30. package/packages/core/networking/quic-peer.js +5 -2
  31. package/packages/core/networking/quic-stream.d.ts +2 -1
  32. package/packages/core/networking/quic-stream.d.ts.map +1 -1
  33. package/packages/core/networking/quic-stream.js +3 -0
  34. package/packages/core/networking/setup.js +2 -2
  35. package/packages/core/pvm-host-calls/bin.js +2 -2
  36. package/packages/core/pvm-host-calls/ecalli-trace-logger.d.ts +5 -0
  37. package/packages/core/pvm-host-calls/ecalli-trace-logger.d.ts.map +1 -1
  38. package/packages/core/pvm-host-calls/ecalli-trace-logger.js +8 -1
  39. package/packages/core/pvm-host-calls/ecalli-trace-logger.test.js +1 -1
  40. package/packages/core/pvm-host-calls/host-call-memory.d.ts +2 -1
  41. package/packages/core/pvm-host-calls/host-call-memory.d.ts.map +1 -1
  42. package/packages/core/pvm-host-calls/host-call-memory.js +3 -0
  43. package/packages/core/pvm-host-calls/host-call-memory.test.js +1 -1
  44. package/packages/core/pvm-host-calls/host-call-registers.d.ts +5 -1
  45. package/packages/core/pvm-host-calls/host-call-registers.d.ts.map +1 -1
  46. package/packages/core/pvm-host-calls/host-call-registers.js +11 -1
  47. package/packages/core/pvm-host-calls/host-call-registers.test.js +2 -2
  48. package/packages/core/pvm-host-calls/host-calls-executor.d.ts +2 -1
  49. package/packages/core/pvm-host-calls/host-calls-executor.d.ts.map +1 -1
  50. package/packages/core/pvm-host-calls/host-calls-executor.js +5 -2
  51. package/packages/core/pvm-host-calls/host-calls.d.ts +4 -2
  52. package/packages/core/pvm-host-calls/host-calls.d.ts.map +1 -1
  53. package/packages/core/pvm-host-calls/host-calls.js +9 -4
  54. package/packages/core/pvm-host-calls/pvm-instance-manager.js +1 -1
  55. package/packages/core/pvm-interface/pvm.d.ts +2 -0
  56. package/packages/core/pvm-interface/pvm.d.ts.map +1 -1
  57. package/packages/core/pvm-interpreter/args-decoder/args-decoder.js +1 -1
  58. package/packages/core/pvm-interpreter/args-decoder/args-decoder.test.js +3 -3
  59. package/packages/core/pvm-interpreter/args-decoder/args-decoding-results.js +11 -11
  60. package/packages/core/pvm-interpreter/args-decoder/decoders/extended-with-immediate-decoder.d.ts +2 -1
  61. package/packages/core/pvm-interpreter/args-decoder/decoders/extended-with-immediate-decoder.d.ts.map +1 -1
  62. package/packages/core/pvm-interpreter/args-decoder/decoders/extended-with-immediate-decoder.js +3 -0
  63. package/packages/core/pvm-interpreter/args-decoder/decoders/extended-with-immediate-decoder.test.js +2 -2
  64. package/packages/core/pvm-interpreter/args-decoder/decoders/immediate-decoder.d.ts +2 -1
  65. package/packages/core/pvm-interpreter/args-decoder/decoders/immediate-decoder.d.ts.map +1 -1
  66. package/packages/core/pvm-interpreter/args-decoder/decoders/immediate-decoder.js +3 -0
  67. package/packages/core/pvm-interpreter/args-decoder/decoders/immediate-decoder.test.js +26 -26
  68. package/packages/core/pvm-interpreter/basic-blocks/basic-blocks.test.js +8 -8
  69. package/packages/core/pvm-interpreter/bin.js +1 -1
  70. package/packages/core/pvm-interpreter/debugger-adapter.d.ts +2 -1
  71. package/packages/core/pvm-interpreter/debugger-adapter.d.ts.map +1 -1
  72. package/packages/core/pvm-interpreter/debugger-adapter.js +6 -3
  73. package/packages/core/pvm-interpreter/gas.js +4 -1
  74. package/packages/core/pvm-interpreter/interpreter.d.ts +2 -1
  75. package/packages/core/pvm-interpreter/interpreter.d.ts.map +1 -1
  76. package/packages/core/pvm-interpreter/interpreter.js +19 -16
  77. package/packages/core/pvm-interpreter/memory/memory-builder.js +2 -2
  78. package/packages/core/pvm-interpreter/memory/memory-builder.test.js +7 -7
  79. package/packages/core/pvm-interpreter/memory/memory.d.ts +2 -1
  80. package/packages/core/pvm-interpreter/memory/memory.d.ts.map +1 -1
  81. package/packages/core/pvm-interpreter/memory/memory.js +4 -1
  82. package/packages/core/pvm-interpreter/memory/memory.test.js +31 -31
  83. package/packages/core/pvm-interpreter/memory/pages/readable-page.d.ts +2 -1
  84. package/packages/core/pvm-interpreter/memory/pages/readable-page.d.ts.map +1 -1
  85. package/packages/core/pvm-interpreter/memory/pages/readable-page.js +3 -0
  86. package/packages/core/pvm-interpreter/memory/pages/readable-page.test.js +3 -3
  87. package/packages/core/pvm-interpreter/memory/pages/writeable-page.d.ts +2 -1
  88. package/packages/core/pvm-interpreter/memory/pages/writeable-page.d.ts.map +1 -1
  89. package/packages/core/pvm-interpreter/memory/pages/writeable-page.js +3 -0
  90. package/packages/core/pvm-interpreter/memory/pages/writeable-page.test.js +4 -4
  91. package/packages/core/pvm-interpreter/ops/bit-ops.d.ts +2 -1
  92. package/packages/core/pvm-interpreter/ops/bit-ops.d.ts.map +1 -1
  93. package/packages/core/pvm-interpreter/ops/bit-ops.js +3 -0
  94. package/packages/core/pvm-interpreter/ops/bit-ops.test.js +3 -3
  95. package/packages/core/pvm-interpreter/ops/bit-rotation-ops.d.ts +2 -1
  96. package/packages/core/pvm-interpreter/ops/bit-rotation-ops.d.ts.map +1 -1
  97. package/packages/core/pvm-interpreter/ops/bit-rotation-ops.js +3 -0
  98. package/packages/core/pvm-interpreter/ops/bit-rotation-ops.test.js +5 -5
  99. package/packages/core/pvm-interpreter/ops/boolean-ops.d.ts +2 -1
  100. package/packages/core/pvm-interpreter/ops/boolean-ops.d.ts.map +1 -1
  101. package/packages/core/pvm-interpreter/ops/boolean-ops.js +3 -0
  102. package/packages/core/pvm-interpreter/ops/boolean-ops.test.js +3 -3
  103. package/packages/core/pvm-interpreter/ops/branch-ops.d.ts +2 -1
  104. package/packages/core/pvm-interpreter/ops/branch-ops.d.ts.map +1 -1
  105. package/packages/core/pvm-interpreter/ops/branch-ops.js +3 -0
  106. package/packages/core/pvm-interpreter/ops/branch-ops.test.js +4 -4
  107. package/packages/core/pvm-interpreter/ops/dynamic-jump-ops.d.ts +2 -1
  108. package/packages/core/pvm-interpreter/ops/dynamic-jump-ops.d.ts.map +1 -1
  109. package/packages/core/pvm-interpreter/ops/dynamic-jump-ops.js +3 -0
  110. package/packages/core/pvm-interpreter/ops/dynamic-jump-ops.test.js +5 -5
  111. package/packages/core/pvm-interpreter/ops/host-call-ops.d.ts +2 -1
  112. package/packages/core/pvm-interpreter/ops/host-call-ops.d.ts.map +1 -1
  113. package/packages/core/pvm-interpreter/ops/host-call-ops.js +3 -0
  114. package/packages/core/pvm-interpreter/ops/host-call-ops.test.js +2 -2
  115. package/packages/core/pvm-interpreter/ops/load-ops.d.ts +2 -1
  116. package/packages/core/pvm-interpreter/ops/load-ops.d.ts.map +1 -1
  117. package/packages/core/pvm-interpreter/ops/load-ops.js +3 -0
  118. package/packages/core/pvm-interpreter/ops/load-ops.test.js +10 -10
  119. package/packages/core/pvm-interpreter/ops/math-ops.d.ts +2 -1
  120. package/packages/core/pvm-interpreter/ops/math-ops.d.ts.map +1 -1
  121. package/packages/core/pvm-interpreter/ops/math-ops.js +3 -0
  122. package/packages/core/pvm-interpreter/ops/math-ops.test.js +3 -3
  123. package/packages/core/pvm-interpreter/ops/memory-ops.d.ts +2 -1
  124. package/packages/core/pvm-interpreter/ops/memory-ops.d.ts.map +1 -1
  125. package/packages/core/pvm-interpreter/ops/memory-ops.js +3 -0
  126. package/packages/core/pvm-interpreter/ops/memory-ops.test.js +3 -3
  127. package/packages/core/pvm-interpreter/ops/move-ops.d.ts +2 -1
  128. package/packages/core/pvm-interpreter/ops/move-ops.d.ts.map +1 -1
  129. package/packages/core/pvm-interpreter/ops/move-ops.js +3 -0
  130. package/packages/core/pvm-interpreter/ops/move-ops.test.js +3 -3
  131. package/packages/core/pvm-interpreter/ops/no-args-ops.d.ts +2 -1
  132. package/packages/core/pvm-interpreter/ops/no-args-ops.d.ts.map +1 -1
  133. package/packages/core/pvm-interpreter/ops/no-args-ops.js +3 -0
  134. package/packages/core/pvm-interpreter/ops/no-args-ops.test.js +2 -2
  135. package/packages/core/pvm-interpreter/ops/shift-ops.d.ts +2 -1
  136. package/packages/core/pvm-interpreter/ops/shift-ops.d.ts.map +1 -1
  137. package/packages/core/pvm-interpreter/ops/shift-ops.js +3 -0
  138. package/packages/core/pvm-interpreter/ops/shift-ops.test.js +3 -3
  139. package/packages/core/pvm-interpreter/ops/store-ops.d.ts +2 -1
  140. package/packages/core/pvm-interpreter/ops/store-ops.d.ts.map +1 -1
  141. package/packages/core/pvm-interpreter/ops/store-ops.js +3 -0
  142. package/packages/core/pvm-interpreter/ops/store-ops.test.js +7 -7
  143. package/packages/core/pvm-interpreter/ops-dispatchers/no-args-dispatcher.test.js +1 -1
  144. package/packages/core/pvm-interpreter/ops-dispatchers/one-imm-dispatcher.test.js +4 -4
  145. package/packages/core/pvm-interpreter/ops-dispatchers/one-offset-dispatcher.test.js +2 -2
  146. package/packages/core/pvm-interpreter/ops-dispatchers/one-reg-one-ext-imm-dispatcher.test.js +4 -4
  147. package/packages/core/pvm-interpreter/ops-dispatchers/one-reg-one-imm-dispatcher.test.js +7 -7
  148. package/packages/core/pvm-interpreter/ops-dispatchers/one-reg-one-imm-one-offset-dispatcher.test.js +10 -10
  149. package/packages/core/pvm-interpreter/ops-dispatchers/one-reg-two-imms-dispatcher.test.js +5 -5
  150. package/packages/core/pvm-interpreter/ops-dispatchers/three-regs-dispatcher.test.js +7 -7
  151. package/packages/core/pvm-interpreter/ops-dispatchers/two-imms-dispatcher.test.js +5 -5
  152. package/packages/core/pvm-interpreter/ops-dispatchers/two-regs-dispatcher.test.js +6 -6
  153. package/packages/core/pvm-interpreter/ops-dispatchers/two-regs-one-imm-dispatcher.test.js +11 -11
  154. package/packages/core/pvm-interpreter/ops-dispatchers/two-regs-one-offset-dispatcher.test.js +2 -2
  155. package/packages/core/pvm-interpreter/ops-dispatchers/two-regs-two-imms-dispatcher.test.js +14 -14
  156. package/packages/core/pvm-interpreter/program-decoder/jump-table.d.ts +5 -2
  157. package/packages/core/pvm-interpreter/program-decoder/jump-table.d.ts.map +1 -1
  158. package/packages/core/pvm-interpreter/program-decoder/jump-table.js +9 -4
  159. package/packages/core/pvm-interpreter/program-decoder/jump-table.test.js +6 -6
  160. package/packages/core/pvm-interpreter/program-decoder/mask.d.ts +2 -1
  161. package/packages/core/pvm-interpreter/program-decoder/mask.d.ts.map +1 -1
  162. package/packages/core/pvm-interpreter/program-decoder/mask.js +3 -0
  163. package/packages/core/pvm-interpreter/program-decoder/mask.test.js +10 -10
  164. package/packages/core/pvm-interpreter/program-decoder/program-decoder.d.ts +2 -1
  165. package/packages/core/pvm-interpreter/program-decoder/program-decoder.d.ts.map +1 -1
  166. package/packages/core/pvm-interpreter/program-decoder/program-decoder.js +6 -3
  167. package/packages/core/pvm-interpreter/program-decoder/program-decoder.test.js +5 -5
  168. package/packages/core/pvm-interpreter/program.js +3 -3
  169. package/packages/core/pvm-interpreter/registers.d.ts +5 -2
  170. package/packages/core/pvm-interpreter/registers.d.ts.map +1 -1
  171. package/packages/core/pvm-interpreter/registers.js +10 -6
  172. package/packages/core/pvm-interpreter/registers.test.js +10 -10
  173. package/packages/core/pvm-interpreter/spi-decoder/decode-standard-program.d.ts +6 -3
  174. package/packages/core/pvm-interpreter/spi-decoder/decode-standard-program.d.ts.map +1 -1
  175. package/packages/core/pvm-interpreter/spi-decoder/decode-standard-program.js +11 -2
  176. package/packages/core/pvm-interpreter-ananas/index.d.ts +6 -3
  177. package/packages/core/pvm-interpreter-ananas/index.d.ts.map +1 -1
  178. package/packages/core/pvm-interpreter-ananas/index.js +12 -3
  179. package/packages/core/trie/nodes.d.ts +7 -2
  180. package/packages/core/trie/nodes.d.ts.map +1 -1
  181. package/packages/core/trie/nodes.js +20 -11
  182. package/packages/core/trie/nodesDb.d.ts +3 -1
  183. package/packages/core/trie/nodesDb.d.ts.map +1 -1
  184. package/packages/core/trie/nodesDb.js +6 -0
  185. package/packages/core/trie/trie.js +2 -2
  186. package/packages/extensions/ipc/index.js +5 -2
  187. package/packages/extensions/ipc/jamnp/handler.d.ts +4 -2
  188. package/packages/extensions/ipc/jamnp/handler.d.ts.map +1 -1
  189. package/packages/extensions/ipc/jamnp/handler.js +9 -3
  190. package/packages/extensions/ipc/jamnp/server.js +3 -3
  191. package/packages/extensions/ipc/server.d.ts +2 -1
  192. package/packages/extensions/ipc/server.d.ts.map +1 -1
  193. package/packages/extensions/ipc/server.js +4 -1
  194. package/packages/jam/block/header.js +1 -1
  195. package/packages/jam/block/work-package.d.ts +7 -7
  196. package/packages/jam/block/work-package.d.ts.map +1 -1
  197. package/packages/jam/block/work-package.js +12 -12
  198. package/packages/jam/config/chain-spec.d.ts +2 -1
  199. package/packages/jam/config/chain-spec.d.ts.map +1 -1
  200. package/packages/jam/config/chain-spec.js +5 -2
  201. package/packages/jam/config/network.d.ts +2 -7
  202. package/packages/jam/config/network.d.ts.map +1 -1
  203. package/packages/jam/config/network.js +3 -0
  204. package/packages/jam/config-node/jip-chain-spec.js +1 -1
  205. package/packages/jam/database/blocks.test.js +1 -1
  206. package/packages/jam/database/states.d.ts +2 -1
  207. package/packages/jam/database/states.d.ts.map +1 -1
  208. package/packages/jam/database/states.js +3 -0
  209. package/packages/jam/database/states.test.js +1 -1
  210. package/packages/jam/database-lmdb/blocks.d.ts +2 -1
  211. package/packages/jam/database-lmdb/blocks.d.ts.map +1 -1
  212. package/packages/jam/database-lmdb/blocks.js +3 -0
  213. package/packages/jam/database-lmdb/root.d.ts +2 -1
  214. package/packages/jam/database-lmdb/root.d.ts.map +1 -1
  215. package/packages/jam/database-lmdb/root.js +3 -0
  216. package/packages/jam/database-lmdb/states.d.ts +2 -1
  217. package/packages/jam/database-lmdb/states.d.ts.map +1 -1
  218. package/packages/jam/database-lmdb/states.js +3 -0
  219. package/packages/jam/database-lmdb/states.test.js +9 -9
  220. package/packages/jam/executor/index.d.ts +1 -1
  221. package/packages/jam/executor/index.d.ts.map +1 -1
  222. package/packages/jam/executor/index.js +1 -1
  223. package/packages/jam/executor/pvm-executor.d.ts +9 -2
  224. package/packages/jam/executor/pvm-executor.d.ts.map +1 -1
  225. package/packages/jam/executor/pvm-executor.js +36 -21
  226. package/packages/jam/fuzz-proto/v1/handler.d.ts +2 -1
  227. package/packages/jam/fuzz-proto/v1/handler.d.ts.map +1 -1
  228. package/packages/jam/fuzz-proto/v1/handler.js +3 -0
  229. package/packages/jam/fuzz-proto/v1/handler.test.js +10 -10
  230. package/packages/jam/in-core/externalities/refine.d.ts +18 -8
  231. package/packages/jam/in-core/externalities/refine.d.ts.map +1 -1
  232. package/packages/jam/in-core/externalities/refine.js +86 -7
  233. package/packages/jam/in-core/externalities/refine.test.js +168 -3
  234. package/packages/jam/in-core/in-core.d.ts +9 -23
  235. package/packages/jam/in-core/in-core.d.ts.map +1 -1
  236. package/packages/jam/in-core/in-core.js +19 -186
  237. package/packages/jam/in-core/in-core.test.js +52 -20
  238. package/packages/jam/in-core/is-authorized.d.ts +33 -0
  239. package/packages/jam/in-core/is-authorized.d.ts.map +1 -0
  240. package/packages/jam/in-core/is-authorized.js +72 -0
  241. package/packages/jam/in-core/is-authorized.test.d.ts +2 -0
  242. package/packages/jam/in-core/is-authorized.test.d.ts.map +1 -0
  243. package/packages/jam/in-core/is-authorized.test.js +125 -0
  244. package/packages/jam/in-core/refine.d.ts +34 -0
  245. package/packages/jam/in-core/refine.d.ts.map +1 -0
  246. package/packages/jam/in-core/refine.js +176 -0
  247. package/packages/jam/in-core/refine.test.d.ts +2 -0
  248. package/packages/jam/in-core/refine.test.d.ts.map +1 -0
  249. package/packages/jam/in-core/refine.test.js +6 -0
  250. package/packages/jam/jam-host-calls/accumulate/assign.d.ts +2 -1
  251. package/packages/jam/jam-host-calls/accumulate/assign.d.ts.map +1 -1
  252. package/packages/jam/jam-host-calls/accumulate/assign.js +3 -0
  253. package/packages/jam/jam-host-calls/accumulate/assign.test.js +8 -9
  254. package/packages/jam/jam-host-calls/accumulate/bless.d.ts +2 -1
  255. package/packages/jam/jam-host-calls/accumulate/bless.d.ts.map +1 -1
  256. package/packages/jam/jam-host-calls/accumulate/bless.js +12 -9
  257. package/packages/jam/jam-host-calls/accumulate/bless.test.js +11 -12
  258. package/packages/jam/jam-host-calls/accumulate/checkpoint.d.ts +2 -1
  259. package/packages/jam/jam-host-calls/accumulate/checkpoint.d.ts.map +1 -1
  260. package/packages/jam/jam-host-calls/accumulate/checkpoint.js +4 -1
  261. package/packages/jam/jam-host-calls/accumulate/checkpoint.test.js +2 -3
  262. package/packages/jam/jam-host-calls/accumulate/designate.d.ts +2 -1
  263. package/packages/jam/jam-host-calls/accumulate/designate.d.ts.map +1 -1
  264. package/packages/jam/jam-host-calls/accumulate/designate.js +3 -0
  265. package/packages/jam/jam-host-calls/accumulate/designate.test.js +5 -6
  266. package/packages/jam/jam-host-calls/accumulate/eject.d.ts +2 -1
  267. package/packages/jam/jam-host-calls/accumulate/eject.d.ts.map +1 -1
  268. package/packages/jam/jam-host-calls/accumulate/eject.js +3 -0
  269. package/packages/jam/jam-host-calls/accumulate/eject.test.js +8 -9
  270. package/packages/jam/jam-host-calls/accumulate/forget.d.ts +2 -1
  271. package/packages/jam/jam-host-calls/accumulate/forget.d.ts.map +1 -1
  272. package/packages/jam/jam-host-calls/accumulate/forget.js +3 -0
  273. package/packages/jam/jam-host-calls/accumulate/forget.test.js +5 -6
  274. package/packages/jam/jam-host-calls/accumulate/new.d.ts +2 -1
  275. package/packages/jam/jam-host-calls/accumulate/new.d.ts.map +1 -1
  276. package/packages/jam/jam-host-calls/accumulate/new.js +3 -0
  277. package/packages/jam/jam-host-calls/accumulate/new.test.js +9 -10
  278. package/packages/jam/jam-host-calls/accumulate/provide.d.ts +2 -1
  279. package/packages/jam/jam-host-calls/accumulate/provide.d.ts.map +1 -1
  280. package/packages/jam/jam-host-calls/accumulate/provide.js +3 -0
  281. package/packages/jam/jam-host-calls/accumulate/provide.test.js +8 -9
  282. package/packages/jam/jam-host-calls/accumulate/query.d.ts +2 -1
  283. package/packages/jam/jam-host-calls/accumulate/query.d.ts.map +1 -1
  284. package/packages/jam/jam-host-calls/accumulate/query.js +3 -0
  285. package/packages/jam/jam-host-calls/accumulate/query.test.js +8 -9
  286. package/packages/jam/jam-host-calls/accumulate/solicit.d.ts +2 -1
  287. package/packages/jam/jam-host-calls/accumulate/solicit.d.ts.map +1 -1
  288. package/packages/jam/jam-host-calls/accumulate/solicit.js +3 -0
  289. package/packages/jam/jam-host-calls/accumulate/solicit.test.js +7 -8
  290. package/packages/jam/jam-host-calls/accumulate/transfer.d.ts +2 -1
  291. package/packages/jam/jam-host-calls/accumulate/transfer.d.ts.map +1 -1
  292. package/packages/jam/jam-host-calls/accumulate/transfer.js +3 -0
  293. package/packages/jam/jam-host-calls/accumulate/transfer.test.js +9 -10
  294. package/packages/jam/jam-host-calls/accumulate/upgrade.d.ts +2 -1
  295. package/packages/jam/jam-host-calls/accumulate/upgrade.d.ts.map +1 -1
  296. package/packages/jam/jam-host-calls/accumulate/upgrade.js +3 -0
  297. package/packages/jam/jam-host-calls/accumulate/upgrade.test.js +4 -5
  298. package/packages/jam/jam-host-calls/accumulate/yield.d.ts +2 -1
  299. package/packages/jam/jam-host-calls/accumulate/yield.d.ts.map +1 -1
  300. package/packages/jam/jam-host-calls/accumulate/yield.js +3 -0
  301. package/packages/jam/jam-host-calls/accumulate/yield.test.js +4 -5
  302. package/packages/jam/jam-host-calls/externalities/partial-state.d.ts +1 -1
  303. package/packages/jam/jam-host-calls/externalities/refine-externalities.d.ts +1 -1
  304. package/packages/jam/jam-host-calls/externalities/refine-externalities.d.ts.map +1 -1
  305. package/packages/jam/jam-host-calls/externalities/refine-externalities.test.js +9 -9
  306. package/packages/jam/jam-host-calls/externalities/state-update.d.ts +2 -3
  307. package/packages/jam/jam-host-calls/externalities/state-update.d.ts.map +1 -1
  308. package/packages/jam/jam-host-calls/externalities/state-update.js +5 -2
  309. package/packages/jam/jam-host-calls/externalities/test-accounts.js +2 -2
  310. package/packages/jam/jam-host-calls/general/fetch.d.ts +166 -104
  311. package/packages/jam/jam-host-calls/general/fetch.d.ts.map +1 -1
  312. package/packages/jam/jam-host-calls/general/fetch.js +120 -23
  313. package/packages/jam/jam-host-calls/general/fetch.test.js +125 -92
  314. package/packages/jam/jam-host-calls/general/gas.d.ts +2 -1
  315. package/packages/jam/jam-host-calls/general/gas.d.ts.map +1 -1
  316. package/packages/jam/jam-host-calls/general/gas.js +3 -0
  317. package/packages/jam/jam-host-calls/general/gas.test.js +4 -5
  318. package/packages/jam/jam-host-calls/general/info.d.ts +2 -1
  319. package/packages/jam/jam-host-calls/general/info.d.ts.map +1 -1
  320. package/packages/jam/jam-host-calls/general/info.js +3 -0
  321. package/packages/jam/jam-host-calls/general/info.test.js +6 -7
  322. package/packages/jam/jam-host-calls/general/log.d.ts +2 -1
  323. package/packages/jam/jam-host-calls/general/log.d.ts.map +1 -1
  324. package/packages/jam/jam-host-calls/general/log.js +3 -0
  325. package/packages/jam/jam-host-calls/general/lookup.d.ts +2 -1
  326. package/packages/jam/jam-host-calls/general/lookup.d.ts.map +1 -1
  327. package/packages/jam/jam-host-calls/general/lookup.js +3 -0
  328. package/packages/jam/jam-host-calls/general/lookup.test.js +8 -9
  329. package/packages/jam/jam-host-calls/general/read.d.ts +2 -1
  330. package/packages/jam/jam-host-calls/general/read.d.ts.map +1 -1
  331. package/packages/jam/jam-host-calls/general/read.js +3 -0
  332. package/packages/jam/jam-host-calls/general/read.test.js +11 -12
  333. package/packages/jam/jam-host-calls/general/write.d.ts +2 -1
  334. package/packages/jam/jam-host-calls/general/write.d.ts.map +1 -1
  335. package/packages/jam/jam-host-calls/general/write.js +3 -0
  336. package/packages/jam/jam-host-calls/general/write.test.js +10 -11
  337. package/packages/jam/jam-host-calls/refine/export.d.ts +2 -1
  338. package/packages/jam/jam-host-calls/refine/export.d.ts.map +1 -1
  339. package/packages/jam/jam-host-calls/refine/export.js +3 -0
  340. package/packages/jam/jam-host-calls/refine/export.test.js +6 -7
  341. package/packages/jam/jam-host-calls/refine/expunge.d.ts +2 -1
  342. package/packages/jam/jam-host-calls/refine/expunge.d.ts.map +1 -1
  343. package/packages/jam/jam-host-calls/refine/expunge.js +3 -0
  344. package/packages/jam/jam-host-calls/refine/expunge.test.js +3 -4
  345. package/packages/jam/jam-host-calls/refine/historical-lookup.d.ts +2 -1
  346. package/packages/jam/jam-host-calls/refine/historical-lookup.d.ts.map +1 -1
  347. package/packages/jam/jam-host-calls/refine/historical-lookup.js +3 -0
  348. package/packages/jam/jam-host-calls/refine/historical-lookup.test.js +11 -12
  349. package/packages/jam/jam-host-calls/refine/invoke.d.ts +2 -1
  350. package/packages/jam/jam-host-calls/refine/invoke.d.ts.map +1 -1
  351. package/packages/jam/jam-host-calls/refine/invoke.js +4 -1
  352. package/packages/jam/jam-host-calls/refine/invoke.test.js +10 -11
  353. package/packages/jam/jam-host-calls/refine/machine.d.ts +2 -1
  354. package/packages/jam/jam-host-calls/refine/machine.d.ts.map +1 -1
  355. package/packages/jam/jam-host-calls/refine/machine.js +3 -0
  356. package/packages/jam/jam-host-calls/refine/machine.test.js +6 -7
  357. package/packages/jam/jam-host-calls/refine/pages.d.ts +2 -1
  358. package/packages/jam/jam-host-calls/refine/pages.d.ts.map +1 -1
  359. package/packages/jam/jam-host-calls/refine/pages.js +3 -0
  360. package/packages/jam/jam-host-calls/refine/pages.test.js +3 -4
  361. package/packages/jam/jam-host-calls/refine/peek.d.ts +2 -1
  362. package/packages/jam/jam-host-calls/refine/peek.d.ts.map +1 -1
  363. package/packages/jam/jam-host-calls/refine/peek.js +3 -0
  364. package/packages/jam/jam-host-calls/refine/peek.test.js +3 -4
  365. package/packages/jam/jam-host-calls/refine/poke.d.ts +2 -1
  366. package/packages/jam/jam-host-calls/refine/poke.d.ts.map +1 -1
  367. package/packages/jam/jam-host-calls/refine/poke.js +3 -0
  368. package/packages/jam/jam-host-calls/refine/poke.test.js +3 -4
  369. package/packages/jam/jamnp-s/network.js +1 -1
  370. package/packages/jam/jamnp-s/peers.d.ts +2 -1
  371. package/packages/jam/jamnp-s/peers.d.ts.map +1 -1
  372. package/packages/jam/jamnp-s/peers.js +3 -0
  373. package/packages/jam/jamnp-s/protocol/ce-128-block-request.d.ts +4 -2
  374. package/packages/jam/jamnp-s/protocol/ce-128-block-request.d.ts.map +1 -1
  375. package/packages/jam/jamnp-s/protocol/ce-128-block-request.js +6 -0
  376. package/packages/jam/jamnp-s/protocol/ce-128-block-request.test.js +2 -2
  377. package/packages/jam/jamnp-s/protocol/ce-129-state-request.d.ts +4 -2
  378. package/packages/jam/jamnp-s/protocol/ce-129-state-request.d.ts.map +1 -1
  379. package/packages/jam/jamnp-s/protocol/ce-129-state-request.js +6 -0
  380. package/packages/jam/jamnp-s/protocol/ce-129-state-request.test.js +4 -4
  381. package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.d.ts +4 -2
  382. package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.d.ts.map +1 -1
  383. package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.js +6 -0
  384. package/packages/jam/jamnp-s/protocol/ce-131-ce-132-safrole-ticket-distribution.test.js +2 -2
  385. package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.d.ts +6 -3
  386. package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.d.ts.map +1 -1
  387. package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.js +7 -0
  388. package/packages/jam/jamnp-s/protocol/ce-133-work-package-submission.test.js +2 -2
  389. package/packages/jam/jamnp-s/protocol/ce-134-work-package-sharing.d.ts +5 -2
  390. package/packages/jam/jamnp-s/protocol/ce-134-work-package-sharing.d.ts.map +1 -1
  391. package/packages/jam/jamnp-s/protocol/ce-134-work-package-sharing.js +7 -0
  392. package/packages/jam/jamnp-s/protocol/ce-134-work-package-sharing.test.js +2 -2
  393. package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.d.ts +4 -2
  394. package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.d.ts.map +1 -1
  395. package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.js +6 -0
  396. package/packages/jam/jamnp-s/protocol/ce-135-work-report-distribution.test.js +2 -2
  397. package/packages/jam/jamnp-s/protocol/up-0-block-announcement.d.ts +2 -1
  398. package/packages/jam/jamnp-s/protocol/up-0-block-announcement.d.ts.map +1 -1
  399. package/packages/jam/jamnp-s/protocol/up-0-block-announcement.js +3 -0
  400. package/packages/jam/jamnp-s/stream-manager.d.ts +2 -1
  401. package/packages/jam/jamnp-s/stream-manager.d.ts.map +1 -1
  402. package/packages/jam/jamnp-s/stream-manager.js +4 -1
  403. package/packages/jam/jamnp-s/tasks/sync.js +4 -4
  404. package/packages/jam/jamnp-s/tasks/sync.test.js +4 -4
  405. package/packages/jam/jamnp-s/tasks/ticket-distribution.js +2 -2
  406. package/packages/jam/jamnp-s/tasks/ticket-distribution.test.js +1 -1
  407. package/packages/jam/node/common.d.ts.map +1 -1
  408. package/packages/jam/node/common.js +3 -3
  409. package/packages/jam/rpc-client/index.d.ts +4 -2
  410. package/packages/jam/rpc-client/index.d.ts.map +1 -1
  411. package/packages/jam/rpc-client/index.js +7 -1
  412. package/packages/jam/state/in-memory-state-view.d.ts +2 -1
  413. package/packages/jam/state/in-memory-state-view.d.ts.map +1 -1
  414. package/packages/jam/state/in-memory-state-view.js +3 -0
  415. package/packages/jam/state/in-memory-state.d.ts +16 -21
  416. package/packages/jam/state/in-memory-state.d.ts.map +1 -1
  417. package/packages/jam/state/in-memory-state.js +10 -6
  418. package/packages/jam/state/in-memory-state.test.js +2 -2
  419. package/packages/jam/state/service.d.ts +2 -6
  420. package/packages/jam/state/service.d.ts.map +1 -1
  421. package/packages/jam/state/service.js +3 -0
  422. package/packages/jam/state/test.utils.js +3 -3
  423. package/packages/jam/state-json/accounts.js +5 -5
  424. package/packages/jam/state-merkleization/in-memory-state-codec.d.ts +3 -34
  425. package/packages/jam/state-merkleization/in-memory-state-codec.d.ts.map +1 -1
  426. package/packages/jam/state-merkleization/in-memory-state-codec.js +1 -1
  427. package/packages/jam/state-merkleization/serialized-state-view.d.ts +8 -3
  428. package/packages/jam/state-merkleization/serialized-state-view.d.ts.map +1 -1
  429. package/packages/jam/state-merkleization/serialized-state-view.js +6 -3
  430. package/packages/jam/state-merkleization/serialized-state.d.ts +2 -3
  431. package/packages/jam/state-merkleization/serialized-state.d.ts.map +1 -1
  432. package/packages/jam/state-merkleization/serialized-state.js +10 -2
  433. package/packages/jam/state-merkleization/serialized-state.test.js +1 -1
  434. package/packages/jam/transition/accumulate/accumulate.d.ts.map +1 -1
  435. package/packages/jam/transition/accumulate/accumulate.js +20 -8
  436. package/packages/jam/transition/accumulate/accumulate.test.js +1 -1
  437. package/packages/jam/transition/accumulate/accumulation-result-merge-utils.js +48 -39
  438. package/packages/jam/transition/block-verifier.d.ts +2 -1
  439. package/packages/jam/transition/block-verifier.d.ts.map +1 -1
  440. package/packages/jam/transition/block-verifier.js +3 -0
  441. package/packages/jam/transition/block-verifier.test.js +8 -8
  442. package/packages/jam/transition/chain-stf.d.ts +12 -4
  443. package/packages/jam/transition/chain-stf.d.ts.map +1 -1
  444. package/packages/jam/transition/chain-stf.js +7 -3
  445. package/packages/jam/transition/externalities/accumulate-externalities.d.ts +22 -8
  446. package/packages/jam/transition/externalities/accumulate-externalities.d.ts.map +1 -1
  447. package/packages/jam/transition/externalities/accumulate-externalities.js +49 -29
  448. package/packages/jam/transition/externalities/accumulate-externalities.test.js +661 -101
  449. package/packages/jam/transition/externalities/accumulate-fetch-externalities.d.ts +19 -0
  450. package/packages/jam/transition/externalities/accumulate-fetch-externalities.d.ts.map +1 -0
  451. package/packages/jam/transition/externalities/accumulate-fetch-externalities.js +45 -0
  452. package/packages/jam/transition/externalities/accumulate-fetch-externalities.test.d.ts +2 -0
  453. package/packages/jam/transition/externalities/accumulate-fetch-externalities.test.d.ts.map +1 -0
  454. package/packages/jam/transition/externalities/accumulate-fetch-externalities.test.js +192 -0
  455. package/packages/jam/transition/externalities/fetch-externalities.d.ts +3 -39
  456. package/packages/jam/transition/externalities/fetch-externalities.d.ts.map +1 -1
  457. package/packages/jam/transition/externalities/fetch-externalities.js +2 -88
  458. package/packages/jam/transition/externalities/index.d.ts +3 -0
  459. package/packages/jam/transition/externalities/index.d.ts.map +1 -1
  460. package/packages/jam/transition/externalities/index.js +3 -0
  461. package/packages/jam/transition/externalities/is-authorized-fetch-externalities.d.ts +22 -0
  462. package/packages/jam/transition/externalities/is-authorized-fetch-externalities.d.ts.map +1 -0
  463. package/packages/jam/transition/externalities/is-authorized-fetch-externalities.js +41 -0
  464. package/packages/jam/transition/externalities/refine-fetch-externalities.d.ts +24 -0
  465. package/packages/jam/transition/externalities/refine-fetch-externalities.d.ts.map +1 -0
  466. package/packages/jam/transition/externalities/refine-fetch-externalities.js +59 -0
  467. package/packages/jam/transition/externalities/refine-fetch-externalities.test.d.ts +2 -0
  468. package/packages/jam/transition/externalities/refine-fetch-externalities.test.d.ts.map +1 -0
  469. package/packages/jam/transition/externalities/refine-fetch-externalities.test.js +32 -0
  470. package/packages/jam/transition/hasher.d.ts +2 -1
  471. package/packages/jam/transition/hasher.d.ts.map +1 -1
  472. package/packages/jam/transition/hasher.js +5 -2
  473. package/packages/jam/transition/hasher.test.js +1 -1
  474. package/packages/jam/transition/preimages.test.js +4 -4
  475. package/packages/jam/transition/reports/test.utils.js +1 -1
  476. package/packages/workers/api-node/config.js +4 -4
  477. package/packages/workers/api-node/port.d.ts +2 -1
  478. package/packages/workers/api-node/port.d.ts.map +1 -1
  479. package/packages/workers/api-node/port.js +4 -1
  480. package/packages/workers/api-node/port.test.js +2 -2
  481. package/packages/workers/api-node/protocol.js +2 -2
  482. package/packages/workers/block-authorship/generator.d.ts +13 -2
  483. package/packages/workers/block-authorship/generator.d.ts.map +1 -1
  484. package/packages/workers/block-authorship/generator.js +13 -9
  485. package/packages/workers/block-authorship/generator.test.js +16 -2
  486. package/packages/workers/block-authorship/main.d.ts.map +1 -1
  487. package/packages/workers/block-authorship/main.js +8 -1
  488. package/packages/workers/importer/finality.test.js +1 -1
  489. package/packages/workers/importer/importer.d.ts +23 -6
  490. package/packages/workers/importer/importer.d.ts.map +1 -1
  491. package/packages/workers/importer/importer.js +34 -19
  492. package/packages/workers/importer/main.d.ts.map +1 -1
  493. package/packages/workers/importer/main.js +13 -5
  494. package/packages/jam/transition/externalities/fetch-externalities.test.d.ts +0 -2
  495. package/packages/jam/transition/externalities/fetch-externalities.test.d.ts.map +0 -1
  496. package/packages/jam/transition/externalities/fetch-externalities.test.js +0 -254
@@ -3,12 +3,15 @@ import { describe, it } from "node:test";
3
3
  import { MAX_NUMBER_OF_EXPORTS_WP, SEGMENT_BYTES, tryAsServiceGas, tryAsServiceId, tryAsTimeSlot, } from "#@typeberry/block";
4
4
  import { Bytes, BytesBlob } from "#@typeberry/bytes";
5
5
  import { HashDictionary } from "#@typeberry/collections";
6
- import { tinyChainSpec } from "#@typeberry/config";
6
+ import { PvmBackend, tinyChainSpec } from "#@typeberry/config";
7
7
  import { HASH_SIZE } from "#@typeberry/hash";
8
- import { SegmentExportError } from "#@typeberry/jam-host-calls";
8
+ import { SegmentExportError, tryAsMachineId, tryAsProgramCounter } from "#@typeberry/jam-host-calls";
9
9
  import { tryAsU32, tryAsU64 } from "#@typeberry/numbers";
10
+ import { HostCallRegisters } from "#@typeberry/pvm-host-calls";
11
+ import { Status, tryAsBigGas } from "#@typeberry/pvm-interface";
10
12
  import { InMemoryService, InMemoryState, PreimageItem, ServiceAccountInfo } from "#@typeberry/state";
11
13
  import { RefineExternalitiesImpl } from "./refine.js";
14
+ const MINIMAL_PROGRAM = new Uint8Array([0, 1, 1, 0, 0x00]);
12
15
  function createSegment(byte = 0xab) {
13
16
  return Bytes.fill(SEGMENT_BYTES, byte);
14
17
  }
@@ -33,7 +36,7 @@ function createMockState(services) {
33
36
  preimages.set(hash, item);
34
37
  }
35
38
  const serviceId = tryAsServiceId(svc.id);
36
- serviceMap.set(serviceId, new InMemoryService(serviceId, {
39
+ serviceMap.set(serviceId, InMemoryService.new(serviceId, {
37
40
  info: ServiceAccountInfo.create({
38
41
  codeHash: Bytes.zero(HASH_SIZE).asOpaque(),
39
42
  balance: tryAsU64(1000000000n),
@@ -59,9 +62,13 @@ function createExt(overrides = {}) {
59
62
  currentServiceId: tryAsServiceId(42),
60
63
  lookupState: overrides.lookupState ?? defaultState,
61
64
  exportOffset: overrides.exportOffset ?? 0,
65
+ pvmBackend: PvmBackend.BuiltIn,
62
66
  ...overrides,
63
67
  });
64
68
  }
69
+ function emptyRegisters() {
70
+ return HostCallRegisters.empty();
71
+ }
65
72
  describe("RefineExternalitiesImpl", () => {
66
73
  describe("historicalLookup", () => {
67
74
  const PREIMAGE_HASH = "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
@@ -160,4 +167,162 @@ describe("RefineExternalitiesImpl", () => {
160
167
  assert.deepStrictEqual(exported[0].raw.subarray(0, 5), new Uint8Array([1, 2, 3, 4, 5]));
161
168
  });
162
169
  });
170
+ describe("machineInit", () => {
171
+ it("should create a new inner PVM and return a machine ID", async () => {
172
+ const ext = createExt();
173
+ const code = BytesBlob.blobFrom(MINIMAL_PROGRAM);
174
+ const pc = tryAsProgramCounter(0);
175
+ const result = await ext.machineInit(code, pc);
176
+ assert.strictEqual(result.isOk, true);
177
+ assert.strictEqual(result.ok, tryAsMachineId(0));
178
+ });
179
+ it("should assign sequential machine IDs", async () => {
180
+ const ext = createExt();
181
+ const code = BytesBlob.blobFrom(MINIMAL_PROGRAM);
182
+ const pc = tryAsProgramCounter(0);
183
+ const r1 = await ext.machineInit(code, pc);
184
+ const r2 = await ext.machineInit(code, pc);
185
+ const r3 = await ext.machineInit(code, pc);
186
+ assert.strictEqual(r1.isOk, true);
187
+ assert.strictEqual(r1.ok, tryAsMachineId(0));
188
+ assert.strictEqual(r2.isOk, true);
189
+ assert.strictEqual(r2.ok, tryAsMachineId(1));
190
+ assert.strictEqual(r3.isOk, true);
191
+ assert.strictEqual(r3.ok, tryAsMachineId(2));
192
+ });
193
+ it("should return error for invalid program blob", async () => {
194
+ const ext = createExt();
195
+ const invalidCode = BytesBlob.blobFrom(new Uint8Array([0xff, 0xff, 0xff]));
196
+ const pc = tryAsProgramCounter(0);
197
+ const result = await ext.machineInit(invalidCode, pc);
198
+ assert.strictEqual(result.isError, true);
199
+ });
200
+ it("should return error for empty program blob", async () => {
201
+ const ext = createExt();
202
+ const emptyCode = BytesBlob.blobFrom(new Uint8Array([]));
203
+ const pc = tryAsProgramCounter(0);
204
+ const result = await ext.machineInit(emptyCode, pc);
205
+ assert.strictEqual(result.isError, true);
206
+ });
207
+ it("should accept a non-zero program counter", async () => {
208
+ const ext = createExt();
209
+ const code = BytesBlob.blobFrom(MINIMAL_PROGRAM);
210
+ const pc = tryAsProgramCounter(1);
211
+ const result = await ext.machineInit(code, pc);
212
+ assert.strictEqual(result.isOk, true);
213
+ });
214
+ });
215
+ describe("machineExpunge", () => {
216
+ it("should remove machine and return its program counter (0)", async () => {
217
+ const ext = createExt();
218
+ const code = BytesBlob.blobFrom(MINIMAL_PROGRAM);
219
+ const initResult = await ext.machineInit(code, tryAsProgramCounter(0));
220
+ assert.strictEqual(initResult.isOk, true);
221
+ const machineId = initResult.ok;
222
+ const result = await ext.machineExpunge(machineId);
223
+ assert.strictEqual(result.isOk, true);
224
+ // PC should be 0 since we initialized with PC=0
225
+ assert.strictEqual(result.ok, tryAsProgramCounter(0));
226
+ });
227
+ it("should remove machine and return its program counter (10)", async () => {
228
+ const ext = createExt();
229
+ const code = BytesBlob.blobFrom(MINIMAL_PROGRAM);
230
+ const initResult = await ext.machineInit(code, tryAsProgramCounter(10));
231
+ assert.strictEqual(initResult.isOk, true);
232
+ const machineId = initResult.ok;
233
+ const result = await ext.machineExpunge(machineId);
234
+ assert.strictEqual(result.isOk, true);
235
+ // PC should be 10 since we initialized with PC=10
236
+ assert.strictEqual(result.ok, tryAsProgramCounter(10));
237
+ });
238
+ it("should return NoMachineError for non-existent machine", async () => {
239
+ const ext = createExt();
240
+ const result = await ext.machineExpunge(tryAsMachineId(999));
241
+ assert.strictEqual(result.isError, true);
242
+ });
243
+ it("should not allow double expunge", async () => {
244
+ const ext = createExt();
245
+ const code = BytesBlob.blobFrom(MINIMAL_PROGRAM);
246
+ const initResult = await ext.machineInit(code, tryAsProgramCounter(0));
247
+ assert.strictEqual(initResult.isOk, true);
248
+ const machineId = initResult.ok;
249
+ const r1 = await ext.machineExpunge(machineId);
250
+ assert.strictEqual(r1.isOk, true);
251
+ const r2 = await ext.machineExpunge(machineId);
252
+ assert.strictEqual(r2.isError, true);
253
+ });
254
+ it("should remove exact machine from multiple and return its program counter (10)", async () => {
255
+ const ext = createExt();
256
+ const code = BytesBlob.blobFrom(MINIMAL_PROGRAM);
257
+ await ext.machineInit(code, tryAsProgramCounter(0));
258
+ const initResult = await ext.machineInit(code, tryAsProgramCounter(10));
259
+ await ext.machineInit(code, tryAsProgramCounter(20));
260
+ assert.strictEqual(initResult.isOk, true);
261
+ const machineId = initResult.ok;
262
+ const result = await ext.machineExpunge(machineId);
263
+ assert.strictEqual(result.isOk, true);
264
+ // PC should be 10 since we initialized with PC=10
265
+ assert.strictEqual(result.ok, tryAsProgramCounter(10));
266
+ });
267
+ });
268
+ describe("machineInvoke", () => {
269
+ it("should return NoMachineError for non-existent machine", async () => {
270
+ const ext = createExt();
271
+ const regs = emptyRegisters();
272
+ const result = await ext.machineInvoke(tryAsMachineId(999), tryAsBigGas(1000n), regs);
273
+ assert.strictEqual(result.isError, true);
274
+ });
275
+ it("should execute inner PVM and return PANIC for TRAP instruction", async () => {
276
+ const ext = createExt();
277
+ const code = BytesBlob.blobFrom(MINIMAL_PROGRAM);
278
+ const initResult = await ext.machineInit(code, tryAsProgramCounter(0));
279
+ assert.strictEqual(initResult.isOk, true);
280
+ const machineId = initResult.ok;
281
+ const regs = emptyRegisters();
282
+ const result = await ext.machineInvoke(machineId, tryAsBigGas(1000n), regs);
283
+ assert.strictEqual(result.isOk, true);
284
+ assert.strictEqual(result.ok.result.status, Status.PANIC);
285
+ });
286
+ it("should return OOG when gas is exhausted", async () => {
287
+ const ext = createExt();
288
+ const code = BytesBlob.blobFrom(MINIMAL_PROGRAM);
289
+ const initResult = await ext.machineInit(code, tryAsProgramCounter(0));
290
+ assert.strictEqual(initResult.isOk, true);
291
+ const machineId = initResult.ok;
292
+ const regs = emptyRegisters();
293
+ // With 0 gas, should immediately OOG
294
+ const result = await ext.machineInvoke(machineId, tryAsBigGas(0n), regs);
295
+ assert.strictEqual(result.isOk, true);
296
+ assert.strictEqual(result.ok.result.status, Status.OOG);
297
+ });
298
+ it("should pass registers to inner PVM and return them back", async () => {
299
+ const ext = createExt();
300
+ const code = BytesBlob.blobFrom(MINIMAL_PROGRAM);
301
+ const initResult = await ext.machineInit(code, tryAsProgramCounter(0));
302
+ assert.strictEqual(initResult.isOk, true);
303
+ const machineId = initResult.ok;
304
+ const regs = emptyRegisters();
305
+ regs.set(0, tryAsU64(0xdeadbeefn));
306
+ regs.set(5, tryAsU64(0xcafebaben));
307
+ const result = await ext.machineInvoke(machineId, tryAsBigGas(1000n), regs);
308
+ assert.strictEqual(result.isOk, true);
309
+ // Registers should be returned (TRAP doesn't modify registers)
310
+ assert.strictEqual(result.ok.registers.get(0), tryAsU64(0xdeadbeefn));
311
+ assert.strictEqual(result.ok.registers.get(5), tryAsU64(0xcafebaben));
312
+ });
313
+ it("should return remaining gas after execution", async () => {
314
+ const ext = createExt();
315
+ const code = BytesBlob.blobFrom(MINIMAL_PROGRAM);
316
+ const initResult = await ext.machineInit(code, tryAsProgramCounter(0));
317
+ assert.strictEqual(initResult.isOk, true);
318
+ const machineId = initResult.ok;
319
+ const regs = emptyRegisters();
320
+ const result = await ext.machineInvoke(machineId, tryAsBigGas(1000n), regs);
321
+ assert.strictEqual(result.isOk, true);
322
+ // TRAP costs 1 gas, so remaining should be 999
323
+ const remaining = Number(result.ok.gas);
324
+ assert.ok(remaining < 1000);
325
+ assert.ok(remaining >= 0);
326
+ });
327
+ });
163
328
  });
@@ -1,23 +1,18 @@
1
- import { type CoreIndex, type Segment, type SegmentIndex, type ServiceGas } from "#@typeberry/block";
1
+ import type { CoreIndex, Segment } from "#@typeberry/block";
2
2
  import { type WorkPackageHash } from "#@typeberry/block/refine-context.js";
3
3
  import type { WorkItemExtrinsic } from "#@typeberry/block/work-item.js";
4
4
  import type { WorkPackage } from "#@typeberry/block/work-package.js";
5
5
  import { WorkReport } from "#@typeberry/block/work-report.js";
6
- import { WorkExecResult, WorkResult } from "#@typeberry/block/work-result.js";
7
- import { type KnownSizeArray } from "#@typeberry/collections";
8
6
  import type { ChainSpec, PvmBackend } from "#@typeberry/config";
9
7
  import type { StatesDb } from "#@typeberry/database";
10
- import { type ReturnValue } from "#@typeberry/executor";
11
- import { type Blake2b, type WithHash } from "#@typeberry/hash";
8
+ import type { Blake2b, WithHash } from "#@typeberry/hash";
12
9
  import { Result } from "#@typeberry/utils";
10
+ import { type ImportedSegment, type PerWorkItem } from "./refine.js";
11
+ export type { ImportedSegment, PerWorkItem, RefineItemResult } from "./refine.js";
13
12
  export type RefineResult = {
14
13
  report: WorkReport;
15
14
  exports: PerWorkItem<Segment[]>;
16
15
  };
17
- export type RefineItemResult = {
18
- result: WorkResult;
19
- exports: readonly Segment[];
20
- };
21
16
  export declare enum RefineError {
22
17
  /** State for context anchor block or lookup anchor is not found in the DB. */
23
18
  StateMissing = 0,
@@ -28,17 +23,13 @@ export declare enum RefineError {
28
23
  /** Authorization error. */
29
24
  AuthorizationError = 3
30
25
  }
31
- export type PerWorkItem<T> = KnownSizeArray<T, "for each work item">;
32
- export type ImportedSegment = {
33
- index: SegmentIndex;
34
- data: Segment;
35
- };
36
26
  export declare class InCore {
37
27
  readonly chainSpec: ChainSpec;
38
28
  private readonly states;
39
- private readonly pvmBackend;
40
- private readonly blake2b;
41
- constructor(chainSpec: ChainSpec, states: StatesDb, pvmBackend: PvmBackend, blake2b: Blake2b);
29
+ private readonly isAuthorized;
30
+ private readonly refineItem;
31
+ static new(chainSpec: ChainSpec, states: StatesDb, pvmBackend: PvmBackend, blake2b: Blake2b): InCore;
32
+ private constructor();
42
33
  /**
43
34
  * Work-report computation function.
44
35
  *
@@ -50,11 +41,6 @@ export declare class InCore {
50
41
  * https://graypaper.fluffylabs.dev/#/ab2cdbd/1b7f021b7f02?v=0.7.2
51
42
  */
52
43
  refine(workPackageAndHash: WithHash<WorkPackageHash, WorkPackage>, core: CoreIndex, imports: PerWorkItem<ImportedSegment[]>, extrinsics: PerWorkItem<WorkItemExtrinsic[]>): Promise<Result<RefineResult, RefineError>>;
53
- private amalgamateWorkReport;
54
- private authorizePackage;
55
- private refineItem;
56
- extractWorkResult(execResult: ReturnValue<ServiceGas>): WorkExecResult;
57
- private getServiceCode;
58
- private createRefineExternalities;
44
+ private static amalgamateWorkReport;
59
45
  }
60
46
  //# sourceMappingURL=in-core.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"in-core.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/in-core/in-core.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,UAAU,EAIhB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAGL,KAAK,eAAe,EAErB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAY,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAmB,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAsC,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAGjH,OAAO,EAA+B,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAA+D,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACpH,OAAO,EAAE,KAAK,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAKzE,OAAO,EAA4B,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAGpE,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;CAC7B,CAAC;AAEF,oBAAY,WAAW;IACrB,8EAA8E;IAC9E,YAAY,IAAI;IAChB,qFAAqF;IACrF,iBAAiB,IAAI;IACrB,wEAAwE;IACxE,uBAAuB,IAAI;IAC3B,2BAA2B;IAC3B,kBAAkB,IAAI;CACvB;AAqBD,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;AAErE,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,YAAY,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAgBF,qBAAa,MAAM;aAEC,SAAS,EAAE,SAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAHR,SAAS,EAAE,SAAS,EACnB,MAAM,EAAE,QAAQ,EAChB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,OAAO;IAGnC;;;;;;;;;OASG;IACG,MAAM,CACV,kBAAkB,EAAE,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,EAC1D,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,WAAW,CAAC,eAAe,EAAE,CAAC,EACvC,UAAU,EAAE,WAAW,CAAC,iBAAiB,EAAE,CAAC,GAC3C,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAgF7C,OAAO,CAAC,oBAAoB;YAuDd,gBAAgB;YAkBhB,UAAU;IAoGxB,iBAAiB,CAAC,UAAU,EAAE,WAAW,CAAC,UAAU,CAAC;IAiBrD,OAAO,CAAC,cAAc;IAyCtB,OAAO,CAAC,yBAAyB;CA2BlC"}
1
+ {"version":3,"file":"in-core.d.ts","sourceRoot":"","sources":["../../../../../packages/jam/in-core/in-core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAsB,KAAK,eAAe,EAAmB,MAAM,oCAAoC,CAAC;AAC/G,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAmB,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAG9E,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIzD,OAAO,EAAe,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,WAAW,EAAiC,MAAM,aAAa,CAAC;AAEpG,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAElF,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;CACjC,CAAC;AAEF,oBAAY,WAAW;IACrB,8EAA8E;IAC9E,YAAY,IAAI;IAChB,qFAAqF;IACrF,iBAAiB,IAAI;IACrB,wEAAwE;IACxE,uBAAuB,IAAI;IAC3B,2BAA2B;IAC3B,kBAAkB,IAAI;CACvB;AAID,qBAAa,MAAM;aASC,SAAS,EAAE,SAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM;IATzB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO;IAI3F,OAAO;IAUP;;;;;;;;;OASG;IACG,MAAM,CACV,kBAAkB,EAAE,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,EAC1D,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,WAAW,CAAC,eAAe,EAAE,CAAC,EACvC,UAAU,EAAE,WAAW,CAAC,iBAAiB,EAAE,CAAC,GAC3C,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAwF7C,OAAO,CAAC,MAAM,CAAC,oBAAoB;CAsDpC"}
@@ -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 { FetchExternalities } from "#@typeberry/transition/externalities/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,148 +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 = FetchExternalities.createForRefine({
290
- entropy: undefined,
291
- ...args,
292
- }, this.chainSpec);
293
- const refine = RefineExternalitiesImpl.create({
294
- currentServiceId: args.currentServiceId,
295
- lookupState: args.lookupState,
296
- exportOffset: args.exportOffset,
297
- });
298
- return {
299
- fetchExternalities,
300
- refine,
301
- };
302
- }
303
136
  }