@europeum-ebsi/cli 0.0.0 → 1.0.0-rc.0

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 (384) hide show
  1. package/LICENSE.txt +289 -289
  2. package/LICENSES.txt +538 -0
  3. package/README.md +1140 -98
  4. package/dist/api/client.d.ts +4 -0
  5. package/dist/api/client.d.ts.map +1 -0
  6. package/dist/api/client.js +14 -0
  7. package/dist/api/client.js.map +1 -0
  8. package/dist/api/fetch.d.ts +13 -0
  9. package/dist/api/fetch.d.ts.map +1 -0
  10. package/dist/api/fetch.js +30 -0
  11. package/dist/api/fetch.js.map +1 -0
  12. package/dist/api/params.d.ts +4 -0
  13. package/dist/api/params.d.ts.map +1 -0
  14. package/dist/api/params.js +9 -0
  15. package/dist/api/params.js.map +1 -0
  16. package/dist/auth/dcql.d.ts +5 -0
  17. package/dist/auth/dcql.d.ts.map +1 -0
  18. package/dist/auth/dcql.js +41 -0
  19. package/dist/auth/dcql.js.map +1 -0
  20. package/dist/auth/presentation.d.ts +30 -0
  21. package/dist/auth/presentation.d.ts.map +1 -0
  22. package/dist/auth/presentation.js +99 -0
  23. package/dist/auth/presentation.js.map +1 -0
  24. package/dist/auth/token.d.ts +11 -0
  25. package/dist/auth/token.d.ts.map +1 -0
  26. package/dist/auth/token.js +116 -0
  27. package/dist/auth/token.js.map +1 -0
  28. package/dist/cli.d.ts +3 -0
  29. package/dist/cli.d.ts.map +1 -0
  30. package/dist/cli.js +96 -10
  31. package/dist/cli.js.map +1 -1
  32. package/dist/commands/auth.d.ts +3 -0
  33. package/dist/commands/auth.d.ts.map +1 -0
  34. package/dist/commands/auth.js +99 -0
  35. package/dist/commands/auth.js.map +1 -0
  36. package/dist/commands/config-cmd.d.ts +3 -0
  37. package/dist/commands/config-cmd.d.ts.map +1 -0
  38. package/dist/commands/config-cmd.js +86 -0
  39. package/dist/commands/config-cmd.js.map +1 -0
  40. package/dist/commands/contracts-registry.d.ts +3 -0
  41. package/dist/commands/contracts-registry.d.ts.map +1 -0
  42. package/dist/commands/contracts-registry.js +132 -0
  43. package/dist/commands/contracts-registry.js.map +1 -0
  44. package/dist/commands/did-registry.d.ts +3 -0
  45. package/dist/commands/did-registry.d.ts.map +1 -0
  46. package/dist/commands/did-registry.js +110 -0
  47. package/dist/commands/did-registry.js.map +1 -0
  48. package/dist/commands/faucet.d.ts +3 -0
  49. package/dist/commands/faucet.d.ts.map +1 -0
  50. package/dist/commands/faucet.js +78 -0
  51. package/dist/commands/faucet.js.map +1 -0
  52. package/dist/commands/health.d.ts +3 -0
  53. package/dist/commands/health.d.ts.map +1 -0
  54. package/dist/commands/health.js +20 -0
  55. package/dist/commands/health.js.map +1 -0
  56. package/dist/commands/issuers-registry.d.ts +3 -0
  57. package/dist/commands/issuers-registry.d.ts.map +1 -0
  58. package/dist/commands/issuers-registry.js +340 -0
  59. package/dist/commands/issuers-registry.js.map +1 -0
  60. package/dist/commands/ledger.d.ts +3 -0
  61. package/dist/commands/ledger.d.ts.map +1 -0
  62. package/dist/commands/ledger.js +549 -372
  63. package/dist/commands/ledger.js.map +1 -1
  64. package/dist/commands/onboarding.d.ts +3 -0
  65. package/dist/commands/onboarding.d.ts.map +1 -0
  66. package/dist/commands/onboarding.js +301 -0
  67. package/dist/commands/onboarding.js.map +1 -0
  68. package/dist/commands/openapi.d.ts +3 -0
  69. package/dist/commands/openapi.d.ts.map +1 -0
  70. package/dist/commands/openapi.js +37 -0
  71. package/dist/commands/openapi.js.map +1 -0
  72. package/dist/commands/policies-registry.d.ts +3 -0
  73. package/dist/commands/policies-registry.d.ts.map +1 -0
  74. package/dist/commands/policies-registry.js +198 -0
  75. package/dist/commands/policies-registry.js.map +1 -0
  76. package/dist/commands/registry.d.ts +27 -0
  77. package/dist/commands/registry.d.ts.map +1 -0
  78. package/dist/commands/registry.js +62 -0
  79. package/dist/commands/registry.js.map +1 -0
  80. package/dist/commands/schemas-registry.d.ts +3 -0
  81. package/dist/commands/schemas-registry.d.ts.map +1 -0
  82. package/dist/commands/schemas-registry.js +231 -0
  83. package/dist/commands/schemas-registry.js.map +1 -0
  84. package/dist/commands/shared/args.d.ts +2 -0
  85. package/dist/commands/shared/args.d.ts.map +1 -0
  86. package/dist/commands/shared/args.js +4 -0
  87. package/dist/commands/shared/args.js.map +1 -0
  88. package/dist/commands/shared/wallet-opts.d.ts +9 -0
  89. package/dist/commands/shared/wallet-opts.d.ts.map +1 -0
  90. package/dist/commands/shared/wallet-opts.js +44 -0
  91. package/dist/commands/shared/wallet-opts.js.map +1 -0
  92. package/dist/commands/timestamp.d.ts +3 -0
  93. package/dist/commands/timestamp.d.ts.map +1 -0
  94. package/dist/commands/timestamp.js +250 -0
  95. package/dist/commands/timestamp.js.map +1 -0
  96. package/dist/commands/track-and-trace.d.ts +3 -0
  97. package/dist/commands/track-and-trace.d.ts.map +1 -0
  98. package/dist/commands/track-and-trace.js +235 -0
  99. package/dist/commands/track-and-trace.js.map +1 -0
  100. package/dist/commands/wallet.d.ts +3 -0
  101. package/dist/commands/wallet.d.ts.map +1 -0
  102. package/dist/commands/wallet.js +123 -0
  103. package/dist/commands/wallet.js.map +1 -0
  104. package/dist/config/config.d.ts +45 -0
  105. package/dist/config/config.d.ts.map +1 -0
  106. package/dist/config/config.js +111 -0
  107. package/dist/config/config.js.map +1 -0
  108. package/dist/config/ebsi-env.d.ts +4 -0
  109. package/dist/config/ebsi-env.d.ts.map +1 -0
  110. package/dist/config/ebsi-env.js +37 -0
  111. package/dist/config/ebsi-env.js.map +1 -0
  112. package/dist/crypto/wallet.d.ts +34 -0
  113. package/dist/crypto/wallet.d.ts.map +1 -0
  114. package/dist/crypto/wallet.js +100 -0
  115. package/dist/crypto/wallet.js.map +1 -0
  116. package/dist/index.d.ts +3 -0
  117. package/dist/index.d.ts.map +1 -0
  118. package/dist/index.js +15 -6
  119. package/dist/index.js.map +1 -1
  120. package/dist/ledger/read.d.ts +11 -0
  121. package/dist/ledger/read.d.ts.map +1 -0
  122. package/dist/ledger/read.js +24 -0
  123. package/dist/ledger/read.js.map +1 -0
  124. package/dist/ledger/registries.d.ts +25 -0
  125. package/dist/ledger/registries.d.ts.map +1 -0
  126. package/dist/ledger/registries.js +111 -0
  127. package/dist/ledger/registries.js.map +1 -0
  128. package/dist/ledger/write.d.ts +43 -0
  129. package/dist/ledger/write.d.ts.map +1 -0
  130. package/dist/ledger/write.js +119 -0
  131. package/dist/ledger/write.js.map +1 -0
  132. package/dist/onboarding/vc.d.ts +18 -0
  133. package/dist/onboarding/vc.d.ts.map +1 -0
  134. package/dist/onboarding/vc.js +72 -0
  135. package/dist/onboarding/vc.js.map +1 -0
  136. package/dist/output/format.d.ts +7 -0
  137. package/dist/output/format.d.ts.map +1 -0
  138. package/dist/output/format.js +94 -0
  139. package/dist/output/format.js.map +1 -0
  140. package/dist/tui/App.d.ts +3 -0
  141. package/dist/tui/App.d.ts.map +1 -0
  142. package/dist/tui/App.js +99 -0
  143. package/dist/tui/App.js.map +1 -0
  144. package/dist/tui/CommandPalette.d.ts +8 -0
  145. package/dist/tui/CommandPalette.d.ts.map +1 -0
  146. package/dist/tui/CommandPalette.js +105 -0
  147. package/dist/tui/CommandPalette.js.map +1 -0
  148. package/package.json +66 -108
  149. package/src/api/client.ts +26 -0
  150. package/src/api/fetch.ts +53 -0
  151. package/src/api/params.ts +17 -0
  152. package/src/auth/dcql.ts +84 -0
  153. package/src/auth/presentation.ts +255 -0
  154. package/src/auth/token.ts +244 -0
  155. package/src/cli.ts +164 -0
  156. package/src/commands/auth.ts +119 -0
  157. package/src/commands/config-cmd.ts +122 -0
  158. package/src/commands/contracts-registry.ts +156 -0
  159. package/src/commands/did-registry.ts +126 -0
  160. package/src/commands/faucet.ts +112 -0
  161. package/src/commands/health.ts +21 -0
  162. package/src/commands/issuers-registry.ts +385 -0
  163. package/src/commands/ledger.ts +777 -0
  164. package/src/commands/onboarding.ts +411 -0
  165. package/src/commands/openapi.ts +42 -0
  166. package/src/commands/policies-registry.ts +218 -0
  167. package/src/commands/registry.ts +152 -0
  168. package/src/commands/schemas-registry.ts +255 -0
  169. package/src/commands/shared/args.ts +14 -0
  170. package/src/commands/shared/wallet-opts.ts +85 -0
  171. package/src/commands/timestamp.ts +272 -0
  172. package/src/commands/track-and-trace.ts +263 -0
  173. package/src/commands/wallet.ts +175 -0
  174. package/src/config/config.ts +275 -0
  175. package/src/config/ebsi-env.ts +67 -0
  176. package/src/crypto/wallet.ts +291 -0
  177. package/src/index.ts +24 -0
  178. package/src/ledger/read.ts +70 -0
  179. package/src/ledger/registries.ts +285 -0
  180. package/src/ledger/write.ts +381 -0
  181. package/src/onboarding/vc.ts +205 -0
  182. package/src/output/format.ts +157 -0
  183. package/src/tui/App.tsx +282 -0
  184. package/src/tui/CommandPalette.tsx +223 -0
  185. package/bin/cli.js +0 -13
  186. package/dist/abi/pilot/DidRegistry.js +0 -568
  187. package/dist/abi/pilot/DidRegistry.js.map +0 -1
  188. package/dist/abi/pilot/Ptr.js +0 -666
  189. package/dist/abi/pilot/Ptr.js.map +0 -1
  190. package/dist/abi/pilot/SchemaSCRegistry.js +0 -264
  191. package/dist/abi/pilot/SchemaSCRegistry.js.map +0 -1
  192. package/dist/abi/pilot/Tcr.js +0 -715
  193. package/dist/abi/pilot/Tcr.js.map +0 -1
  194. package/dist/abi/pilot/Timestamp.js +0 -658
  195. package/dist/abi/pilot/Timestamp.js.map +0 -1
  196. package/dist/abi/pilot/Tir.js +0 -428
  197. package/dist/abi/pilot/Tir.js.map +0 -1
  198. package/dist/abi/pilot/TnT.js +0 -842
  199. package/dist/abi/pilot/TnT.js.map +0 -1
  200. package/dist/abi/pilot/Tpr.js +0 -492
  201. package/dist/abi/pilot/Tpr.js.map +0 -1
  202. package/dist/abi/test/DidRegistry.js +0 -568
  203. package/dist/abi/test/DidRegistry.js.map +0 -1
  204. package/dist/abi/test/Ptr.js +0 -666
  205. package/dist/abi/test/Ptr.js.map +0 -1
  206. package/dist/abi/test/SchemaSCRegistry.js +0 -300
  207. package/dist/abi/test/SchemaSCRegistry.js.map +0 -1
  208. package/dist/abi/test/Tcr.js +0 -715
  209. package/dist/abi/test/Tcr.js.map +0 -1
  210. package/dist/abi/test/Timestamp.js +0 -658
  211. package/dist/abi/test/Timestamp.js.map +0 -1
  212. package/dist/abi/test/Tir.js +0 -428
  213. package/dist/abi/test/Tir.js.map +0 -1
  214. package/dist/abi/test/TnT.js +0 -842
  215. package/dist/abi/test/TnT.js.map +0 -1
  216. package/dist/abi/test/Tpr.js +0 -492
  217. package/dist/abi/test/Tpr.js.map +0 -1
  218. package/dist/app.js +0 -659
  219. package/dist/app.js.map +0 -1
  220. package/dist/buildParam/didr.js +0 -374
  221. package/dist/buildParam/didr.js.map +0 -1
  222. package/dist/buildParam/index.js +0 -53
  223. package/dist/buildParam/index.js.map +0 -1
  224. package/dist/buildParam/ptr.js +0 -80
  225. package/dist/buildParam/ptr.js.map +0 -1
  226. package/dist/buildParam/tcr.js +0 -36
  227. package/dist/buildParam/tcr.js.map +0 -1
  228. package/dist/buildParam/timestamp.js +0 -350
  229. package/dist/buildParam/timestamp.js.map +0 -1
  230. package/dist/buildParam/tir.js +0 -110
  231. package/dist/buildParam/tir.js.map +0 -1
  232. package/dist/buildParam/tnt.js +0 -214
  233. package/dist/buildParam/tnt.js.map +0 -1
  234. package/dist/buildParam/tpr.js +0 -91
  235. package/dist/buildParam/tpr.js.map +0 -1
  236. package/dist/buildParam/tsr.js +0 -115
  237. package/dist/buildParam/tsr.js.map +0 -1
  238. package/dist/commands/authorisation.js +0 -144
  239. package/dist/commands/authorisation.js.map +0 -1
  240. package/dist/commands/compute.js +0 -680
  241. package/dist/commands/compute.js.map +0 -1
  242. package/dist/commands/conformance.js +0 -813
  243. package/dist/commands/conformance.js.map +0 -1
  244. package/dist/commands/hardwarewallet.js +0 -41
  245. package/dist/commands/hardwarewallet.js.map +0 -1
  246. package/dist/commands/index.js +0 -8
  247. package/dist/commands/index.js.map +0 -1
  248. package/dist/commands/ptr.js +0 -54
  249. package/dist/commands/ptr.js.map +0 -1
  250. package/dist/commands/tcr.js +0 -50
  251. package/dist/commands/tcr.js.map +0 -1
  252. package/dist/commands/tir.js +0 -64
  253. package/dist/commands/tir.js.map +0 -1
  254. package/dist/commands/tnl.js +0 -81
  255. package/dist/commands/tnl.js.map +0 -1
  256. package/dist/commands/tsr.js +0 -45
  257. package/dist/commands/tsr.js.map +0 -1
  258. package/dist/commands/view.js +0 -53
  259. package/dist/commands/view.js.map +0 -1
  260. package/dist/config.js +0 -497
  261. package/dist/config.js.map +0 -1
  262. package/dist/interfaces/context.js +0 -2
  263. package/dist/interfaces/context.js.map +0 -1
  264. package/dist/interfaces/contracts/ProxyFactory.js +0 -2
  265. package/dist/interfaces/contracts/ProxyFactory.js.map +0 -1
  266. package/dist/interfaces/contracts/ProxyTemplateRegistry.js +0 -2
  267. package/dist/interfaces/contracts/ProxyTemplateRegistry.js.map +0 -1
  268. package/dist/interfaces/contracts/SchemaSCRegistry.js +0 -2
  269. package/dist/interfaces/contracts/SchemaSCRegistry.js.map +0 -1
  270. package/dist/interfaces/contracts/common.js +0 -2
  271. package/dist/interfaces/contracts/common.js.map +0 -1
  272. package/dist/interfaces/index.js +0 -5
  273. package/dist/interfaces/index.js.map +0 -1
  274. package/dist/interfaces/jsonrpc.interface.js +0 -2
  275. package/dist/interfaces/jsonrpc.interface.js.map +0 -1
  276. package/dist/interfaces/paginated-list.interface.js +0 -2
  277. package/dist/interfaces/paginated-list.interface.js.map +0 -1
  278. package/dist/interfaces/unsigned-transaction.interface.js +0 -2
  279. package/dist/interfaces/unsigned-transaction.interface.js.map +0 -1
  280. package/dist/interfaces/utils.interface.js +0 -2
  281. package/dist/interfaces/utils.interface.js.map +0 -1
  282. package/dist/programs/migrateDid.js +0 -159
  283. package/dist/programs/migrateDid.js.map +0 -1
  284. package/dist/programs/migrateDids.js +0 -232
  285. package/dist/programs/migrateDids.js.map +0 -1
  286. package/dist/programs/migrateTsr.js +0 -201
  287. package/dist/programs/migrateTsr.js.map +0 -1
  288. package/dist/scripts/accreditAndAuthorize/conformance/step1 +0 -34
  289. package/dist/scripts/accreditAndAuthorize/conformance/step2 +0 -18
  290. package/dist/scripts/accreditAndAuthorize/conformance/step3 +0 -9
  291. package/dist/scripts/accreditAndAuthorize/conformance/step4 +0 -27
  292. package/dist/scripts/accreditAndAuthorize/conformance/step5 +0 -13
  293. package/dist/scripts/accreditAndAuthorize/conformance/step6 +0 -14
  294. package/dist/scripts/accreditAndAuthorize/conformance/step7 +0 -7
  295. package/dist/scripts/accreditAndAuthorize/test/step1 +0 -34
  296. package/dist/scripts/accreditAndAuthorize/test/step2 +0 -18
  297. package/dist/scripts/accreditAndAuthorize/test/step3 +0 -9
  298. package/dist/scripts/accreditAndAuthorize/test/step4 +0 -27
  299. package/dist/scripts/accreditAndAuthorize/test/step5 +0 -13
  300. package/dist/scripts/accreditAndAuthorize/test/step6 +0 -14
  301. package/dist/scripts/accreditAndAuthorize/test/step7 +0 -7
  302. package/dist/scripts/accreditTI +0 -21
  303. package/dist/scripts/assets/Nodes.json +0 -27
  304. package/dist/scripts/assets/vcdm1.1/CTRevocableCredential.json +0 -30
  305. package/dist/scripts/assets/vcdm1.1/CredentialToAttestVerifiableAuthorisationForTrustChain.json +0 -29
  306. package/dist/scripts/assets/vcdm1.1/Nodes.json +0 -27
  307. package/dist/scripts/assets/vcdm1.1/TrustedNodesList.json +0 -35
  308. package/dist/scripts/assets/vcdm1.1/VerifiableAccreditationToAccredit.json +0 -35
  309. package/dist/scripts/assets/vcdm1.1/VerifiableAccreditationToAttest.json +0 -33
  310. package/dist/scripts/assets/vcdm1.1/VerifiableAuthorisationForTrustChain.json +0 -22
  311. package/dist/scripts/assets/vcdm1.1/VerifiableAuthorisationToInvoke.json +0 -24
  312. package/dist/scripts/assets/vcdm1.1/VerifiableAuthorisationToOnboard.json +0 -24
  313. package/dist/scripts/assets/vcdm2.0/CredentialToAttestVerifiableAuthorisationForTrustChain.json +0 -29
  314. package/dist/scripts/assets/vcdm2.0/TrustedNodesList.json +0 -36
  315. package/dist/scripts/assets/vcdm2.0/VerifiableAccreditationToAccredit.json +0 -40
  316. package/dist/scripts/assets/vcdm2.0/VerifiableAccreditationToAttest.json +0 -38
  317. package/dist/scripts/assets/vcdm2.0/VerifiableAuthorisationForTrustChain.json +0 -30
  318. package/dist/scripts/assets/vcdm2.0/VerifiableAuthorisationToInvoke.json +0 -24
  319. package/dist/scripts/assets/vcdm2.0/VerifiableAuthorisationToOnboard.json +0 -23
  320. package/dist/scripts/bootstrap/0a-loadTPROperator +0 -5
  321. package/dist/scripts/bootstrap/0b-loadAdmin +0 -8
  322. package/dist/scripts/bootstrap/1-populateTPR +0 -92
  323. package/dist/scripts/bootstrap/2-populateDID +0 -6
  324. package/dist/scripts/bootstrap/3-populateTimestamp +0 -9
  325. package/dist/scripts/bootstrap/4-populateTIR +0 -8
  326. package/dist/scripts/bootstrap/5-populateTSR +0 -85
  327. package/dist/scripts/bootstrap/6-setupConformanceIssuer +0 -35
  328. package/dist/scripts/bootstrap/README.md +0 -218
  329. package/dist/scripts/issueVcInvoke +0 -10
  330. package/dist/scripts/issueVcOnboard +0 -9
  331. package/dist/scripts/issueVcRootTAO +0 -11
  332. package/dist/scripts/issueVcTAO +0 -12
  333. package/dist/scripts/issueVcTI +0 -12
  334. package/dist/scripts/issueVcTnl +0 -32
  335. package/dist/scripts/issue_CTRevocableCredential +0 -12
  336. package/dist/scripts/issue_SelfAttestationSupportOffice +0 -10
  337. package/dist/scripts/issue_VerifiableAccreditationToAccredit +0 -11
  338. package/dist/scripts/issue_VerifiableAccreditationToAttest +0 -11
  339. package/dist/scripts/issue_VerifiableAuthorisationForTrustChain +0 -10
  340. package/dist/scripts/issue_VerifiableAuthorisationToOnboard +0 -9
  341. package/dist/scripts/preregisterIssuer +0 -6
  342. package/dist/scripts/registerDidDocument +0 -15
  343. package/dist/scripts/registerIssuer +0 -6
  344. package/dist/scripts/updateVcRootTAO +0 -10
  345. package/dist/scripts/updateVcTAO +0 -11
  346. package/dist/scripts/updateVcTI +0 -11
  347. package/dist/scripts/vcdm2.0/issueSelfAttestationSupportOffice +0 -10
  348. package/dist/scripts/vcdm2.0/issueVcInvoke +0 -12
  349. package/dist/scripts/vcdm2.0/issueVcOnboard +0 -11
  350. package/dist/scripts/vcdm2.0/issueVcRootTAO +0 -14
  351. package/dist/scripts/vcdm2.0/issueVcTAO +0 -15
  352. package/dist/scripts/vcdm2.0/issueVcTI +0 -15
  353. package/dist/scripts/vcdm2.0/issueVcTnl +0 -34
  354. package/dist/scripts/vcdm2.0/registerDidDocument +0 -15
  355. package/dist/scripts/vcdm2.0/updateVcRootTAO +0 -13
  356. package/dist/scripts/vcdm2.0/updateVcTAO +0 -14
  357. package/dist/scripts/vcdm2.0/updateVcTI +0 -14
  358. package/dist/scripts/vcdm2.0/verifyVcTnl +0 -10
  359. package/dist/scripts/verifyVcTnl +0 -10
  360. package/dist/scripts/wct/accreditAndAuthorize +0 -133
  361. package/dist/scripts/wct/accreditAndAuthorize2 +0 -89
  362. package/dist/scripts/wct/holderWallet +0 -39
  363. package/dist/scripts/wct/holderWallet2 +0 -39
  364. package/dist/scripts/wct/issueToHolder +0 -38
  365. package/dist/scripts/wct/issueToHolder2 +0 -38
  366. package/dist/scripts/wct/pda1 +0 -3
  367. package/dist/scripts/wct/verifier +0 -8
  368. package/dist/scripts/wct/verifier2 +0 -7
  369. package/dist/utils/Client.js +0 -155
  370. package/dist/utils/Client.js.map +0 -1
  371. package/dist/utils/HardwareWallet.js +0 -326
  372. package/dist/utils/HardwareWallet.js.map +0 -1
  373. package/dist/utils/http.js +0 -132
  374. package/dist/utils/http.js.map +0 -1
  375. package/dist/utils/index.js +0 -8
  376. package/dist/utils/index.js.map +0 -1
  377. package/dist/utils/jsonrpc.js +0 -38
  378. package/dist/utils/jsonrpc.js.map +0 -1
  379. package/dist/utils/print.js +0 -56
  380. package/dist/utils/print.js.map +0 -1
  381. package/dist/utils/utils.js +0 -427
  382. package/dist/utils/utils.js.map +0 -1
  383. package/dist/utils/vcdm.js +0 -47
  384. package/dist/utils/vcdm.js.map +0 -1
