@geeqdev/geeq-sdk 0.1.0 → 0.2.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 (392) hide show
  1. package/.idea/geeq_sdk.iml +12 -0
  2. package/.idea/modules.xml +8 -0
  3. package/.idea/vcs.xml +6 -0
  4. package/.nvmrc +1 -0
  5. package/CONTRIBUTING.md +20 -0
  6. package/dist/src/address/record-type.d.ts +10 -0
  7. package/dist/src/address/record-type.js +59 -0
  8. package/dist/src/address/record-type.js.map +1 -0
  9. package/dist/src/address/wallet-address.d.ts +34 -0
  10. package/dist/src/address/wallet-address.js +90 -0
  11. package/dist/src/address/wallet-address.js.map +1 -0
  12. package/dist/src/amount.d.ts +43 -0
  13. package/dist/src/amount.js +105 -0
  14. package/dist/src/amount.js.map +1 -0
  15. package/dist/src/assert.d.ts +12 -0
  16. package/dist/src/assert.js +24 -0
  17. package/dist/src/assert.js.map +1 -0
  18. package/dist/src/capnp/adminNetTx.capnp.d.ts +75 -0
  19. package/dist/src/capnp/adminNetTx.capnp.js +66 -0
  20. package/dist/src/capnp/adminNetTx.capnp.js.map +1 -0
  21. package/dist/src/capnp/appLayBlock.capnp.d.ts +26 -0
  22. package/dist/src/capnp/appLayBlock.capnp.js +24 -0
  23. package/dist/src/capnp/appLayBlock.capnp.js.map +1 -0
  24. package/dist/src/capnp/appLayLedger.capnp.d.ts +34 -0
  25. package/dist/src/capnp/appLayLedger.capnp.js +32 -0
  26. package/dist/src/capnp/appLayLedger.capnp.js.map +1 -0
  27. package/dist/src/capnp/appLayRec.capnp.d.ts +129 -0
  28. package/dist/src/capnp/appLayRec.capnp.js +156 -0
  29. package/dist/src/capnp/appLayRec.capnp.js.map +1 -0
  30. package/dist/src/capnp/chainStateView.capnp.d.ts +50 -0
  31. package/dist/src/capnp/chainStateView.capnp.js +48 -0
  32. package/dist/src/capnp/chainStateView.capnp.js.map +1 -0
  33. package/dist/src/capnp/coinAcctRec.capnp.d.ts +178 -0
  34. package/dist/src/capnp/coinAcctRec.capnp.js +189 -0
  35. package/dist/src/capnp/coinAcctRec.capnp.js.map +1 -0
  36. package/dist/src/capnp/genesisBlock.capnp.d.ts +61 -0
  37. package/dist/src/capnp/genesisBlock.capnp.js +55 -0
  38. package/dist/src/capnp/genesisBlock.capnp.js.map +1 -0
  39. package/dist/src/capnp/hubContentStmt.capnp.d.ts +63 -0
  40. package/dist/src/capnp/hubContentStmt.capnp.js +57 -0
  41. package/dist/src/capnp/hubContentStmt.capnp.js.map +1 -0
  42. package/dist/src/capnp/misc.capnp.d.ts +20 -0
  43. package/dist/src/capnp/misc.capnp.js +18 -0
  44. package/dist/src/capnp/misc.capnp.js.map +1 -0
  45. package/dist/src/capnp/netActorRec.capnp.d.ts +65 -0
  46. package/dist/src/capnp/netActorRec.capnp.js +65 -0
  47. package/dist/src/capnp/netActorRec.capnp.js.map +1 -0
  48. package/dist/src/capnp/nodeContentStmt.capnp.d.ts +67 -0
  49. package/dist/src/capnp/nodeContentStmt.capnp.js +61 -0
  50. package/dist/src/capnp/nodeContentStmt.capnp.js.map +1 -0
  51. package/dist/src/capnp/nodePayloadList.capnp.d.ts +28 -0
  52. package/dist/src/capnp/nodePayloadList.capnp.js +26 -0
  53. package/dist/src/capnp/nodePayloadList.capnp.js.map +1 -0
  54. package/dist/src/capnp/nodeTxList.capnp.d.ts +36 -0
  55. package/dist/src/capnp/nodeTxList.capnp.js +34 -0
  56. package/dist/src/capnp/nodeTxList.capnp.js.map +1 -0
  57. package/dist/src/capnp/paramAcctRec.capnp.d.ts +338 -0
  58. package/dist/src/capnp/paramAcctRec.capnp.js +669 -0
  59. package/dist/src/capnp/paramAcctRec.capnp.js.map +1 -0
  60. package/dist/src/capnp/payload.capnp.d.ts +237 -0
  61. package/dist/src/capnp/payload.capnp.js +260 -0
  62. package/dist/src/capnp/payload.capnp.js.map +1 -0
  63. package/dist/src/capnp/proxyAcctRec.capnp.d.ts +223 -0
  64. package/dist/src/capnp/proxyAcctRec.capnp.js +255 -0
  65. package/dist/src/capnp/proxyAcctRec.capnp.js.map +1 -0
  66. package/dist/src/capnp/relayContentStmt.capnp.d.ts +82 -0
  67. package/dist/src/capnp/relayContentStmt.capnp.js +85 -0
  68. package/dist/src/capnp/relayContentStmt.capnp.js.map +1 -0
  69. package/dist/src/capnp/sysAcctRec.capnp.d.ts +48 -0
  70. package/dist/src/capnp/sysAcctRec.capnp.js +46 -0
  71. package/dist/src/capnp/sysAcctRec.capnp.js.map +1 -0
  72. package/dist/src/capnp/userAppTx.capnp.d.ts +230 -0
  73. package/dist/src/capnp/userAppTx.capnp.js +270 -0
  74. package/dist/src/capnp/userAppTx.capnp.js.map +1 -0
  75. package/dist/src/capnp/userValTx.capnp.d.ts +1575 -0
  76. package/dist/src/capnp/userValTx.capnp.js +2004 -0
  77. package/dist/src/capnp/userValTx.capnp.js.map +1 -0
  78. package/dist/src/capnp/valLayBlock.capnp.d.ts +88 -0
  79. package/dist/src/capnp/valLayBlock.capnp.js +86 -0
  80. package/dist/src/capnp/valLayBlock.capnp.js.map +1 -0
  81. package/dist/src/capnp/valLayLedger.capnp.d.ts +85 -0
  82. package/dist/src/capnp/valLayLedger.capnp.js +75 -0
  83. package/dist/src/capnp/valLayLedger.capnp.js.map +1 -0
  84. package/dist/src/chain/geeq-chain.d.ts +474 -0
  85. package/dist/src/chain/geeq-chain.js +721 -0
  86. package/dist/src/chain/geeq-chain.js.map +1 -0
  87. package/dist/src/chain/geeq-node.d.ts +57 -0
  88. package/dist/src/chain/geeq-node.js +62 -0
  89. package/dist/src/chain/geeq-node.js.map +1 -0
  90. package/dist/src/chain/nonce-guard.d.ts +42 -0
  91. package/dist/src/chain/nonce-guard.js +68 -0
  92. package/dist/src/chain/nonce-guard.js.map +1 -0
  93. package/dist/src/chain/select.d.ts +40 -0
  94. package/dist/src/chain/select.js +114 -0
  95. package/dist/src/chain/select.js.map +1 -0
  96. package/dist/src/crypto/account-id.d.ts +35 -0
  97. package/dist/src/crypto/account-id.js +58 -0
  98. package/dist/src/crypto/account-id.js.map +1 -0
  99. package/dist/src/crypto/keypair.d.ts +24 -0
  100. package/dist/src/crypto/keypair.js +158 -0
  101. package/dist/src/crypto/keypair.js.map +1 -0
  102. package/dist/src/crypto/mnemonic.d.ts +34 -0
  103. package/dist/src/crypto/mnemonic.js +57 -0
  104. package/dist/src/crypto/mnemonic.js.map +1 -0
  105. package/dist/src/encoding/base64.d.ts +8 -0
  106. package/dist/src/encoding/base64.js +53 -0
  107. package/dist/src/encoding/base64.js.map +1 -0
  108. package/dist/src/encoding/hex.d.ts +2 -0
  109. package/dist/src/encoding/hex.js +35 -0
  110. package/dist/src/encoding/hex.js.map +1 -0
  111. package/dist/src/errors.d.ts +83 -0
  112. package/dist/src/errors.js +49 -0
  113. package/dist/src/errors.js.map +1 -0
  114. package/dist/src/index.d.ts +59 -0
  115. package/dist/src/index.js +53 -0
  116. package/dist/src/index.js.map +1 -0
  117. package/dist/src/ledger/coin-accounts.d.ts +42 -0
  118. package/dist/src/ledger/coin-accounts.js +37 -0
  119. package/dist/src/ledger/coin-accounts.js.map +1 -0
  120. package/dist/src/ledger/decode.d.ts +18 -0
  121. package/dist/src/ledger/decode.js +113 -0
  122. package/dist/src/ledger/decode.js.map +1 -0
  123. package/dist/src/ledger/geeq-ledger.d.ts +99 -0
  124. package/dist/src/ledger/geeq-ledger.js +125 -0
  125. package/dist/src/ledger/geeq-ledger.js.map +1 -0
  126. package/dist/src/ledger/net-actors.d.ts +65 -0
  127. package/dist/src/ledger/net-actors.js +53 -0
  128. package/dist/src/ledger/net-actors.js.map +1 -0
  129. package/dist/src/ledger/nft-records.d.ts +13 -0
  130. package/dist/src/ledger/nft-records.js +41 -0
  131. package/dist/src/ledger/nft-records.js.map +1 -0
  132. package/dist/src/ledger/params.d.ts +34 -0
  133. package/dist/src/ledger/params.js +71 -0
  134. package/dist/src/ledger/params.js.map +1 -0
  135. package/dist/src/ledger/proxy-accounts.d.ts +26 -0
  136. package/dist/src/ledger/proxy-accounts.js +27 -0
  137. package/dist/src/ledger/proxy-accounts.js.map +1 -0
  138. package/dist/src/net/discovery.d.ts +62 -0
  139. package/dist/src/net/discovery.js +136 -0
  140. package/dist/src/net/discovery.js.map +1 -0
  141. package/dist/src/net/explorer.d.ts +57 -0
  142. package/dist/src/net/explorer.js +64 -0
  143. package/dist/src/net/explorer.js.map +1 -0
  144. package/dist/src/net/read-ledger.d.ts +7 -0
  145. package/dist/src/net/read-ledger.js +39 -0
  146. package/dist/src/net/read-ledger.js.map +1 -0
  147. package/dist/src/net/routes.d.ts +49 -0
  148. package/dist/src/net/routes.js +70 -0
  149. package/dist/src/net/routes.js.map +1 -0
  150. package/dist/src/net/transport.d.ts +55 -0
  151. package/dist/src/net/transport.js +168 -0
  152. package/dist/src/net/transport.js.map +1 -0
  153. package/dist/src/net/websocket.d.ts +49 -0
  154. package/dist/src/net/websocket.js +54 -0
  155. package/dist/src/net/websocket.js.map +1 -0
  156. package/dist/src/runtime/bindings.d.ts +9 -0
  157. package/dist/src/runtime/bindings.js +27 -0
  158. package/dist/src/runtime/bindings.js.map +1 -0
  159. package/dist/src/runtime/init.d.ts +13 -0
  160. package/dist/src/runtime/init.js +40 -0
  161. package/dist/src/runtime/init.js.map +1 -0
  162. package/dist/src/runtime/wasm-loader.browser.d.ts +14 -0
  163. package/dist/src/runtime/wasm-loader.browser.js +20 -0
  164. package/dist/src/runtime/wasm-loader.browser.js.map +1 -0
  165. package/dist/src/runtime/wasm-loader.node.d.ts +7 -0
  166. package/dist/src/runtime/wasm-loader.node.js +14 -0
  167. package/dist/src/runtime/wasm-loader.node.js.map +1 -0
  168. package/dist/src/socket/geeq-socket.d.ts +232 -0
  169. package/dist/src/socket/geeq-socket.js +634 -0
  170. package/dist/src/socket/geeq-socket.js.map +1 -0
  171. package/dist/src/socket/tracked-tx.d.ts +148 -0
  172. package/dist/src/socket/tracked-tx.js +212 -0
  173. package/dist/src/socket/tracked-tx.js.map +1 -0
  174. package/dist/src/socket/tx-status.d.ts +69 -0
  175. package/dist/src/socket/tx-status.js +72 -0
  176. package/dist/src/socket/tx-status.js.map +1 -0
  177. package/dist/src/tx/attestation.d.ts +60 -0
  178. package/dist/src/tx/attestation.js +163 -0
  179. package/dist/src/tx/attestation.js.map +1 -0
  180. package/dist/src/tx/content.d.ts +27 -0
  181. package/dist/src/tx/content.js +62 -0
  182. package/dist/src/tx/content.js.map +1 -0
  183. package/dist/src/tx/encode.d.ts +60 -0
  184. package/dist/src/tx/encode.js +82 -0
  185. package/dist/src/tx/encode.js.map +1 -0
  186. package/dist/src/tx/expiry.d.ts +11 -0
  187. package/dist/src/tx/expiry.js +12 -0
  188. package/dist/src/tx/expiry.js.map +1 -0
  189. package/dist/src/tx/fee.d.ts +16 -0
  190. package/dist/src/tx/fee.js +29 -0
  191. package/dist/src/tx/fee.js.map +1 -0
  192. package/dist/src/tx/metadata.d.ts +39 -0
  193. package/dist/src/tx/metadata.js +66 -0
  194. package/dist/src/tx/metadata.js.map +1 -0
  195. package/dist/src/tx/nft.d.ts +16 -0
  196. package/dist/src/tx/nft.js +98 -0
  197. package/dist/src/tx/nft.js.map +1 -0
  198. package/dist/src/tx/proxy.d.ts +37 -0
  199. package/dist/src/tx/proxy.js +134 -0
  200. package/dist/src/tx/proxy.js.map +1 -0
  201. package/dist/src/tx/transfer.d.ts +31 -0
  202. package/dist/src/tx/transfer.js +123 -0
  203. package/dist/src/tx/transfer.js.map +1 -0
  204. package/dist/src/types.d.ts +448 -0
  205. package/dist/src/types.js +2 -0
  206. package/dist/src/types.js.map +1 -0
  207. package/dist/tests/account-id.test.d.ts +1 -0
  208. package/dist/tests/account-id.test.js +27 -0
  209. package/dist/tests/account-id.test.js.map +1 -0
  210. package/dist/tests/amount.test.d.ts +1 -0
  211. package/dist/tests/amount.test.js +113 -0
  212. package/dist/tests/amount.test.js.map +1 -0
  213. package/dist/tests/attestation.test.d.ts +1 -0
  214. package/dist/tests/attestation.test.js +182 -0
  215. package/dist/tests/attestation.test.js.map +1 -0
  216. package/dist/tests/chain.test.d.ts +1 -0
  217. package/dist/tests/chain.test.js +647 -0
  218. package/dist/tests/chain.test.js.map +1 -0
  219. package/dist/tests/content.test.d.ts +1 -0
  220. package/dist/tests/content.test.js +90 -0
  221. package/dist/tests/content.test.js.map +1 -0
  222. package/dist/tests/documented-api.test.d.ts +1 -0
  223. package/dist/tests/documented-api.test.js +229 -0
  224. package/dist/tests/documented-api.test.js.map +1 -0
  225. package/dist/tests/explorer.test.d.ts +1 -0
  226. package/dist/tests/explorer.test.js +95 -0
  227. package/dist/tests/explorer.test.js.map +1 -0
  228. package/dist/tests/fee.test.d.ts +1 -0
  229. package/dist/tests/fee.test.js +179 -0
  230. package/dist/tests/fee.test.js.map +1 -0
  231. package/dist/tests/fixtures/build-vll.d.ts +71 -0
  232. package/dist/tests/fixtures/build-vll.js +141 -0
  233. package/dist/tests/fixtures/build-vll.js.map +1 -0
  234. package/dist/tests/fixtures/fake-socket.d.ts +44 -0
  235. package/dist/tests/fixtures/fake-socket.js +93 -0
  236. package/dist/tests/fixtures/fake-socket.js.map +1 -0
  237. package/dist/tests/fixtures/fake-transport.d.ts +24 -0
  238. package/dist/tests/fixtures/fake-transport.js +30 -0
  239. package/dist/tests/fixtures/fake-transport.js.map +1 -0
  240. package/dist/tests/keypair.test.d.ts +1 -0
  241. package/dist/tests/keypair.test.js +163 -0
  242. package/dist/tests/keypair.test.js.map +1 -0
  243. package/dist/tests/ledger.test.d.ts +1 -0
  244. package/dist/tests/ledger.test.js +234 -0
  245. package/dist/tests/ledger.test.js.map +1 -0
  246. package/dist/tests/mnemonic.test.d.ts +1 -0
  247. package/dist/tests/mnemonic.test.js +97 -0
  248. package/dist/tests/mnemonic.test.js.map +1 -0
  249. package/dist/tests/nft-transfer.test.d.ts +1 -0
  250. package/dist/tests/nft-transfer.test.js +170 -0
  251. package/dist/tests/nft-transfer.test.js.map +1 -0
  252. package/dist/tests/nft.test.d.ts +1 -0
  253. package/dist/tests/nft.test.js +180 -0
  254. package/dist/tests/nft.test.js.map +1 -0
  255. package/dist/tests/offline.test.d.ts +1 -0
  256. package/dist/tests/offline.test.js +95 -0
  257. package/dist/tests/offline.test.js.map +1 -0
  258. package/dist/tests/proxy.test.d.ts +1 -0
  259. package/dist/tests/proxy.test.js +183 -0
  260. package/dist/tests/proxy.test.js.map +1 -0
  261. package/dist/tests/select.test.d.ts +1 -0
  262. package/dist/tests/select.test.js +200 -0
  263. package/dist/tests/select.test.js.map +1 -0
  264. package/dist/tests/socket.test.d.ts +1 -0
  265. package/dist/tests/socket.test.js +607 -0
  266. package/dist/tests/socket.test.js.map +1 -0
  267. package/dist/tests/transfer.test.d.ts +1 -0
  268. package/dist/tests/transfer.test.js +225 -0
  269. package/dist/tests/transfer.test.js.map +1 -0
  270. package/dist/tests/wallet-address.test.d.ts +1 -0
  271. package/dist/tests/wallet-address.test.js +101 -0
  272. package/dist/tests/wallet-address.test.js.map +1 -0
  273. package/dist/tests/wasm-loader.jest.d.ts +13 -0
  274. package/dist/tests/wasm-loader.jest.js +15 -0
  275. package/dist/tests/wasm-loader.jest.js.map +1 -0
  276. package/example/.env.example +4 -0
  277. package/example/README.md +304 -0
  278. package/example/USAGE.md +74 -0
  279. package/example/index.html +12 -0
  280. package/example/package-lock.json +1557 -0
  281. package/example/package.json +25 -0
  282. package/example/scripts/browser-check.mjs +1421 -0
  283. package/example/scripts/match-derivation.mjs +65 -0
  284. package/example/src/App.vue +138 -0
  285. package/example/src/components/AuthorityPanel.vue +277 -0
  286. package/example/src/components/ChainPanel.vue +267 -0
  287. package/example/src/components/ChainState.vue +59 -0
  288. package/example/src/components/CopyButton.vue +25 -0
  289. package/example/src/components/CreateAssetPanel.vue +313 -0
  290. package/example/src/components/DigitalAssetsPanel.vue +68 -0
  291. package/example/src/components/EvidencePanel.vue +396 -0
  292. package/example/src/components/ExplorerPanel.vue +119 -0
  293. package/example/src/components/KeypairPanel.vue +182 -0
  294. package/example/src/components/PhrasePanel.vue +105 -0
  295. package/example/src/components/SocketWarning.vue +18 -0
  296. package/example/src/components/StepGate.vue +24 -0
  297. package/example/src/components/TransferPanel.vue +416 -0
  298. package/example/src/components/TxDeadline.vue +19 -0
  299. package/example/src/components/TxFee.vue +31 -0
  300. package/example/src/components/TxStatus.vue +105 -0
  301. package/example/src/composables/useSocketConnection.ts +80 -0
  302. package/example/src/env.d.ts +12 -0
  303. package/example/src/main.ts +5 -0
  304. package/example/src/pennies.ts +7 -0
  305. package/example/src/style.css +149 -0
  306. package/example/tsconfig.json +19 -0
  307. package/example/vite.config.ts +26 -0
  308. package/jest.config.js +18 -0
  309. package/package.json +2 -6
  310. package/scripts/copy-wasm.mjs +21 -0
  311. package/scripts/smoke.mjs +382 -0
  312. package/src/address/record-type.ts +77 -0
  313. package/src/address/wallet-address.ts +105 -0
  314. package/src/amount.ts +143 -0
  315. package/src/assert.ts +30 -0
  316. package/src/capnp/README.md +15 -0
  317. package/src/capnp/adminNetTx.capnp.ts +66 -0
  318. package/src/capnp/appLayBlock.capnp.ts +26 -0
  319. package/src/capnp/appLayLedger.capnp.ts +35 -0
  320. package/src/capnp/appLayRec.capnp.ts +159 -0
  321. package/src/capnp/chainStateView.capnp.ts +49 -0
  322. package/src/capnp/coinAcctRec.capnp.ts +193 -0
  323. package/src/capnp/genesisBlock.capnp.ts +56 -0
  324. package/src/capnp/hubContentStmt.capnp.ts +59 -0
  325. package/src/capnp/misc.capnp.ts +19 -0
  326. package/src/capnp/netActorRec.capnp.ts +64 -0
  327. package/src/capnp/nodeContentStmt.capnp.ts +62 -0
  328. package/src/capnp/nodePayloadList.capnp.ts +28 -0
  329. package/src/capnp/nodeTxList.capnp.ts +37 -0
  330. package/src/capnp/paramAcctRec.capnp.ts +669 -0
  331. package/src/capnp/payload.capnp.ts +261 -0
  332. package/src/capnp/proxyAcctRec.capnp.ts +259 -0
  333. package/src/capnp/relayContentStmt.capnp.ts +85 -0
  334. package/src/capnp/sysAcctRec.capnp.ts +47 -0
  335. package/src/capnp/userAppTx.capnp.ts +269 -0
  336. package/src/capnp/userValTx.capnp.ts +1999 -0
  337. package/src/capnp/valLayBlock.capnp.ts +93 -0
  338. package/src/capnp/valLayLedger.capnp.ts +80 -0
  339. package/src/chain/geeq-chain.ts +1094 -0
  340. package/src/chain/geeq-node.ts +105 -0
  341. package/src/chain/nonce-guard.ts +73 -0
  342. package/src/chain/select.ts +149 -0
  343. package/src/crypto/account-id.ts +83 -0
  344. package/src/crypto/keypair.ts +221 -0
  345. package/src/crypto/mnemonic.ts +69 -0
  346. package/src/encoding/base64.ts +58 -0
  347. package/src/encoding/hex.ts +42 -0
  348. package/src/errors.ts +122 -0
  349. package/src/index.ts +195 -0
  350. package/src/ledger/coin-accounts.ts +73 -0
  351. package/src/ledger/decode.ts +147 -0
  352. package/src/ledger/geeq-ledger.ts +184 -0
  353. package/src/ledger/net-actors.ts +129 -0
  354. package/src/ledger/nft-records.ts +49 -0
  355. package/src/ledger/params.ts +82 -0
  356. package/src/ledger/proxy-accounts.ts +51 -0
  357. package/src/net/discovery.ts +231 -0
  358. package/src/net/explorer.ts +123 -0
  359. package/src/net/read-ledger.ts +58 -0
  360. package/src/net/routes.ts +79 -0
  361. package/src/net/transport.ts +221 -0
  362. package/src/net/websocket.ts +94 -0
  363. package/src/runtime/bindings.ts +38 -0
  364. package/src/runtime/init.ts +49 -0
  365. package/src/runtime/wasm-loader.browser.ts +22 -0
  366. package/src/runtime/wasm-loader.node.ts +16 -0
  367. package/src/socket/geeq-socket.ts +827 -0
  368. package/src/socket/tracked-tx.ts +319 -0
  369. package/src/socket/tx-status.ts +131 -0
  370. package/src/tx/attestation.ts +222 -0
  371. package/src/tx/content.ts +82 -0
  372. package/src/tx/encode.ts +107 -0
  373. package/src/tx/expiry.ts +11 -0
  374. package/src/tx/fee.ts +31 -0
  375. package/src/tx/metadata.ts +100 -0
  376. package/src/tx/nft.ts +108 -0
  377. package/src/tx/proxy.ts +156 -0
  378. package/src/tx/transfer.ts +162 -0
  379. package/src/types.ts +503 -0
  380. package/src/wasm/README.md +22 -0
  381. package/src/wasm/browser/geeq_core.d.ts +1224 -0
  382. package/src/wasm/browser/geeq_core.js +6014 -0
  383. package/src/wasm/browser/geeq_core_bg.wasm +0 -0
  384. package/src/wasm/browser/geeq_core_bg.wasm.d.ts +447 -0
  385. package/src/wasm/nodejs/geeq_core.d.ts +753 -0
  386. package/src/wasm/nodejs/geeq_core.js +6016 -0
  387. package/src/wasm/nodejs/geeq_core_bg.wasm +0 -0
  388. package/src/wasm/nodejs/geeq_core_bg.wasm.d.ts +447 -0
  389. package/src/wasm/nodejs/package.json +3 -0
  390. package/tsconfig.build.json +8 -0
  391. package/tsconfig.json +21 -0
  392. package/tsup.config.ts +60 -0
