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,238 @@
1
+ /**
2
+ * SVM surface inside the Tenzro runtime. SPL Token Adapter view of TNZO at
3
+ * 9 decimals. Sub-lamport (sub-9-decimal) dust is truncated when crossing into
4
+ * this view from EVM/native — the router surfaces a warning when applicable.
5
+ */
6
+ import { base58Decode, base58Encode, serializeCompiledMessage, serializeTransaction, } from "../crypto/solana.js";
7
+ import { dustResidual, truncateForView } from "../ports/cross-vm.js";
8
+ import { makeHandle, mockStatusWalk } from "./util.js";
9
+ /**
10
+ * Placeholder program ID (32 bytes, base58 of all-zeros + last byte = 3) for
11
+ * `tenzro_cross_vm`. The real address is gated on the SVM-on-Tenzro spec
12
+ * publishing the canonical program ID — when it does, swap in those bytes.
13
+ * Documentation TODO at https://tenzro.com/docs/cross-vm-tokens.
14
+ */
15
+ const TENZRO_CROSS_VM_PROGRAM_ID = (() => {
16
+ const b = new Uint8Array(32);
17
+ b[31] = 0x03; // sentinel — distinct from System Program (all zeros)
18
+ return b;
19
+ })();
20
+ export function svmOnTenzroSurface(deps) {
21
+ const rpc = deps.rpc ?? mockRpc();
22
+ return {
23
+ name: 'svm-on-tenzro',
24
+ async prepare(intent) {
25
+ if (intent.kind !== 'send')
26
+ throw new Error(`unsupported: ${intent.kind}`);
27
+ if (intent.to.kind !== 'svm')
28
+ throw new Error('svm-on-tenzro requires an SVM recipient');
29
+ const fromKey = deps.keyResolver(intent.from);
30
+ if (!fromKey || fromKey.surface !== 'svm-on-tenzro') {
31
+ throw new Error(`no svm-on-tenzro key for ${intent.from}`);
32
+ }
33
+ const recentBlockhash = await rpc.getRecentBlockhash();
34
+ const lamports = toLamports(intent.amount, intent.asset.decimals);
35
+ const dustTruncated = fromLamports(lamports, intent.asset.decimals) !== intent.amount;
36
+ const body = {
37
+ kind: 'svm-send',
38
+ fromPubkey: fromKey.address,
39
+ toPubkey: intent.to.publicKey,
40
+ lamports,
41
+ recentBlockhash,
42
+ };
43
+ return {
44
+ route: { kind: 'native', surface: 'svm-on-tenzro' },
45
+ intent,
46
+ fees: [{ asset: intent.asset, amount: 5000n, label: 'solana-style fee (lamports)' }],
47
+ etaMs: 800,
48
+ reversibility: 'final-on-submit',
49
+ warnings: dustTruncated
50
+ ? ['amount truncated to 9-decimal precision (sub-lamport dust dropped)']
51
+ : [],
52
+ body,
53
+ };
54
+ },
55
+ async preparePointer(intent, op) {
56
+ if (intent.kind !== 'send')
57
+ throw new Error(`unsupported: ${intent.kind}`);
58
+ const fromKey = deps.keyResolver(intent.from);
59
+ if (!fromKey || fromKey.surface !== 'svm-on-tenzro') {
60
+ throw new Error(`no svm-on-tenzro key for ${intent.from}`);
61
+ }
62
+ const recentBlockhash = await rpc.getRecentBlockhash();
63
+ const body = {
64
+ kind: 'svm-pointer',
65
+ fromPubkey: fromKey.address,
66
+ recentBlockhash,
67
+ pointer: op,
68
+ };
69
+ const dust = dustResidual(op.amount, op.toSurface);
70
+ const truncated = truncateForView(op.amount, op.toSurface);
71
+ const warnings = [];
72
+ if (dust > 0n) {
73
+ warnings.push(`${dust.toString()} sub-units below ${op.toSurface} precision will ` +
74
+ `not appear in the destination view; ${truncated.toString()} ` +
75
+ `canonical units will move`);
76
+ }
77
+ return {
78
+ route: {
79
+ kind: 'cross-vm-pointer',
80
+ fromSurface: 'svm-on-tenzro',
81
+ toSurface: op.toSurface,
82
+ precompile: '0x1003',
83
+ },
84
+ intent,
85
+ fees: [{ asset: intent.asset, amount: 5000n, label: 'solana-style fee (lamports)' }],
86
+ etaMs: 800,
87
+ reversibility: 'final-on-submit',
88
+ warnings,
89
+ body,
90
+ };
91
+ },
92
+ async sign(prepared, _consent) {
93
+ const body = prepared.body;
94
+ const did = prepared.intent.from;
95
+ const key = deps.keyResolver(did);
96
+ if (!key || key.surface !== 'svm-on-tenzro') {
97
+ throw new Error('missing svm key at sign time');
98
+ }
99
+ const preimage = canonicalize(body);
100
+ const result = await deps.signingDriver.sign({
101
+ did,
102
+ surfaceKey: key,
103
+ scheme: 'ed25519',
104
+ preimage,
105
+ purpose: body.kind === 'svm-pointer' ? 'svm-pointer' : 'svm-send',
106
+ });
107
+ return { prepared, signatures: result.signatures, body };
108
+ },
109
+ async submit(signed) {
110
+ const body = signed.body;
111
+ const sig = signed.signatures[0];
112
+ if (!sig)
113
+ throw new Error('missing signature');
114
+ const message = compileMessage(body);
115
+ const rawTx = serializeTransaction(message, [sig]);
116
+ const txSig = await rpc.sendRawTransaction(rawTx);
117
+ return makeHandle('svm-on-tenzro', signed.prepared.intent, txSig);
118
+ },
119
+ watch(handle) {
120
+ return mockStatusWalk(handle);
121
+ },
122
+ };
123
+ }
124
+ function toLamports(amount, decimals) {
125
+ if (decimals === 9)
126
+ return amount;
127
+ if (decimals > 9) {
128
+ const div = 10n ** BigInt(decimals - 9);
129
+ return amount / div;
130
+ }
131
+ const mul = 10n ** BigInt(9 - decimals);
132
+ return amount * mul;
133
+ }
134
+ function fromLamports(lamports, decimals) {
135
+ if (decimals === 9)
136
+ return lamports;
137
+ if (decimals > 9)
138
+ return lamports * 10n ** BigInt(decimals - 9);
139
+ return lamports / 10n ** BigInt(9 - decimals);
140
+ }
141
+ /**
142
+ * Canonical signing pre-image for an SVM transaction is the *compiled message
143
+ * bytes themselves*. Ed25519 (RFC 8032) hashes internally, so unlike EVM we
144
+ * do NOT pre-hash here — feeding the message bytes to the SigningDriver is
145
+ * what `solana-validator` will recompute and verify against `accountKeys[0]`.
146
+ */
147
+ function canonicalize(body) {
148
+ return serializeCompiledMessage(compileMessage(body));
149
+ }
150
+ /**
151
+ * Compile the structured tx body into a Solana legacy `CompiledMessage`.
152
+ *
153
+ * For `svm-send`: signer is the fee payer + sender (`fromPubkey`); recipient
154
+ * is a non-signer; the System Program (all-zeros pubkey) is the program; the
155
+ * single instruction is a System Program transfer with little-endian u64
156
+ * lamports.
157
+ *
158
+ * For `svm-pointer`: signer is the fee payer (`fromPubkey`); program is
159
+ * `TENZRO_CROSS_VM_PROGRAM_ID`; data is the structured payload (placeholder
160
+ * JSON until the program's instruction discriminator is published).
161
+ */
162
+ function compileMessage(body) {
163
+ if (body.kind === 'svm-send') {
164
+ const from = base58Decode(body.fromPubkey);
165
+ const to = base58Decode(body.toPubkey);
166
+ const sysProgram = new Uint8Array(32); // 11111…11
167
+ return {
168
+ numRequiredSignatures: 1,
169
+ numReadonlySignedAccounts: 0,
170
+ // Recipient is writable (sees value increase) but not a signer; program
171
+ // is read-only and not a signer.
172
+ numReadonlyUnsignedAccounts: 1,
173
+ // Solana ordering: signers first, then writable non-signers, then
174
+ // read-only non-signers. So [from, to, sysProgram].
175
+ accountKeys: [from, to, sysProgram],
176
+ recentBlockhash: base58Decode(body.recentBlockhash),
177
+ instructions: [
178
+ {
179
+ programIdIndex: 2, // sysProgram
180
+ accountKeyIndices: [0, 1], // from, to
181
+ data: encodeSystemTransfer(body.lamports),
182
+ },
183
+ ],
184
+ };
185
+ }
186
+ // pointer op
187
+ const from = base58Decode(body.fromPubkey);
188
+ return {
189
+ numRequiredSignatures: 1,
190
+ numReadonlySignedAccounts: 0,
191
+ numReadonlyUnsignedAccounts: 1, // program is read-only
192
+ accountKeys: [from, TENZRO_CROSS_VM_PROGRAM_ID],
193
+ recentBlockhash: base58Decode(body.recentBlockhash),
194
+ instructions: [
195
+ {
196
+ programIdIndex: 1, // tenzro_cross_vm
197
+ accountKeyIndices: [0], // signer
198
+ // Placeholder until the program publishes its instruction
199
+ // discriminator. The wire path that wraps and signs this is real;
200
+ // only the inner bytes are TBD.
201
+ data: new TextEncoder().encode(JSON.stringify({
202
+ toSurface: body.pointer.toSurface,
203
+ owner: body.pointer.owner,
204
+ amount: body.pointer.amount.toString(),
205
+ })),
206
+ },
207
+ ],
208
+ };
209
+ }
210
+ /**
211
+ * Solana System Program `Transfer` instruction:
212
+ * layout: u32 instruction_index (= 2 for transfer) || u64 LE lamports
213
+ */
214
+ function encodeSystemTransfer(lamports) {
215
+ const out = new Uint8Array(12);
216
+ // instruction = 2 (Transfer), little-endian u32
217
+ out[0] = 2;
218
+ // lamports, little-endian u64
219
+ let v = lamports;
220
+ for (let i = 0; i < 8; i++) {
221
+ out[4 + i] = Number(v & 0xffn);
222
+ v >>= 8n;
223
+ }
224
+ return out;
225
+ }
226
+ /**
227
+ * Mock RPC used when no real Solana port is injected. Returns deterministic
228
+ * placeholders shaped like real Solana wire types (32-byte blockhash
229
+ * base58-encoded, fixed tx-signature string).
230
+ */
231
+ function mockRpc() {
232
+ const blockhash = base58Encode(new Uint8Array(32).fill(0x01));
233
+ return {
234
+ getRecentBlockhash: async () => blockhash,
235
+ sendRawTransaction: async () => 'mocksig',
236
+ };
237
+ }
238
+ //# sourceMappingURL=svm-on-tenzro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svm-on-tenzro.js","sourceRoot":"","sources":["../../src/surfaces/svm-on-tenzro.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Tenzro native surface — the canonical TNZO ledger. Hybrid signing
3
+ * (Ed25519 + ML-DSA-65) per https://tenzro.com/docs/wallet-sdk.
4
+ *
5
+ * M2 path (current):
6
+ * prepare → sign (local placeholder) → submit (server-side hybrid signing
7
+ * via `tenzro_signAndSendTransaction`, see TenzroRpcPort.sendTransaction).
8
+ *
9
+ * M5 path (future):
10
+ * sign() runs the FROST-Ed25519 device-leg with a passkey assertion;
11
+ * submit() sends the local share + assertion to the node, which combines
12
+ * with the TEE share and the ML-DSA leg. Same surface contract; the
13
+ * signing driver gets swapped under the kernel.
14
+ *
15
+ * The signing-driver call here is retained so the M1 mock test continues to
16
+ * exercise the threshold-share collection abstraction. Its output is not
17
+ * consumed by `submit()` in M2 (the node signs server-side); it will be
18
+ * consumed in M5.
19
+ */
20
+ import type { TenzroIdentityPort } from '../ports/tenzro-identity.js';
21
+ import type { TenzroRpcPort } from '../ports/tenzro-rpc.js';
22
+ import type { SurfaceKey, TdipDid } from '../types/identity.js';
23
+ import type { SigningDriver } from '../types/signing-driver.js';
24
+ import type { SurfaceModule } from '../types/surface-module.js';
25
+ export interface TenzroNativeDeps {
26
+ /** Resolves the surface key (with on-chain address) for a given DID. */
27
+ readonly keyResolver: (did: TdipDid) => SurfaceKey | undefined;
28
+ readonly signingDriver: SigningDriver;
29
+ /**
30
+ * Tenzro RPC port. Real builds inject `TenzroSdkAdapter.fromClient(...)`;
31
+ * tests inject an in-memory fake. Optional only because the M1 smoke tests
32
+ * exercise the abstraction without a node — defaults to a stub that returns
33
+ * deterministic placeholders.
34
+ */
35
+ readonly rpc?: TenzroRpcPort;
36
+ /**
37
+ * Optional remote identity port. Used only when a recipient DID is *not*
38
+ * the user's own (i.e., not in `keyResolver`'s local cache). Without it,
39
+ * sends to non-self DIDs throw — useful in tests and offline-first builds
40
+ * where every DID is locally known.
41
+ */
42
+ readonly identityPort?: TenzroIdentityPort;
43
+ }
44
+ export declare function tenzroNativeSurface(deps: TenzroNativeDeps): SurfaceModule;
45
+ //# sourceMappingURL=tenzro-native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenzro-native.d.ts","sourceRoot":"","sources":["../../src/surfaces/tenzro-native.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,wBAAwB,CAAC;AAE5E,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAgChE,MAAM,WAAW,gBAAgB;IAC/B,wEAAwE;IACxE,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,UAAU,GAAG,SAAS,CAAC;IAC/D,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IACtC;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,kBAAkB,CAAC;CAC5C;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,aAAa,CAoKzE"}
@@ -0,0 +1,299 @@
1
+ /**
2
+ * Tenzro native surface — the canonical TNZO ledger. Hybrid signing
3
+ * (Ed25519 + ML-DSA-65) per https://tenzro.com/docs/wallet-sdk.
4
+ *
5
+ * M2 path (current):
6
+ * prepare → sign (local placeholder) → submit (server-side hybrid signing
7
+ * via `tenzro_signAndSendTransaction`, see TenzroRpcPort.sendTransaction).
8
+ *
9
+ * M5 path (future):
10
+ * sign() runs the FROST-Ed25519 device-leg with a passkey assertion;
11
+ * submit() sends the local share + assertion to the node, which combines
12
+ * with the TEE share and the ML-DSA leg. Same surface contract; the
13
+ * signing driver gets swapped under the kernel.
14
+ *
15
+ * The signing-driver call here is retained so the M1 mock test continues to
16
+ * exercise the threshold-share collection abstraction. Its output is not
17
+ * consumed by `submit()` in M2 (the node signs server-side); it will be
18
+ * consumed in M5.
19
+ */
20
+ import { dustResidual, truncateForView } from "../ports/cross-vm.js";
21
+ import { makeHandle } from "./util.js";
22
+ export function tenzroNativeSurface(deps) {
23
+ const rpc = deps.rpc ?? stubRpc();
24
+ return {
25
+ name: 'tenzro-native',
26
+ async prepare(intent) {
27
+ if (intent.kind !== 'send') {
28
+ throw new Error(`unsupported intent on tenzro-native: ${intent.kind}`);
29
+ }
30
+ const fromKey = deps.keyResolver(intent.from);
31
+ if (!fromKey || fromKey.surface !== 'tenzro-native') {
32
+ throw new Error(`no tenzro-native key for ${intent.from}`);
33
+ }
34
+ const fromAddress = fromKey.address;
35
+ const nonce = await rpc.getNonce(fromAddress);
36
+ const chainId = await rpc.getChainId();
37
+ const toAddress = await resolveRecipientAddress(intent.to, deps.keyResolver, deps.identityPort);
38
+ const body = {
39
+ kind: 'tenzro-native-send',
40
+ from: intent.from,
41
+ fromAddress,
42
+ ...(intent.to.kind === 'tdip' ? { toDid: intent.to.did } : {}),
43
+ toAddress,
44
+ amount: intent.amount,
45
+ assetSymbol: intent.asset.symbol,
46
+ nonce,
47
+ chainId,
48
+ };
49
+ return {
50
+ route: { kind: 'native', surface: 'tenzro-native' },
51
+ intent,
52
+ fees: [
53
+ {
54
+ asset: intent.asset,
55
+ // M2: 21000 gas × 1 gwei placeholder; real estimate via
56
+ // node-side gas oracle lands when the SDK exposes one.
57
+ amount: 21000n * 1000000000n,
58
+ label: 'tenzro gas',
59
+ },
60
+ ],
61
+ etaMs: 500,
62
+ reversibility: 'final-on-submit',
63
+ warnings: [],
64
+ body,
65
+ };
66
+ },
67
+ async preparePointer(intent, op) {
68
+ if (intent.kind !== 'send') {
69
+ throw new Error(`unsupported intent on tenzro-native: ${intent.kind}`);
70
+ }
71
+ const fromKey = deps.keyResolver(intent.from);
72
+ if (!fromKey || fromKey.surface !== 'tenzro-native') {
73
+ throw new Error(`no tenzro-native key for ${intent.from}`);
74
+ }
75
+ const [nonce, chainId] = await Promise.all([rpc.getNonce(fromKey.address), rpc.getChainId()]);
76
+ const body = {
77
+ kind: 'tenzro-native-pointer',
78
+ from: intent.from,
79
+ fromAddress: fromKey.address,
80
+ nonce,
81
+ chainId,
82
+ pointer: op,
83
+ };
84
+ const dust = dustResidual(op.amount, op.toSurface);
85
+ const truncated = truncateForView(op.amount, op.toSurface);
86
+ const warnings = [];
87
+ if (dust > 0n) {
88
+ warnings.push(`${dust.toString()} sub-units below ${op.toSurface} precision will ` +
89
+ `not appear in the destination view; ${truncated.toString()} ` +
90
+ `canonical units will move`);
91
+ }
92
+ return {
93
+ route: {
94
+ kind: 'cross-vm-pointer',
95
+ fromSurface: 'tenzro-native',
96
+ toSurface: op.toSurface,
97
+ precompile: '0x1003',
98
+ },
99
+ intent,
100
+ fees: [
101
+ {
102
+ asset: intent.asset,
103
+ amount: 21000n * 1000000000n,
104
+ label: 'tenzro gas (pointer call)',
105
+ },
106
+ ],
107
+ etaMs: 500,
108
+ reversibility: 'final-on-submit',
109
+ warnings,
110
+ body,
111
+ };
112
+ },
113
+ async sign(prepared, _consent) {
114
+ const body = prepared.body;
115
+ const surfaceKey = deps.keyResolver(body.from);
116
+ if (!surfaceKey || surfaceKey.surface !== 'tenzro-native') {
117
+ throw new Error(`no tenzro-native key for ${body.from}`);
118
+ }
119
+ const preimage = canonicalize(body);
120
+ // M2: the signing driver still runs (so the M1 test fixture keeps
121
+ // working and the consent/policy gate stays at the kernel-level
122
+ // sign() boundary). In M5 the driver becomes a real FROST-Ed25519
123
+ // device-leg + passkey assertion, and `submit()` forwards that to
124
+ // the node along with the canonical body for TEE-side completion.
125
+ const result = await deps.signingDriver.sign({
126
+ did: body.from,
127
+ surfaceKey,
128
+ scheme: 'ed25519+ml-dsa-65',
129
+ preimage,
130
+ purpose: body.kind === 'tenzro-native-pointer' ? 'tenzro-native-pointer' : 'tenzro-native-send',
131
+ });
132
+ return { prepared, signatures: result.signatures, body };
133
+ },
134
+ async submit(signed) {
135
+ const body = signed.body;
136
+ // M2: server-side hybrid signing path. The kernel's local signature
137
+ // shares are not yet wire-bound; the SDK's DPoP-asserted session is
138
+ // the auth boundary. M5 wires the local Ed25519 leg + passkey
139
+ // assertion through to the node here.
140
+ //
141
+ // M3: pointer ops also flow through `sendTransaction` for now — the
142
+ // node's RPC will branch on the body's `kind` to invoke the
143
+ // `crossvm_pointer_move` syscall instead of value-transfer settlement.
144
+ // When the SDK adds a dedicated pointer endpoint this branches.
145
+ const sendArgs = body.kind === 'tenzro-native-pointer'
146
+ ? {
147
+ from: body.fromAddress,
148
+ to: '0x1003',
149
+ value: 0n,
150
+ nonce: body.nonce,
151
+ chainId: body.chainId,
152
+ }
153
+ : {
154
+ from: body.fromAddress,
155
+ to: body.toAddress,
156
+ value: body.amount,
157
+ nonce: body.nonce,
158
+ chainId: body.chainId,
159
+ };
160
+ const hash = await rpc.sendTransaction(sendArgs);
161
+ return makeHandle('tenzro-native', signed.prepared.intent, hash);
162
+ },
163
+ watch(handle) {
164
+ return watchViaPort(handle, rpc);
165
+ },
166
+ };
167
+ }
168
+ // --- helpers ---
169
+ async function resolveRecipientAddress(to, keyResolver, identityPort) {
170
+ switch (to.kind) {
171
+ case 'tdip': {
172
+ // Local-first: self-sends and any DID the kernel already knows about
173
+ // resolve from the in-memory `SurfaceKey` map without a round-trip.
174
+ const k = keyResolver(to.did);
175
+ if (k && k.surface === 'tenzro-native')
176
+ return k.address;
177
+ // Remote: ask the identity port. This is where `resolveDidDocument`
178
+ // happens in real builds; tests can leave the port unset to enforce
179
+ // local-only resolution.
180
+ if (!identityPort) {
181
+ throw new Error(`cannot resolve tenzro-native address for recipient DID ${to.did}; ` +
182
+ `no identity port wired (pass deps.identityPort to enable remote DID resolution)`);
183
+ }
184
+ const remote = await identityPort.resolveTenzroAddress(to.did);
185
+ if (!remote) {
186
+ throw new Error(`DID ${to.did} has no tenzro-native key; cannot send to it on this surface`);
187
+ }
188
+ return remote;
189
+ }
190
+ case 'evm':
191
+ return to.address;
192
+ case 'svm':
193
+ return to.publicKey;
194
+ case 'canton':
195
+ return to.partyId;
196
+ }
197
+ }
198
+ function canonicalize(body) {
199
+ // Stable JSON canonicalization is fine for the M2 stub; the wire format
200
+ // the chain actually verifies is `Transaction::hash()` per wallet-sdk
201
+ // docs, but server-side signing means the node owns canonicalization.
202
+ // Local canonicalization here only matters for the local signing-driver
203
+ // leg (which is a placeholder until M5).
204
+ const json = JSON.stringify(body, (_k, v) => (typeof v === 'bigint' ? v.toString() : v));
205
+ return new TextEncoder().encode(json);
206
+ }
207
+ function stubRpc() {
208
+ return {
209
+ getNonce: async () => 0,
210
+ getChainId: async () => 1337,
211
+ sendTransaction: async () => '0xmock',
212
+ getTransaction: async () => null,
213
+ };
214
+ }
215
+ /**
216
+ * Watch loop: yields one `created` status, then polls the node every
217
+ * `intervalMs` and yields whenever the inferred status changes. Stops
218
+ * after `finalized` or `failed`, or when `timeoutMs` elapses (yielding a
219
+ * synthetic `dropped`).
220
+ *
221
+ * Defaults: 250ms poll, 60s timeout. Both can be overridden via the
222
+ * `TENZRO_WATCH_INTERVAL_MS` / `TENZRO_WATCH_TIMEOUT_MS` env vars at
223
+ * runtime — useful for smoke tests against slow testnets.
224
+ */
225
+ async function* watchViaPort(handle, rpc) {
226
+ const env = readEnv();
227
+ const intervalMs = Number(env.TENZRO_WATCH_INTERVAL_MS ?? 250);
228
+ const timeoutMs = Number(env.TENZRO_WATCH_TIMEOUT_MS ?? 60_000);
229
+ yield { handle, phase: 'created' };
230
+ if (handle.hash === undefined) {
231
+ // No hash to poll for — surface produced a placeholder handle. Treat as
232
+ // dropped immediately rather than spinning a doomed poll loop.
233
+ yield { handle, phase: 'dropped', error: 'no transaction hash on handle' };
234
+ return;
235
+ }
236
+ const deadline = Date.now() + timeoutMs;
237
+ let lastPhase = 'created';
238
+ while (Date.now() < deadline) {
239
+ let nodeStatus = null;
240
+ try {
241
+ nodeStatus = await rpc.getTransaction(handle.hash);
242
+ }
243
+ catch (err) {
244
+ // Transient RPC errors don't kill the walk — they just fall through
245
+ // to the next interval. M3+ may surface them as warnings.
246
+ const message = err instanceof Error ? err.message : String(err);
247
+ // Yielding a `failed` here would lie about the on-chain state; just
248
+ // sleep and retry. If the issue is persistent we'll time out.
249
+ void message;
250
+ }
251
+ const phase = mapStatusToPhase(nodeStatus);
252
+ if (phase !== lastPhase) {
253
+ lastPhase = phase;
254
+ const update = {
255
+ handle,
256
+ phase,
257
+ ...(handle.hash !== undefined ? { hash: handle.hash } : {}),
258
+ ...(nodeStatus?.blockHeight !== undefined ? { blockHeight: nodeStatus.blockHeight } : {}),
259
+ };
260
+ yield update;
261
+ if (phase === 'finalized' || phase === 'failed')
262
+ return;
263
+ }
264
+ await sleep(intervalMs);
265
+ }
266
+ // Timed out without seeing finalization.
267
+ yield {
268
+ handle,
269
+ phase: 'dropped',
270
+ ...(handle.hash !== undefined ? { hash: handle.hash } : {}),
271
+ error: `watch timed out after ${timeoutMs}ms`,
272
+ };
273
+ }
274
+ function mapStatusToPhase(s) {
275
+ if (s === null)
276
+ return 'pending';
277
+ switch (s.status) {
278
+ case 'pending':
279
+ return 'pending';
280
+ case 'included':
281
+ return 'confirmed';
282
+ case 'finalized':
283
+ return 'finalized';
284
+ case 'failed':
285
+ return 'failed';
286
+ }
287
+ }
288
+ function sleep(ms) {
289
+ return new Promise((r) => setTimeout(r, ms));
290
+ }
291
+ /**
292
+ * Read env vars without requiring `@types/node`. Falls back to an empty
293
+ * object in non-Node runtimes (browsers, web workers).
294
+ */
295
+ function readEnv() {
296
+ const g = globalThis;
297
+ return g.process?.env ?? {};
298
+ }
299
+ //# sourceMappingURL=tenzro-native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenzro-native.js","sourceRoot":"","sources":["../../src/surfaces/tenzro-native.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Surface-internal helpers. Not exported from the package root.
3
+ */
4
+ import type { Intent, TxHandle, TxStatus } from '../types/intent.js';
5
+ import type { SurfaceName } from '../types/surface.js';
6
+ export declare function makeHandle(surface: SurfaceName, _intent: Intent, hash?: string): TxHandle;
7
+ /**
8
+ * M1 placeholder confirmation walk: created → pending → confirmed → finalized.
9
+ *
10
+ * Used by every surface that doesn't yet have a real port wired. As of M2,
11
+ * `tenzro-native` replaces this with `watchViaPort` against a real RPC; the
12
+ * remaining consumers (evm-on-tenzro, svm-on-tenzro, canton-internal,
13
+ * canton-external) keep using this until their respective milestones land.
14
+ *
15
+ * Delete this when no surface imports it any more.
16
+ */
17
+ export declare function mockStatusWalk(handle: TxHandle): AsyncIterable<TxStatus>;
18
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/surfaces/util.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIvD,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,CAQzF;AAED;;;;;;;;;GASG;AACH,wBAAuB,cAAc,CAAC,MAAM,EAAE,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,CAQ/E"}