tenzro-wallet 0.1.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 (471) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +128 -0
  3. package/dist/balance/aggregator.d.ts +16 -0
  4. package/dist/balance/aggregator.d.ts.map +1 -0
  5. package/dist/balance/aggregator.js +73 -0
  6. package/dist/balance/aggregator.js.map +1 -0
  7. package/dist/balance/index.d.ts +3 -0
  8. package/dist/balance/index.d.ts.map +1 -0
  9. package/dist/balance/index.js +2 -0
  10. package/dist/balance/index.js.map +1 -0
  11. package/dist/consent/index.d.ts +3 -0
  12. package/dist/consent/index.d.ts.map +1 -0
  13. package/dist/consent/index.js +2 -0
  14. package/dist/consent/index.js.map +1 -0
  15. package/dist/consent/policy.d.ts +27 -0
  16. package/dist/consent/policy.d.ts.map +1 -0
  17. package/dist/consent/policy.js +121 -0
  18. package/dist/consent/policy.js.map +1 -0
  19. package/dist/crypto/eip1559.d.ts +53 -0
  20. package/dist/crypto/eip1559.d.ts.map +1 -0
  21. package/dist/crypto/eip1559.js +79 -0
  22. package/dist/crypto/eip1559.js.map +1 -0
  23. package/dist/crypto/keccak256.d.ts +20 -0
  24. package/dist/crypto/keccak256.d.ts.map +1 -0
  25. package/dist/crypto/keccak256.js +167 -0
  26. package/dist/crypto/keccak256.js.map +1 -0
  27. package/dist/crypto/rlp.d.ts +30 -0
  28. package/dist/crypto/rlp.d.ts.map +1 -0
  29. package/dist/crypto/rlp.js +165 -0
  30. package/dist/crypto/rlp.js.map +1 -0
  31. package/dist/crypto/sha256.d.ts +14 -0
  32. package/dist/crypto/sha256.d.ts.map +1 -0
  33. package/dist/crypto/sha256.js +33 -0
  34. package/dist/crypto/sha256.js.map +1 -0
  35. package/dist/crypto/solana.d.ts +86 -0
  36. package/dist/crypto/solana.d.ts.map +1 -0
  37. package/dist/crypto/solana.js +218 -0
  38. package/dist/crypto/solana.js.map +1 -0
  39. package/dist/custody/frost/backend.d.ts +59 -0
  40. package/dist/custody/frost/backend.d.ts.map +1 -0
  41. package/dist/custody/frost/backend.js +83 -0
  42. package/dist/custody/frost/backend.js.map +1 -0
  43. package/dist/custody/frost/coordinator.d.ts +148 -0
  44. package/dist/custody/frost/coordinator.d.ts.map +1 -0
  45. package/dist/custody/frost/coordinator.js +58 -0
  46. package/dist/custody/frost/coordinator.js.map +1 -0
  47. package/dist/custody/frost/ed25519-driver.d.ts +30 -0
  48. package/dist/custody/frost/ed25519-driver.d.ts.map +1 -0
  49. package/dist/custody/frost/ed25519-driver.js +76 -0
  50. package/dist/custody/frost/ed25519-driver.js.map +1 -0
  51. package/dist/custody/frost/http-adapter.d.ts +77 -0
  52. package/dist/custody/frost/http-adapter.d.ts.map +1 -0
  53. package/dist/custody/frost/http-adapter.js +168 -0
  54. package/dist/custody/frost/http-adapter.js.map +1 -0
  55. package/dist/custody/frost/hybrid-driver.d.ts +37 -0
  56. package/dist/custody/frost/hybrid-driver.d.ts.map +1 -0
  57. package/dist/custody/frost/hybrid-driver.js +60 -0
  58. package/dist/custody/frost/hybrid-driver.js.map +1 -0
  59. package/dist/custody/frost/index.d.ts +12 -0
  60. package/dist/custody/frost/index.d.ts.map +1 -0
  61. package/dist/custody/frost/index.js +6 -0
  62. package/dist/custody/frost/index.js.map +1 -0
  63. package/dist/custody/frost/secp256k1-driver.d.ts +26 -0
  64. package/dist/custody/frost/secp256k1-driver.d.ts.map +1 -0
  65. package/dist/custody/frost/secp256k1-driver.js +78 -0
  66. package/dist/custody/frost/secp256k1-driver.js.map +1 -0
  67. package/dist/custody/index.d.ts +9 -0
  68. package/dist/custody/index.d.ts.map +1 -0
  69. package/dist/custody/index.js +11 -0
  70. package/dist/custody/index.js.map +1 -0
  71. package/dist/custody/internal-mpc.d.ts +14 -0
  72. package/dist/custody/internal-mpc.d.ts.map +1 -0
  73. package/dist/custody/internal-mpc.js +40 -0
  74. package/dist/custody/internal-mpc.js.map +1 -0
  75. package/dist/custody/mldsa/coordinator.d.ts +63 -0
  76. package/dist/custody/mldsa/coordinator.d.ts.map +1 -0
  77. package/dist/custody/mldsa/coordinator.js +44 -0
  78. package/dist/custody/mldsa/coordinator.js.map +1 -0
  79. package/dist/custody/mldsa/driver.d.ts +23 -0
  80. package/dist/custody/mldsa/driver.d.ts.map +1 -0
  81. package/dist/custody/mldsa/driver.js +43 -0
  82. package/dist/custody/mldsa/driver.js.map +1 -0
  83. package/dist/custody/mldsa/http-adapter.d.ts +59 -0
  84. package/dist/custody/mldsa/http-adapter.d.ts.map +1 -0
  85. package/dist/custody/mldsa/http-adapter.js +103 -0
  86. package/dist/custody/mldsa/http-adapter.js.map +1 -0
  87. package/dist/custody/mldsa/index.d.ts +7 -0
  88. package/dist/custody/mldsa/index.d.ts.map +1 -0
  89. package/dist/custody/mldsa/index.js +4 -0
  90. package/dist/custody/mldsa/index.js.map +1 -0
  91. package/dist/custody/pairing/http-adapter.d.ts +40 -0
  92. package/dist/custody/pairing/http-adapter.d.ts.map +1 -0
  93. package/dist/custody/pairing/http-adapter.js +113 -0
  94. package/dist/custody/pairing/http-adapter.js.map +1 -0
  95. package/dist/custody/pairing/index.d.ts +10 -0
  96. package/dist/custody/pairing/index.d.ts.map +1 -0
  97. package/dist/custody/pairing/index.js +8 -0
  98. package/dist/custody/pairing/index.js.map +1 -0
  99. package/dist/custody/pairing/port.d.ts +121 -0
  100. package/dist/custody/pairing/port.d.ts.map +1 -0
  101. package/dist/custody/pairing/port.js +40 -0
  102. package/dist/custody/pairing/port.js.map +1 -0
  103. package/dist/custody/passkey-share/http-adapter.d.ts +77 -0
  104. package/dist/custody/passkey-share/http-adapter.d.ts.map +1 -0
  105. package/dist/custody/passkey-share/http-adapter.js +125 -0
  106. package/dist/custody/passkey-share/http-adapter.js.map +1 -0
  107. package/dist/custody/passkey-share/index.d.ts +7 -0
  108. package/dist/custody/passkey-share/index.d.ts.map +1 -0
  109. package/dist/custody/passkey-share/index.js +4 -0
  110. package/dist/custody/passkey-share/index.js.map +1 -0
  111. package/dist/custody/passkey-share/unwrapper.d.ts +174 -0
  112. package/dist/custody/passkey-share/unwrapper.d.ts.map +1 -0
  113. package/dist/custody/passkey-share/unwrapper.js +132 -0
  114. package/dist/custody/passkey-share/unwrapper.js.map +1 -0
  115. package/dist/custody/passkey-share/webauthn-adapter.d.ts +112 -0
  116. package/dist/custody/passkey-share/webauthn-adapter.d.ts.map +1 -0
  117. package/dist/custody/passkey-share/webauthn-adapter.js +150 -0
  118. package/dist/custody/passkey-share/webauthn-adapter.js.map +1 -0
  119. package/dist/custody/surface-key-id.d.ts +15 -0
  120. package/dist/custody/surface-key-id.d.ts.map +1 -0
  121. package/dist/custody/surface-key-id.js +25 -0
  122. package/dist/custody/surface-key-id.js.map +1 -0
  123. package/dist/dapp/eip6963.d.ts +64 -0
  124. package/dist/dapp/eip6963.d.ts.map +1 -0
  125. package/dist/dapp/eip6963.js +55 -0
  126. package/dist/dapp/eip6963.js.map +1 -0
  127. package/dist/dapp/index.d.ts +21 -0
  128. package/dist/dapp/index.d.ts.map +1 -0
  129. package/dist/dapp/index.js +24 -0
  130. package/dist/dapp/index.js.map +1 -0
  131. package/dist/identity/delegate-set.d.ts +57 -0
  132. package/dist/identity/delegate-set.d.ts.map +1 -0
  133. package/dist/identity/delegate-set.js +85 -0
  134. package/dist/identity/delegate-set.js.map +1 -0
  135. package/dist/identity/did.d.ts +17 -0
  136. package/dist/identity/did.d.ts.map +1 -0
  137. package/dist/identity/did.js +60 -0
  138. package/dist/identity/did.js.map +1 -0
  139. package/dist/identity/index.d.ts +14 -0
  140. package/dist/identity/index.d.ts.map +1 -0
  141. package/dist/identity/index.js +8 -0
  142. package/dist/identity/index.js.map +1 -0
  143. package/dist/identity/provision.d.ts +13 -0
  144. package/dist/identity/provision.d.ts.map +1 -0
  145. package/dist/identity/provision.js +151 -0
  146. package/dist/identity/provision.js.map +1 -0
  147. package/dist/identity/provisioning-http-adapter.d.ts +81 -0
  148. package/dist/identity/provisioning-http-adapter.d.ts.map +1 -0
  149. package/dist/identity/provisioning-http-adapter.js +114 -0
  150. package/dist/identity/provisioning-http-adapter.js.map +1 -0
  151. package/dist/identity/recovery-http-adapter.d.ts +83 -0
  152. package/dist/identity/recovery-http-adapter.d.ts.map +1 -0
  153. package/dist/identity/recovery-http-adapter.js +139 -0
  154. package/dist/identity/recovery-http-adapter.js.map +1 -0
  155. package/dist/identity/wallet-new.d.ts +132 -0
  156. package/dist/identity/wallet-new.d.ts.map +1 -0
  157. package/dist/identity/wallet-new.js +94 -0
  158. package/dist/identity/wallet-new.js.map +1 -0
  159. package/dist/identity/wallet-recover.d.ts +116 -0
  160. package/dist/identity/wallet-recover.d.ts.map +1 -0
  161. package/dist/identity/wallet-recover.js +95 -0
  162. package/dist/identity/wallet-recover.js.map +1 -0
  163. package/dist/index.d.ts +12 -0
  164. package/dist/index.d.ts.map +1 -0
  165. package/dist/index.js +11 -0
  166. package/dist/index.js.map +1 -0
  167. package/dist/kernel.d.ts +119 -0
  168. package/dist/kernel.d.ts.map +1 -0
  169. package/dist/kernel.js +144 -0
  170. package/dist/kernel.js.map +1 -0
  171. package/dist/ports/adapters/tenzro-identity-adapter.d.ts +44 -0
  172. package/dist/ports/adapters/tenzro-identity-adapter.d.ts.map +1 -0
  173. package/dist/ports/adapters/tenzro-identity-adapter.js +60 -0
  174. package/dist/ports/adapters/tenzro-identity-adapter.js.map +1 -0
  175. package/dist/ports/adapters/tenzro-sdk-adapter.d.ts +86 -0
  176. package/dist/ports/adapters/tenzro-sdk-adapter.d.ts.map +1 -0
  177. package/dist/ports/adapters/tenzro-sdk-adapter.js +100 -0
  178. package/dist/ports/adapters/tenzro-sdk-adapter.js.map +1 -0
  179. package/dist/ports/agent/acp.d.ts +66 -0
  180. package/dist/ports/agent/acp.d.ts.map +1 -0
  181. package/dist/ports/agent/acp.js +27 -0
  182. package/dist/ports/agent/acp.js.map +1 -0
  183. package/dist/ports/agent/adapters/acp-adapter.d.ts +67 -0
  184. package/dist/ports/agent/adapters/acp-adapter.d.ts.map +1 -0
  185. package/dist/ports/agent/adapters/acp-adapter.js +70 -0
  186. package/dist/ports/agent/adapters/acp-adapter.js.map +1 -0
  187. package/dist/ports/agent/adapters/agent-bond-adapter.d.ts +31 -0
  188. package/dist/ports/agent/adapters/agent-bond-adapter.d.ts.map +1 -0
  189. package/dist/ports/agent/adapters/agent-bond-adapter.js +82 -0
  190. package/dist/ports/agent/adapters/agent-bond-adapter.js.map +1 -0
  191. package/dist/ports/agent/adapters/agent-payment-adapter.d.ts +66 -0
  192. package/dist/ports/agent/adapters/agent-payment-adapter.d.ts.map +1 -0
  193. package/dist/ports/agent/adapters/agent-payment-adapter.js +75 -0
  194. package/dist/ports/agent/adapters/agent-payment-adapter.js.map +1 -0
  195. package/dist/ports/agent/adapters/ap2-adapter.d.ts +28 -0
  196. package/dist/ports/agent/adapters/ap2-adapter.d.ts.map +1 -0
  197. package/dist/ports/agent/adapters/ap2-adapter.js +97 -0
  198. package/dist/ports/agent/adapters/ap2-adapter.js.map +1 -0
  199. package/dist/ports/agent/adapters/auth-approval-adapter.d.ts +26 -0
  200. package/dist/ports/agent/adapters/auth-approval-adapter.d.ts.map +1 -0
  201. package/dist/ports/agent/adapters/auth-approval-adapter.js +37 -0
  202. package/dist/ports/agent/adapters/auth-approval-adapter.js.map +1 -0
  203. package/dist/ports/agent/adapters/erc7802-adapter.d.ts +30 -0
  204. package/dist/ports/agent/adapters/erc7802-adapter.d.ts.map +1 -0
  205. package/dist/ports/agent/adapters/erc7802-adapter.js +60 -0
  206. package/dist/ports/agent/adapters/erc7802-adapter.js.map +1 -0
  207. package/dist/ports/agent/adapters/erc8004-adapter.d.ts +54 -0
  208. package/dist/ports/agent/adapters/erc8004-adapter.d.ts.map +1 -0
  209. package/dist/ports/agent/adapters/erc8004-adapter.js +53 -0
  210. package/dist/ports/agent/adapters/erc8004-adapter.js.map +1 -0
  211. package/dist/ports/agent/adapters/escrow-adapter.d.ts +33 -0
  212. package/dist/ports/agent/adapters/escrow-adapter.d.ts.map +1 -0
  213. package/dist/ports/agent/adapters/escrow-adapter.js +109 -0
  214. package/dist/ports/agent/adapters/escrow-adapter.js.map +1 -0
  215. package/dist/ports/agent/adapters/fee-estimator-adapter.d.ts +31 -0
  216. package/dist/ports/agent/adapters/fee-estimator-adapter.d.ts.map +1 -0
  217. package/dist/ports/agent/adapters/fee-estimator-adapter.js +103 -0
  218. package/dist/ports/agent/adapters/fee-estimator-adapter.js.map +1 -0
  219. package/dist/ports/agent/adapters/htlc-escrow-adapter.d.ts +68 -0
  220. package/dist/ports/agent/adapters/htlc-escrow-adapter.d.ts.map +1 -0
  221. package/dist/ports/agent/adapters/htlc-escrow-adapter.js +131 -0
  222. package/dist/ports/agent/adapters/htlc-escrow-adapter.js.map +1 -0
  223. package/dist/ports/agent/adapters/insurance-adapter.d.ts +32 -0
  224. package/dist/ports/agent/adapters/insurance-adapter.d.ts.map +1 -0
  225. package/dist/ports/agent/adapters/insurance-adapter.js +103 -0
  226. package/dist/ports/agent/adapters/insurance-adapter.js.map +1 -0
  227. package/dist/ports/agent/adapters/lifecycle-adapter.d.ts +26 -0
  228. package/dist/ports/agent/adapters/lifecycle-adapter.d.ts.map +1 -0
  229. package/dist/ports/agent/adapters/lifecycle-adapter.js +136 -0
  230. package/dist/ports/agent/adapters/lifecycle-adapter.js.map +1 -0
  231. package/dist/ports/agent/adapters/nanopayment-adapter.d.ts +62 -0
  232. package/dist/ports/agent/adapters/nanopayment-adapter.d.ts.map +1 -0
  233. package/dist/ports/agent/adapters/nanopayment-adapter.js +76 -0
  234. package/dist/ports/agent/adapters/nanopayment-adapter.js.map +1 -0
  235. package/dist/ports/agent/adapters/payment-rails-adapter.d.ts +67 -0
  236. package/dist/ports/agent/adapters/payment-rails-adapter.d.ts.map +1 -0
  237. package/dist/ports/agent/adapters/payment-rails-adapter.js +108 -0
  238. package/dist/ports/agent/adapters/payment-rails-adapter.js.map +1 -0
  239. package/dist/ports/agent/adapters/principal-chain-adapter.d.ts +23 -0
  240. package/dist/ports/agent/adapters/principal-chain-adapter.d.ts.map +1 -0
  241. package/dist/ports/agent/adapters/principal-chain-adapter.js +156 -0
  242. package/dist/ports/agent/adapters/principal-chain-adapter.js.map +1 -0
  243. package/dist/ports/agent/adapters/session-key-adapter.d.ts +45 -0
  244. package/dist/ports/agent/adapters/session-key-adapter.d.ts.map +1 -0
  245. package/dist/ports/agent/adapters/session-key-adapter.js +80 -0
  246. package/dist/ports/agent/adapters/session-key-adapter.js.map +1 -0
  247. package/dist/ports/agent/adapters/tee-attestation-adapter.d.ts +32 -0
  248. package/dist/ports/agent/adapters/tee-attestation-adapter.d.ts.map +1 -0
  249. package/dist/ports/agent/adapters/tee-attestation-adapter.js +38 -0
  250. package/dist/ports/agent/adapters/tee-attestation-adapter.js.map +1 -0
  251. package/dist/ports/agent/agent-bond.d.ts +80 -0
  252. package/dist/ports/agent/agent-bond.d.ts.map +1 -0
  253. package/dist/ports/agent/agent-bond.js +23 -0
  254. package/dist/ports/agent/agent-bond.js.map +1 -0
  255. package/dist/ports/agent/agent-payment.d.ts +72 -0
  256. package/dist/ports/agent/agent-payment.d.ts.map +1 -0
  257. package/dist/ports/agent/agent-payment.js +17 -0
  258. package/dist/ports/agent/agent-payment.js.map +1 -0
  259. package/dist/ports/agent/ap2.d.ts +104 -0
  260. package/dist/ports/agent/ap2.d.ts.map +1 -0
  261. package/dist/ports/agent/ap2.js +22 -0
  262. package/dist/ports/agent/ap2.js.map +1 -0
  263. package/dist/ports/agent/auth-approval.d.ts +40 -0
  264. package/dist/ports/agent/auth-approval.d.ts.map +1 -0
  265. package/dist/ports/agent/auth-approval.js +23 -0
  266. package/dist/ports/agent/auth-approval.js.map +1 -0
  267. package/dist/ports/agent/erc7802.d.ts +94 -0
  268. package/dist/ports/agent/erc7802.d.ts.map +1 -0
  269. package/dist/ports/agent/erc7802.js +30 -0
  270. package/dist/ports/agent/erc7802.js.map +1 -0
  271. package/dist/ports/agent/erc8004.d.ts +57 -0
  272. package/dist/ports/agent/erc8004.d.ts.map +1 -0
  273. package/dist/ports/agent/erc8004.js +20 -0
  274. package/dist/ports/agent/erc8004.js.map +1 -0
  275. package/dist/ports/agent/escrow.d.ts +74 -0
  276. package/dist/ports/agent/escrow.d.ts.map +1 -0
  277. package/dist/ports/agent/escrow.js +18 -0
  278. package/dist/ports/agent/escrow.js.map +1 -0
  279. package/dist/ports/agent/fee-estimator.d.ts +71 -0
  280. package/dist/ports/agent/fee-estimator.d.ts.map +1 -0
  281. package/dist/ports/agent/fee-estimator.js +21 -0
  282. package/dist/ports/agent/fee-estimator.js.map +1 -0
  283. package/dist/ports/agent/htlc-escrow.d.ts +94 -0
  284. package/dist/ports/agent/htlc-escrow.d.ts.map +1 -0
  285. package/dist/ports/agent/htlc-escrow.js +25 -0
  286. package/dist/ports/agent/htlc-escrow.js.map +1 -0
  287. package/dist/ports/agent/index.d.ts +58 -0
  288. package/dist/ports/agent/index.d.ts.map +1 -0
  289. package/dist/ports/agent/index.js +24 -0
  290. package/dist/ports/agent/index.js.map +1 -0
  291. package/dist/ports/agent/insurance.d.ts +65 -0
  292. package/dist/ports/agent/insurance.d.ts.map +1 -0
  293. package/dist/ports/agent/insurance.js +18 -0
  294. package/dist/ports/agent/insurance.js.map +1 -0
  295. package/dist/ports/agent/lifecycle.d.ts +69 -0
  296. package/dist/ports/agent/lifecycle.d.ts.map +1 -0
  297. package/dist/ports/agent/lifecycle.js +17 -0
  298. package/dist/ports/agent/lifecycle.js.map +1 -0
  299. package/dist/ports/agent/nanopayment.d.ts +72 -0
  300. package/dist/ports/agent/nanopayment.d.ts.map +1 -0
  301. package/dist/ports/agent/nanopayment.js +16 -0
  302. package/dist/ports/agent/nanopayment.js.map +1 -0
  303. package/dist/ports/agent/payment-rails.d.ts +140 -0
  304. package/dist/ports/agent/payment-rails.d.ts.map +1 -0
  305. package/dist/ports/agent/payment-rails.js +25 -0
  306. package/dist/ports/agent/payment-rails.js.map +1 -0
  307. package/dist/ports/agent/principal-chain.d.ts +95 -0
  308. package/dist/ports/agent/principal-chain.d.ts.map +1 -0
  309. package/dist/ports/agent/principal-chain.js +16 -0
  310. package/dist/ports/agent/principal-chain.js.map +1 -0
  311. package/dist/ports/agent/session-key.d.ts +94 -0
  312. package/dist/ports/agent/session-key.d.ts.map +1 -0
  313. package/dist/ports/agent/session-key.js +31 -0
  314. package/dist/ports/agent/session-key.js.map +1 -0
  315. package/dist/ports/agent/tee-attestation.d.ts +51 -0
  316. package/dist/ports/agent/tee-attestation.d.ts.map +1 -0
  317. package/dist/ports/agent/tee-attestation.js +28 -0
  318. package/dist/ports/agent/tee-attestation.js.map +1 -0
  319. package/dist/ports/bridge/adapters/bridge-adapter-base.d.ts +47 -0
  320. package/dist/ports/bridge/adapters/bridge-adapter-base.d.ts.map +1 -0
  321. package/dist/ports/bridge/adapters/bridge-adapter-base.js +144 -0
  322. package/dist/ports/bridge/adapters/bridge-adapter-base.js.map +1 -0
  323. package/dist/ports/bridge/adapters/canton-bridge-adapter.d.ts +30 -0
  324. package/dist/ports/bridge/adapters/canton-bridge-adapter.d.ts.map +1 -0
  325. package/dist/ports/bridge/adapters/canton-bridge-adapter.js +31 -0
  326. package/dist/ports/bridge/adapters/canton-bridge-adapter.js.map +1 -0
  327. package/dist/ports/bridge/adapters/ccip-adapter.d.ts +30 -0
  328. package/dist/ports/bridge/adapters/ccip-adapter.d.ts.map +1 -0
  329. package/dist/ports/bridge/adapters/ccip-adapter.js +31 -0
  330. package/dist/ports/bridge/adapters/ccip-adapter.js.map +1 -0
  331. package/dist/ports/bridge/adapters/debridge-adapter.d.ts +27 -0
  332. package/dist/ports/bridge/adapters/debridge-adapter.d.ts.map +1 -0
  333. package/dist/ports/bridge/adapters/debridge-adapter.js +28 -0
  334. package/dist/ports/bridge/adapters/debridge-adapter.js.map +1 -0
  335. package/dist/ports/bridge/adapters/layerzero-adapter.d.ts +30 -0
  336. package/dist/ports/bridge/adapters/layerzero-adapter.d.ts.map +1 -0
  337. package/dist/ports/bridge/adapters/layerzero-adapter.js +31 -0
  338. package/dist/ports/bridge/adapters/layerzero-adapter.js.map +1 -0
  339. package/dist/ports/bridge/adapters/lifi-adapter.d.ts +48 -0
  340. package/dist/ports/bridge/adapters/lifi-adapter.d.ts.map +1 -0
  341. package/dist/ports/bridge/adapters/lifi-adapter.js +49 -0
  342. package/dist/ports/bridge/adapters/lifi-adapter.js.map +1 -0
  343. package/dist/ports/bridge/adapters/wormhole-adapter.d.ts +26 -0
  344. package/dist/ports/bridge/adapters/wormhole-adapter.d.ts.map +1 -0
  345. package/dist/ports/bridge/adapters/wormhole-adapter.js +27 -0
  346. package/dist/ports/bridge/adapters/wormhole-adapter.js.map +1 -0
  347. package/dist/ports/bridge/bridge.d.ts +123 -0
  348. package/dist/ports/bridge/bridge.d.ts.map +1 -0
  349. package/dist/ports/bridge/bridge.js +20 -0
  350. package/dist/ports/bridge/bridge.js.map +1 -0
  351. package/dist/ports/bridge/index.d.ts +13 -0
  352. package/dist/ports/bridge/index.d.ts.map +1 -0
  353. package/dist/ports/bridge/index.js +11 -0
  354. package/dist/ports/bridge/index.js.map +1 -0
  355. package/dist/ports/canton/adapters/ledger-api-adapter.d.ts +52 -0
  356. package/dist/ports/canton/adapters/ledger-api-adapter.d.ts.map +1 -0
  357. package/dist/ports/canton/adapters/ledger-api-adapter.js +232 -0
  358. package/dist/ports/canton/adapters/ledger-api-adapter.js.map +1 -0
  359. package/dist/ports/canton/canton-identity.d.ts +60 -0
  360. package/dist/ports/canton/canton-identity.d.ts.map +1 -0
  361. package/dist/ports/canton/canton-identity.js +28 -0
  362. package/dist/ports/canton/canton-identity.js.map +1 -0
  363. package/dist/ports/canton/canton-validator.d.ts +182 -0
  364. package/dist/ports/canton/canton-validator.d.ts.map +1 -0
  365. package/dist/ports/canton/canton-validator.js +39 -0
  366. package/dist/ports/canton/canton-validator.js.map +1 -0
  367. package/dist/ports/canton/fingerprint.d.ts +24 -0
  368. package/dist/ports/canton/fingerprint.d.ts.map +1 -0
  369. package/dist/ports/canton/fingerprint.js +31 -0
  370. package/dist/ports/canton/fingerprint.js.map +1 -0
  371. package/dist/ports/canton/hash.d.ts +37 -0
  372. package/dist/ports/canton/hash.d.ts.map +1 -0
  373. package/dist/ports/canton/hash.js +68 -0
  374. package/dist/ports/canton/hash.js.map +1 -0
  375. package/dist/ports/canton/http.d.ts +64 -0
  376. package/dist/ports/canton/http.d.ts.map +1 -0
  377. package/dist/ports/canton/http.js +177 -0
  378. package/dist/ports/canton/http.js.map +1 -0
  379. package/dist/ports/cross-vm.d.ts +79 -0
  380. package/dist/ports/cross-vm.d.ts.map +1 -0
  381. package/dist/ports/cross-vm.js +81 -0
  382. package/dist/ports/cross-vm.js.map +1 -0
  383. package/dist/ports/index.d.ts +18 -0
  384. package/dist/ports/index.d.ts.map +1 -0
  385. package/dist/ports/index.js +11 -0
  386. package/dist/ports/index.js.map +1 -0
  387. package/dist/ports/tenzro-identity.d.ts +29 -0
  388. package/dist/ports/tenzro-identity.d.ts.map +1 -0
  389. package/dist/ports/tenzro-identity.js +19 -0
  390. package/dist/ports/tenzro-identity.js.map +1 -0
  391. package/dist/ports/tenzro-rpc.d.ts +79 -0
  392. package/dist/ports/tenzro-rpc.d.ts.map +1 -0
  393. package/dist/ports/tenzro-rpc.js +21 -0
  394. package/dist/ports/tenzro-rpc.js.map +1 -0
  395. package/dist/router/index.d.ts +3 -0
  396. package/dist/router/index.d.ts.map +1 -0
  397. package/dist/router/index.js +2 -0
  398. package/dist/router/index.js.map +1 -0
  399. package/dist/router/route.d.ts +17 -0
  400. package/dist/router/route.d.ts.map +1 -0
  401. package/dist/router/route.js +78 -0
  402. package/dist/router/route.js.map +1 -0
  403. package/dist/settlement/nanopayment-flow.d.ts +48 -0
  404. package/dist/settlement/nanopayment-flow.d.ts.map +1 -0
  405. package/dist/settlement/nanopayment-flow.js +111 -0
  406. package/dist/settlement/nanopayment-flow.js.map +1 -0
  407. package/dist/surfaces/canton-external.d.ts +43 -0
  408. package/dist/surfaces/canton-external.d.ts.map +1 -0
  409. package/dist/surfaces/canton-external.js +252 -0
  410. package/dist/surfaces/canton-external.js.map +1 -0
  411. package/dist/surfaces/canton-internal.d.ts +34 -0
  412. package/dist/surfaces/canton-internal.d.ts.map +1 -0
  413. package/dist/surfaces/canton-internal.js +163 -0
  414. package/dist/surfaces/canton-internal.js.map +1 -0
  415. package/dist/surfaces/canton-onboarding.d.ts +64 -0
  416. package/dist/surfaces/canton-onboarding.d.ts.map +1 -0
  417. package/dist/surfaces/canton-onboarding.js +113 -0
  418. package/dist/surfaces/canton-onboarding.js.map +1 -0
  419. package/dist/surfaces/evm-on-tenzro.d.ts +29 -0
  420. package/dist/surfaces/evm-on-tenzro.d.ts.map +1 -0
  421. package/dist/surfaces/evm-on-tenzro.js +226 -0
  422. package/dist/surfaces/evm-on-tenzro.js.map +1 -0
  423. package/dist/surfaces/index.d.ts +13 -0
  424. package/dist/surfaces/index.d.ts.map +1 -0
  425. package/dist/surfaces/index.js +7 -0
  426. package/dist/surfaces/index.js.map +1 -0
  427. package/dist/surfaces/svm-on-tenzro.d.ts +24 -0
  428. package/dist/surfaces/svm-on-tenzro.d.ts.map +1 -0
  429. package/dist/surfaces/svm-on-tenzro.js +238 -0
  430. package/dist/surfaces/svm-on-tenzro.js.map +1 -0
  431. package/dist/surfaces/tenzro-native.d.ts +45 -0
  432. package/dist/surfaces/tenzro-native.d.ts.map +1 -0
  433. package/dist/surfaces/tenzro-native.js +299 -0
  434. package/dist/surfaces/tenzro-native.js.map +1 -0
  435. package/dist/surfaces/util.d.ts +18 -0
  436. package/dist/surfaces/util.d.ts.map +1 -0
  437. package/dist/surfaces/util.js +36 -0
  438. package/dist/surfaces/util.js.map +1 -0
  439. package/dist/types/asset.d.ts +43 -0
  440. package/dist/types/asset.d.ts.map +1 -0
  441. package/dist/types/asset.js +13 -0
  442. package/dist/types/asset.js.map +1 -0
  443. package/dist/types/consent.d.ts +46 -0
  444. package/dist/types/consent.d.ts.map +1 -0
  445. package/dist/types/consent.js +18 -0
  446. package/dist/types/consent.js.map +1 -0
  447. package/dist/types/identity.d.ts +115 -0
  448. package/dist/types/identity.d.ts.map +1 -0
  449. package/dist/types/identity.js +12 -0
  450. package/dist/types/identity.js.map +1 -0
  451. package/dist/types/index.d.ts +10 -0
  452. package/dist/types/index.d.ts.map +1 -0
  453. package/dist/types/index.js +3 -0
  454. package/dist/types/index.js.map +1 -0
  455. package/dist/types/intent.d.ts +132 -0
  456. package/dist/types/intent.d.ts.map +1 -0
  457. package/dist/types/intent.js +8 -0
  458. package/dist/types/intent.js.map +1 -0
  459. package/dist/types/signing-driver.d.ts +48 -0
  460. package/dist/types/signing-driver.d.ts.map +1 -0
  461. package/dist/types/signing-driver.js +9 -0
  462. package/dist/types/signing-driver.js.map +1 -0
  463. package/dist/types/surface-module.d.ts +38 -0
  464. package/dist/types/surface-module.d.ts.map +1 -0
  465. package/dist/types/surface-module.js +19 -0
  466. package/dist/types/surface-module.js.map +1 -0
  467. package/dist/types/surface.d.ts +17 -0
  468. package/dist/types/surface.d.ts.map +1 -0
  469. package/dist/types/surface.js +28 -0
  470. package/dist/types/surface.js.map +1 -0
  471. package/package.json +84 -0