@@ -0,0 +1,148 @@
1
+ import type { GeeqTxStatusEvent } from './tx-status';
2
+ /** The node committed it. */
3
+ export interface GeeqTxConfirmed {
4
+ readonly status: 'confirmed';
5
+ readonly id: string;
6
+ /** The `valid` event that settled it. */
7
+ readonly event: GeeqTxStatusEvent;
8
+ readonly at: Date;
9
+ }
10
+ /**
11
+ * Why a transaction was rejected. Branch on this, never on {@link GeeqTxRejected.message}.
12
+ *
13
+ * - `invalid` — found wrong at commit, usually the nonce or the balance. The fee is still
14
+ * charged.
15
+ * - `incorrectly-included` — carried by a node the chain judged dishonest. Not your fault.
16
+ * - `nonsane` — the receiving node refused it and dropped it.
17
+ * - `refused` — the node answered the submission with an error status. It never entered
18
+ * a block and will produce no status event.
19
+ */
20
+ export type GeeqTxRejectionReason = 'invalid' | 'incorrectly-included' | 'nonsane' | 'refused';
21
+ export interface GeeqTxRejected {
22
+ readonly status: 'rejected';
23
+ readonly id: string;
24
+ readonly reason: GeeqTxRejectionReason;
25
+ /** The node's own words when it gave any. For display and support — never parse it. */
26
+ readonly message: string;
27
+ /** The event that settled it. Undefined for a `refused` submission the socket never saw. */
28
+ readonly event: GeeqTxStatusEvent | undefined;
29
+ /** The HTTP status of a `refused` submission, when the caller reported one. */
30
+ readonly httpStatus: number | undefined;
31
+ readonly at: Date;
32
+ }
33
+ /**
34
+ * No verdict, and none is coming to this handle.
35
+ *
36
+ * - `timeout` — nothing final arrived in time. **This is not a rejection**: statuses sent
37
+ * while the socket was reconnecting are lost, so it may well have settled. Read the
38
+ * ledger (has the account's nonce moved on?) before sending it again.
39
+ * - `closed` — the socket was disposed while it was pending.
40
+ * - `released` — the caller stopped tracking it.
41
+ */
42
+ export type GeeqTxUnknownReason = 'timeout' | 'closed' | 'released';
43
+ export interface GeeqTxUnknown {
44
+ readonly status: 'unknown';
45
+ readonly id: string;
46
+ readonly reason: GeeqTxUnknownReason;
47
+ readonly message: string;
48
+ readonly at: Date;
49
+ }
50
+ export type GeeqTxOutcome = GeeqTxConfirmed | GeeqTxRejected | GeeqTxUnknown;
51
+ /** `pending` until an outcome, then the outcome's own status. Never goes back. */
52
+ export type GeeqTxState = 'pending' | GeeqTxOutcome['status'];
53
+ /** What a submission refusal looked like, for {@link GeeqTrackedTx.refused}. */
54
+ export interface GeeqTxRefusal {
55
+ /** The HTTP status the node answered with. */
56
+ readonly status?: number;
57
+ /** The node's `details`, or the body — whatever it said. */
58
+ readonly message?: string;
59
+ }
60
+ /**
61
+ * Hand an error thrown by application code to the platform, without letting it stop the
62
+ * SDK delivering the same event to everyone else.
63
+ *
64
+ * @internal
65
+ */
66
+ export declare function reportListenerError(error: unknown): void;
67
+ /** @internal */
68
+ export interface TrackedTxInit {
69
+ readonly id: string;
70
+ readonly timeoutMs: number;
71
+ readonly nonsaneGraceMs: number;
72
+ /** Called once, when it settles — the socket drops it from its table. */
73
+ readonly detach: () => void;
74
+ }
75
+ /**
76
+ * One submitted transaction, followed to its verdict.
77
+ *
78
+ * Returned by {@link GeeqSocket.track}. It collapses the node's four verdicts, some of
79
+ * which arrive more than once and one of which is only usually final, into one of three
80
+ * outcomes an application can branch on — and it never rejects, because a rejected
81
+ * transaction is an answer, not a failure:
82
+ *
83
+ * ```ts
84
+ * const outcome = await tracked.settled()
85
+ * if (outcome.status === 'confirmed') …
86
+ * else if (outcome.status === 'rejected') show(outcome.reason, outcome.message)
87
+ * else checkLedgerBeforeRetrying() // 'unknown'
88
+ * ```
89
+ *
90
+ * In a reactive framework, keep it raw (Vue's `markRaw`) and re-read `status` and
91
+ * `events` from {@link onChange}.
92
+ */
93
+ export declare class GeeqTrackedTx {
94
+ /** The transaction's refHash, base64 — the same string status events carry. */
95
+ readonly id: string;
96
+ private readonly received;
97
+ private readonly listeners;
98
+ private readonly nonsaneGraceMs;
99
+ private readonly detach;
100
+ private readonly promise;
101
+ private readonly resolve;
102
+ private current;
103
+ private deadline;
104
+ private grace;
105
+ /** @internal */
106
+ constructor(init: TrackedTxInit);
107
+ /** `pending`, then `confirmed`, `rejected` or `unknown` — once, and for good. */
108
+ get status(): GeeqTxState;
109
+ /** The outcome, once there is one. */
110
+ get outcome(): GeeqTxOutcome | undefined;
111
+ /** Every status event received for this transaction, oldest first. */
112
+ get events(): readonly GeeqTxStatusEvent[];
113
+ /** Resolves with the outcome. Never rejects — see the class notes. */
114
+ settled(): Promise<GeeqTxOutcome>;
115
+ /**
116
+ * Call `listener` whenever an event arrives for this transaction or it settles.
117
+ *
118
+ * Returns the function that removes it. Read {@link status}, {@link events} and
119
+ * {@link outcome} inside; they are already up to date.
120
+ */
121
+ onChange(listener: (tx: GeeqTrackedTx) => void): () => void;
122
+ /**
123
+ * Report that the node refused the submission — answered it with an error status.
124
+ *
125
+ * Settles it `rejected` at once. A refused transaction never reaches a block, so no
126
+ * status event would ever arrive to settle it, and waiting would only turn a clear
127
+ * answer into a timeout. Do **not** call this when the POST failed to arrive at all
128
+ * (a network error): the node may have it, so leave it tracked.
129
+ */
130
+ refused(refusal?: GeeqTxRefusal): void;
131
+ /** Stop tracking. Settles `unknown` with reason `released` if it was still pending. */
132
+ release(): void;
133
+ /** @internal Settle as unknown because the socket is going away, or on release. */
134
+ abandon(reason: 'closed' | 'released', message: string): void;
135
+ /**
136
+ * @internal Take one status event for this transaction.
137
+ *
138
+ * The only place the protocol's rules live. First-event-wins would report false
139
+ * failures: a `nonsane` can be followed by a real verdict when a node carries its buffer
140
+ * over a restart, so it only settles if nothing final follows within the grace window.
141
+ * Everything after the outcome — a second node's copy, a duplicate — is ignored.
142
+ */
143
+ receive(event: GeeqTxStatusEvent): void;
144
+ private finish;
145
+ private notify;
146
+ toJSON(): Record<string, unknown>;
147
+ toString(): string;
148
+ }
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Hand an error thrown by application code to the platform, without letting it stop the
3
+ * SDK delivering the same event to everyone else.
4
+ *
5
+ * @internal
6
+ */
7
+ export function reportListenerError(error) {
8
+ const report = globalThis.reportError;
9
+ if (typeof report === 'function')
10
+ report(error);
11
+ else
12
+ console.error(error);
13
+ }
14
+ /**
15
+ * One submitted transaction, followed to its verdict.
16
+ *
17
+ * Returned by {@link GeeqSocket.track}. It collapses the node's four verdicts, some of
18
+ * which arrive more than once and one of which is only usually final, into one of three
19
+ * outcomes an application can branch on — and it never rejects, because a rejected
20
+ * transaction is an answer, not a failure:
21
+ *
22
+ * ```ts
23
+ * const outcome = await tracked.settled()
24
+ * if (outcome.status === 'confirmed') …
25
+ * else if (outcome.status === 'rejected') show(outcome.reason, outcome.message)
26
+ * else checkLedgerBeforeRetrying() // 'unknown'
27
+ * ```
28
+ *
29
+ * In a reactive framework, keep it raw (Vue's `markRaw`) and re-read `status` and
30
+ * `events` from {@link onChange}.
31
+ */
32
+ export class GeeqTrackedTx {
33
+ /** @internal */
34
+ constructor(init) {
35
+ this.id = init.id;
36
+ const hidden = (key, value, writable = false) => {
37
+ Object.defineProperty(this, key, { value, enumerable: false, writable });
38
+ };
39
+ let resolve;
40
+ const promise = new Promise((settle) => {
41
+ resolve = settle;
42
+ });
43
+ hidden('received', []);
44
+ hidden('listeners', new Set());
45
+ hidden('nonsaneGraceMs', init.nonsaneGraceMs);
46
+ hidden('detach', init.detach);
47
+ hidden('promise', promise);
48
+ hidden('resolve', resolve);
49
+ hidden('current', undefined, true);
50
+ hidden('grace', null, true);
51
+ hidden('deadline', init.timeoutMs > 0
52
+ ? setTimeout(() => {
53
+ this.finish({
54
+ status: 'unknown',
55
+ id: this.id,
56
+ reason: 'timeout',
57
+ message: `No final status for transaction ${this.id} within ${init.timeoutMs}ms. ` +
58
+ 'That is not a rejection: statuses sent while the socket was reconnecting ' +
59
+ 'are lost. Check the ledger — whether the account nonce has moved on — ' +
60
+ 'before sending it again.',
61
+ at: new Date(),
62
+ });
63
+ }, init.timeoutMs)
64
+ : null, true);
65
+ }
66
+ /** `pending`, then `confirmed`, `rejected` or `unknown` — once, and for good. */
67
+ get status() {
68
+ return this.current?.status ?? 'pending';
69
+ }
70
+ /** The outcome, once there is one. */
71
+ get outcome() {
72
+ return this.current;
73
+ }
74
+ /** Every status event received for this transaction, oldest first. */
75
+ get events() {
76
+ return [...this.received];
77
+ }
78
+ /** Resolves with the outcome. Never rejects — see the class notes. */
79
+ settled() {
80
+ return this.promise;
81
+ }
82
+ /**
83
+ * Call `listener` whenever an event arrives for this transaction or it settles.
84
+ *
85
+ * Returns the function that removes it. Read {@link status}, {@link events} and
86
+ * {@link outcome} inside; they are already up to date.
87
+ */
88
+ onChange(listener) {
89
+ this.listeners.add(listener);
90
+ return () => {
91
+ this.listeners.delete(listener);
92
+ };
93
+ }
94
+ /**
95
+ * Report that the node refused the submission — answered it with an error status.
96
+ *
97
+ * Settles it `rejected` at once. A refused transaction never reaches a block, so no
98
+ * status event would ever arrive to settle it, and waiting would only turn a clear
99
+ * answer into a timeout. Do **not** call this when the POST failed to arrive at all
100
+ * (a network error): the node may have it, so leave it tracked.
101
+ */
102
+ refused(refusal = {}) {
103
+ if (this.current !== undefined)
104
+ return;
105
+ const nonsane = this.received.find((event) => event.verdict === 'nonsane');
106
+ const said = refusal.message ?? nonsane?.error;
107
+ this.finish({
108
+ status: 'rejected',
109
+ id: this.id,
110
+ reason: 'refused',
111
+ message: said === undefined || said === ''
112
+ ? `The node refused transaction ${this.id}` +
113
+ (refusal.status === undefined ? '.' : ` with HTTP ${refusal.status}.`)
114
+ : said,
115
+ event: nonsane,
116
+ httpStatus: refusal.status,
117
+ at: new Date(),
118
+ });
119
+ }
120
+ /** Stop tracking. Settles `unknown` with reason `released` if it was still pending. */
121
+ release() {
122
+ this.abandon('released', `Tracking of transaction ${this.id} was released.`);
123
+ }
124
+ /** @internal Settle as unknown because the socket is going away, or on release. */
125
+ abandon(reason, message) {
126
+ this.finish({ status: 'unknown', id: this.id, reason, message, at: new Date() });
127
+ }
128
+ /**
129
+ * @internal Take one status event for this transaction.
130
+ *
131
+ * The only place the protocol's rules live. First-event-wins would report false
132
+ * failures: a `nonsane` can be followed by a real verdict when a node carries its buffer
133
+ * over a restart, so it only settles if nothing final follows within the grace window.
134
+ * Everything after the outcome — a second node's copy, a duplicate — is ignored.
135
+ */
136
+ receive(event) {
137
+ if (this.current !== undefined)
138
+ return;
139
+ this.received.push(event);
140
+ if (event.verdict === 'nonsane') {
141
+ if (this.grace === null) {
142
+ this.grace = setTimeout(() => {
143
+ this.finish({
144
+ status: 'rejected',
145
+ id: this.id,
146
+ reason: 'nonsane',
147
+ message: event.error ?? 'The node refused this transaction.',
148
+ event,
149
+ httpStatus: undefined,
150
+ at: new Date(),
151
+ });
152
+ }, this.nonsaneGraceMs);
153
+ }
154
+ this.notify();
155
+ return;
156
+ }
157
+ if (event.verdict === 'valid') {
158
+ this.finish({ status: 'confirmed', id: this.id, event, at: new Date() });
159
+ return;
160
+ }
161
+ this.finish({
162
+ status: 'rejected',
163
+ id: this.id,
164
+ reason: event.verdict === 'invalid' ? 'invalid' : 'incorrectly-included',
165
+ message: event.error ??
166
+ (event.verdict === 'invalid'
167
+ ? 'The chain found this transaction invalid when committing the block.'
168
+ : 'This transaction was carried by a node the chain judged dishonest.'),
169
+ event,
170
+ httpStatus: undefined,
171
+ at: new Date(),
172
+ });
173
+ }
174
+ finish(outcome) {
175
+ if (this.current !== undefined)
176
+ return;
177
+ this.current = Object.freeze(outcome);
178
+ if (this.deadline !== null)
179
+ clearTimeout(this.deadline);
180
+ if (this.grace !== null)
181
+ clearTimeout(this.grace);
182
+ this.deadline = null;
183
+ this.grace = null;
184
+ this.detach();
185
+ this.resolve(this.current);
186
+ this.notify();
187
+ }
188
+ notify() {
189
+ for (const listener of [...this.listeners]) {
190
+ try {
191
+ listener(this);
192
+ }
193
+ catch (error) {
194
+ reportListenerError(error);
195
+ }
196
+ }
197
+ }
198
+ toJSON() {
199
+ return {
200
+ id: this.id,
201
+ status: this.status,
202
+ events: this.received.map((event) => event.verdict),
203
+ ...(this.current?.status === 'rejected' || this.current?.status === 'unknown'
204
+ ? { reason: this.current.reason }
205
+ : {}),
206
+ };
207
+ }
208
+ toString() {
209
+ return `GeeqTrackedTx(${this.id}, ${this.status})`;
210
+ }
211
+ }
212
+ //# sourceMappingURL=tracked-tx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracked-tx.js","sourceRoot":"","sources":["../../../src/socket/tracked-tx.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * The four verdicts a node reports for a transaction, by their protocol names.
3
+ *
4
+ * - `valid` — committed in a block. Final.
5
+ * - `invalid` — placed in a block's invalid list, typically a nonce or solvency failure
6
+ * found at commit. Final, and **the sender is still charged the fee**.
7
+ * - `incorrectlyIncluded` — carried by a node the chain judged dishonest. Final; not the
8
+ * sender's fault.
9
+ * - `nonsane` — refused by the receiving node, at intake (alongside an HTTP 400) or at block
10
+ * selection (after a 200). The node drops it, so it is final in practice — but a node
11
+ * restarting can carry its buffer forward, and then a later verdict follows.
12
+ *
13
+ * From geeq_node_core `UutStatuses` (actors/interfaces.ts).
14
+ */
15
+ export type GeeqTxVerdict = 'nonsane' | 'incorrectlyIncluded' | 'invalid' | 'valid';
16
+ /**
17
+ * One `uut_status` event, normalised.
18
+ *
19
+ * Every field is what the node sent, renamed only where the wire name misleads. Nothing
20
+ * is inferred: in particular `vlbBlock` is passed through as reported and not treated as
21
+ * the inclusion block, because on current nodes it is one ahead of it for `valid` and
22
+ * `invalid` events.
23
+ */
24
+ export interface GeeqTxStatusEvent {
25
+ /**
26
+ * The transaction's refHash, standard base64 — compare it with `transactionIdOf(tx)`.
27
+ * Always the transaction hash, never the payload hash.
28
+ */
29
+ readonly id: string;
30
+ readonly verdict: GeeqTxVerdict;
31
+ /** The node's own boolean: true exactly when `verdict` is `valid`. */
32
+ readonly isValid: boolean;
33
+ /** The node's reason, verbatim. Empty when valid. Show it; never parse it. */
34
+ readonly error: string | undefined;
35
+ /** The transaction's own target block, as the node reports it. */
36
+ readonly blockNumber: number | undefined;
37
+ /** The node's `vlbBlock`, as reported. See the note above before relying on it. */
38
+ readonly vlbBlock: number | undefined;
39
+ /**
40
+ * `outgoing` on the sender's copy, `incoming` on the receiver's, when the node says —
41
+ * older nodes do not. Do not use it to tell your own transactions apart: match on
42
+ * {@link id} instead.
43
+ */
44
+ readonly direction: 'incoming' | 'outgoing' | undefined;
45
+ /** The signer's base64 public key. */
46
+ readonly signer: string | undefined;
47
+ /** When the node stamped it. Second precision. */
48
+ readonly createdAt: Date | undefined;
49
+ /** The event's payload exactly as it arrived, for logging and support. */
50
+ readonly raw: unknown;
51
+ }
52
+ /**
53
+ * Read a `uut_status` payload, or `undefined` when it is not one this SDK understands.
54
+ *
55
+ * Tolerant of the shapes nodes have actually sent: `publicKeys` as an array or the older
56
+ * single `publicKey`, the verdict as a name or as the node's enum number.
57
+ *
58
+ * @internal
59
+ */
60
+ export declare function parseTxStatus(payload: unknown): GeeqTxStatusEvent | undefined;
61
+ /**
62
+ * A transaction's id as status events name it: its `transactionHash`, in base64.
63
+ *
64
+ * Works on anything the SDK builds — an attestation or a transfer — because each already
65
+ * carries the hash its kind is identified by, and the two kinds are hashed differently.
66
+ */
67
+ export declare function transactionIdOf(tx: {
68
+ readonly transactionHash: Uint8Array;
69
+ }): string;
@@ -0,0 +1,72 @@
1
+ import { toBase64 } from '../encoding/base64';
2
+ /** The wire carries names, but the node's own enum is numbered; accept either. */
3
+ const VERDICTS = [
4
+ 'nonsane',
5
+ 'incorrectlyIncluded',
6
+ 'invalid',
7
+ 'valid',
8
+ ];
9
+ function optionalNumber(value) {
10
+ return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
11
+ }
12
+ function verdictOf(value) {
13
+ if (typeof value === 'number')
14
+ return VERDICTS[value];
15
+ if (typeof value === 'string') {
16
+ return VERDICTS.find((verdict) => verdict === value);
17
+ }
18
+ return undefined;
19
+ }
20
+ /** The node renders timestamps as `Date:<Date#toString()>`. */
21
+ function dateOf(value) {
22
+ if (typeof value !== 'string')
23
+ return undefined;
24
+ const parsed = Date.parse(value.replace(/^Date:/u, ''));
25
+ return Number.isNaN(parsed) ? undefined : new Date(parsed);
26
+ }
27
+ /**
28
+ * Read a `uut_status` payload, or `undefined` when it is not one this SDK understands.
29
+ *
30
+ * Tolerant of the shapes nodes have actually sent: `publicKeys` as an array or the older
31
+ * single `publicKey`, the verdict as a name or as the node's enum number.
32
+ *
33
+ * @internal
34
+ */
35
+ export function parseTxStatus(payload) {
36
+ if (payload === null || typeof payload !== 'object')
37
+ return undefined;
38
+ const fields = payload;
39
+ const id = fields.refHash;
40
+ const verdict = verdictOf(fields.status);
41
+ if (typeof id !== 'string' || id === '' || verdict === undefined)
42
+ return undefined;
43
+ const keys = fields.publicKeys;
44
+ const signer = Array.isArray(keys)
45
+ ? keys.find((key) => typeof key === 'string')
46
+ : typeof fields.publicKey === 'string'
47
+ ? fields.publicKey
48
+ : undefined;
49
+ const direction = fields.type === 'incoming' || fields.type === 'outgoing' ? fields.type : undefined;
50
+ return Object.freeze({
51
+ id,
52
+ verdict,
53
+ isValid: typeof fields.isValid === 'boolean' ? fields.isValid : verdict === 'valid',
54
+ error: typeof fields.error === 'string' && fields.error !== '' ? fields.error : undefined,
55
+ blockNumber: optionalNumber(fields.blockNumber),
56
+ vlbBlock: optionalNumber(fields.vlbBlock),
57
+ direction,
58
+ signer,
59
+ createdAt: dateOf(fields.createdAt),
60
+ raw: payload,
61
+ });
62
+ }
63
+ /**
64
+ * A transaction's id as status events name it: its `transactionHash`, in base64.
65
+ *
66
+ * Works on anything the SDK builds — an attestation or a transfer — because each already
67
+ * carries the hash its kind is identified by, and the two kinds are hashed differently.
68
+ */
69
+ export function transactionIdOf(tx) {
70
+ return toBase64(tx.transactionHash);
71
+ }
72
+ //# sourceMappingURL=tx-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tx-status.js","sourceRoot":"","sources":["../../../src/socket/tx-status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { Message } from 'capnp-ts';
2
+ import { AttestationSubgroup as CapnpAttestationSubgroup } from '../capnp/payload.capnp';
3
+ import { UserAppTx as CapnpUserAppTx } from '../capnp/userAppTx.capnp';
4
+ import type { AttestationTx, AttestationTxInput, GeeqKeypair } from '../types';
5
+ /**
6
+ * Build and sign an attestation subgroup: a hash, its labels, and the account vouching
7
+ * for them. An attestation and an NFT mint carry the same subgroup; it names the signer's
8
+ * own account in one and the minting proxy in the other.
9
+ *
10
+ * Also returns the signature-excluded flatten — what was signed, and what an NFT's id is
11
+ * the hash of.
12
+ *
13
+ * @internal
14
+ */
15
+ export declare function signAttestationSubgroup(input: {
16
+ readonly keypair: GeeqKeypair;
17
+ readonly attestHash: Uint8Array;
18
+ readonly metadata: readonly Uint8Array[];
19
+ readonly chainNumber: number;
20
+ readonly accountId: Uint8Array;
21
+ }): {
22
+ subgroup: CapnpAttestationSubgroup;
23
+ flattened: Uint8Array;
24
+ };
25
+ /**
26
+ * A payload as it is submitted, the hash its transaction references it by, and its
27
+ * flattened size, which the fee charges for.
28
+ *
29
+ * @internal
30
+ */
31
+ export declare function packPayload(message: Message): {
32
+ payload: string;
33
+ refHashPayload: Uint8Array;
34
+ bytes: number;
35
+ };
36
+ /**
37
+ * Sign a built application-layer transaction and work out the id the node files it under.
38
+ * Every application-layer transaction — an attestation, an NFT mint — ends this way.
39
+ *
40
+ * @internal
41
+ */
42
+ export declare function signAppTx(message: Message, tx: CapnpUserAppTx, keypair: GeeqKeypair): {
43
+ transaction: string;
44
+ transactionHash: Uint8Array;
45
+ bytes: number;
46
+ };
47
+ /**
48
+ * Build and sign an attestation transaction. Synchronous; requires a loaded engine.
49
+ *
50
+ * This function is offline: it opens no sockets and reads no ledger. It needs chain
51
+ * state that only a node can supply, so either pass the four values yourself or let
52
+ * {@link GeeqChain} read them and hand you a `chainState`.
53
+ *
54
+ * The transaction is signed but **not submitted**. Post
55
+ * {@link AttestationTx.transaction} and {@link AttestationTx.payload} to the node named
56
+ * by {@link AttestationTx.nodeUrl}.
57
+ */
58
+ export declare function createAttestationTxSync(input: AttestationTxInput): AttestationTx;
59
+ /** Build and sign an attestation transaction, loading the engine if needed. */
60
+ export declare function createAttestationTx(input: AttestationTxInput): Promise<AttestationTx>;