@toon-protocol/connector 1.7.1

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 (458) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +421 -0
  3. package/dist/btp/btp-claim-types.d.ts +30 -0
  4. package/dist/btp/btp-claim-types.d.ts.map +1 -0
  5. package/dist/btp/btp-claim-types.js +103 -0
  6. package/dist/btp/btp-claim-types.js.map +1 -0
  7. package/dist/btp/btp-client-manager.d.ts +27 -0
  8. package/dist/btp/btp-client-manager.d.ts.map +1 -0
  9. package/dist/btp/btp-client-manager.js +138 -0
  10. package/dist/btp/btp-client-manager.js.map +1 -0
  11. package/dist/btp/btp-client.d.ts +55 -0
  12. package/dist/btp/btp-client.d.ts.map +1 -0
  13. package/dist/btp/btp-client.js +474 -0
  14. package/dist/btp/btp-client.js.map +1 -0
  15. package/dist/btp/btp-message-parser.d.ts +4 -0
  16. package/dist/btp/btp-message-parser.d.ts.map +1 -0
  17. package/dist/btp/btp-message-parser.js +211 -0
  18. package/dist/btp/btp-message-parser.js.map +1 -0
  19. package/dist/btp/btp-server.d.ts +30 -0
  20. package/dist/btp/btp-server.d.ts.map +1 -0
  21. package/dist/btp/btp-server.js +458 -0
  22. package/dist/btp/btp-server.js.map +1 -0
  23. package/dist/btp/btp-types.d.ts +43 -0
  24. package/dist/btp/btp-types.d.ts.map +1 -0
  25. package/dist/btp/btp-types.js +44 -0
  26. package/dist/btp/btp-types.js.map +1 -0
  27. package/dist/cli/index.d.ts +3 -0
  28. package/dist/cli/index.d.ts.map +1 -0
  29. package/dist/cli/index.js +175 -0
  30. package/dist/cli/index.js.map +1 -0
  31. package/dist/cli/onboarding-wizard.d.ts +7 -0
  32. package/dist/cli/onboarding-wizard.d.ts.map +1 -0
  33. package/dist/cli/onboarding-wizard.js +257 -0
  34. package/dist/cli/onboarding-wizard.js.map +1 -0
  35. package/dist/cli/types.d.ts +38 -0
  36. package/dist/cli/types.d.ts.map +1 -0
  37. package/dist/cli/types.js +3 -0
  38. package/dist/cli/types.js.map +1 -0
  39. package/dist/config/aptos-env-validator.d.ts +8 -0
  40. package/dist/config/aptos-env-validator.d.ts.map +1 -0
  41. package/dist/config/aptos-env-validator.js +25 -0
  42. package/dist/config/aptos-env-validator.js.map +1 -0
  43. package/dist/config/config-loader.d.ts +20 -0
  44. package/dist/config/config-loader.d.ts.map +1 -0
  45. package/dist/config/config-loader.js +269 -0
  46. package/dist/config/config-loader.js.map +1 -0
  47. package/dist/config/environment-validator.d.ts +4 -0
  48. package/dist/config/environment-validator.d.ts.map +1 -0
  49. package/dist/config/environment-validator.js +239 -0
  50. package/dist/config/environment-validator.js.map +1 -0
  51. package/dist/config/index.d.ts +2 -0
  52. package/dist/config/index.d.ts.map +1 -0
  53. package/dist/config/index.js +7 -0
  54. package/dist/config/index.js.map +1 -0
  55. package/dist/config/key-manager-config.d.ts +7 -0
  56. package/dist/config/key-manager-config.d.ts.map +1 -0
  57. package/dist/config/key-manager-config.js +209 -0
  58. package/dist/config/key-manager-config.js.map +1 -0
  59. package/dist/config/topology-validator.d.ts +14 -0
  60. package/dist/config/topology-validator.d.ts.map +1 -0
  61. package/dist/config/topology-validator.js +142 -0
  62. package/dist/config/topology-validator.js.map +1 -0
  63. package/dist/config/types.d.ts +210 -0
  64. package/dist/config/types.d.ts.map +1 -0
  65. package/dist/config/types.js +10 -0
  66. package/dist/config/types.js.map +1 -0
  67. package/dist/core/connector-node.d.ts +79 -0
  68. package/dist/core/connector-node.d.ts.map +1 -0
  69. package/dist/core/connector-node.js +1036 -0
  70. package/dist/core/connector-node.js.map +1 -0
  71. package/dist/core/local-delivery-client.d.ts +16 -0
  72. package/dist/core/local-delivery-client.d.ts.map +1 -0
  73. package/dist/core/local-delivery-client.js +176 -0
  74. package/dist/core/local-delivery-client.js.map +1 -0
  75. package/dist/core/packet-handler.d.ts +45 -0
  76. package/dist/core/packet-handler.d.ts.map +1 -0
  77. package/dist/core/packet-handler.js +606 -0
  78. package/dist/core/packet-handler.js.map +1 -0
  79. package/dist/core/payment-handler.d.ts +27 -0
  80. package/dist/core/payment-handler.d.ts.map +1 -0
  81. package/dist/core/payment-handler.js +115 -0
  82. package/dist/core/payment-handler.js.map +1 -0
  83. package/dist/discovery/index.d.ts +3 -0
  84. package/dist/discovery/index.d.ts.map +1 -0
  85. package/dist/discovery/index.js +6 -0
  86. package/dist/discovery/index.js.map +1 -0
  87. package/dist/discovery/peer-discovery-service.d.ts +29 -0
  88. package/dist/discovery/peer-discovery-service.d.ts.map +1 -0
  89. package/dist/discovery/peer-discovery-service.js +230 -0
  90. package/dist/discovery/peer-discovery-service.js.map +1 -0
  91. package/dist/discovery/types.d.ts +38 -0
  92. package/dist/discovery/types.d.ts.map +1 -0
  93. package/dist/discovery/types.js +3 -0
  94. package/dist/discovery/types.js.map +1 -0
  95. package/dist/encoding/oer-parser.d.ts +39 -0
  96. package/dist/encoding/oer-parser.d.ts.map +1 -0
  97. package/dist/encoding/oer-parser.js +154 -0
  98. package/dist/encoding/oer-parser.js.map +1 -0
  99. package/dist/explorer-ui/assets/EventDetailPanel-CnSaMk3V.js +6 -0
  100. package/dist/explorer-ui/assets/FilterBar-BEmAzBku.js +26 -0
  101. package/dist/explorer-ui/assets/chevron-right-BUT9VhYe.js +11 -0
  102. package/dist/explorer-ui/assets/index-BZ2INVgy.js +360 -0
  103. package/dist/explorer-ui/assets/index-Cemh6svI.css +1 -0
  104. package/dist/explorer-ui/index.html +14 -0
  105. package/dist/explorer-ui/vite.svg +1 -0
  106. package/dist/facilitator/index.d.ts +2 -0
  107. package/dist/facilitator/index.d.ts.map +1 -0
  108. package/dist/facilitator/index.js +7 -0
  109. package/dist/facilitator/index.js.map +1 -0
  110. package/dist/facilitator/spsp-client.d.ts +18 -0
  111. package/dist/facilitator/spsp-client.d.ts.map +1 -0
  112. package/dist/facilitator/spsp-client.js +95 -0
  113. package/dist/facilitator/spsp-client.js.map +1 -0
  114. package/dist/http/admin-api.d.ts +123 -0
  115. package/dist/http/admin-api.d.ts.map +1 -0
  116. package/dist/http/admin-api.js +1057 -0
  117. package/dist/http/admin-api.js.map +1 -0
  118. package/dist/http/admin-server.d.ts +41 -0
  119. package/dist/http/admin-server.d.ts.map +1 -0
  120. package/dist/http/admin-server.js +156 -0
  121. package/dist/http/admin-server.js.map +1 -0
  122. package/dist/http/health-server.d.ts +22 -0
  123. package/dist/http/health-server.d.ts.map +1 -0
  124. package/dist/http/health-server.js +192 -0
  125. package/dist/http/health-server.js.map +1 -0
  126. package/dist/http/ilp-send-handler.d.ts +19 -0
  127. package/dist/http/ilp-send-handler.d.ts.map +1 -0
  128. package/dist/http/ilp-send-handler.js +162 -0
  129. package/dist/http/ilp-send-handler.js.map +1 -0
  130. package/dist/http/types.d.ts +39 -0
  131. package/dist/http/types.d.ts.map +1 -0
  132. package/dist/http/types.js +3 -0
  133. package/dist/http/types.js.map +1 -0
  134. package/dist/index.d.ts +2 -0
  135. package/dist/index.d.ts.map +1 -0
  136. package/dist/index.js +5 -0
  137. package/dist/index.js.map +1 -0
  138. package/dist/lib.d.ts +22 -0
  139. package/dist/lib.d.ts.map +1 -0
  140. package/dist/lib.js +41 -0
  141. package/dist/lib.js.map +1 -0
  142. package/dist/main.d.ts +4 -0
  143. package/dist/main.d.ts.map +1 -0
  144. package/dist/main.js +79 -0
  145. package/dist/main.js.map +1 -0
  146. package/dist/routing/packet-processor.d.ts +36 -0
  147. package/dist/routing/packet-processor.d.ts.map +1 -0
  148. package/dist/routing/packet-processor.js +112 -0
  149. package/dist/routing/packet-processor.js.map +1 -0
  150. package/dist/routing/packet-worker.d.ts +10 -0
  151. package/dist/routing/packet-worker.d.ts.map +1 -0
  152. package/dist/routing/packet-worker.js +34 -0
  153. package/dist/routing/packet-worker.js.map +1 -0
  154. package/dist/routing/routing-table.d.ts +15 -0
  155. package/dist/routing/routing-table.d.ts.map +1 -0
  156. package/dist/routing/routing-table.js +63 -0
  157. package/dist/routing/routing-table.js.map +1 -0
  158. package/dist/routing/worker-pool.d.ts +43 -0
  159. package/dist/routing/worker-pool.d.ts.map +1 -0
  160. package/dist/routing/worker-pool.js +228 -0
  161. package/dist/routing/worker-pool.js.map +1 -0
  162. package/dist/security/alert-notifier.d.ts +34 -0
  163. package/dist/security/alert-notifier.d.ts.map +1 -0
  164. package/dist/security/alert-notifier.js +136 -0
  165. package/dist/security/alert-notifier.js.map +1 -0
  166. package/dist/security/audit-logger.d.ts +34 -0
  167. package/dist/security/audit-logger.d.ts.map +1 -0
  168. package/dist/security/audit-logger.js +132 -0
  169. package/dist/security/audit-logger.js.map +1 -0
  170. package/dist/security/backends/aws-kms-backend.d.ts +18 -0
  171. package/dist/security/backends/aws-kms-backend.d.ts.map +1 -0
  172. package/dist/security/backends/aws-kms-backend.js +130 -0
  173. package/dist/security/backends/aws-kms-backend.js.map +1 -0
  174. package/dist/security/backends/azure-kv-backend.d.ts +17 -0
  175. package/dist/security/backends/azure-kv-backend.d.ts.map +1 -0
  176. package/dist/security/backends/azure-kv-backend.js +121 -0
  177. package/dist/security/backends/azure-kv-backend.js.map +1 -0
  178. package/dist/security/backends/environment-backend.d.ts +15 -0
  179. package/dist/security/backends/environment-backend.d.ts.map +1 -0
  180. package/dist/security/backends/environment-backend.js +56 -0
  181. package/dist/security/backends/environment-backend.js.map +1 -0
  182. package/dist/security/backends/gcp-kms-backend.d.ts +17 -0
  183. package/dist/security/backends/gcp-kms-backend.d.ts.map +1 -0
  184. package/dist/security/backends/gcp-kms-backend.js +110 -0
  185. package/dist/security/backends/gcp-kms-backend.js.map +1 -0
  186. package/dist/security/backends/hsm-backend.d.ts +18 -0
  187. package/dist/security/backends/hsm-backend.d.ts.map +1 -0
  188. package/dist/security/backends/hsm-backend.js +187 -0
  189. package/dist/security/backends/hsm-backend.js.map +1 -0
  190. package/dist/security/fraud-detector.d.ts +79 -0
  191. package/dist/security/fraud-detector.d.ts.map +1 -0
  192. package/dist/security/fraud-detector.js +147 -0
  193. package/dist/security/fraud-detector.js.map +1 -0
  194. package/dist/security/key-manager-signer.d.ts +15 -0
  195. package/dist/security/key-manager-signer.d.ts.map +1 -0
  196. package/dist/security/key-manager-signer.js +91 -0
  197. package/dist/security/key-manager-signer.js.map +1 -0
  198. package/dist/security/key-manager.d.ts +69 -0
  199. package/dist/security/key-manager.d.ts.map +1 -0
  200. package/dist/security/key-manager.js +79 -0
  201. package/dist/security/key-manager.js.map +1 -0
  202. package/dist/security/key-rotation-manager.d.ts +27 -0
  203. package/dist/security/key-rotation-manager.d.ts.map +1 -0
  204. package/dist/security/key-rotation-manager.js +142 -0
  205. package/dist/security/key-rotation-manager.js.map +1 -0
  206. package/dist/security/rate-limit-config.d.ts +7 -0
  207. package/dist/security/rate-limit-config.d.ts.map +1 -0
  208. package/dist/security/rate-limit-config.js +57 -0
  209. package/dist/security/rate-limit-config.js.map +1 -0
  210. package/dist/security/rate-limiter.d.ts +46 -0
  211. package/dist/security/rate-limiter.d.ts.map +1 -0
  212. package/dist/security/rate-limiter.js +170 -0
  213. package/dist/security/rate-limiter.js.map +1 -0
  214. package/dist/security/reputation-tracker.d.ts +30 -0
  215. package/dist/security/reputation-tracker.d.ts.map +1 -0
  216. package/dist/security/reputation-tracker.js +111 -0
  217. package/dist/security/reputation-tracker.js.map +1 -0
  218. package/dist/security/rules/balance-manipulation-rule.d.ts +23 -0
  219. package/dist/security/rules/balance-manipulation-rule.d.ts.map +1 -0
  220. package/dist/security/rules/balance-manipulation-rule.js +70 -0
  221. package/dist/security/rules/balance-manipulation-rule.js.map +1 -0
  222. package/dist/security/rules/double-spend-detection-rule.d.ts +23 -0
  223. package/dist/security/rules/double-spend-detection-rule.d.ts.map +1 -0
  224. package/dist/security/rules/double-spend-detection-rule.js +61 -0
  225. package/dist/security/rules/double-spend-detection-rule.js.map +1 -0
  226. package/dist/security/rules/rapid-channel-closure-rule.d.ts +16 -0
  227. package/dist/security/rules/rapid-channel-closure-rule.d.ts.map +1 -0
  228. package/dist/security/rules/rapid-channel-closure-rule.js +57 -0
  229. package/dist/security/rules/rapid-channel-closure-rule.js.map +1 -0
  230. package/dist/security/rules/sudden-traffic-spike-rule.d.ts +18 -0
  231. package/dist/security/rules/sudden-traffic-spike-rule.d.ts.map +1 -0
  232. package/dist/security/rules/sudden-traffic-spike-rule.js +92 -0
  233. package/dist/security/rules/sudden-traffic-spike-rule.js.map +1 -0
  234. package/dist/security/rules/unusual-settlement-amount-rule.d.ts +12 -0
  235. package/dist/security/rules/unusual-settlement-amount-rule.d.ts.map +1 -0
  236. package/dist/security/rules/unusual-settlement-amount-rule.js +33 -0
  237. package/dist/security/rules/unusual-settlement-amount-rule.js.map +1 -0
  238. package/dist/security/token-bucket.d.ts +16 -0
  239. package/dist/security/token-bucket.d.ts.map +1 -0
  240. package/dist/security/token-bucket.js +49 -0
  241. package/dist/security/token-bucket.js.map +1 -0
  242. package/dist/security/violation-counter.d.ts +11 -0
  243. package/dist/security/violation-counter.d.ts.map +1 -0
  244. package/dist/security/violation-counter.js +61 -0
  245. package/dist/security/violation-counter.js.map +1 -0
  246. package/dist/settlement/account-id-generator.d.ts +4 -0
  247. package/dist/settlement/account-id-generator.d.ts.map +1 -0
  248. package/dist/settlement/account-id-generator.js +38 -0
  249. package/dist/settlement/account-id-generator.js.map +1 -0
  250. package/dist/settlement/account-manager.d.ts +47 -0
  251. package/dist/settlement/account-manager.d.ts.map +1 -0
  252. package/dist/settlement/account-manager.js +447 -0
  253. package/dist/settlement/account-manager.js.map +1 -0
  254. package/dist/settlement/account-metadata.d.ts +11 -0
  255. package/dist/settlement/account-metadata.d.ts.map +1 -0
  256. package/dist/settlement/account-metadata.js +40 -0
  257. package/dist/settlement/account-metadata.js.map +1 -0
  258. package/dist/settlement/aptos-channel-sdk.d.ts +66 -0
  259. package/dist/settlement/aptos-channel-sdk.d.ts.map +1 -0
  260. package/dist/settlement/aptos-channel-sdk.js +274 -0
  261. package/dist/settlement/aptos-channel-sdk.js.map +1 -0
  262. package/dist/settlement/aptos-claim-signer.d.ts +57 -0
  263. package/dist/settlement/aptos-claim-signer.d.ts.map +1 -0
  264. package/dist/settlement/aptos-claim-signer.js +200 -0
  265. package/dist/settlement/aptos-claim-signer.js.map +1 -0
  266. package/dist/settlement/aptos-client.d.ts +99 -0
  267. package/dist/settlement/aptos-client.d.ts.map +1 -0
  268. package/dist/settlement/aptos-client.js +474 -0
  269. package/dist/settlement/aptos-client.js.map +1 -0
  270. package/dist/settlement/channel-manager.d.ts +66 -0
  271. package/dist/settlement/channel-manager.d.ts.map +1 -0
  272. package/dist/settlement/channel-manager.js +214 -0
  273. package/dist/settlement/channel-manager.js.map +1 -0
  274. package/dist/settlement/claim-receiver-db-schema.d.ts +4 -0
  275. package/dist/settlement/claim-receiver-db-schema.d.ts.map +1 -0
  276. package/dist/settlement/claim-receiver-db-schema.js +25 -0
  277. package/dist/settlement/claim-receiver-db-schema.js.map +1 -0
  278. package/dist/settlement/claim-receiver.d.ts +31 -0
  279. package/dist/settlement/claim-receiver.d.ts.map +1 -0
  280. package/dist/settlement/claim-receiver.js +228 -0
  281. package/dist/settlement/claim-receiver.js.map +1 -0
  282. package/dist/settlement/claim-redemption-service.d.ts +39 -0
  283. package/dist/settlement/claim-redemption-service.d.ts.map +1 -0
  284. package/dist/settlement/claim-redemption-service.js +189 -0
  285. package/dist/settlement/claim-redemption-service.js.map +1 -0
  286. package/dist/settlement/claim-sender-db-schema.d.ts +3 -0
  287. package/dist/settlement/claim-sender-db-schema.d.ts.map +1 -0
  288. package/dist/settlement/claim-sender-db-schema.js +18 -0
  289. package/dist/settlement/claim-sender-db-schema.js.map +1 -0
  290. package/dist/settlement/claim-sender.d.ts +22 -0
  291. package/dist/settlement/claim-sender.d.ts.map +1 -0
  292. package/dist/settlement/claim-sender.js +108 -0
  293. package/dist/settlement/claim-sender.js.map +1 -0
  294. package/dist/settlement/eip712-helper.d.ts +13 -0
  295. package/dist/settlement/eip712-helper.d.ts.map +1 -0
  296. package/dist/settlement/eip712-helper.js +24 -0
  297. package/dist/settlement/eip712-helper.js.map +1 -0
  298. package/dist/settlement/in-memory-ledger-client.d.ts +40 -0
  299. package/dist/settlement/in-memory-ledger-client.d.ts.map +1 -0
  300. package/dist/settlement/in-memory-ledger-client.js +177 -0
  301. package/dist/settlement/in-memory-ledger-client.js.map +1 -0
  302. package/dist/settlement/ledger-client.d.ts +22 -0
  303. package/dist/settlement/ledger-client.d.ts.map +1 -0
  304. package/dist/settlement/ledger-client.js +3 -0
  305. package/dist/settlement/ledger-client.js.map +1 -0
  306. package/dist/settlement/metrics-collector.d.ts +29 -0
  307. package/dist/settlement/metrics-collector.d.ts.map +1 -0
  308. package/dist/settlement/metrics-collector.js +81 -0
  309. package/dist/settlement/metrics-collector.js.map +1 -0
  310. package/dist/settlement/payment-channel-sdk.d.ts +59 -0
  311. package/dist/settlement/payment-channel-sdk.d.ts.map +1 -0
  312. package/dist/settlement/payment-channel-sdk.js +677 -0
  313. package/dist/settlement/payment-channel-sdk.js.map +1 -0
  314. package/dist/settlement/per-packet-claim-service.d.ts +33 -0
  315. package/dist/settlement/per-packet-claim-service.d.ts.map +1 -0
  316. package/dist/settlement/per-packet-claim-service.js +177 -0
  317. package/dist/settlement/per-packet-claim-service.js.map +1 -0
  318. package/dist/settlement/settlement-api.d.ts +37 -0
  319. package/dist/settlement/settlement-api.d.ts.map +1 -0
  320. package/dist/settlement/settlement-api.js +172 -0
  321. package/dist/settlement/settlement-api.js.map +1 -0
  322. package/dist/settlement/settlement-coordinator.d.ts +47 -0
  323. package/dist/settlement/settlement-coordinator.d.ts.map +1 -0
  324. package/dist/settlement/settlement-coordinator.js +166 -0
  325. package/dist/settlement/settlement-coordinator.js.map +1 -0
  326. package/dist/settlement/settlement-executor.d.ts +44 -0
  327. package/dist/settlement/settlement-executor.d.ts.map +1 -0
  328. package/dist/settlement/settlement-executor.js +247 -0
  329. package/dist/settlement/settlement-executor.js.map +1 -0
  330. package/dist/settlement/settlement-monitor.d.ts +29 -0
  331. package/dist/settlement/settlement-monitor.d.ts.map +1 -0
  332. package/dist/settlement/settlement-monitor.js +172 -0
  333. package/dist/settlement/settlement-monitor.js.map +1 -0
  334. package/dist/settlement/tigerbeetle-batch-writer.d.ts +58 -0
  335. package/dist/settlement/tigerbeetle-batch-writer.d.ts.map +1 -0
  336. package/dist/settlement/tigerbeetle-batch-writer.js +162 -0
  337. package/dist/settlement/tigerbeetle-batch-writer.js.map +1 -0
  338. package/dist/settlement/tigerbeetle-client.d.ts +40 -0
  339. package/dist/settlement/tigerbeetle-client.d.ts.map +1 -0
  340. package/dist/settlement/tigerbeetle-client.js +279 -0
  341. package/dist/settlement/tigerbeetle-client.js.map +1 -0
  342. package/dist/settlement/tigerbeetle-errors.d.ts +23 -0
  343. package/dist/settlement/tigerbeetle-errors.d.ts.map +1 -0
  344. package/dist/settlement/tigerbeetle-errors.js +58 -0
  345. package/dist/settlement/tigerbeetle-errors.js.map +1 -0
  346. package/dist/settlement/types.d.ts +64 -0
  347. package/dist/settlement/types.d.ts.map +1 -0
  348. package/dist/settlement/types.js +42 -0
  349. package/dist/settlement/types.js.map +1 -0
  350. package/dist/settlement/unified-settlement-executor.d.ts +34 -0
  351. package/dist/settlement/unified-settlement-executor.d.ts.map +1 -0
  352. package/dist/settlement/unified-settlement-executor.js +145 -0
  353. package/dist/settlement/unified-settlement-executor.js.map +1 -0
  354. package/dist/settlement/xrp-channel-lifecycle.d.ts +41 -0
  355. package/dist/settlement/xrp-channel-lifecycle.d.ts.map +1 -0
  356. package/dist/settlement/xrp-channel-lifecycle.js +142 -0
  357. package/dist/settlement/xrp-channel-lifecycle.js.map +1 -0
  358. package/dist/settlement/xrp-channel-manager.d.ts +59 -0
  359. package/dist/settlement/xrp-channel-manager.d.ts.map +1 -0
  360. package/dist/settlement/xrp-channel-manager.js +160 -0
  361. package/dist/settlement/xrp-channel-manager.js.map +1 -0
  362. package/dist/settlement/xrp-channel-sdk.d.ts +30 -0
  363. package/dist/settlement/xrp-channel-sdk.d.ts.map +1 -0
  364. package/dist/settlement/xrp-channel-sdk.js +164 -0
  365. package/dist/settlement/xrp-channel-sdk.js.map +1 -0
  366. package/dist/settlement/xrp-claim-signer.d.ts +22 -0
  367. package/dist/settlement/xrp-claim-signer.d.ts.map +1 -0
  368. package/dist/settlement/xrp-claim-signer.js +122 -0
  369. package/dist/settlement/xrp-claim-signer.js.map +1 -0
  370. package/dist/settlement/xrpl-client.d.ts +104 -0
  371. package/dist/settlement/xrpl-client.d.ts.map +1 -0
  372. package/dist/settlement/xrpl-client.js +304 -0
  373. package/dist/settlement/xrpl-client.js.map +1 -0
  374. package/dist/test/testnet-config.d.ts +58 -0
  375. package/dist/test/testnet-config.d.ts.map +1 -0
  376. package/dist/test/testnet-config.js +89 -0
  377. package/dist/test/testnet-config.js.map +1 -0
  378. package/dist/test-utils/index.d.ts +3 -0
  379. package/dist/test-utils/index.d.ts.map +1 -0
  380. package/dist/test-utils/index.js +15 -0
  381. package/dist/test-utils/index.js.map +1 -0
  382. package/dist/test-utils/isolated-test-env.d.ts +31 -0
  383. package/dist/test-utils/isolated-test-env.d.ts.map +1 -0
  384. package/dist/test-utils/isolated-test-env.js +127 -0
  385. package/dist/test-utils/isolated-test-env.js.map +1 -0
  386. package/dist/test-utils/mock-factories-patch.d.ts +2 -0
  387. package/dist/test-utils/mock-factories-patch.d.ts.map +1 -0
  388. package/dist/test-utils/mock-factories-patch.js +3 -0
  389. package/dist/test-utils/mock-factories-patch.js.map +1 -0
  390. package/dist/test-utils/mock-factories.d.ts +22 -0
  391. package/dist/test-utils/mock-factories.d.ts.map +1 -0
  392. package/dist/test-utils/mock-factories.js +56 -0
  393. package/dist/test-utils/mock-factories.js.map +1 -0
  394. package/dist/utils/connection-pool.d.ts +42 -0
  395. package/dist/utils/connection-pool.d.ts.map +1 -0
  396. package/dist/utils/connection-pool.js +209 -0
  397. package/dist/utils/connection-pool.js.map +1 -0
  398. package/dist/utils/evm-rpc-connection-pool.d.ts +8 -0
  399. package/dist/utils/evm-rpc-connection-pool.d.ts.map +1 -0
  400. package/dist/utils/evm-rpc-connection-pool.js +40 -0
  401. package/dist/utils/evm-rpc-connection-pool.js.map +1 -0
  402. package/dist/utils/logger.d.ts +6 -0
  403. package/dist/utils/logger.d.ts.map +1 -0
  404. package/dist/utils/logger.js +58 -0
  405. package/dist/utils/logger.js.map +1 -0
  406. package/dist/utils/optional-require.d.ts +2 -0
  407. package/dist/utils/optional-require.d.ts.map +1 -0
  408. package/dist/utils/optional-require.js +54 -0
  409. package/dist/utils/optional-require.js.map +1 -0
  410. package/dist/utils/xrp-wss-connection-pool.d.ts +8 -0
  411. package/dist/utils/xrp-wss-connection-pool.d.ts.map +1 -0
  412. package/dist/utils/xrp-wss-connection-pool.js +42 -0
  413. package/dist/utils/xrp-wss-connection-pool.js.map +1 -0
  414. package/dist/wallet/audit-logger.d.ts +22 -0
  415. package/dist/wallet/audit-logger.d.ts.map +1 -0
  416. package/dist/wallet/audit-logger.js +120 -0
  417. package/dist/wallet/audit-logger.js.map +1 -0
  418. package/dist/wallet/fraud-detector-interface.d.ts +14 -0
  419. package/dist/wallet/fraud-detector-interface.d.ts.map +1 -0
  420. package/dist/wallet/fraud-detector-interface.js +3 -0
  421. package/dist/wallet/fraud-detector-interface.js.map +1 -0
  422. package/dist/wallet/key-manager.d.ts +6 -0
  423. package/dist/wallet/key-manager.d.ts.map +1 -0
  424. package/dist/wallet/key-manager.js +3 -0
  425. package/dist/wallet/key-manager.js.map +1 -0
  426. package/dist/wallet/placeholder-fraud-detector.d.ts +10 -0
  427. package/dist/wallet/placeholder-fraud-detector.d.ts.map +1 -0
  428. package/dist/wallet/placeholder-fraud-detector.js +10 -0
  429. package/dist/wallet/placeholder-fraud-detector.js.map +1 -0
  430. package/dist/wallet/rate-limiter.d.ts +26 -0
  431. package/dist/wallet/rate-limiter.d.ts.map +1 -0
  432. package/dist/wallet/rate-limiter.js +114 -0
  433. package/dist/wallet/rate-limiter.js.map +1 -0
  434. package/dist/wallet/suspicious-activity-detector.d.ts +25 -0
  435. package/dist/wallet/suspicious-activity-detector.d.ts.map +1 -0
  436. package/dist/wallet/suspicious-activity-detector.js +97 -0
  437. package/dist/wallet/suspicious-activity-detector.js.map +1 -0
  438. package/dist/wallet/treasury-wallet.d.ts +20 -0
  439. package/dist/wallet/treasury-wallet.d.ts.map +1 -0
  440. package/dist/wallet/treasury-wallet.js +151 -0
  441. package/dist/wallet/treasury-wallet.js.map +1 -0
  442. package/dist/wallet/wallet-authentication.d.ts +31 -0
  443. package/dist/wallet/wallet-authentication.d.ts.map +1 -0
  444. package/dist/wallet/wallet-authentication.js +102 -0
  445. package/dist/wallet/wallet-authentication.js.map +1 -0
  446. package/dist/wallet/wallet-db-schema.d.ts +11 -0
  447. package/dist/wallet/wallet-db-schema.d.ts.map +1 -0
  448. package/dist/wallet/wallet-db-schema.js +79 -0
  449. package/dist/wallet/wallet-db-schema.js.map +1 -0
  450. package/dist/wallet/wallet-security.d.ts +58 -0
  451. package/dist/wallet/wallet-security.d.ts.map +1 -0
  452. package/dist/wallet/wallet-security.js +148 -0
  453. package/dist/wallet/wallet-security.js.map +1 -0
  454. package/dist/wallet/wallet-seed-manager.d.ts +65 -0
  455. package/dist/wallet/wallet-seed-manager.d.ts.map +1 -0
  456. package/dist/wallet/wallet-seed-manager.js +418 -0
  457. package/dist/wallet/wallet-seed-manager.js.map +1 -0
  458. package/package.json +134 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 M2M Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,421 @@