@@ -1,397 +1,574 @@
1
- import { ethers } from "ethers";
2
- import Joi from "joi";
3
- import { buildParam } from "../buildParam/index.js";
4
- import { green, httpCall, jsonrpcBody, red, yellow } from "../utils/index.js";
5
- import { compute, getProperties, toPlainAbiValue } from "./compute.js";
6
- import { readPtrContract } from "./ptr.js";
7
- import { readTcrContract } from "./tcr.js";
8
- import { readTsrContract } from "./tsr.js";
9
- import { view } from "./view.js";
10
- export const smartContractApiList = [
11
- "timestamp",
12
- "did",
13
- "tcr",
14
- "ptr",
15
- "tir",
16
- "tsr",
17
- "tpr",
18
- "tnt",
19
- ];
20
- const onlyApiMethods = [
21
- {
22
- contract: "did",
23
- method: "addService",
24
- },
25
- {
26
- contract: "did",
27
- method: "revokeService",
28
- },
29
- ];
30
- export async function ledger(method, inputs, useProxy, context) {
31
- if (useProxy) {
32
- try {
33
- new URL(context.config.besuProvider);
34
- }
35
- catch {
36
- throw new Error(`Invalid URL for besu provider: ${context.config.besuProvider}`);
37
- }
1
+ import { readFileSync } from "node:fs";
2
+ import { getClient, unwrap } from "../api/fetch.js";
3
+ import { validateScope } from "../auth/presentation.js";
4
+ import { getAccessToken } from "../auth/token.js";
5
+ import { readFromRegistry } from "../ledger/read.js";
6
+ import { defaultScopeFor, deriveScopeForRegistries, REGISTRIES, REGISTRY_NAMES, } from "../ledger/registries.js";
7
+ import { signWriteBatch, writeToRegistry } from "../ledger/write.js";
8
+ import { requiredArg } from "./shared/args.js";
9
+ import { resolveWallet, WALLET_KEY_OPTIONS } from "./shared/wallet-opts.js";
10
+ function normalizeBatchEntry(entry, index) {
11
+ const position = `Batch entry #${(index + 1).toString()}`;
12
+ if (typeof entry !== "object" || entry === null || Array.isArray(entry)) {
13
+ throw new Error(`${position} must be a JSON object with a "method" field (e.g. {"method": "eth_blockNumber"}).`);
38
14
  }
39
- if (smartContractApiList.includes(method)) {
40
- return ledgerCallSmartContract(method, inputs, useProxy, context);
15
+ const { id, method, params } = entry;
16
+ if (typeof method !== "string" || method === "") {
17
+ throw new Error(`${position} is missing a "method" string.`);
41
18
  }
42
- switch (method) {
43
- case "get": {
44
- return ledgerGet(inputs, useProxy, context);
45
- }
46
- case "getBlock": {
47
- return ledgerGetBlock(inputs, useProxy, context);
48
- }
49
- case "getChainId": {
50
- return ledgerGetChainId(inputs, useProxy, context);
51
- }
52
- case "getGasPrice": {
53
- return ledgerGetGasPrice(useProxy, context);
54
- }
55
- case "getTransaction": {
56
- return ledgerGetTransaction(inputs, useProxy, context);
57
- }
58
- case "getTransactionCount": {
59
- return ledgerGetTransactionCount(inputs, useProxy, context);
60
- }
61
- case "getTransactionReceipt": {
62
- return ledgerGetTransactionReceipt(inputs, useProxy, context);
63
- }
64
- case "send": {
65
- return ledgerSendCustomContract(inputs, useProxy, context);
66
- }
67
- case "sendEth": {
68
- return ledgerSendEth(inputs[0], inputs[1], useProxy, context);
69
- }
70
- case "sendTransaction": {
71
- return ledgerSendTransaction(inputs, useProxy, context);
72
- }
73
- default: {
74
- throw new Error(`Invalid method '${method}'`);
75
- }
19
+ if (params !== undefined && !Array.isArray(params)) {
20
+ throw new Error(`${position}: "params" must be a JSON array when present.`);
21
+ }
22
+ if (id !== undefined && typeof id !== "number" && typeof id !== "string") {
23
+ throw new Error(`${position}: "id" must be a number or string when present.`);
76
24
  }
25
+ return {
26
+ ...(id !== undefined && { id: id }),
27
+ jsonrpc: "2.0",
28
+ method,
29
+ ...(params !== undefined && { params: params }),
30
+ };
77
31
  }
78
- export async function ledgerCallSmartContract(contractName, inputs, useProxy, context) {
79
- if (!(contractName in context.config.api)) {
80
- throw new Error(`contract ${contractName} not supported`);
32
+ function parseGasBigInt(raw, flag) {
33
+ try {
34
+ return BigInt(raw);
81
35
  }
82
- const { contract } = context.config.api[contractName];
83
- if (!contract) {
84
- throw new Error(`contract ${contractName} not supported`);
36
+ catch (error) {
37
+ const message = error instanceof Error ? error.message : String(error);
38
+ throw new Error(`Invalid ${flag} value "${raw}": ${message}`, {
39
+ cause: error,
40
+ });
85
41
  }
86
- const [m, ...args] = inputs;
87
- let method = m;
88
- Joi.assert(method, Joi.string());
89
- // check if the user wants to read data from the contract
90
- if (method === "get") {
91
- const path = args[0];
92
- switch (contractName) {
93
- case "ptr": {
94
- return readPtrContract(path, useProxy, context);
95
- }
96
- case "tcr": {
97
- return readTcrContract(path, useProxy, context);
98
- }
99
- case "tsr": {
100
- return readTsrContract(path, useProxy, context);
101
- }
102
- default: {
103
- throw new Error(`contract ${contractName} not supported`);
104
- }
105
- }
42
+ }
43
+ function parseGasOverrides(opts) {
44
+ const gasLimitRaw = opts["gasLimit"];
45
+ const gasPriceRaw = opts["gasPrice"];
46
+ if (gasLimitRaw === undefined && gasPriceRaw === undefined) {
47
+ return undefined;
106
48
  }
107
- // check if the method is just to build the unsigned transaction
108
- if (method.startsWith("build-")) {
109
- method = method.replace("build-", "");
110
- if (onlyApiMethods.some((im) => im.contract === contractName && im.method === method)) {
111
- throw new Error(`The method '${method}' can only be used through the ${contractName} api`);
112
- }
113
- const build = await buildParam(contractName, method, context.client, args, context.config.versionApis);
114
- const params = build.paramOrder.map((key) => build.param[key]);
115
- if (build.method)
116
- method = build.method;
117
- const data = contract.interface.encodeFunctionData(method, params);
118
- yellow(build.info.title);
119
- yellow(build.info.data);
120
- context.transactionInfo = {
121
- build,
122
- contract: contractName,
123
- method,
124
- };
125
- return {
126
- chainId: `0x${Number(await ledgerGetChainId([], useProxy, context)).toString(16)}`,
127
- data,
128
- from: context.client.ethWallet.address,
129
- gasLimit: `0x${context.rtVars["gasLimit"].toString(16)}`,
130
- gasPrice: `0x${context.rtVars["gasPrice"].toString(16)}`,
131
- nonce: await ledgerGetTransactionCount([context.client.ethWallet.address], useProxy, context),
132
- to: await contract.getAddress(),
133
- value: "0x0",
134
- };
49
+ return {
50
+ ...(gasLimitRaw !== undefined && {
51
+ gasLimit: parseGasBigInt(gasLimitRaw, "--gas-limit"),
52
+ }),
53
+ ...(gasPriceRaw !== undefined && {
54
+ gasPrice: parseGasBigInt(gasPriceRaw, "--gas-price"),
55
+ }),
56
+ };
57
+ }
58
+ function parseJsonArray(raw, argName) {
59
+ let parsed;
60
+ try {
61
+ parsed = JSON.parse(raw);
62
+ }
63
+ catch (error) {
64
+ const message = error instanceof Error ? error.message : "parse error";
65
+ throw new Error(`Invalid ${argName} JSON: ${message}`, { cause: error });
66
+ }
67
+ if (!Array.isArray(parsed)) {
68
+ throw new TypeError(`${argName} must be a JSON array`);
69
+ }
70
+ return parsed;
71
+ }
72
+ function parseWriteBatchFile(raw) {
73
+ let parsed;
74
+ try {
75
+ parsed = JSON.parse(raw);
76
+ }
77
+ catch (error) {
78
+ const message = error instanceof Error ? error.message : "parse error";
79
+ throw new Error(`Invalid JSON: ${message}`, { cause: error });
135
80
  }
136
- // build, sign and send
137
- const cmd = useProxy ? "proxyledger" : "ledger";
138
- console.log(`==> ${cmd} built-${method} ${args
139
- .map((arg) => {
140
- let param;
141
- if (typeof arg === "number") {
142
- param = `${arg}`;
81
+ if (!Array.isArray(parsed) || parsed.length === 0) {
82
+ throw new Error("Batch file must contain a non-empty JSON array of write entries " +
83
+ '(each: {"registry", "function", "args", "to"?}).');
84
+ }
85
+ return parsed.map((entry, index) => {
86
+ const position = `Entry #${(index + 1).toString()}`;
87
+ if (typeof entry !== "object" || entry === null || Array.isArray(entry)) {
88
+ throw new Error(`${position} must be a JSON object with "registry", "function", and "args".`);
89
+ }
90
+ const { args, function: fn, registry, to, } = entry;
91
+ if (typeof registry !== "string" || registry === "") {
92
+ throw new Error(`${position} is missing a "registry" string.`);
143
93
  }
144
- else if (typeof arg === "string") {
145
- param = `"${arg}"`;
94
+ if (typeof fn !== "string" || fn === "") {
95
+ throw new Error(`${position} is missing a "function" string.`);
146
96
  }
147
- else {
148
- param = JSON.stringify(arg);
97
+ if (!Array.isArray(args)) {
98
+ throw new TypeError(`${position}: "args" must be a JSON array.`);
149
99
  }
150
- return param;
151
- })
152
- .join(" ")}`);
153
- const uTx = (await ledgerCallSmartContract(contractName, [`build-${method}`, ...args], useProxy, context));
154
- console.log(`==> compute signTransaction ${JSON.stringify(uTx)}`);
155
- const sgnTx = (await compute("signTransaction", [uTx], context));
156
- console.log(`==> ${cmd} sendTransaction ${sgnTx}`);
157
- const receipt = await ledgerSendTransaction([sgnTx], useProxy, context);
158
- await view(["transactionInfo"], context);
159
- return receipt;
100
+ if (to !== undefined && typeof to !== "string") {
101
+ throw new Error(`${position}: "to" must be a string when present.`);
102
+ }
103
+ return { args, function: fn, registry, ...(to !== undefined && { to }) };
104
+ });
160
105
  }
161
- export async function ledgerGet(inputs, useProxy, context) {
162
- // check if the first input is an address
163
- if (/^0x[0-9a-fA-F]+$/.test(inputs[0])) {
164
- return ledgerGetCustomContract(inputs, useProxy, context);
106
+ async function readStdin() {
107
+ const chunks = [];
108
+ for await (const chunk of process.stdin) {
109
+ chunks.push(chunk);
165
110
  }
166
- const apiUrl = context.config.api.ledger.url;
167
- const urlPath = inputs.join("");
168
- const url = urlPath.startsWith("http") ? urlPath : `${apiUrl}${urlPath}`;
169
- const response = await httpCall.get(url, context.httpOpts);
170
- return response.data;
171
- }
172
- export async function ledgerGetBlock(inputs, useProxy, context) {
173
- const apiUrl = useProxy
174
- ? context.config.besuProvider
175
- : `${context.config.api.ledger.url}/blockchains/besu`;
176
- const body = jsonrpcBody("eth_getBlockByNumber", [inputs[0], true]);
177
- const response = await httpCall.post(apiUrl, body, context.httpOpts);
178
- return response.data.result;
111
+ return Buffer.concat(chunks).toString("utf8");
179
112
  }
180
- export async function ledgerGetChainId(_inputs, useProxy, context) {
181
- const apiUrl = useProxy
182
- ? context.config.besuProvider
183
- : `${context.config.api.ledger.url}/blockchains/besu`;
184
- const body = jsonrpcBody("net_version", []);
185
- const response = await httpCall.post(apiUrl, body, context.httpOpts);
186
- return response.data.result;
187
- }
188
- export async function ledgerGetCustomContract(inputs, useProxy, context) {
189
- const [address, abi, method, ...args] = inputs;
190
- const provider = new ethers.JsonRpcProvider(useProxy
191
- ? context.config.besuProvider
192
- : `${context.config.api.ledger.url}/blockchains/besu`);
193
- const contract = new ethers.Contract(address, abi, provider);
194
- const result = (await contract[method](...args));
195
- const fragment = contract.interface.getFunction(method);
196
- if (!fragment) {
197
- throw new Error(`Can't get function fragment for ${method}`);
113
+ async function resolveWriteToken(opts, config, wallet, defaultScope) {
114
+ if (opts["autoToken"]) {
115
+ const scope = opts["scope"] ?? defaultScope;
116
+ validateScope(scope);
117
+ const vcFile = opts["vc"];
118
+ const vcJwt = vcFile ? readFileSync(vcFile, "utf8").trim() : undefined;
119
+ return getAccessToken({
120
+ config,
121
+ scope,
122
+ wallet,
123
+ ...(vcJwt !== undefined && { vcJwt }),
124
+ });
198
125
  }
199
- const outputs = fragment.outputs;
200
- const outputsDecoded = outputs.length === 0
201
- ? undefined
202
- : outputs.length === 1
203
- ? toPlainAbiValue(result, outputs[0])
204
- : getProperties(result, outputs);
205
- const dataDecoded = {
206
- name: fragment.name,
207
- outputs: outputsDecoded,
208
- };
209
- green({ dataDecoded, result });
210
- return { dataDecoded, result };
211
- }
212
- export async function ledgerGetGasPrice(useProxy, context) {
213
- const apiUrl = useProxy
214
- ? context.config.besuProvider
215
- : `${context.config.api.ledger.url}/blockchains/besu`;
216
- const body = jsonrpcBody("eth_gasPrice", []);
217
- const response = await httpCall.post(apiUrl, body, context.httpOpts);
218
- return response.data.result;
219
- }
220
- export async function ledgerGetTransaction(inputs, useProxy, context) {
221
- const apiUrl = useProxy
222
- ? context.config.besuProvider
223
- : `${context.config.api.ledger.url}/blockchains/besu`;
224
- const body = jsonrpcBody("eth_getTransactionByHash", [inputs[0]]);
225
- const response = await httpCall.post(apiUrl, body, context.httpOpts);
226
- return response.data.result;
227
- }
228
- export async function ledgerGetTransactionCount(inputs, useProxy, context) {
229
- const apiUrl = useProxy
230
- ? context.config.besuProvider
231
- : `${context.config.api.ledger.url}/blockchains/besu`;
232
- const body = jsonrpcBody("eth_getTransactionCount", [inputs[0], "latest"]);
233
- const response = await httpCall.post(apiUrl, body, context.httpOpts);
234
- return response.data.result;
235
- }
236
- export async function ledgerGetTransactionReceipt(inputs, useProxy, context) {
237
- const apiUrl = useProxy
238
- ? context.config.besuProvider
239
- : `${context.config.api.ledger.url}/blockchains/besu`;
240
- const body = jsonrpcBody("eth_getTransactionReceipt", [inputs[0]]);
241
- const response = await httpCall.post(apiUrl, body, context.httpOpts);
242
- const receipt = response.data.result;
243
- if (receipt && Number(receipt.status) !== 1) {
244
- const message = `Transaction failed: Status ${receipt.status}. Revert reason: ${parseRevertReason(receipt, context)}`;
245
- red(message);
246
- throw new Error(message);
126
+ const resolvedToken = opts["token"] ?? config.token;
127
+ if (!resolvedToken) {
128
+ throw new Error("No access token found. " +
129
+ "Use --auto-token to mint one via the VP flow, " +
130
+ "or provide --token <jwt> / EBSI_ACCESS_TOKEN / `ebsi config set token <jwt>`.");
247
131
  }
248
- return receipt;
132
+ return resolvedToken;
249
133
  }
250
- export async function ledgerSendCustomContract(inputs, useProxy, context) {
251
- const [address, abi, method, ...params] = inputs;
252
- const provider = new ethers.JsonRpcProvider(useProxy
253
- ? context.config.besuProvider
254
- : `${context.config.api.ledger.url}/blockchains/besu`);
255
- const contract = new ethers.Contract(address, abi, provider);
256
- const data = contract.interface.encodeFunctionData(method, params);
257
- const uTx = {
258
- chainId: `0x${Number(await ledgerGetChainId([], useProxy, context)).toString(16)}`,
259
- data,
260
- from: context.client.ethWallet.address,
261
- gasLimit: `0x${context.rtVars["gasLimit"].toString(16)}`,
262
- gasPrice: `0x${context.rtVars["gasPrice"].toString(16)}`,
263
- nonce: await ledgerGetTransactionCount([context.client.ethWallet.address], useProxy, context),
264
- to: address,
265
- value: "0x0",
266
- };
267
- context.transactionInfo = {
268
- build: {
269
- info: {
270
- data: params,
271
- title: `call ${method} on ${address}`,
134
+ export const ledgerCommands = [
135
+ {
136
+ args: [
137
+ {
138
+ description: "JSON-RPC method to invoke (e.g. eth_getBlockByNumber, eth_sendRawTransaction)",
139
+ example: "eth_getBlockByNumber",
140
+ name: "method",
141
+ required: true,
142
+ },
143
+ {
144
+ description: "JSON array of parameters encoded as a string (e.g. '[\"latest\", false]'). Omit or pass '[]' for methods with no params.",
145
+ example: '["latest", false]',
146
+ name: "params",
147
+ required: false,
272
148
  },
273
- param: {},
274
- paramOrder: [],
149
+ ],
150
+ group: "Ledger",
151
+ async handler(args, opts, config) {
152
+ const method = requiredArg(args, "method");
153
+ const rawParams = args["params"];
154
+ let params = [];
155
+ if (rawParams !== undefined && rawParams !== "") {
156
+ try {
157
+ const parsed = JSON.parse(rawParams);
158
+ if (!Array.isArray(parsed)) {
159
+ throw new TypeError("params must be a JSON array");
160
+ }
161
+ params = parsed;
162
+ }
163
+ catch (error) {
164
+ const message = error instanceof Error ? error.message : "parse error";
165
+ throw new Error(`Invalid params JSON: ${message}`, { cause: error });
166
+ }
167
+ }
168
+ const id = Number(opts["id"] ?? 1);
169
+ const client = getClient(config);
170
+ const result = await client.POST("/ledger", {
171
+ body: { id, jsonrpc: "2.0", method, params },
172
+ });
173
+ return unwrap(result);
275
174
  },
276
- contract: address,
277
- method,
278
- };
279
- console.log(`==> compute signTransaction ${JSON.stringify(uTx)}`);
280
- const sgnTx = (await compute("signTransaction", [uTx], context));
281
- const cmd = useProxy ? "proxyledger" : "ledger";
282
- console.log(`==> ${cmd} sendTransaction ${sgnTx}`);
283
- const receipt = await ledgerSendTransaction([sgnTx], useProxy, context);
284
- return receipt;
285
- }
286
- export async function ledgerSendEth(amount, to, useProxy, context) {
287
- const value = `0x${(BigInt(Number(amount) * 1e6) * BigInt(Number(1e12))).toString(16)}`;
288
- const uTx = {
289
- chainId: `0x${Number(await ledgerGetChainId([], useProxy, context)).toString(16)}`,
290
- data: "0x",
291
- from: context.client.ethWallet.address,
292
- gasLimit: `0x${context.rtVars["gasLimit"].toString(16)}`,
293
- gasPrice: "0x01",
294
- nonce: await ledgerGetTransactionCount([context.client.ethWallet.address], useProxy, context),
295
- to,
296
- value,
297
- };
298
- context.transactionInfo = {
299
- build: {
300
- info: {
301
- data: { amount, to },
302
- title: `send ETH: ${amount} to ${to}`,
175
+ id: "ledger.call",
176
+ options: [
177
+ {
178
+ defaultValue: "1",
179
+ description: "JSON-RPC request id (default: 1)",
180
+ flags: "--id <n>",
181
+ },
182
+ ],
183
+ segments: ["ledger", "call"],
184
+ summary: "Send a JSON-RPC request to the Besu node via POST /ledger. " +
185
+ "Read methods (eth_getBlock*, eth_getTransaction*, ...) are forwarded anonymously. " +
186
+ "Write methods (eth_sendRawTransaction) require a Bearer token via --token, " +
187
+ "EBSI_ACCESS_TOKEN env var, or `ebsi config set token <jwt>`. " +
188
+ "The caller is responsible for building and signing the raw transaction.",
189
+ },
190
+ {
191
+ args: [
192
+ {
193
+ description: "Block number (hex, e.g. 0x1e240) or tag (latest, earliest, pending)",
194
+ example: "latest",
195
+ name: "blockNumberOrTag",
196
+ required: true,
303
197
  },
304
- param: {},
305
- paramOrder: [],
198
+ ],
199
+ group: "Ledger",
200
+ async handler(args, _opts, config) {
201
+ const tag = requiredArg(args, "blockNumberOrTag", "latest");
202
+ const client = getClient(config);
203
+ const result = await client.POST("/ledger", {
204
+ body: {
205
+ id: 1,
206
+ jsonrpc: "2.0",
207
+ method: "eth_getBlockByNumber",
208
+ params: [tag, false],
209
+ },
210
+ });
211
+ return unwrap(result);
306
212
  },
307
- contract: to,
308
- method: "sendEth",
309
- };
310
- console.log(`==> compute signTransaction ${JSON.stringify(uTx)}`);
311
- const sgnTx = (await compute("signTransaction", [uTx], context));
312
- const cmd = useProxy ? "proxyledger" : "ledger";
313
- console.log(`==> ${cmd} sendTransaction ${sgnTx}`);
314
- const receipt = await ledgerSendTransaction([sgnTx], useProxy, context);
315
- return receipt;
316
- }
317
- export async function ledgerSendTransaction(inputs, useProxy, context) {
318
- const apiUrl = useProxy
319
- ? context.config.besuProvider
320
- : `${context.config.api.ledger.url}/blockchains/besu`;
321
- const [sgnTx] = inputs;
322
- Joi.assert(sgnTx, Joi.string());
323
- const body = jsonrpcBody("eth_sendRawTransaction", [sgnTx]);
324
- const response = await httpCall.post(apiUrl, body, context.httpOpts);
325
- if (!response.data.result) {
326
- if (response.data.error)
327
- throw new Error(JSON.stringify(response.data.error));
328
- throw new Error(JSON.stringify(response.data));
329
- }
330
- context.transactionInfo.txId = response.data.result;
331
- context.transactionInfo.receipt = await waitToBeMined(response.data.result, useProxy, context);
332
- return context.transactionInfo.receipt;
333
- }
334
- export function parseRevertReason(receipt, context) {
335
- if (!receipt.revertReason) {
336
- // no revert reason
337
- return "";
338
- }
339
- if (receipt.revertReason.length >= 138) {
340
- // revert reason with a message
341
- return Buffer.from(receipt.revertReason.slice(138), "hex")
342
- .toString()
343
- .replaceAll(/[^a-z0-9:\-' ]/gi, "");
344
- }
345
- // get the contract linked to the "to" value in the receipt
346
- const contractName = Object.keys(context.config.contractAddresses).find((a) => context.config.contractAddresses[a].toLowerCase() ===
347
- receipt.to.toLowerCase());
348
- if (!contractName)
349
- return receipt.revertReason;
350
- const { contract } = context.config.api[contractName];
351
- // get the error name associated to the revert reason
352
- // In ethers v6, errors are accessed through fragments
353
- const errorSelector = receipt.revertReason.slice(0, 10);
354
- let errorName;
355
- // Try to find error by iterating through interface error fragments
356
- try {
357
- const interfaceErrors = contract?.interface.fragments.filter((f) => f.type === "error");
358
- for (const fragment of interfaceErrors) {
213
+ id: "ledger.block",
214
+ options: [],
215
+ segments: ["ledger", "block"],
216
+ summary: "Get a block by number or tag (eth_getBlockByNumber). Shorthand for `ledger call eth_getBlockByNumber`.",
217
+ },
218
+ {
219
+ args: [
220
+ {
221
+ description: "Transaction hash (0x-prefixed hex)",
222
+ example: "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b",
223
+ name: "hash",
224
+ required: true,
225
+ },
226
+ ],
227
+ group: "Ledger",
228
+ async handler(args, _opts, config) {
229
+ const hash = requiredArg(args, "hash");
230
+ const client = getClient(config);
231
+ const result = await client.POST("/ledger", {
232
+ body: {
233
+ id: 1,
234
+ jsonrpc: "2.0",
235
+ method: "eth_getTransactionByHash",
236
+ params: [hash],
237
+ },
238
+ });
239
+ return unwrap(result);
240
+ },
241
+ id: "ledger.tx",
242
+ options: [],
243
+ segments: ["ledger", "tx"],
244
+ summary: "Get a transaction by hash (eth_getTransactionByHash). Shorthand for `ledger call eth_getTransactionByHash`.",
245
+ },
246
+ {
247
+ args: [
248
+ {
249
+ description: "Registry name: " + REGISTRY_NAMES.join(", "),
250
+ example: "did-registry",
251
+ name: "registry",
252
+ required: true,
253
+ },
254
+ {
255
+ description: "Smart-contract function to call (e.g. insertDidDocument, addIssuer)",
256
+ example: "insertDidDocument",
257
+ name: "function",
258
+ required: true,
259
+ },
260
+ {
261
+ description: 'Function arguments as a JSON array string (e.g. \'["did:ebsi:z123", "..."]\'). ' +
262
+ "Types must match the contract ABI exactly.",
263
+ example: '["did:ebsi:z123", "{}", "thumbprint", "0xpubkey", true, 0, 9999999999]',
264
+ name: "args",
265
+ required: true,
266
+ },
267
+ ],
268
+ group: "Ledger",
269
+ async handler(args, opts, config) {
270
+ const registryName = requiredArg(args, "registry");
271
+ const functionName = requiredArg(args, "function");
272
+ const argsRaw = requiredArg(args, "args");
273
+ const registry = REGISTRIES[registryName];
274
+ if (!registry) {
275
+ throw new Error(`Unknown registry "${registryName}". Known registries: ${REGISTRY_NAMES.join(", ")}`);
276
+ }
277
+ const functionArgs = parseJsonArray(argsRaw, "args");
278
+ const toOpt = opts["to"];
279
+ const contractAddress = toOpt ?? process.env[registry.addressEnvKey];
280
+ if (!contractAddress) {
281
+ throw new Error(`No contract address for "${registryName}". ` +
282
+ `Provide --to <address> or set ${registry.addressEnvKey}.`);
283
+ }
284
+ const wallet = await resolveWallet(opts, config);
285
+ const token = await resolveWriteToken(opts, config, wallet, `${defaultScopeFor(registryName, functionName, registry)}:${contractAddress}`);
286
+ const gas = parseGasOverrides(opts);
287
+ const receipt = await writeToRegistry({
288
+ config,
289
+ contractAddress,
290
+ functionArgs,
291
+ functionName,
292
+ ...(gas !== undefined && { gas }),
293
+ registry,
294
+ token,
295
+ wallet,
296
+ });
297
+ return receipt;
298
+ },
299
+ id: "ledger.write",
300
+ options: [
301
+ {
302
+ description: "Contract address (0x-prefixed). If omitted, read from the corresponding env var " +
303
+ "(e.g. DID_REGISTRY_CONTRACT_ADDRESS for did-registry).",
304
+ flags: "--to <address>",
305
+ },
306
+ {
307
+ description: "Obtain a fresh access token automatically using the VP flow " +
308
+ "before submitting the transaction. Uses the registry/function's default scope " +
309
+ '(e.g. "did-registry:invite" for did-registry insertDidDocument, "track-and-trace:authorise" for ' +
310
+ 'track-and-trace authoriseDid, "track-and-trace:create" for track-and-trace createDocument/' +
311
+ "commitCreateDocument, and each registry's plain write scope for every other " +
312
+ "function), targeted at the resolved --to contract instance, unless --scope " +
313
+ "overrides it.",
314
+ flags: "--auto-token",
315
+ },
316
+ {
317
+ description: "EBSI scope to use when requesting a token with --auto-token " +
318
+ '(e.g. "did-registry:write", "issuers-registry:invite", or "track-and-trace:write:0x61c3..." to target a specific ' +
319
+ "instance). Defaults to the registry/function's default scope targeted at --to.",
320
+ flags: "--scope <scope>",
321
+ },
322
+ {
323
+ description: "Path to a VC JWT file. Required for VC-required scopes " +
324
+ "(did-registry:invite, ledger:invoke, issuers-registry:invite, track-and-trace:authorise) when using --auto-token.",
325
+ flags: "--vc <file>",
326
+ },
327
+ ...WALLET_KEY_OPTIONS,
328
+ {
329
+ description: "EBSI DID to use. Overrides config/env.",
330
+ flags: "--did <did>",
331
+ },
332
+ {
333
+ description: "Advanced: manual gas limit (decimal or 0x-prefixed hex), overriding the " +
334
+ "eth_estimateGas result. By default the gas limit is estimated dynamically from the node.",
335
+ flags: "--gas-limit <value>",
336
+ },
337
+ {
338
+ description: "Advanced: manual gas price (decimal or 0x-prefixed hex), forcing a legacy " +
339
+ "transaction. By default fees are derived dynamically from the node (EIP-1559 when supported).",
340
+ flags: "--gas-price <value>",
341
+ },
342
+ ],
343
+ segments: ["ledger", "write"],
344
+ summary: "ABI-encode a registry function call, sign an Ethereum transaction, and submit it " +
345
+ "via POST /ledger. " +
346
+ "Requires a private key and an access token (or --auto-token to mint one inline). " +
347
+ "Contract address comes from --to or the corresponding env var " +
348
+ "(e.g. DID_REGISTRY_CONTRACT_ADDRESS). " +
349
+ "Known registries: " +
350
+ REGISTRY_NAMES.join(", ") +
351
+ ".",
352
+ },
353
+ {
354
+ args: [
355
+ {
356
+ description: "Registry name: " + REGISTRY_NAMES.join(", "),
357
+ example: "timestamp",
358
+ name: "registry",
359
+ required: true,
360
+ },
361
+ {
362
+ description: "Smart-contract view/pure function to call (e.g. getTimestamp, computeTimestampCommitment)",
363
+ example: "computeTimestampCommitment",
364
+ name: "function",
365
+ required: true,
366
+ },
367
+ {
368
+ description: "Function arguments as a JSON array string (e.g. '[\"0x1234\"]'). " +
369
+ "Types must match the contract ABI exactly.",
370
+ example: '["0xCommitter", [1], ["0xhash"], [], "0xsalt"]',
371
+ name: "args",
372
+ required: true,
373
+ },
374
+ ],
375
+ group: "Ledger",
376
+ async handler(args, opts, config) {
377
+ const registryName = requiredArg(args, "registry");
378
+ const functionName = requiredArg(args, "function");
379
+ const functionArgs = parseJsonArray(requiredArg(args, "args"), "args");
380
+ const registry = REGISTRIES[registryName];
381
+ if (!registry) {
382
+ throw new Error(`Unknown registry "${registryName}". Known registries: ${REGISTRY_NAMES.join(", ")}`);
383
+ }
384
+ const toOpt = opts["to"];
385
+ const contractAddress = toOpt ?? process.env[registry.addressEnvKey];
386
+ if (!contractAddress) {
387
+ throw new Error(`No contract address for "${registryName}". ` +
388
+ `Provide --to <address> or set ${registry.addressEnvKey}.`);
389
+ }
390
+ return readFromRegistry({
391
+ config,
392
+ contractAddress,
393
+ functionArgs,
394
+ functionName,
395
+ registry,
396
+ });
397
+ },
398
+ id: "ledger.read",
399
+ options: [
400
+ {
401
+ description: "Contract address (0x-prefixed). If omitted, read from the corresponding env var " +
402
+ "(e.g. TIMESTAMP_CONTRACT_ADDRESS for timestamp).",
403
+ flags: "--to <address>",
404
+ },
405
+ ],
406
+ segments: ["ledger", "read"],
407
+ summary: "ABI-encode a registry view/pure function call and resolve it via eth_call — " +
408
+ "the read-only counterpart to `ledger write`. No wallet or token needed, since " +
409
+ "eth_call is served anonymously. Returns the function's outputs as an array, " +
410
+ "in declaration order. Contract address comes from --to or the corresponding " +
411
+ "env var. Known registries: " +
412
+ REGISTRY_NAMES.join(", ") +
413
+ ".",
414
+ },
415
+ {
416
+ args: [
417
+ {
418
+ description: "Path to a JSON file containing a JSON array of JSON-RPC requests, or '-' to read from stdin. " +
419
+ 'Each entry needs a "method" field; "params" defaults to [] and "id" may be omitted to send ' +
420
+ "a notification (no response entry for that request).",
421
+ example: "./batch.json",
422
+ name: "source",
423
+ required: true,
424
+ },
425
+ ],
426
+ group: "Ledger",
427
+ async handler(args, _opts, config) {
428
+ const source = requiredArg(args, "source");
429
+ const raw = source === "-" ? await readStdin() : readFileSync(source, "utf8");
430
+ let parsed;
359
431
  try {
360
- const selector = ethers.id(fragment.format("sighash")).slice(0, 10);
361
- if (selector === errorSelector) {
362
- errorName = fragment.name;
363
- break;
364
- }
432
+ parsed = JSON.parse(raw);
365
433
  }
366
- catch {
367
- // Continue searching
434
+ catch (error) {
435
+ const message = error instanceof Error ? error.message : "parse error";
436
+ throw new Error(`Invalid JSON in "${source}": ${message}`, {
437
+ cause: error,
438
+ });
368
439
  }
369
- }
370
- }
371
- catch {
372
- // If we can't parse errors, return the revert reason
373
- errorName = undefined;
374
- }
375
- return errorName ?? receipt.revertReason;
376
- }
377
- export async function waitToBeMined(txId, useProxy, context) {
378
- let mined = false;
379
- let receipt = null;
380
- yellow("Waiting to be mined...");
381
- const iniTime = Date.now();
382
- let diffTime = 0;
383
- while (!mined && diffTime <= context.config.timeoutMining) {
384
- await new Promise((resolve) => {
385
- setTimeout(resolve, 5000);
386
- });
387
- console.log(`==> ${useProxy ? "proxyledger" : "ledger"} getTransactionReceipt ${txId}`);
388
- receipt = await ledgerGetTransactionReceipt([txId], useProxy, context);
389
- mined = !!receipt;
390
- diffTime = Date.now() - iniTime;
391
- }
392
- if (!mined && diffTime > context.config.timeoutMining) {
393
- throw new Error(`${context.config.timeoutMining} milliseconds timeout. Transaction ${txId} is still waiting to be mined`);
394
- }
395
- return receipt;
396
- }
440
+ if (!Array.isArray(parsed) || parsed.length === 0) {
441
+ throw new Error("Batch source must contain a non-empty JSON array of JSON-RPC requests.");
442
+ }
443
+ const batch = parsed.map((entry, index) => normalizeBatchEntry(entry, index));
444
+ const client = getClient(config);
445
+ const result = await client.POST("/ledger", {
446
+ body: batch,
447
+ });
448
+ return unwrap(result);
449
+ },
450
+ id: "ledger.batch",
451
+ options: [],
452
+ segments: ["ledger", "batch"],
453
+ summary: "Send a JSON-RPC batch request to the Besu node via POST /ledger — an array of independent " +
454
+ "requests processed in order under a single Authorization header (--token, EBSI_ACCESS_TOKEN, " +
455
+ "or `ebsi config set token`). Besu accepts at most 1024 requests per batch. Useful for grouping " +
456
+ "reads, or submitting several pre-signed raw transactions (eth_sendRawTransaction) together. " +
457
+ "For signing and submitting several registry writes in one batch, use `ledger write-batch`.",
458
+ },
459
+ {
460
+ args: [
461
+ {
462
+ description: 'Path to a JSON file containing a JSON array of write entries: {"registry", "function", ' +
463
+ '"args", "to"?} — same shape as the `ledger write` positional args. "to" falls back to the ' +
464
+ "registry's env var, per entry, if omitted.",
465
+ example: "./writes.json",
466
+ name: "file",
467
+ required: true,
468
+ },
469
+ ],
470
+ group: "Ledger",
471
+ async handler(args, opts, config) {
472
+ const file = requiredArg(args, "file");
473
+ const fileEntries = parseWriteBatchFile(readFileSync(file, "utf8"));
474
+ const resolvedEntries = fileEntries.map((entry, index) => {
475
+ const position = `Entry #${(index + 1).toString()}`;
476
+ const registry = REGISTRIES[entry.registry];
477
+ if (!registry) {
478
+ throw new Error(`${position}: unknown registry "${entry.registry}". Known registries: ${REGISTRY_NAMES.join(", ")}`);
479
+ }
480
+ const to = entry.to ?? process.env[registry.addressEnvKey];
481
+ if (!to) {
482
+ throw new Error(`${position}: no contract address for "${entry.registry}". ` +
483
+ `Set "to" in the batch file or the ${registry.addressEnvKey} env var.`);
484
+ }
485
+ return {
486
+ functionArgs: entry.args,
487
+ functionName: entry.function,
488
+ registry,
489
+ registryName: entry.registry,
490
+ to,
491
+ };
492
+ });
493
+ const wallet = await resolveWallet(opts, config);
494
+ const defaultScope = deriveScopeForRegistries(resolvedEntries.map(({ functionName, registryName, to }) => ({
495
+ functionName,
496
+ registryName,
497
+ to,
498
+ })));
499
+ const token = await resolveWriteToken(opts, config, wallet, defaultScope);
500
+ const gas = parseGasOverrides(opts);
501
+ const rawTxs = await signWriteBatch({
502
+ config,
503
+ entries: resolvedEntries.map(({ functionArgs, functionName, registry, to }) => ({
504
+ functionArgs,
505
+ functionName,
506
+ registry,
507
+ to,
508
+ })),
509
+ ...(gas !== undefined && { gas }),
510
+ token,
511
+ wallet,
512
+ });
513
+ const batchBody = rawTxs.map((rawTx, index) => ({
514
+ id: index + 1,
515
+ jsonrpc: "2.0",
516
+ method: "eth_sendRawTransaction",
517
+ params: [rawTx],
518
+ }));
519
+ const client = getClient(config);
520
+ const result = await client.POST("/ledger", {
521
+ body: batchBody,
522
+ });
523
+ return unwrap(result);
524
+ },
525
+ id: "ledger.write-batch",
526
+ options: [
527
+ {
528
+ description: "Obtain a fresh access token automatically using the VP flow before submitting the batch. " +
529
+ "Uses the minimal multi-scope token covering every distinct registry in the batch, each " +
530
+ "targeted at the instance it's being written to, unless --scope overrides it.",
531
+ flags: "--auto-token",
532
+ },
533
+ {
534
+ description: 'EBSI scope to use when requesting a token with --auto-token (e.g. "did-registry:write issuers-registry:write"). ' +
535
+ "Defaults to the minimal multi-scope combination derived from the batch's registries, " +
536
+ "each instance-targeted at its resolved contract address.",
537
+ flags: "--scope <scope>",
538
+ },
539
+ {
540
+ description: "Path to a VC JWT file. Only relevant if --scope is overridden to a VC-required scope " +
541
+ "(uncommon for a multi-write batch).",
542
+ flags: "--vc <file>",
543
+ },
544
+ ...WALLET_KEY_OPTIONS,
545
+ {
546
+ description: "EBSI DID to use. Overrides config/env.",
547
+ flags: "--did <did>",
548
+ },
549
+ {
550
+ description: "Advanced: manual gas limit (decimal or 0x-prefixed hex), shared by every entry, " +
551
+ "overriding the eth_estimateGas result. By default the gas limit is estimated dynamically, " +
552
+ "per entry, from the node.",
553
+ flags: "--gas-limit <value>",
554
+ },
555
+ {
556
+ description: "Advanced: manual gas price (decimal or 0x-prefixed hex), shared by every entry, " +
557
+ "forcing legacy transactions. By default fees are derived dynamically from the node " +
558
+ "(EIP-1559 when supported).",
559
+ flags: "--gas-price <value>",
560
+ },
561
+ ],
562
+ segments: ["ledger", "write-batch"],
563
+ summary: "Sign several registry writes from one wallet, under one access token, and submit them as a " +
564
+ "single JSON-RPC batch request via POST /ledger — one round-trip instead of one per write. " +
565
+ "Each write gets a sequential nonce so they don't collide. With --auto-token, one multi-scope " +
566
+ "token is minted covering every distinct registry referenced in the batch file " +
567
+ "(combinable scopes only: did-registry:write, issuers-registry:write, timestamp:write, track-and-trace:create, track-and-trace:write, " +
568
+ "policies-registry:write, schemas-registry:write). Returns transaction hashes, not receipts — use `ledger tx <hash>` " +
569
+ "to check status afterwards. Known registries: " +
570
+ REGISTRY_NAMES.join(", ") +
571
+ ".",
572
+ },
573
+ ];
397
574
  //# sourceMappingURL=ledger.js.map