@@ -0,0 +1,111 @@
1
+ /**
2
+ * NanopaymentFlow — wallet-side orchestration helpers for nanopayment
3
+ * channels. The `NanopaymentPort` exposes the SDK's primitives one-for-one;
4
+ * this module composes them into the lifecycle a real consumer (LLM
5
+ * streaming UI, per-API-call paywall, bandwidth meter) actually drives:
6
+ *
7
+ * open → many sendNanopayment → autoFlush at threshold → close on done
8
+ *
9
+ * The orchestration is all wallet-side. The node holds the channel state,
10
+ * the SDK exposes RPCs, this module sequences them.
11
+ */
12
+ const DEFAULT_OPTS = {
13
+ flushEvery: 100,
14
+ flushAtAmount: 0n, // disabled by default — count-only
15
+ };
16
+ /**
17
+ * Stateful helper that owns one open channel. Counts payments + value, flushes
18
+ * on threshold, closes on `done()`. Designed to be created once at the start
19
+ * of a streaming session and discarded at the end.
20
+ */
21
+ export class NanopaymentSession {
22
+ #port;
23
+ #channel;
24
+ #opts;
25
+ #unsettledCount = 0;
26
+ #unsettledAmount = 0n;
27
+ #totalPaid = 0n;
28
+ #closed = false;
29
+ constructor(port, channel, opts) {
30
+ this.#port = port;
31
+ this.#channel = channel;
32
+ this.#opts = opts;
33
+ }
34
+ /** Open a channel and return a session bound to it. */
35
+ static async open(port, req, opts = {}) {
36
+ const channel = await port.openChannel({
37
+ payer: req.payer,
38
+ payee: req.payee,
39
+ deposit: req.deposit,
40
+ ...(req.asset !== undefined ? { asset: req.asset } : {}),
41
+ });
42
+ return new NanopaymentSession(port, channel, opts);
43
+ }
44
+ get channelId() {
45
+ return this.#channel.channelId;
46
+ }
47
+ get totalPaid() {
48
+ return this.#totalPaid;
49
+ }
50
+ /**
51
+ * Send a single off-chain payment. Returns the receipt. Auto-flushes
52
+ * when count or amount thresholds cross.
53
+ */
54
+ async send(amount, memo) {
55
+ if (this.#closed) {
56
+ throw new Error('NanopaymentSession.send: session is closed');
57
+ }
58
+ const cap = this.#opts.sessionCap;
59
+ if (cap !== undefined && this.#totalPaid + amount > cap) {
60
+ throw new Error(`NanopaymentSession.send: amount ${amount} would exceed session cap ${cap} ` +
61
+ `(already paid ${this.#totalPaid})`);
62
+ }
63
+ const receipt = await this.#port.sendNanopayment({
64
+ channelId: this.#channel.channelId,
65
+ amount,
66
+ ...(memo !== undefined ? { memo } : {}),
67
+ });
68
+ this.#unsettledCount += 1;
69
+ this.#unsettledAmount += amount;
70
+ this.#totalPaid += amount;
71
+ if (this.#shouldAutoFlush()) {
72
+ await this.flush();
73
+ }
74
+ return receipt;
75
+ }
76
+ /** Force an on-chain batch settlement. Resets unsettled counters. */
77
+ async flush() {
78
+ if (this.#unsettledCount === 0)
79
+ return;
80
+ await this.#port.flushBatch(this.#channel.channelId);
81
+ this.#unsettledCount = 0;
82
+ this.#unsettledAmount = 0n;
83
+ }
84
+ /** Close the channel. Idempotent; subsequent sends throw. */
85
+ async close() {
86
+ if (this.#closed)
87
+ return;
88
+ this.#closed = true;
89
+ if (this.#unsettledCount > 0) {
90
+ // Best-effort flush before close; if it fails, close still proceeds —
91
+ // the node settles anything outstanding from the channel state.
92
+ try {
93
+ await this.#port.flushBatch(this.#channel.channelId);
94
+ }
95
+ catch {
96
+ // swallow — close handles final state
97
+ }
98
+ }
99
+ await this.#port.closeChannel(this.#channel.channelId);
100
+ }
101
+ #shouldAutoFlush() {
102
+ const flushEvery = this.#opts.flushEvery ?? DEFAULT_OPTS.flushEvery;
103
+ if (flushEvery > 0 && this.#unsettledCount >= flushEvery)
104
+ return true;
105
+ const flushAtAmount = this.#opts.flushAtAmount ?? DEFAULT_OPTS.flushAtAmount;
106
+ if (flushAtAmount > 0n && this.#unsettledAmount >= flushAtAmount)
107
+ return true;
108
+ return false;
109
+ }
110
+ }
111
+ //# sourceMappingURL=nanopayment-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nanopayment-flow.js","sourceRoot":"","sources":["../../src/settlement/nanopayment-flow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Canton Network MainNet surface — Tenzro hosts the validator; the user's
3
+ * canton-external party signs locally and the validator dispatches to the
4
+ * Global Synchronizer.
5
+ *
6
+ * Protocol shape (per DESIGN.md §4.5):
7
+ * - prepare → ask the validator's Interactive Submission Service for a
8
+ * `PreparedTransaction` proto + canonical hash.
9
+ * - sign → recompute the hash locally (SHA-256 with Canton hash purpose 11
10
+ * prefix, `HASHING_SCHEME_VERSION_V2`), constant-time-compare with the
11
+ * validator's hash, then sign that hash via the SigningDriver. The
12
+ * equality assertion is the wallet's only defence against a malicious
13
+ * validator — without it, signing the validator-supplied hash trusts
14
+ * the validator on what's being authorised.
15
+ * - submit → `executeSubmission` with the signed hash; the validator
16
+ * dispatches to the synchronizer.
17
+ * - watch → tail `tailCompletions` filtered to this command id.
18
+ *
19
+ * The PreparedTransaction proto's content-level decode (re-deriving the
20
+ * user-visible fields from the proto and comparing them to `intent`) is
21
+ * deferred — see DESIGN.md §11 open question #5. Hash equality alone is
22
+ * sufficient to bind signature → exact bytes; content decode is a defence
23
+ * against a validator that returns *valid* bytes for the *wrong* transaction.
24
+ * We accept that gap until the proto schema lands in the kernel.
25
+ */
26
+ import type { CantonValidatorPort } from '../ports/canton/canton-validator.js';
27
+ import type { SurfaceKey, TdipDid } from '../types/identity.js';
28
+ import type { SigningDriver } from '../types/signing-driver.js';
29
+ import type { SurfaceModule } from '../types/surface-module.js';
30
+ export interface CantonExternalDeps {
31
+ readonly keyResolver: (did: TdipDid) => SurfaceKey | undefined;
32
+ readonly signingDriver: SigningDriver;
33
+ /**
34
+ * Validator port. The kernel owns the adapter wiring (typically
35
+ * `LedgerApiAdapter`) and threads it through here. The surface module
36
+ * never constructs the port itself — keeps test injection clean.
37
+ */
38
+ readonly validatorPort: CantonValidatorPort;
39
+ /** User id to thread into completion filters (Canton needs `user_id`). */
40
+ readonly userId: string;
41
+ }
42
+ export declare function cantonExternalSurface(deps: CantonExternalDeps): SurfaceModule;
43
+ //# sourceMappingURL=canton-external.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canton-external.d.ts","sourceRoot":"","sources":["../../src/surfaces/canton-external.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAIpB,MAAM,qCAAqC,CAAC;AAG7C,OAAO,KAAK,EAAkB,UAAU,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAoBhE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,UAAU,GAAG,SAAS,CAAC;IAC/D,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC;;;;OAIG;IACH,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC;IAC5C,0EAA0E;IAC1E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,GAAG,aAAa,CAoJ7E"}
@@ -0,0 +1,252 @@
1
+ /**
2
+ * Canton Network MainNet surface — Tenzro hosts the validator; the user's
3
+ * canton-external party signs locally and the validator dispatches to the
4
+ * Global Synchronizer.
5
+ *
6
+ * Protocol shape (per DESIGN.md §4.5):
7
+ * - prepare → ask the validator's Interactive Submission Service for a
8
+ * `PreparedTransaction` proto + canonical hash.
9
+ * - sign → recompute the hash locally (SHA-256 with Canton hash purpose 11
10
+ * prefix, `HASHING_SCHEME_VERSION_V2`), constant-time-compare with the
11
+ * validator's hash, then sign that hash via the SigningDriver. The
12
+ * equality assertion is the wallet's only defence against a malicious
13
+ * validator — without it, signing the validator-supplied hash trusts
14
+ * the validator on what's being authorised.
15
+ * - submit → `executeSubmission` with the signed hash; the validator
16
+ * dispatches to the synchronizer.
17
+ * - watch → tail `tailCompletions` filtered to this command id.
18
+ *
19
+ * The PreparedTransaction proto's content-level decode (re-deriving the
20
+ * user-visible fields from the proto and comparing them to `intent`) is
21
+ * deferred — see DESIGN.md §11 open question #5. Hash equality alone is
22
+ * sufficient to bind signature → exact bytes; content decode is a defence
23
+ * against a validator that returns *valid* bytes for the *wrong* transaction.
24
+ * We accept that gap until the proto schema lands in the kernel.
25
+ */
26
+ import { bytesEqualConstantTime, preparedTransactionHash } from "../ports/canton/hash.js";
27
+ import { makeHandle } from "./util.js";
28
+ export function cantonExternalSurface(deps) {
29
+ const port = deps.validatorPort;
30
+ return {
31
+ name: 'canton-external',
32
+ memoSpec() {
33
+ // Canton's transfer description is a free-form text field, optional
34
+ // (the network credits without it), capped at 256 chars to keep the
35
+ // CC `Numeric 10` payload + description under the standard transfer-
36
+ // command size budget. Per DESIGN.md §11.9, this is the canonical
37
+ // example surfaces follow.
38
+ return {
39
+ kind: 'text',
40
+ required: false,
41
+ maxLength: 256,
42
+ label: 'Transfer description',
43
+ };
44
+ },
45
+ async prepare(intent) {
46
+ if (intent.kind !== 'send')
47
+ throw new Error(`unsupported: ${intent.kind}`);
48
+ if (intent.to.kind !== 'canton') {
49
+ throw new Error('canton-external requires a canton recipient');
50
+ }
51
+ const fromKey = deps.keyResolver(intent.from);
52
+ if (!fromKey || fromKey.surface !== 'canton-external') {
53
+ throw new Error(`no canton-external key for ${intent.from}`);
54
+ }
55
+ const trackingId = `tenzro-wallet-${Date.now()}`;
56
+ // Two-path routing: if the recipient has a TransferPreapproval, use the
57
+ // one-step `TransferPreapproval_Send` path (atomic, final on commit).
58
+ // Otherwise fall back to the Token Standard two-step (TransferOffer
59
+ // / accept). Tenzro pre-creates preapprovals during external-party
60
+ // onboarding, so the preapproval path is the common case — but the
61
+ // recipient may be a non-Tenzro Canton party.
62
+ const preapproval = await port.lookupPreapproval(intent.to.partyId);
63
+ const viaPreapproval = preapproval !== null;
64
+ const req = {
65
+ actAs: fromKey.partyId,
66
+ synchronizerId: fromKey.synchronizerId,
67
+ commandId: trackingId,
68
+ // Pinned package id per DESIGN.md §4.5.3. Post-2026-05-05 baseline:
69
+ // `splice-amulet 0.1.17` on the Tenzro validator.
70
+ packageIdSelectionPreference: 'splice-amulet:0.1.17',
71
+ commands: shapeAmuletTransfer({
72
+ from: fromKey.partyId,
73
+ to: intent.to.partyId,
74
+ amount: intent.amount,
75
+ assetSymbol: intent.asset.symbol,
76
+ memo: intent.memo,
77
+ viaPreapproval,
78
+ ...(preapproval !== null ? { preapprovalContractId: preapproval.contractId } : {}),
79
+ }),
80
+ };
81
+ const prepared = await port.prepareSubmission(req);
82
+ assertHashingScheme(prepared);
83
+ const body = {
84
+ kind: 'canton-external-send',
85
+ fromParty: fromKey.partyId,
86
+ toParty: intent.to.partyId,
87
+ amount: intent.amount,
88
+ assetSymbol: intent.asset.symbol,
89
+ ...(intent.memo !== undefined ? { description: intent.memo } : {}),
90
+ trackingId,
91
+ viaPreapproval,
92
+ synchronizerId: fromKey.synchronizerId,
93
+ preparedTransaction: prepared.preparedTransaction,
94
+ preparedTransactionHash: prepared.preparedTransactionHash,
95
+ };
96
+ return {
97
+ route: { kind: 'native', surface: 'canton-external' },
98
+ intent,
99
+ // Canton fees aren't paid in CC at the wallet level — they're SV
100
+ // reward economics under the hood. Display-only zero is fine here;
101
+ // the validator response carries the actual cost in CC if needed.
102
+ fees: [{ asset: intent.asset, amount: 0n, label: 'canton mainnet sync fee' }],
103
+ // Two-step (Token Standard) is held as `pending` on the receiver's
104
+ // side until acceptance; preapproval is atomic. Reflect the latency
105
+ // delta in `etaMs`.
106
+ etaMs: viaPreapproval ? 2000 : 8000,
107
+ reversibility: viaPreapproval ? 'final-on-submit' : 'reversible-until-confirmed',
108
+ warnings: [],
109
+ body,
110
+ };
111
+ },
112
+ async sign(prepared, _consent) {
113
+ const body = prepared.body;
114
+ const did = prepared.intent.from;
115
+ const key = deps.keyResolver(did);
116
+ if (!key || key.surface !== 'canton-external') {
117
+ throw new Error('missing canton-external key at sign time');
118
+ }
119
+ // Recompute the hash from the proto bytes the validator returned and
120
+ // assert it matches what the validator claims is the hash. Without
121
+ // this check the wallet trusts the validator on what it's signing —
122
+ // defeats external signing.
123
+ const recomputed = await preparedTransactionHash(body.preparedTransaction);
124
+ if (!bytesEqualConstantTime(recomputed, body.preparedTransactionHash)) {
125
+ throw new Error('canton-external: preparedTransactionHash mismatch — refusing to sign. ' +
126
+ 'Either the validator is malicious or the proto bytes were corrupted in transit.');
127
+ }
128
+ const result = await deps.signingDriver.sign({
129
+ did,
130
+ surfaceKey: key,
131
+ scheme: 'ed25519',
132
+ // Sign the recomputed hash, not the validator-supplied one. They're
133
+ // equal by the assertion above; using the recomputed one removes the
134
+ // last byte of trust in the validator's response.
135
+ preimage: recomputed,
136
+ purpose: 'canton-external-send',
137
+ });
138
+ return { prepared, signatures: result.signatures, body };
139
+ },
140
+ async submit(signed) {
141
+ const body = signed.body;
142
+ const key = deps.keyResolver(signed.prepared.intent.from);
143
+ if (!key || key.surface !== 'canton-external') {
144
+ throw new Error('missing canton-external key at submit time');
145
+ }
146
+ const req = {
147
+ preparedTransaction: body.preparedTransaction,
148
+ partySignatures: shapePartySignatures(key, signed.signatures),
149
+ hashingSchemeVersion: 'HASHING_SCHEME_VERSION_V2',
150
+ submissionId: body.trackingId,
151
+ };
152
+ await port.executeSubmission(req);
153
+ // Canton has no tx hash equivalent until the completion arrives. The
154
+ // returned `updateId` becomes `TxHandle.hash` once `watch` observes
155
+ // the completion; for now hand back the trackingId so the consent UI
156
+ // has something to display.
157
+ return makeHandle('canton-external', signed.prepared.intent, body.trackingId);
158
+ },
159
+ watch(handle) {
160
+ return watchViaPort(handle, port, deps.userId);
161
+ },
162
+ };
163
+ }
164
+ /**
165
+ * Translate a high-level transfer into Daml `Commands`. Hands the port a
166
+ * structured payload it can shape into the real Splice `Commands` proto;
167
+ * the kernel itself never sees the proto bytes. Two shapes by route:
168
+ * - viaPreapproval: `TransferPreapproval_Send` (one-step).
169
+ * - two-step: `AmuletRules_TransferOffer_Create` (recipient must accept).
170
+ */
171
+ function shapeAmuletTransfer(args) {
172
+ if (args.viaPreapproval) {
173
+ return [
174
+ {
175
+ _intent: 'amulet-transfer-preapproval',
176
+ sender: args.from,
177
+ receiver: args.to,
178
+ amount: args.amount,
179
+ assetSymbol: args.assetSymbol,
180
+ ...(args.memo !== undefined ? { description: args.memo } : {}),
181
+ preapprovalContractId: args.preapprovalContractId,
182
+ },
183
+ ];
184
+ }
185
+ return [
186
+ {
187
+ _intent: 'amulet-transfer-offer',
188
+ sender: args.from,
189
+ receiver: args.to,
190
+ amount: args.amount,
191
+ assetSymbol: args.assetSymbol,
192
+ ...(args.memo !== undefined ? { description: args.memo } : {}),
193
+ },
194
+ ];
195
+ }
196
+ /**
197
+ * Shape the SigningDriver's signature output as `partySignatures` for the
198
+ * Interactive Submission Service. Single-party, threshold = N: the
199
+ * SigningDriver returns N signatures (one per signing key) and we attach
200
+ * each to the corresponding `signingKeys[i]`. M-of-N over different parties
201
+ * is a separate flow (multi-party signing) handled outside this surface.
202
+ */
203
+ function shapePartySignatures(key, signatures) {
204
+ if (signatures.length < key.threshold) {
205
+ throw new Error(`canton-external: need ${key.threshold} signatures, got ${signatures.length}`);
206
+ }
207
+ return signatures.slice(0, key.threshold).map((sig, i) => {
208
+ const sk = key.signingKeys[i];
209
+ if (!sk)
210
+ throw new Error(`canton-external: missing signing key at index ${i}`);
211
+ return {
212
+ party: key.partyId,
213
+ signature: sig,
214
+ scheme: sk.scheme,
215
+ // Canton's `Fingerprint` (`1220` + lowercase-hex SHA-256 of the public
216
+ // key) is the validator's lookup key into `PartyToKeyMapping`.
217
+ // Precomputed at provision time so the signing path stays sync.
218
+ signedBy: sk.fingerprint,
219
+ };
220
+ });
221
+ }
222
+ function assertHashingScheme(r) {
223
+ if (r.hashingSchemeVersion !== 'HASHING_SCHEME_VERSION_V2') {
224
+ throw new Error(`canton-external: unsupported hashing scheme ${r.hashingSchemeVersion}; ` +
225
+ `kernel only knows V2 (see DESIGN.md §11 open question #4)`);
226
+ }
227
+ }
228
+ /**
229
+ * Watch a Canton submission to completion. Tails `port.tailCompletions`
230
+ * filtered to the user's party + this command id, surfaces the single
231
+ * `executed | failed` finality event as a TxStatus stream.
232
+ */
233
+ async function* watchViaPort(handle, port, userId) {
234
+ yield { handle, phase: 'created' };
235
+ yield { handle, phase: 'pending' };
236
+ // Watching against the port: Canton has no confirmation depth, so we
237
+ // surface a single `confirmed` event for `executed` and stop there.
238
+ for await (const c of port.tailCompletions({
239
+ userId,
240
+ actAs: [handle.surface],
241
+ })) {
242
+ if (c.commandId !== handle.hash)
243
+ continue; // hash carries the trackingId
244
+ yield {
245
+ handle: { ...handle, hash: c.updateId },
246
+ phase: c.status === 'executed' ? 'confirmed' : 'failed',
247
+ ...(c.errorMessage !== undefined ? { reason: c.errorMessage } : {}),
248
+ };
249
+ return;
250
+ }
251
+ }
252
+ //# sourceMappingURL=canton-external.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canton-external.js","sourceRoot":"","sources":["../../src/surfaces/canton-external.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Canton/Daml on the Tenzro-operated synchronizer.
3
+ *
4
+ * Same protocol as canton-external — Interactive Submission Service for
5
+ * prepare/execute, completion-stream for watch — different validator and
6
+ * different `synchronizerId`. Tenzro runs its own sequencer + mediator;
7
+ * participants hosted on Tenzro infra connect to it; the asset model is a
8
+ * Tenzro-local mirror of `Splice.Amulet` semantics, no Global Synchronizer
9
+ * governance hooks.
10
+ *
11
+ * The two surfaces stay separate because:
12
+ * - The recipient mapping is different (`canton-internal` parties live
13
+ * on the Tenzro synchronizer, not GSN).
14
+ * - The asset symbol set is local (no CC, no SV economics).
15
+ * - The validator port is configured with a different ledger base URL.
16
+ *
17
+ * The implementation mirrors canton-external.ts; the kernel can choose to
18
+ * factor the shared body out later if these stay 1:1, but keeping them
19
+ * separate now lets us evolve them independently as the Tenzro internal
20
+ * synchronizer's economics diverge from MainNet.
21
+ */
22
+ import type { CantonValidatorPort } from '../ports/canton/canton-validator.js';
23
+ import type { SurfaceKey, TdipDid } from '../types/identity.js';
24
+ import type { SigningDriver } from '../types/signing-driver.js';
25
+ import type { SurfaceModule } from '../types/surface-module.js';
26
+ export interface CantonInternalDeps {
27
+ readonly keyResolver: (did: TdipDid) => SurfaceKey | undefined;
28
+ readonly signingDriver: SigningDriver;
29
+ /** Validator port, pointed at the Tenzro-operated synchronizer's validator. */
30
+ readonly validatorPort: CantonValidatorPort;
31
+ readonly userId: string;
32
+ }
33
+ export declare function cantonInternalSurface(deps: CantonInternalDeps): SurfaceModule;
34
+ //# sourceMappingURL=canton-internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canton-internal.d.ts","sourceRoot":"","sources":["../../src/surfaces/canton-internal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAIpB,MAAM,qCAAqC,CAAC;AAG7C,OAAO,KAAK,EAAkB,UAAU,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAgBhE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,UAAU,GAAG,SAAS,CAAC;IAC/D,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC,+EAA+E;IAC/E,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,GAAG,aAAa,CA4G7E"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Canton/Daml on the Tenzro-operated synchronizer.
3
+ *
4
+ * Same protocol as canton-external — Interactive Submission Service for
5
+ * prepare/execute, completion-stream for watch — different validator and
6
+ * different `synchronizerId`. Tenzro runs its own sequencer + mediator;
7
+ * participants hosted on Tenzro infra connect to it; the asset model is a
8
+ * Tenzro-local mirror of `Splice.Amulet` semantics, no Global Synchronizer
9
+ * governance hooks.
10
+ *
11
+ * The two surfaces stay separate because:
12
+ * - The recipient mapping is different (`canton-internal` parties live
13
+ * on the Tenzro synchronizer, not GSN).
14
+ * - The asset symbol set is local (no CC, no SV economics).
15
+ * - The validator port is configured with a different ledger base URL.
16
+ *
17
+ * The implementation mirrors canton-external.ts; the kernel can choose to
18
+ * factor the shared body out later if these stay 1:1, but keeping them
19
+ * separate now lets us evolve them independently as the Tenzro internal
20
+ * synchronizer's economics diverge from MainNet.
21
+ */
22
+ import { bytesEqualConstantTime, preparedTransactionHash } from "../ports/canton/hash.js";
23
+ import { makeHandle } from "./util.js";
24
+ export function cantonInternalSurface(deps) {
25
+ const port = deps.validatorPort;
26
+ return {
27
+ name: 'canton-internal',
28
+ async prepare(intent) {
29
+ if (intent.kind !== 'send')
30
+ throw new Error(`unsupported: ${intent.kind}`);
31
+ if (intent.to.kind !== 'canton') {
32
+ throw new Error('canton-internal requires a canton recipient');
33
+ }
34
+ const fromKey = deps.keyResolver(intent.from);
35
+ if (!fromKey || fromKey.surface !== 'canton-internal') {
36
+ throw new Error(`no canton-internal key for ${intent.from}`);
37
+ }
38
+ const trackingId = `tenzro-wallet-${Date.now()}`;
39
+ const req = {
40
+ actAs: fromKey.partyId,
41
+ synchronizerId: fromKey.synchronizerId,
42
+ commandId: trackingId,
43
+ // Tenzro-internal asset package. Aligned with the splice-amulet
44
+ // semantics but published under a Tenzro-specific package id so
45
+ // the two synchronizers' assets don't collide.
46
+ packageIdSelectionPreference: 'tenzro-amulet:0.1.0',
47
+ commands: [
48
+ {
49
+ _intent: 'tenzro-amulet-transfer',
50
+ sender: fromKey.partyId,
51
+ receiver: intent.to.partyId,
52
+ amount: intent.amount,
53
+ assetSymbol: intent.asset.symbol,
54
+ ...(intent.memo !== undefined ? { description: intent.memo } : {}),
55
+ },
56
+ ],
57
+ };
58
+ const prepared = await port.prepareSubmission(req);
59
+ assertHashingScheme(prepared);
60
+ const body = {
61
+ kind: 'canton-internal-send',
62
+ fromParty: fromKey.partyId,
63
+ toParty: intent.to.partyId,
64
+ amount: intent.amount,
65
+ assetSymbol: intent.asset.symbol,
66
+ ...(intent.memo !== undefined ? { description: intent.memo } : {}),
67
+ trackingId,
68
+ synchronizerId: fromKey.synchronizerId,
69
+ preparedTransaction: prepared.preparedTransaction,
70
+ preparedTransactionHash: prepared.preparedTransactionHash,
71
+ };
72
+ return {
73
+ route: { kind: 'native', surface: 'canton-internal' },
74
+ intent,
75
+ // Tenzro-internal synchronizer charges a flat sync fee in the local
76
+ // asset; surface-level fee modelling tracks canton-external for now.
77
+ fees: [{ asset: intent.asset, amount: 0n, label: 'tenzro synchronizer fee' }],
78
+ etaMs: 1500,
79
+ reversibility: 'final-on-submit',
80
+ warnings: [],
81
+ body,
82
+ };
83
+ },
84
+ async sign(prepared, _consent) {
85
+ const body = prepared.body;
86
+ const did = prepared.intent.from;
87
+ const key = deps.keyResolver(did);
88
+ if (!key || key.surface !== 'canton-internal') {
89
+ throw new Error('missing canton-internal key at sign time');
90
+ }
91
+ const recomputed = await preparedTransactionHash(body.preparedTransaction);
92
+ if (!bytesEqualConstantTime(recomputed, body.preparedTransactionHash)) {
93
+ throw new Error('canton-internal: preparedTransactionHash mismatch — refusing to sign.');
94
+ }
95
+ const result = await deps.signingDriver.sign({
96
+ did,
97
+ surfaceKey: key,
98
+ scheme: 'ed25519',
99
+ preimage: recomputed,
100
+ purpose: 'canton-internal-send',
101
+ });
102
+ return { prepared, signatures: result.signatures, body };
103
+ },
104
+ async submit(signed) {
105
+ const body = signed.body;
106
+ const key = deps.keyResolver(signed.prepared.intent.from);
107
+ if (!key || key.surface !== 'canton-internal') {
108
+ throw new Error('missing canton-internal key at submit time');
109
+ }
110
+ const req = {
111
+ preparedTransaction: body.preparedTransaction,
112
+ partySignatures: shapePartySignatures(key, signed.signatures),
113
+ hashingSchemeVersion: 'HASHING_SCHEME_VERSION_V2',
114
+ submissionId: body.trackingId,
115
+ };
116
+ await port.executeSubmission(req);
117
+ return makeHandle('canton-internal', signed.prepared.intent, body.trackingId);
118
+ },
119
+ watch(handle) {
120
+ return watchViaPort(handle, port, deps.userId);
121
+ },
122
+ };
123
+ }
124
+ function shapePartySignatures(key, signatures) {
125
+ if (signatures.length < key.threshold) {
126
+ throw new Error(`canton-internal: need ${key.threshold} signatures, got ${signatures.length}`);
127
+ }
128
+ return signatures.slice(0, key.threshold).map((sig, i) => {
129
+ const sk = key.signingKeys[i];
130
+ if (!sk)
131
+ throw new Error(`canton-internal: missing signing key at index ${i}`);
132
+ return {
133
+ party: key.partyId,
134
+ signature: sig,
135
+ scheme: sk.scheme,
136
+ signedBy: sk.fingerprint,
137
+ };
138
+ });
139
+ }
140
+ function assertHashingScheme(r) {
141
+ if (r.hashingSchemeVersion !== 'HASHING_SCHEME_VERSION_V2') {
142
+ throw new Error(`canton-internal: unsupported hashing scheme ${r.hashingSchemeVersion}; ` +
143
+ `kernel only knows V2`);
144
+ }
145
+ }
146
+ async function* watchViaPort(handle, port, userId) {
147
+ yield { handle, phase: 'created' };
148
+ yield { handle, phase: 'pending' };
149
+ for await (const c of port.tailCompletions({
150
+ userId,
151
+ actAs: [handle.surface],
152
+ })) {
153
+ if (c.commandId !== handle.hash)
154
+ continue;
155
+ yield {
156
+ handle: { ...handle, hash: c.updateId },
157
+ phase: c.status === 'executed' ? 'confirmed' : 'failed',
158
+ ...(c.errorMessage !== undefined ? { reason: c.errorMessage } : {}),
159
+ };
160
+ return;
161
+ }
162
+ }
163
+ //# sourceMappingURL=canton-internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canton-internal.js","sourceRoot":"","sources":["../../src/surfaces/canton-internal.ts"],"names":[],"mappings":"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"}