1
+ # @toon-protocol/connector
2
+
3
+ [![npm](https://img.shields.io/npm/v/@toon-protocol/connector)](https://www.npmjs.com/package/@toon-protocol/connector)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](../../LICENSE)
5
+
6
+ > ILP connector node for AI agent payment networks. Routes packets, tracks balances, settles on-chain.
7
+
8
+ See the [root README](../../README.md) for conceptual overview, network architecture, and Docker deployment.
9
+
10
+ ## Install
11
+
12
+ ```bash
13
+ npm install @toon-protocol/connector
14
+ ```
15
+
16
+ ## Quick Start
17
+
18
+ ```typescript
19
+ import { ConnectorNode, createLogger } from '@toon-protocol/connector';
20
+
21
+ const node = new ConnectorNode('config.yaml', createLogger('my-agent', 'info'));
22
+
23
+ node.setPacketHandler(async (request) => {
24
+ console.log(`Received ${request.amount} tokens`);
25
+ return { accept: true };
26
+ });
27
+
28
+ await node.start();
29
+ ```
30
+
31
+ ## Deployment Modes
32
+
33
+ The connector supports two deployment modes via `deploymentMode` in config:
34
+
35
+ | Mode | Value | How packets arrive | How packets are sent |
36
+ | -------------- | -------------- | ----------------------------- | ------------------------------ |
37
+ | **Embedded** | `'embedded'` | `setPacketHandler()` callback | `node.sendPacket()` |
38
+ | **Standalone** | `'standalone'` | HTTP POST to BLS `handlerUrl` | HTTP POST to `/admin/ilp/send` |
39
+
40
+ When `deploymentMode` is omitted, it is inferred from `localDelivery` and `adminApi` flags.
41
+
42
+ ### Embedded Mode (Recommended for Libraries)
43
+
44
+ Pass a `ConnectorConfig` object directly for programmatic usage:
45
+
46
+ ```typescript
47
+ import { ConnectorNode } from '@toon-protocol/connector';
48
+ import type { ConnectorConfig } from '@toon-protocol/connector';
49
+ import pino from 'pino';
50
+
51
+ const config: ConnectorConfig = {
52
+ nodeId: 'connector-a',
53
+ btpServerPort: 4000,
54
+ healthCheckPort: 8080,
55
+ deploymentMode: 'embedded',
56
+ adminApi: { enabled: false },
57
+ localDelivery: { enabled: false },
58
+ peers: [],
59
+ routes: [],
60
+ environment: 'production',
61
+ };
62
+
63
+ const node = new ConnectorNode(config, pino({ name: 'connector-a' }));
64
+
65
+ node.setPacketHandler(async (request) => {
66
+ if (request.isTransit) {
67
+ // Transit notification (fire-and-forget at intermediate hops)
68
+ console.log(`Transit: ${request.amount} tokens → ${request.destination}`);
69
+ return { accept: true };
70
+ }
71
+ // Final-hop delivery
72
+ console.log(`Delivery: ${request.amount} tokens from ${request.sourcePeer}`);
73
+ return { accept: true };
74
+ });
75
+
76
+ await node.start();
77
+
78
+ // Register peers dynamically at runtime
79
+ await node.registerPeer({
80
+ id: 'connector-b',
81
+ url: 'ws://localhost:4001',
82
+ authToken: '',
83
+ routes: [{ prefix: 'g.connector-b' }],
84
+ evmAddress: '0xConnectorBAddress...', // peer's EVM settlement address
85
+ });
86
+
87
+ // Send a packet
88
+ await node.sendPacket({
89
+ destination: 'g.connector-b.agent',
90
+ amount: 1000n,
91
+ executionCondition: Buffer.alloc(32),
92
+ expiresAt: new Date(Date.now() + 30000),
93
+ data: Buffer.from('Hello'),
94
+ });
95
+ ```
96
+
97
+ ### Standalone Mode
98
+
99
+ For separate-process deployments, configure `localDelivery` and `adminApi`:
100
+
101
+ ```yaml
102
+ nodeId: my-connector
103
+ btpServerPort: 3000
104
+ healthCheckPort: 8080
105
+ deploymentMode: standalone
106
+ environment: production
107
+
108
+ localDelivery:
109
+ enabled: true
110
+ handlerUrl: http://my-bls:3100
111
+ timeout: 5000
112
+
113
+ adminApi:
114
+ enabled: true
115
+ port: 8081
116
+ apiKey: ${ADMIN_API_KEY}
117
+
118
+ peers:
119
+ - id: peer-b
120
+ url: ws://peer-b:3001
121
+ authToken: ''
122
+ ```
123
+
124
+ ## ConnectorConfig Reference
125
+
126
+ The constructor accepts either a YAML file path or a `ConnectorConfig` object:
127
+
128
+ ```typescript
129
+ const node = new ConnectorNode(config: ConnectorConfig | string, logger: Logger);
130
+ ```
131
+
132
+ ### Required Fields
133
+
134
+ | Field | Type | Description |
135
+ | --------------- | --------------- | ------------------------------------------------ |
136
+ | `nodeId` | `string` | Unique identifier for this connector |
137
+ | `btpServerPort` | `number` | Port for BTP WebSocket server |
138
+ | `peers` | `PeerConfig[]` | Peer connector definitions |
139
+ | `routes` | `RouteConfig[]` | Routing table entries |
140
+ | `environment` | `Environment` | `'development'` \| `'staging'` \| `'production'` |
141
+
142
+ ### Optional Fields
143
+
144
+ | Field | Type | Default | Description |
145
+ | ----------------- | ----------------------- | ------------- | ---------------------------------------------- |
146
+ | `deploymentMode` | `DeploymentMode` | inferred | `'embedded'` \| `'standalone'` |
147
+ | `healthCheckPort` | `number` | `8080` | HTTP health endpoint port |
148
+ | `logLevel` | `string` | `'info'` | `'debug'` \| `'info'` \| `'warn'` \| `'error'` |
149
+ | `adminApi` | `AdminApiConfig` | disabled | Admin REST API settings |
150
+ | `localDelivery` | `LocalDeliveryConfig` | disabled | HTTP forwarding to BLS |
151
+ | `settlement` | `SettlementConfig` | — | TigerBeetle accounting config |
152
+ | `settlementInfra` | `SettlementInfraConfig` | — | EVM settlement infrastructure |
153
+ | `blockchain` | `BlockchainConfig` | — | Multi-chain EVM config (Base, Arbitrum) |
154
+ | `security` | `SecurityConfig` | — | Key management backend |
155
+ | `performance` | `PerformanceConfig` | — | Batching, pooling, parallelization |
156
+ | `explorer` | `ExplorerConfig` | enabled:3001 | Explorer UI settings |
157
+ | `mode` | `string` | `'connector'` | `'connector'` \| `'gateway'` |
158
+
159
+ ### PeerConfig
160
+
161
+ ```typescript
162
+ interface PeerConfig {
163
+ id: string; // Unique peer identifier (referenced by routes)
164
+ url: string; // WebSocket URL: ws://host:port or wss://host:port
165
+ authToken: string; // Shared secret (empty string for permissionless)
166
+ evmAddress?: string; // Peer's EVM address for settlement
167
+ }
168
+ ```
169
+
170
+ ### RouteConfig
171
+
172
+ ```typescript
173
+ interface RouteConfig {
174
+ prefix: string; // ILP address prefix (e.g., 'g.connector-b')
175
+ nextHop: string; // Peer ID to forward to
176
+ priority?: number; // Higher wins (default: 0)
177
+ }
178
+ ```
179
+
180
+ ## ConnectorNode Public API
181
+
182
+ ### Lifecycle
183
+
184
+ | Method | Returns | Description |
185
+ | --------- | --------------- | --------------------------------------------------- |
186
+ | `start()` | `Promise<void>` | Start BTP server, connect to peers, init settlement |
187
+ | `stop()` | `Promise<void>` | Graceful shutdown of all connections and servers |
188
+
189
+ ### Packet Handling
190
+
191
+ | Method | Returns | Description |
192
+ | ---------------------------------- | ---------------------------------------------- | -------------------------------------- |
193
+ | `setPacketHandler(handler)` | `void` | Register callback for incoming packets |
194
+ | `setLocalDeliveryHandler(handler)` | `void` | Register callback for local delivery |
195
+ | `sendPacket(params)` | `Promise<ILPFulfillPacket \| ILPRejectPacket>` | Send ILP Prepare packet |
196
+
197
+ ### Peer Management
198
+
199
+ | Method | Returns | Description |
200
+ | ----------------------------------- | --------------------------- | ------------------------ |
201
+ | `registerPeer(config)` | `Promise<PeerInfo>` | Add peer at runtime |
202
+ | `removePeer(peerId, removeRoutes?)` | `Promise<RemovePeerResult>` | Remove peer |
203
+ | `listPeers()` | `PeerInfo[]` | List all connected peers |
204
+
205
+ ### Routing
206
+
207
+ | Method | Returns | Description |
208
+ | -------------------------------------- | ------------- | ------------------ |
209
+ | `listRoutes()` | `RouteInfo[]` | List routing table |
210
+ | `addRoute(prefix, nextHop, priority?)` | — | Add a route |
211
+ | `removeRoute(prefix)` | — | Remove a route |
212
+
213
+ ### Balance & Settlement
214
+
215
+ | Method | Returns | Description |
216
+ | ----------------------------- | ----------------------------- | ------------------------- |
217
+ | `getBalance(peerId)` | `Promise<PeerAccountBalance>` | Query peer balances |
218
+ | `openChannel(peerId, amount)` | `Promise<void>` | Open EVM payment channel |
219
+ | `getChannelState(peerId)` | `Promise<...>` | Get payment channel state |
220
+
221
+ ### Mode Inspection
222
+
223
+ | Method | Returns | Description |
224
+ | --------------------- | ---------------- | -------------------------------------- |
225
+ | `getDeploymentMode()` | `DeploymentMode` | Returns `'embedded'` or `'standalone'` |
226
+ | `isEmbedded()` | `boolean` | Check if embedded mode |
227
+ | `isStandalone()` | `boolean` | Check if standalone mode |
228
+
229
+ ## BTP Authentication
230
+
231
+ ### Permissionless Networks (Default)
232
+
233
+ Default mode for open networks where security is at the ILP layer:
234
+
235
+ ```yaml
236
+ peers:
237
+ - id: peer-b
238
+ url: ws://peer-b:3001
239
+ authToken: '' # Empty = permissionless
240
+ ```
241
+
242
+ ### Private Networks
243
+
244
+ Disable permissionless mode and use shared secrets:
245
+
246
+ ```bash
247
+ BTP_ALLOW_NOAUTH=false
248
+ BTP_PEER_PEER_B_SECRET=secret-token
249
+ ```
250
+
251
+ ```yaml
252
+ peers:
253
+ - id: peer-b
254
+ url: ws://peer-b:3001
255
+ authToken: secret-token
256
+ ```
257
+
258
+ ## Per-Hop Notification
259
+
260
+ Intermediate connectors can fire non-blocking notifications to a BLS for transit packets:
261
+
262
+ ```yaml
263
+ localDelivery:
264
+ enabled: true
265
+ handlerUrl: http://my-bls:3100
266
+ perHopNotification: true
267
+ ```
268
+
269
+ | | Transit (`isTransit: true`) | Final-Hop (`isTransit` omitted) |
270
+ | ---------------- | --------------------------- | ---------------------------------- |
271
+ | **When** | Packet passing through | Packet addressed to this connector |
272
+ | **BLS response** | Ignored (fire-and-forget) | Drives ILP fulfill/reject |
273
+ | **Blocking** | No | Yes |
274
+ | **Use case** | Logging, analytics | Payment acceptance, business logic |
275
+
276
+ ## Accounting Backend
277
+
278
+ ### Default: In-Memory Ledger
279
+
280
+ Zero dependencies. Persists to JSON snapshots on disk.
281
+
282
+ | Variable | Default | Description |
283
+ | ---------------------------- | ----------------------------- | ------------------------- |
284
+ | `LEDGER_SNAPSHOT_PATH` | `./data/ledger-snapshot.json` | Snapshot file path |
285
+ | `LEDGER_PERSIST_INTERVAL_MS` | `30000` | Persistence interval (ms) |
286
+
287
+ ### Optional: TigerBeetle
288
+
289
+ High-performance double-entry accounting. Falls back to in-memory if connection fails.
290
+
291
+ | Variable | Required | Description |
292
+ | ------------------------ | -------- | --------------------------------- |
293
+ | `TIGERBEETLE_CLUSTER_ID` | Yes | TigerBeetle cluster identifier |
294
+ | `TIGERBEETLE_REPLICAS` | Yes | Comma-separated replica addresses |
295
+
296
+ ## Settlement Infrastructure
297
+
298
+ EVM payment channels on Base L2 (and optionally Arbitrum):
299
+
300
+ | Variable | Description |
301
+ | ----------------------------- | ------------------------------------------------------------- |
302
+ | `SETTLEMENT_ENABLED` | Enable automatic settlement (default: `true`) |
303
+ | `SETTLEMENT_THRESHOLD` | Balance threshold to trigger settlement |
304
+ | `SETTLEMENT_POLLING_INTERVAL` | Polling frequency in ms (default: `30000`) |
305
+ | `BASE_L2_RPC_URL` | Base L2 RPC endpoint |
306
+ | `EVM_PRIVATE_KEY` | Private key (dev only — use KMS in production) |
307
+ | `M2M_TOKEN_ADDRESS` | ERC-20 token contract |
308
+ | `TOKEN_NETWORK_REGISTRY` | Payment channel registry contract |
309
+ | `KEY_BACKEND` | Key management: `env` \| `aws-kms` \| `gcp-kms` \| `azure-kv` |
310
+ | `NETWORK_MODE` | Auto-configure chain settings: `testnet` \| `mainnet` |
311
+
312
+ ### Multi-Chain Support
313
+
314
+ Configure per-chain settings via `blockchain` config:
315
+
316
+ ```typescript
317
+ const config: ConnectorConfig = {
318
+ // ...
319
+ blockchain: {
320
+ base: {
321
+ enabled: true,
322
+ rpcUrl: 'https://mainnet.base.org',
323
+ chainId: 8453,
324
+ },
325
+ arbitrum: {
326
+ enabled: true,
327
+ rpcUrl: 'https://arb1.arbitrum.io/rpc',
328
+ chainId: 42161,
329
+ },
330
+ },
331
+ };
332
+ ```
333
+
334
+ ## Explorer UI
335
+
336
+ Built-in real-time dashboard for packet flow, balances, and settlement monitoring.
337
+
338
+ | Variable | Default | Description |
339
+ | ------------------------- | --------- | ------------------------ |
340
+ | `EXPLORER_ENABLED` | `true` | Enable/disable explorer |
341
+ | `EXPLORER_PORT` | `3001` | HTTP/WebSocket port |
342
+ | `EXPLORER_RETENTION_DAYS` | `7` | Event retention period |
343
+ | `EXPLORER_MAX_EVENTS` | `1000000` | Maximum events to retain |
344
+
345
+ **Endpoints:**
346
+
347
+ | Endpoint | Description |
348
+ | ----------------- | -------------------------------------------- |
349
+ | `GET /api/events` | Query historical events (supports filtering) |
350
+ | `GET /api/health` | Explorer health status |
351
+ | `WS /ws` | Real-time event streaming |
352
+
353
+ ## Admin API
354
+
355
+ REST endpoints for runtime peer/route management and ILP packet sending.
356
+
357
+ | Endpoint | Description |
358
+ | ------------------------------ | --------------------- |
359
+ | `GET /admin/peers` | List all peers |
360
+ | `POST /admin/peers` | Add a new peer |
361
+ | `DELETE /admin/peers/:peerId` | Remove a peer |
362
+ | `GET /admin/routes` | List routing table |
363
+ | `POST /admin/routes` | Add a route |
364
+ | `DELETE /admin/routes/:prefix` | Remove a route |
365
+ | `POST /admin/ilp/send` | Send ILP packet |
366
+ | `GET /admin/balances/:peerId` | Query peer balances |
367
+ | `GET /admin/channels` | List payment channels |
368
+ | `POST /admin/channels` | Open payment channel |
369
+
370
+ ### Security
371
+
372
+ | Variable | Description |
373
+ | ----------------------- | -------------------------------------------------------- |
374
+ | `ADMIN_API_KEY` | API key (required in production unless IP allowlist set) |
375
+ | `ADMIN_API_ALLOWED_IPS` | Comma-separated IPs/CIDRs |
376
+ | `ADMIN_API_TRUST_PROXY` | Trust `X-Forwarded-For` (default: `false`) |
377
+
378
+ ## CLI Commands
379
+
380
+ ```bash
381
+ npx connector setup # Interactive onboarding wizard
382
+ npx connector start -c config.yaml # Start connector
383
+ npx connector health -u http://localhost:8080 # Check health
384
+ npx connector validate config.yaml # Validate config file
385
+ ```
386
+
387
+ ## Exported API
388
+
389
+ **Classes:** `ConnectorNode`, `ConfigLoader`, `ConfigurationError`, `ConnectorNotStartedError`, `RoutingTable`, `PacketHandler`, `BTPServer`, `BTPClient`, `BTPClientManager`, `AdminServer`, `AccountManager`, `SettlementMonitor`, `UnifiedSettlementExecutor`, `IlpSendHandler`
390
+
391
+ **Types:** `ConnectorConfig`, `PeerConfig`, `RouteConfig`, `SettlementConfig`, `SettlementInfraConfig`, `LocalDeliveryConfig`, `LocalDeliveryHandler`, `LocalDeliveryRequest`, `LocalDeliveryResponse`, `SendPacketParams`, `PeerRegistrationRequest`, `PeerInfo`, `PeerAccountBalance`, `RouteInfo`, `RemovePeerResult`, `IlpSendRequest`, `IlpSendResponse`, `AdminSettlementConfig`, `ChannelOpenOptions`, `ChannelMetadata`, `PaymentRequest`, `PaymentResponse`, `PaymentHandler`, `PacketSenderFn`, `IsReadyFn`, `ILPPreparePacket`, `ILPFulfillPacket`, `ILPRejectPacket`
392
+
393
+ **Utilities:** `createLogger`, `createPaymentHandlerAdapter`, `computeFulfillmentFromData`, `computeConditionFromData`, `validateIlpSendRequest`, `generatePaymentId`, `mapRejectCode`, `validateResponseData`, `REJECT_CODE_MAP`
394
+
395
+ ## Package Structure
396
+
397
+ ```
398
+ src/
399
+ ├── core/ # ConnectorNode, PacketHandler, payment handler, local delivery
400
+ ├── btp/ # BTP server and client (WebSocket peers)
401
+ ├── routing/ # Routing table and prefix matching
402
+ ├── settlement/ # EVM settlement, payment channels, account manager
403
+ ├── http/ # Admin API, health endpoints, ILP send handler
404
+ ├── explorer/ # Embedded telemetry UI server and event store
405
+ ├── wallet/ # HD wallet derivation for EVM keys
406
+ ├── security/ # KMS integration (AWS, Azure, GCP)
407
+ ├── config/ # Configuration schema, loader, and validation
408
+ ├── cli/ # CLI commands (setup, start, health, validate)
409
+ └── utils/ # Logger, OER encoding
410
+ ```
411
+
412
+ ## Testing
413
+
414
+ ```bash
415
+ npm test # Unit tests
416
+ npm run test:acceptance # Acceptance tests
417
+ ```
418
+
419
+ ## License
420
+
421
+ MIT — see [LICENSE](../../LICENSE).
@@ -0,0 +1,30 @@
1
+ export type BlockchainType = 'evm';
2
+ export interface BaseClaimMessage {
3
+ version: '1.0';
4
+ blockchain: BlockchainType;
5
+ messageId: string;
6
+ timestamp: string;
7
+ senderId: string;
8
+ }
9
+ export interface EVMClaimMessage extends BaseClaimMessage {
10
+ blockchain: 'evm';
11
+ channelId: string;
12
+ nonce: number;
13
+ transferredAmount: string;
14
+ lockedAmount: string;
15
+ locksRoot: string;
16
+ signature: string;
17
+ signerAddress: string;
18
+ chainId?: number;
19
+ tokenNetworkAddress?: string;
20
+ tokenAddress?: string;
21
+ }
22
+ export type BTPClaimMessage = EVMClaimMessage;
23
+ export declare const BTP_CLAIM_PROTOCOL: {
24
+ readonly NAME: "payment-channel-claim";
25
+ readonly CONTENT_TYPE: 1;
26
+ readonly VERSION: "1.0";
27
+ };
28
+ export declare function isEVMClaim(msg: BTPClaimMessage): msg is EVMClaimMessage;
29
+ export declare function validateClaimMessage(msg: unknown): asserts msg is BTPClaimMessage;
30
+ //# sourceMappingURL=btp-claim-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"btp-claim-types.d.ts","sourceRoot":"","sources":["../../src/btp/btp-claim-types.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,cAAc,GAAG,KAAK,CAAC;AAYnC,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,KAAK,CAAC;IACf,UAAU,EAAE,cAAc,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AA0CD,MAAM,WAAW,eAAgB,SAAQ,gBAAgB;IACvD,UAAU,EAAE,KAAK,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD,MAAM,MAAM,eAAe,GAAG,eAAe,CAAC;AAU9C,eAAO,MAAM,kBAAkB;;;;CAIrB,CAAC;AAaX,wBAAgB,UAAU,CAAC,GAAG,EAAE,eAAe,GAAG,GAAG,IAAI,eAAe,CAEvE;AAwGD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,GAAG,IAAI,eAAe,CAwCjF"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BTP_CLAIM_PROTOCOL = void 0;
4
+ exports.isEVMClaim = isEVMClaim;
5
+ exports.validateClaimMessage = validateClaimMessage;
6
+ exports.BTP_CLAIM_PROTOCOL = {
7
+ NAME: 'payment-channel-claim',
8
+ CONTENT_TYPE: 1,
9
+ VERSION: '1.0',
10
+ };
11
+ function isEVMClaim(msg) {
12
+ return msg.blockchain === 'evm';
13
+ }
14
+ function validateEVMClaim(claim) {
15
+ if (!claim.channelId || typeof claim.channelId !== 'string') {
16
+ throw new Error('Missing or invalid channelId (expected non-empty string)');
17
+ }
18
+ if (claim.nonce === undefined || typeof claim.nonce !== 'number' || claim.nonce < 0) {
19
+ throw new Error('Missing or invalid nonce (expected non-negative number)');
20
+ }
21
+ if (!claim.transferredAmount || typeof claim.transferredAmount !== 'string') {
22
+ throw new Error('Missing or invalid transferredAmount (expected non-empty string)');
23
+ }
24
+ if (!claim.lockedAmount || typeof claim.lockedAmount !== 'string') {
25
+ throw new Error('Missing or invalid lockedAmount (expected non-empty string)');
26
+ }
27
+ if (!claim.locksRoot || typeof claim.locksRoot !== 'string') {
28
+ throw new Error('Missing or invalid locksRoot (expected non-empty string)');
29
+ }
30
+ if (!claim.signature || typeof claim.signature !== 'string') {
31
+ throw new Error('Missing or invalid signature (expected non-empty string)');
32
+ }
33
+ if (!claim.signerAddress || typeof claim.signerAddress !== 'string') {
34
+ throw new Error('Missing or invalid signerAddress (expected non-empty string)');
35
+ }
36
+ if (!/^0x[0-9a-fA-F]{64}$/.test(claim.channelId)) {
37
+ throw new Error('Invalid channelId format (expected 0x-prefixed 64-char hex)');
38
+ }
39
+ if (!/^0x[0-9a-fA-F]{40}$/.test(claim.signerAddress)) {
40
+ throw new Error('Invalid signerAddress format (expected 0x-prefixed 40-char hex)');
41
+ }
42
+ if (!/^0x[0-9a-fA-F]{64}$/.test(claim.locksRoot)) {
43
+ throw new Error('Invalid locksRoot format (expected 0x-prefixed 64-char hex)');
44
+ }
45
+ if (!/^\d+$/.test(claim.transferredAmount)) {
46
+ throw new Error('Invalid transferredAmount (expected non-negative integer string)');
47
+ }
48
+ if (!/^\d+$/.test(claim.lockedAmount)) {
49
+ throw new Error('Invalid lockedAmount (expected non-negative integer string)');
50
+ }
51
+ if (claim.chainId !== undefined) {
52
+ if (typeof claim.chainId !== 'number' ||
53
+ !Number.isInteger(claim.chainId) ||
54
+ claim.chainId <= 0) {
55
+ throw new Error('Invalid chainId (expected positive integer)');
56
+ }
57
+ }
58
+ if (claim.tokenNetworkAddress !== undefined) {
59
+ if (typeof claim.tokenNetworkAddress !== 'string') {
60
+ throw new Error('Invalid tokenNetworkAddress (expected string)');
61
+ }
62
+ if (!/^0x[0-9a-fA-F]{40}$/.test(claim.tokenNetworkAddress)) {
63
+ throw new Error('Invalid tokenNetworkAddress format (expected 0x-prefixed 40-char hex)');
64
+ }
65
+ }
66
+ if (claim.tokenAddress !== undefined) {
67
+ if (typeof claim.tokenAddress !== 'string') {
68
+ throw new Error('Invalid tokenAddress (expected string)');
69
+ }
70
+ if (!/^0x[0-9a-fA-F]{40}$/.test(claim.tokenAddress)) {
71
+ throw new Error('Invalid tokenAddress format (expected 0x-prefixed 40-char hex)');
72
+ }
73
+ }
74
+ }
75
+ function validateClaimMessage(msg) {
76
+ if (typeof msg !== 'object' || msg === null) {
77
+ throw new Error('Claim message must be an object');
78
+ }
79
+ const claim = msg;
80
+ if (claim.version !== '1.0') {
81
+ throw new Error(`Invalid version (expected '1.0', got '${claim.version}')`);
82
+ }
83
+ if (!claim.blockchain) {
84
+ throw new Error('Missing blockchain field');
85
+ }
86
+ if (claim.blockchain !== 'evm') {
87
+ throw new Error(`Unsupported blockchain type: ${claim.blockchain}`);
88
+ }
89
+ if (!claim.messageId || typeof claim.messageId !== 'string') {
90
+ throw new Error('Missing or invalid messageId (expected non-empty string)');
91
+ }
92
+ if (!claim.timestamp || typeof claim.timestamp !== 'string') {
93
+ throw new Error('Missing or invalid timestamp (expected ISO 8601 string)');
94
+ }
95
+ if (!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z$/.test(claim.timestamp)) {
96
+ throw new Error('Invalid timestamp format (expected ISO 8601 with Z timezone)');
97
+ }
98
+ if (!claim.senderId || typeof claim.senderId !== 'string') {
99
+ throw new Error('Missing or invalid senderId (expected non-empty string)');
100
+ }
101
+ validateEVMClaim(claim);
102
+ }
103
+ //# sourceMappingURL=btp-claim-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"btp-claim-types.js","sourceRoot":"","sources":["../../src/btp/btp-claim-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { Logger } from '../utils/logger';
2
+ import { BTPClient, Peer } from './btp-client';
3
+ import { ILPPreparePacket, ILPFulfillPacket, ILPRejectPacket } from '@toon-protocol/shared';
4
+ import type { PacketHandler } from '../core/packet-handler';
5
+ export declare class BTPClientManager {
6
+ private readonly _clients;
7
+ private readonly _logger;
8
+ private readonly _nodeId;
9
+ private _packetHandler;
10
+ constructor(nodeId: string, logger: Logger);
11
+ setPacketHandler(packetHandler: PacketHandler): void;
12
+ addPeer(peer: Peer): Promise<void>;
13
+ removePeer(peerId: string): Promise<void>;
14
+ sendToPeer(peerId: string, packet: ILPPreparePacket, protocolData?: Array<{
15
+ protocolName: string;
16
+ contentType: number;
17
+ data: Buffer;
18
+ }>): Promise<ILPFulfillPacket | ILPRejectPacket>;
19
+ getPeerStatus(): Map<string, boolean>;
20
+ getPeerIds(): string[];
21
+ getClientForPeer(peerId: string): BTPClient | undefined;
22
+ isConnected(peerId: string): boolean;
23
+ getConnectedPeerCount(): number;
24
+ getTotalPeerCount(): number;
25
+ getConnectionHealth(): number;
26
+ }
27
+ //# sourceMappingURL=btp-client-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"btp-client-manager.d.ts","sourceRoot":"","sources":["../../src/btp/btp-client-manager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAsB,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC5F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAM5D,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,cAAc,CAA8B;gBAOxC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAS1C,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,IAAI;IAa9C,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAwElC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCzC,UAAU,CACd,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,gBAAgB,EACxB,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,GAChF,OAAO,CAAC,gBAAgB,GAAG,eAAe,CAAC;IAiE9C,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAYrC,UAAU,IAAI,MAAM,EAAE;IAUtB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAUvD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAUpC,qBAAqB,IAAI,MAAM;IAU/B,iBAAiB,IAAI,MAAM;IAS3B,mBAAmB,IAAI,MAAM;CAQ9B"}