@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.
- package/LICENSE +21 -0
- package/README.md +421 -0
- package/dist/btp/btp-claim-types.d.ts +30 -0
- package/dist/btp/btp-claim-types.d.ts.map +1 -0
- package/dist/btp/btp-claim-types.js +103 -0
- package/dist/btp/btp-claim-types.js.map +1 -0
- package/dist/btp/btp-client-manager.d.ts +27 -0
- package/dist/btp/btp-client-manager.d.ts.map +1 -0
- package/dist/btp/btp-client-manager.js +138 -0
- package/dist/btp/btp-client-manager.js.map +1 -0
- package/dist/btp/btp-client.d.ts +55 -0
- package/dist/btp/btp-client.d.ts.map +1 -0
- package/dist/btp/btp-client.js +474 -0
- package/dist/btp/btp-client.js.map +1 -0
- package/dist/btp/btp-message-parser.d.ts +4 -0
- package/dist/btp/btp-message-parser.d.ts.map +1 -0
- package/dist/btp/btp-message-parser.js +211 -0
- package/dist/btp/btp-message-parser.js.map +1 -0
- package/dist/btp/btp-server.d.ts +30 -0
- package/dist/btp/btp-server.d.ts.map +1 -0
- package/dist/btp/btp-server.js +458 -0
- package/dist/btp/btp-server.js.map +1 -0
- package/dist/btp/btp-types.d.ts +43 -0
- package/dist/btp/btp-types.d.ts.map +1 -0
- package/dist/btp/btp-types.js +44 -0
- package/dist/btp/btp-types.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +175 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/onboarding-wizard.d.ts +7 -0
- package/dist/cli/onboarding-wizard.d.ts.map +1 -0
- package/dist/cli/onboarding-wizard.js +257 -0
- package/dist/cli/onboarding-wizard.js.map +1 -0
- package/dist/cli/types.d.ts +38 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +3 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/config/aptos-env-validator.d.ts +8 -0
- package/dist/config/aptos-env-validator.d.ts.map +1 -0
- package/dist/config/aptos-env-validator.js +25 -0
- package/dist/config/aptos-env-validator.js.map +1 -0
- package/dist/config/config-loader.d.ts +20 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +269 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/environment-validator.d.ts +4 -0
- package/dist/config/environment-validator.d.ts.map +1 -0
- package/dist/config/environment-validator.js +239 -0
- package/dist/config/environment-validator.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +7 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/key-manager-config.d.ts +7 -0
- package/dist/config/key-manager-config.d.ts.map +1 -0
- package/dist/config/key-manager-config.js +209 -0
- package/dist/config/key-manager-config.js.map +1 -0
- package/dist/config/topology-validator.d.ts +14 -0
- package/dist/config/topology-validator.d.ts.map +1 -0
- package/dist/config/topology-validator.js +142 -0
- package/dist/config/topology-validator.js.map +1 -0
- package/dist/config/types.d.ts +210 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +10 -0
- package/dist/config/types.js.map +1 -0
- package/dist/core/connector-node.d.ts +79 -0
- package/dist/core/connector-node.d.ts.map +1 -0
- package/dist/core/connector-node.js +1036 -0
- package/dist/core/connector-node.js.map +1 -0
- package/dist/core/local-delivery-client.d.ts +16 -0
- package/dist/core/local-delivery-client.d.ts.map +1 -0
- package/dist/core/local-delivery-client.js +176 -0
- package/dist/core/local-delivery-client.js.map +1 -0
- package/dist/core/packet-handler.d.ts +45 -0
- package/dist/core/packet-handler.d.ts.map +1 -0
- package/dist/core/packet-handler.js +606 -0
- package/dist/core/packet-handler.js.map +1 -0
- package/dist/core/payment-handler.d.ts +27 -0
- package/dist/core/payment-handler.d.ts.map +1 -0
- package/dist/core/payment-handler.js +115 -0
- package/dist/core/payment-handler.js.map +1 -0
- package/dist/discovery/index.d.ts +3 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +6 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/peer-discovery-service.d.ts +29 -0
- package/dist/discovery/peer-discovery-service.d.ts.map +1 -0
- package/dist/discovery/peer-discovery-service.js +230 -0
- package/dist/discovery/peer-discovery-service.js.map +1 -0
- package/dist/discovery/types.d.ts +38 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/discovery/types.js +3 -0
- package/dist/discovery/types.js.map +1 -0
- package/dist/encoding/oer-parser.d.ts +39 -0
- package/dist/encoding/oer-parser.d.ts.map +1 -0
- package/dist/encoding/oer-parser.js +154 -0
- package/dist/encoding/oer-parser.js.map +1 -0
- package/dist/explorer-ui/assets/EventDetailPanel-CnSaMk3V.js +6 -0
- package/dist/explorer-ui/assets/FilterBar-BEmAzBku.js +26 -0
- package/dist/explorer-ui/assets/chevron-right-BUT9VhYe.js +11 -0
- package/dist/explorer-ui/assets/index-BZ2INVgy.js +360 -0
- package/dist/explorer-ui/assets/index-Cemh6svI.css +1 -0
- package/dist/explorer-ui/index.html +14 -0
- package/dist/explorer-ui/vite.svg +1 -0
- package/dist/facilitator/index.d.ts +2 -0
- package/dist/facilitator/index.d.ts.map +1 -0
- package/dist/facilitator/index.js +7 -0
- package/dist/facilitator/index.js.map +1 -0
- package/dist/facilitator/spsp-client.d.ts +18 -0
- package/dist/facilitator/spsp-client.d.ts.map +1 -0
- package/dist/facilitator/spsp-client.js +95 -0
- package/dist/facilitator/spsp-client.js.map +1 -0
- package/dist/http/admin-api.d.ts +123 -0
- package/dist/http/admin-api.d.ts.map +1 -0
- package/dist/http/admin-api.js +1057 -0
- package/dist/http/admin-api.js.map +1 -0
- package/dist/http/admin-server.d.ts +41 -0
- package/dist/http/admin-server.d.ts.map +1 -0
- package/dist/http/admin-server.js +156 -0
- package/dist/http/admin-server.js.map +1 -0
- package/dist/http/health-server.d.ts +22 -0
- package/dist/http/health-server.d.ts.map +1 -0
- package/dist/http/health-server.js +192 -0
- package/dist/http/health-server.js.map +1 -0
- package/dist/http/ilp-send-handler.d.ts +19 -0
- package/dist/http/ilp-send-handler.d.ts.map +1 -0
- package/dist/http/ilp-send-handler.js +162 -0
- package/dist/http/ilp-send-handler.js.map +1 -0
- package/dist/http/types.d.ts +39 -0
- package/dist/http/types.d.ts.map +1 -0
- package/dist/http/types.js +3 -0
- package/dist/http/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/lib.d.ts +22 -0
- package/dist/lib.d.ts.map +1 -0
- package/dist/lib.js +41 -0
- package/dist/lib.js.map +1 -0
- package/dist/main.d.ts +4 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +79 -0
- package/dist/main.js.map +1 -0
- package/dist/routing/packet-processor.d.ts +36 -0
- package/dist/routing/packet-processor.d.ts.map +1 -0
- package/dist/routing/packet-processor.js +112 -0
- package/dist/routing/packet-processor.js.map +1 -0
- package/dist/routing/packet-worker.d.ts +10 -0
- package/dist/routing/packet-worker.d.ts.map +1 -0
- package/dist/routing/packet-worker.js +34 -0
- package/dist/routing/packet-worker.js.map +1 -0
- package/dist/routing/routing-table.d.ts +15 -0
- package/dist/routing/routing-table.d.ts.map +1 -0
- package/dist/routing/routing-table.js +63 -0
- package/dist/routing/routing-table.js.map +1 -0
- package/dist/routing/worker-pool.d.ts +43 -0
- package/dist/routing/worker-pool.d.ts.map +1 -0
- package/dist/routing/worker-pool.js +228 -0
- package/dist/routing/worker-pool.js.map +1 -0
- package/dist/security/alert-notifier.d.ts +34 -0
- package/dist/security/alert-notifier.d.ts.map +1 -0
- package/dist/security/alert-notifier.js +136 -0
- package/dist/security/alert-notifier.js.map +1 -0
- package/dist/security/audit-logger.d.ts +34 -0
- package/dist/security/audit-logger.d.ts.map +1 -0
- package/dist/security/audit-logger.js +132 -0
- package/dist/security/audit-logger.js.map +1 -0
- package/dist/security/backends/aws-kms-backend.d.ts +18 -0
- package/dist/security/backends/aws-kms-backend.d.ts.map +1 -0
- package/dist/security/backends/aws-kms-backend.js +130 -0
- package/dist/security/backends/aws-kms-backend.js.map +1 -0
- package/dist/security/backends/azure-kv-backend.d.ts +17 -0
- package/dist/security/backends/azure-kv-backend.d.ts.map +1 -0
- package/dist/security/backends/azure-kv-backend.js +121 -0
- package/dist/security/backends/azure-kv-backend.js.map +1 -0
- package/dist/security/backends/environment-backend.d.ts +15 -0
- package/dist/security/backends/environment-backend.d.ts.map +1 -0
- package/dist/security/backends/environment-backend.js +56 -0
- package/dist/security/backends/environment-backend.js.map +1 -0
- package/dist/security/backends/gcp-kms-backend.d.ts +17 -0
- package/dist/security/backends/gcp-kms-backend.d.ts.map +1 -0
- package/dist/security/backends/gcp-kms-backend.js +110 -0
- package/dist/security/backends/gcp-kms-backend.js.map +1 -0
- package/dist/security/backends/hsm-backend.d.ts +18 -0
- package/dist/security/backends/hsm-backend.d.ts.map +1 -0
- package/dist/security/backends/hsm-backend.js +187 -0
- package/dist/security/backends/hsm-backend.js.map +1 -0
- package/dist/security/fraud-detector.d.ts +79 -0
- package/dist/security/fraud-detector.d.ts.map +1 -0
- package/dist/security/fraud-detector.js +147 -0
- package/dist/security/fraud-detector.js.map +1 -0
- package/dist/security/key-manager-signer.d.ts +15 -0
- package/dist/security/key-manager-signer.d.ts.map +1 -0
- package/dist/security/key-manager-signer.js +91 -0
- package/dist/security/key-manager-signer.js.map +1 -0
- package/dist/security/key-manager.d.ts +69 -0
- package/dist/security/key-manager.d.ts.map +1 -0
- package/dist/security/key-manager.js +79 -0
- package/dist/security/key-manager.js.map +1 -0
- package/dist/security/key-rotation-manager.d.ts +27 -0
- package/dist/security/key-rotation-manager.d.ts.map +1 -0
- package/dist/security/key-rotation-manager.js +142 -0
- package/dist/security/key-rotation-manager.js.map +1 -0
- package/dist/security/rate-limit-config.d.ts +7 -0
- package/dist/security/rate-limit-config.d.ts.map +1 -0
- package/dist/security/rate-limit-config.js +57 -0
- package/dist/security/rate-limit-config.js.map +1 -0
- package/dist/security/rate-limiter.d.ts +46 -0
- package/dist/security/rate-limiter.d.ts.map +1 -0
- package/dist/security/rate-limiter.js +170 -0
- package/dist/security/rate-limiter.js.map +1 -0
- package/dist/security/reputation-tracker.d.ts +30 -0
- package/dist/security/reputation-tracker.d.ts.map +1 -0
- package/dist/security/reputation-tracker.js +111 -0
- package/dist/security/reputation-tracker.js.map +1 -0
- package/dist/security/rules/balance-manipulation-rule.d.ts +23 -0
- package/dist/security/rules/balance-manipulation-rule.d.ts.map +1 -0
- package/dist/security/rules/balance-manipulation-rule.js +70 -0
- package/dist/security/rules/balance-manipulation-rule.js.map +1 -0
- package/dist/security/rules/double-spend-detection-rule.d.ts +23 -0
- package/dist/security/rules/double-spend-detection-rule.d.ts.map +1 -0
- package/dist/security/rules/double-spend-detection-rule.js +61 -0
- package/dist/security/rules/double-spend-detection-rule.js.map +1 -0
- package/dist/security/rules/rapid-channel-closure-rule.d.ts +16 -0
- package/dist/security/rules/rapid-channel-closure-rule.d.ts.map +1 -0
- package/dist/security/rules/rapid-channel-closure-rule.js +57 -0
- package/dist/security/rules/rapid-channel-closure-rule.js.map +1 -0
- package/dist/security/rules/sudden-traffic-spike-rule.d.ts +18 -0
- package/dist/security/rules/sudden-traffic-spike-rule.d.ts.map +1 -0
- package/dist/security/rules/sudden-traffic-spike-rule.js +92 -0
- package/dist/security/rules/sudden-traffic-spike-rule.js.map +1 -0
- package/dist/security/rules/unusual-settlement-amount-rule.d.ts +12 -0
- package/dist/security/rules/unusual-settlement-amount-rule.d.ts.map +1 -0
- package/dist/security/rules/unusual-settlement-amount-rule.js +33 -0
- package/dist/security/rules/unusual-settlement-amount-rule.js.map +1 -0
- package/dist/security/token-bucket.d.ts +16 -0
- package/dist/security/token-bucket.d.ts.map +1 -0
- package/dist/security/token-bucket.js +49 -0
- package/dist/security/token-bucket.js.map +1 -0
- package/dist/security/violation-counter.d.ts +11 -0
- package/dist/security/violation-counter.d.ts.map +1 -0
- package/dist/security/violation-counter.js +61 -0
- package/dist/security/violation-counter.js.map +1 -0
- package/dist/settlement/account-id-generator.d.ts +4 -0
- package/dist/settlement/account-id-generator.d.ts.map +1 -0
- package/dist/settlement/account-id-generator.js +38 -0
- package/dist/settlement/account-id-generator.js.map +1 -0
- package/dist/settlement/account-manager.d.ts +47 -0
- package/dist/settlement/account-manager.d.ts.map +1 -0
- package/dist/settlement/account-manager.js +447 -0
- package/dist/settlement/account-manager.js.map +1 -0
- package/dist/settlement/account-metadata.d.ts +11 -0
- package/dist/settlement/account-metadata.d.ts.map +1 -0
- package/dist/settlement/account-metadata.js +40 -0
- package/dist/settlement/account-metadata.js.map +1 -0
- package/dist/settlement/aptos-channel-sdk.d.ts +66 -0
- package/dist/settlement/aptos-channel-sdk.d.ts.map +1 -0
- package/dist/settlement/aptos-channel-sdk.js +274 -0
- package/dist/settlement/aptos-channel-sdk.js.map +1 -0
- package/dist/settlement/aptos-claim-signer.d.ts +57 -0
- package/dist/settlement/aptos-claim-signer.d.ts.map +1 -0
- package/dist/settlement/aptos-claim-signer.js +200 -0
- package/dist/settlement/aptos-claim-signer.js.map +1 -0
- package/dist/settlement/aptos-client.d.ts +99 -0
- package/dist/settlement/aptos-client.d.ts.map +1 -0
- package/dist/settlement/aptos-client.js +474 -0
- package/dist/settlement/aptos-client.js.map +1 -0
- package/dist/settlement/channel-manager.d.ts +66 -0
- package/dist/settlement/channel-manager.d.ts.map +1 -0
- package/dist/settlement/channel-manager.js +214 -0
- package/dist/settlement/channel-manager.js.map +1 -0
- package/dist/settlement/claim-receiver-db-schema.d.ts +4 -0
- package/dist/settlement/claim-receiver-db-schema.d.ts.map +1 -0
- package/dist/settlement/claim-receiver-db-schema.js +25 -0
- package/dist/settlement/claim-receiver-db-schema.js.map +1 -0
- package/dist/settlement/claim-receiver.d.ts +31 -0
- package/dist/settlement/claim-receiver.d.ts.map +1 -0
- package/dist/settlement/claim-receiver.js +228 -0
- package/dist/settlement/claim-receiver.js.map +1 -0
- package/dist/settlement/claim-redemption-service.d.ts +39 -0
- package/dist/settlement/claim-redemption-service.d.ts.map +1 -0
- package/dist/settlement/claim-redemption-service.js +189 -0
- package/dist/settlement/claim-redemption-service.js.map +1 -0
- package/dist/settlement/claim-sender-db-schema.d.ts +3 -0
- package/dist/settlement/claim-sender-db-schema.d.ts.map +1 -0
- package/dist/settlement/claim-sender-db-schema.js +18 -0
- package/dist/settlement/claim-sender-db-schema.js.map +1 -0
- package/dist/settlement/claim-sender.d.ts +22 -0
- package/dist/settlement/claim-sender.d.ts.map +1 -0
- package/dist/settlement/claim-sender.js +108 -0
- package/dist/settlement/claim-sender.js.map +1 -0
- package/dist/settlement/eip712-helper.d.ts +13 -0
- package/dist/settlement/eip712-helper.d.ts.map +1 -0
- package/dist/settlement/eip712-helper.js +24 -0
- package/dist/settlement/eip712-helper.js.map +1 -0
- package/dist/settlement/in-memory-ledger-client.d.ts +40 -0
- package/dist/settlement/in-memory-ledger-client.d.ts.map +1 -0
- package/dist/settlement/in-memory-ledger-client.js +177 -0
- package/dist/settlement/in-memory-ledger-client.js.map +1 -0
- package/dist/settlement/ledger-client.d.ts +22 -0
- package/dist/settlement/ledger-client.d.ts.map +1 -0
- package/dist/settlement/ledger-client.js +3 -0
- package/dist/settlement/ledger-client.js.map +1 -0
- package/dist/settlement/metrics-collector.d.ts +29 -0
- package/dist/settlement/metrics-collector.d.ts.map +1 -0
- package/dist/settlement/metrics-collector.js +81 -0
- package/dist/settlement/metrics-collector.js.map +1 -0
- package/dist/settlement/payment-channel-sdk.d.ts +59 -0
- package/dist/settlement/payment-channel-sdk.d.ts.map +1 -0
- package/dist/settlement/payment-channel-sdk.js +677 -0
- package/dist/settlement/payment-channel-sdk.js.map +1 -0
- package/dist/settlement/per-packet-claim-service.d.ts +33 -0
- package/dist/settlement/per-packet-claim-service.d.ts.map +1 -0
- package/dist/settlement/per-packet-claim-service.js +177 -0
- package/dist/settlement/per-packet-claim-service.js.map +1 -0
- package/dist/settlement/settlement-api.d.ts +37 -0
- package/dist/settlement/settlement-api.d.ts.map +1 -0
- package/dist/settlement/settlement-api.js +172 -0
- package/dist/settlement/settlement-api.js.map +1 -0
- package/dist/settlement/settlement-coordinator.d.ts +47 -0
- package/dist/settlement/settlement-coordinator.d.ts.map +1 -0
- package/dist/settlement/settlement-coordinator.js +166 -0
- package/dist/settlement/settlement-coordinator.js.map +1 -0
- package/dist/settlement/settlement-executor.d.ts +44 -0
- package/dist/settlement/settlement-executor.d.ts.map +1 -0
- package/dist/settlement/settlement-executor.js +247 -0
- package/dist/settlement/settlement-executor.js.map +1 -0
- package/dist/settlement/settlement-monitor.d.ts +29 -0
- package/dist/settlement/settlement-monitor.d.ts.map +1 -0
- package/dist/settlement/settlement-monitor.js +172 -0
- package/dist/settlement/settlement-monitor.js.map +1 -0
- package/dist/settlement/tigerbeetle-batch-writer.d.ts +58 -0
- package/dist/settlement/tigerbeetle-batch-writer.d.ts.map +1 -0
- package/dist/settlement/tigerbeetle-batch-writer.js +162 -0
- package/dist/settlement/tigerbeetle-batch-writer.js.map +1 -0
- package/dist/settlement/tigerbeetle-client.d.ts +40 -0
- package/dist/settlement/tigerbeetle-client.d.ts.map +1 -0
- package/dist/settlement/tigerbeetle-client.js +279 -0
- package/dist/settlement/tigerbeetle-client.js.map +1 -0
- package/dist/settlement/tigerbeetle-errors.d.ts +23 -0
- package/dist/settlement/tigerbeetle-errors.d.ts.map +1 -0
- package/dist/settlement/tigerbeetle-errors.js +58 -0
- package/dist/settlement/tigerbeetle-errors.js.map +1 -0
- package/dist/settlement/types.d.ts +64 -0
- package/dist/settlement/types.d.ts.map +1 -0
- package/dist/settlement/types.js +42 -0
- package/dist/settlement/types.js.map +1 -0
- package/dist/settlement/unified-settlement-executor.d.ts +34 -0
- package/dist/settlement/unified-settlement-executor.d.ts.map +1 -0
- package/dist/settlement/unified-settlement-executor.js +145 -0
- package/dist/settlement/unified-settlement-executor.js.map +1 -0
- package/dist/settlement/xrp-channel-lifecycle.d.ts +41 -0
- package/dist/settlement/xrp-channel-lifecycle.d.ts.map +1 -0
- package/dist/settlement/xrp-channel-lifecycle.js +142 -0
- package/dist/settlement/xrp-channel-lifecycle.js.map +1 -0
- package/dist/settlement/xrp-channel-manager.d.ts +59 -0
- package/dist/settlement/xrp-channel-manager.d.ts.map +1 -0
- package/dist/settlement/xrp-channel-manager.js +160 -0
- package/dist/settlement/xrp-channel-manager.js.map +1 -0
- package/dist/settlement/xrp-channel-sdk.d.ts +30 -0
- package/dist/settlement/xrp-channel-sdk.d.ts.map +1 -0
- package/dist/settlement/xrp-channel-sdk.js +164 -0
- package/dist/settlement/xrp-channel-sdk.js.map +1 -0
- package/dist/settlement/xrp-claim-signer.d.ts +22 -0
- package/dist/settlement/xrp-claim-signer.d.ts.map +1 -0
- package/dist/settlement/xrp-claim-signer.js +122 -0
- package/dist/settlement/xrp-claim-signer.js.map +1 -0
- package/dist/settlement/xrpl-client.d.ts +104 -0
- package/dist/settlement/xrpl-client.d.ts.map +1 -0
- package/dist/settlement/xrpl-client.js +304 -0
- package/dist/settlement/xrpl-client.js.map +1 -0
- package/dist/test/testnet-config.d.ts +58 -0
- package/dist/test/testnet-config.d.ts.map +1 -0
- package/dist/test/testnet-config.js +89 -0
- package/dist/test/testnet-config.js.map +1 -0
- package/dist/test-utils/index.d.ts +3 -0
- package/dist/test-utils/index.d.ts.map +1 -0
- package/dist/test-utils/index.js +15 -0
- package/dist/test-utils/index.js.map +1 -0
- package/dist/test-utils/isolated-test-env.d.ts +31 -0
- package/dist/test-utils/isolated-test-env.d.ts.map +1 -0
- package/dist/test-utils/isolated-test-env.js +127 -0
- package/dist/test-utils/isolated-test-env.js.map +1 -0
- package/dist/test-utils/mock-factories-patch.d.ts +2 -0
- package/dist/test-utils/mock-factories-patch.d.ts.map +1 -0
- package/dist/test-utils/mock-factories-patch.js +3 -0
- package/dist/test-utils/mock-factories-patch.js.map +1 -0
- package/dist/test-utils/mock-factories.d.ts +22 -0
- package/dist/test-utils/mock-factories.d.ts.map +1 -0
- package/dist/test-utils/mock-factories.js +56 -0
- package/dist/test-utils/mock-factories.js.map +1 -0
- package/dist/utils/connection-pool.d.ts +42 -0
- package/dist/utils/connection-pool.d.ts.map +1 -0
- package/dist/utils/connection-pool.js +209 -0
- package/dist/utils/connection-pool.js.map +1 -0
- package/dist/utils/evm-rpc-connection-pool.d.ts +8 -0
- package/dist/utils/evm-rpc-connection-pool.d.ts.map +1 -0
- package/dist/utils/evm-rpc-connection-pool.js +40 -0
- package/dist/utils/evm-rpc-connection-pool.js.map +1 -0
- package/dist/utils/logger.d.ts +6 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +58 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/optional-require.d.ts +2 -0
- package/dist/utils/optional-require.d.ts.map +1 -0
- package/dist/utils/optional-require.js +54 -0
- package/dist/utils/optional-require.js.map +1 -0
- package/dist/utils/xrp-wss-connection-pool.d.ts +8 -0
- package/dist/utils/xrp-wss-connection-pool.d.ts.map +1 -0
- package/dist/utils/xrp-wss-connection-pool.js +42 -0
- package/dist/utils/xrp-wss-connection-pool.js.map +1 -0
- package/dist/wallet/audit-logger.d.ts +22 -0
- package/dist/wallet/audit-logger.d.ts.map +1 -0
- package/dist/wallet/audit-logger.js +120 -0
- package/dist/wallet/audit-logger.js.map +1 -0
- package/dist/wallet/fraud-detector-interface.d.ts +14 -0
- package/dist/wallet/fraud-detector-interface.d.ts.map +1 -0
- package/dist/wallet/fraud-detector-interface.js +3 -0
- package/dist/wallet/fraud-detector-interface.js.map +1 -0
- package/dist/wallet/key-manager.d.ts +6 -0
- package/dist/wallet/key-manager.d.ts.map +1 -0
- package/dist/wallet/key-manager.js +3 -0
- package/dist/wallet/key-manager.js.map +1 -0
- package/dist/wallet/placeholder-fraud-detector.d.ts +10 -0
- package/dist/wallet/placeholder-fraud-detector.d.ts.map +1 -0
- package/dist/wallet/placeholder-fraud-detector.js +10 -0
- package/dist/wallet/placeholder-fraud-detector.js.map +1 -0
- package/dist/wallet/rate-limiter.d.ts +26 -0
- package/dist/wallet/rate-limiter.d.ts.map +1 -0
- package/dist/wallet/rate-limiter.js +114 -0
- package/dist/wallet/rate-limiter.js.map +1 -0
- package/dist/wallet/suspicious-activity-detector.d.ts +25 -0
- package/dist/wallet/suspicious-activity-detector.d.ts.map +1 -0
- package/dist/wallet/suspicious-activity-detector.js +97 -0
- package/dist/wallet/suspicious-activity-detector.js.map +1 -0
- package/dist/wallet/treasury-wallet.d.ts +20 -0
- package/dist/wallet/treasury-wallet.d.ts.map +1 -0
- package/dist/wallet/treasury-wallet.js +151 -0
- package/dist/wallet/treasury-wallet.js.map +1 -0
- package/dist/wallet/wallet-authentication.d.ts +31 -0
- package/dist/wallet/wallet-authentication.d.ts.map +1 -0
- package/dist/wallet/wallet-authentication.js +102 -0
- package/dist/wallet/wallet-authentication.js.map +1 -0
- package/dist/wallet/wallet-db-schema.d.ts +11 -0
- package/dist/wallet/wallet-db-schema.d.ts.map +1 -0
- package/dist/wallet/wallet-db-schema.js +79 -0
- package/dist/wallet/wallet-db-schema.js.map +1 -0
- package/dist/wallet/wallet-security.d.ts +58 -0
- package/dist/wallet/wallet-security.d.ts.map +1 -0
- package/dist/wallet/wallet-security.js +148 -0
- package/dist/wallet/wallet-security.js.map +1 -0
- package/dist/wallet/wallet-seed-manager.d.ts +65 -0
- package/dist/wallet/wallet-seed-manager.d.ts.map +1 -0
- package/dist/wallet/wallet-seed-manager.js +418 -0
- package/dist/wallet/wallet-seed-manager.js.map +1 -0
- package/package.json +134 -0
|
@@ -0,0 +1,677 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PaymentChannelSDK = exports.ChallengeNotExpiredError = void 0;
|
|
4
|
+
const eip712_helper_1 = require("./eip712-helper");
|
|
5
|
+
const key_manager_signer_1 = require("../security/key-manager-signer");
|
|
6
|
+
const optional_require_1 = require("../utils/optional-require");
|
|
7
|
+
const REGISTRY_ABI = [
|
|
8
|
+
'function createTokenNetwork(address token) external returns (address)',
|
|
9
|
+
'function getTokenNetwork(address token) external view returns (address)',
|
|
10
|
+
'event TokenNetworkCreated(address indexed token, address indexed tokenNetwork)',
|
|
11
|
+
];
|
|
12
|
+
const TOKEN_NETWORK_ABI = [
|
|
13
|
+
'function openChannel(address participant2, uint256 settlementTimeout) external returns (bytes32)',
|
|
14
|
+
'function setTotalDeposit(bytes32 channelId, address participant, uint256 totalDeposit) external',
|
|
15
|
+
'function closeChannel(bytes32 channelId) external',
|
|
16
|
+
'function claimFromChannel(bytes32 channelId, tuple(bytes32 channelId, uint256 nonce, uint256 transferredAmount, uint256 lockedAmount, bytes32 locksRoot) balanceProof, bytes signature) external',
|
|
17
|
+
'function settleChannel(bytes32 channelId) external',
|
|
18
|
+
'function channels(bytes32) external view returns (uint256 settlementTimeout, uint8 state, uint256 closedAt, uint256 openedAt, address participant1, address participant2)',
|
|
19
|
+
'function participants(bytes32, address) external view returns (uint256 deposit, uint256 nonce, uint256 transferredAmount)',
|
|
20
|
+
'function claimedAmounts(bytes32, address) external view returns (uint256)',
|
|
21
|
+
'event ChannelOpened(bytes32 indexed channelId, address indexed participant1, address indexed participant2, uint256 settlementTimeout)',
|
|
22
|
+
'event ChannelClosed(bytes32 indexed channelId, address indexed closingParticipant)',
|
|
23
|
+
'event ChannelSettled(bytes32 indexed channelId, uint256 participant1Amount, uint256 participant2Amount)',
|
|
24
|
+
'event ChannelClaimed(bytes32 indexed channelId, address indexed claimant, uint256 claimedAmount, uint256 totalClaimed)',
|
|
25
|
+
];
|
|
26
|
+
const ERC20_ABI = [
|
|
27
|
+
'function approve(address spender, uint256 amount) external returns (bool)',
|
|
28
|
+
'function allowance(address owner, address spender) external view returns (uint256)',
|
|
29
|
+
'function symbol() external view returns (string)',
|
|
30
|
+
];
|
|
31
|
+
class ChallengeNotExpiredError extends Error {
|
|
32
|
+
channelId;
|
|
33
|
+
closedAt;
|
|
34
|
+
settlementTimeout;
|
|
35
|
+
constructor(message, channelId, closedAt, settlementTimeout) {
|
|
36
|
+
super(message);
|
|
37
|
+
this.channelId = channelId;
|
|
38
|
+
this.closedAt = closedAt;
|
|
39
|
+
this.settlementTimeout = settlementTimeout;
|
|
40
|
+
this.name = 'ChallengeNotExpiredError';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.ChallengeNotExpiredError = ChallengeNotExpiredError;
|
|
44
|
+
class PaymentChannelSDK {
|
|
45
|
+
provider;
|
|
46
|
+
signer = null;
|
|
47
|
+
keyManager;
|
|
48
|
+
evmKeyId;
|
|
49
|
+
registryAddress;
|
|
50
|
+
registryContract = null;
|
|
51
|
+
tokenNetworkCache;
|
|
52
|
+
channelStateCache;
|
|
53
|
+
logger;
|
|
54
|
+
eventListeners;
|
|
55
|
+
_initPromise = null;
|
|
56
|
+
constructor(provider, keyManager, evmKeyId, registryAddress, logger) {
|
|
57
|
+
this.provider = provider;
|
|
58
|
+
this.keyManager = keyManager;
|
|
59
|
+
this.evmKeyId = evmKeyId;
|
|
60
|
+
this.registryAddress = registryAddress;
|
|
61
|
+
this.tokenNetworkCache = new Map();
|
|
62
|
+
this.channelStateCache = new Map();
|
|
63
|
+
this.logger = logger;
|
|
64
|
+
this.eventListeners = new Map();
|
|
65
|
+
}
|
|
66
|
+
async _ensureInitialized() {
|
|
67
|
+
if (this.signer && this.registryContract) {
|
|
68
|
+
const ethersModule = await (0, optional_require_1.requireOptional)('ethers', 'EVM settlement');
|
|
69
|
+
return {
|
|
70
|
+
signer: this.signer,
|
|
71
|
+
registryContract: this.registryContract,
|
|
72
|
+
ethers: ethersModule.ethers,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
if (!this._initPromise) {
|
|
76
|
+
this._initPromise = (async () => {
|
|
77
|
+
const { ethers: ethersNs } = await (0, optional_require_1.requireOptional)('ethers', 'EVM settlement');
|
|
78
|
+
this.signer = await (0, key_manager_signer_1.createKeyManagerSigner)(this.keyManager, this.evmKeyId, this.provider);
|
|
79
|
+
this.registryContract = new ethersNs.Contract(this.registryAddress, REGISTRY_ABI, this.signer);
|
|
80
|
+
})();
|
|
81
|
+
}
|
|
82
|
+
await this._initPromise;
|
|
83
|
+
const ethersModule = await (0, optional_require_1.requireOptional)('ethers', 'EVM settlement');
|
|
84
|
+
return {
|
|
85
|
+
signer: this.signer,
|
|
86
|
+
registryContract: this.registryContract,
|
|
87
|
+
ethers: ethersModule.ethers,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
static fromConnectionPool(pool, keyManager, evmKeyId, registryAddress, logger) {
|
|
91
|
+
const provider = pool.getProvider();
|
|
92
|
+
if (!provider) {
|
|
93
|
+
throw new Error('No healthy EVM RPC connection available in pool');
|
|
94
|
+
}
|
|
95
|
+
logger.info('Creating PaymentChannelSDK from connection pool');
|
|
96
|
+
return new PaymentChannelSDK(provider, keyManager, evmKeyId, registryAddress, logger);
|
|
97
|
+
}
|
|
98
|
+
async getTokenNetworkContract(tokenAddress) {
|
|
99
|
+
if (this.tokenNetworkCache.has(tokenAddress)) {
|
|
100
|
+
return this.tokenNetworkCache.get(tokenAddress);
|
|
101
|
+
}
|
|
102
|
+
const { signer, registryContract, ethers } = await this._ensureInitialized();
|
|
103
|
+
const networkAddress = await registryContract.getTokenNetwork(tokenAddress);
|
|
104
|
+
if (networkAddress === ethers.ZeroAddress) {
|
|
105
|
+
throw new Error(`No TokenNetwork found for token ${tokenAddress}`);
|
|
106
|
+
}
|
|
107
|
+
const tokenNetwork = new ethers.Contract(networkAddress, TOKEN_NETWORK_ABI, signer);
|
|
108
|
+
this.tokenNetworkCache.set(tokenAddress, tokenNetwork);
|
|
109
|
+
this.logger.debug('TokenNetwork contract cached', { tokenAddress, networkAddress });
|
|
110
|
+
return tokenNetwork;
|
|
111
|
+
}
|
|
112
|
+
async getTokenNetworkAddress(tokenAddress) {
|
|
113
|
+
const contract = await this.getTokenNetworkContract(tokenAddress);
|
|
114
|
+
return await contract.getAddress();
|
|
115
|
+
}
|
|
116
|
+
async getChainId() {
|
|
117
|
+
const network = await this.provider.getNetwork();
|
|
118
|
+
return Number(network.chainId);
|
|
119
|
+
}
|
|
120
|
+
async getTokenSymbol(tokenAddress) {
|
|
121
|
+
const { ethers } = await (0, optional_require_1.requireOptional)('ethers', 'EVM settlement');
|
|
122
|
+
const erc20 = new ethers.Contract(tokenAddress, ERC20_ABI, this.provider);
|
|
123
|
+
const symbol = await erc20.symbol();
|
|
124
|
+
return symbol;
|
|
125
|
+
}
|
|
126
|
+
async getSignerAddress() {
|
|
127
|
+
const { signer } = await this._ensureInitialized();
|
|
128
|
+
return await signer.getAddress();
|
|
129
|
+
}
|
|
130
|
+
async openChannel(participant2, tokenAddress, settlementTimeout, initialDeposit) {
|
|
131
|
+
const tokenNetwork = await this.getTokenNetworkContract(tokenAddress);
|
|
132
|
+
this.logger.info('Opening payment channel', {
|
|
133
|
+
participant2,
|
|
134
|
+
tokenAddress,
|
|
135
|
+
settlementTimeout,
|
|
136
|
+
initialDeposit: initialDeposit.toString(),
|
|
137
|
+
});
|
|
138
|
+
const tx = await tokenNetwork.openChannel(participant2, settlementTimeout);
|
|
139
|
+
const receipt = await tx.wait();
|
|
140
|
+
const channelOpenedEvent = receipt.logs
|
|
141
|
+
.map((log) => {
|
|
142
|
+
try {
|
|
143
|
+
return tokenNetwork.interface.parseLog({
|
|
144
|
+
topics: log.topics,
|
|
145
|
+
data: log.data,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
})
|
|
152
|
+
.find((parsed) => parsed?.name === 'ChannelOpened');
|
|
153
|
+
if (!channelOpenedEvent) {
|
|
154
|
+
throw new Error('ChannelOpened event not found in transaction receipt');
|
|
155
|
+
}
|
|
156
|
+
const channelId = channelOpenedEvent.args[0];
|
|
157
|
+
const [participant1, participant2Addr] = [
|
|
158
|
+
channelOpenedEvent.args[1],
|
|
159
|
+
channelOpenedEvent.args[2],
|
|
160
|
+
];
|
|
161
|
+
const participants = [participant1, participant2Addr];
|
|
162
|
+
this.channelStateCache.set(channelId, {
|
|
163
|
+
channelId,
|
|
164
|
+
participants,
|
|
165
|
+
myDeposit: 0n,
|
|
166
|
+
theirDeposit: 0n,
|
|
167
|
+
myNonce: 0,
|
|
168
|
+
theirNonce: 0,
|
|
169
|
+
myTransferred: 0n,
|
|
170
|
+
theirTransferred: 0n,
|
|
171
|
+
status: 'opened',
|
|
172
|
+
settlementTimeout,
|
|
173
|
+
openedAt: Date.now() / 1000,
|
|
174
|
+
});
|
|
175
|
+
const txHash = receipt.hash;
|
|
176
|
+
this.logger.info('Channel opened successfully', {
|
|
177
|
+
channelId,
|
|
178
|
+
participant1,
|
|
179
|
+
participant2: participant2Addr,
|
|
180
|
+
txHash,
|
|
181
|
+
});
|
|
182
|
+
if (initialDeposit > 0n) {
|
|
183
|
+
await this.deposit(channelId, tokenAddress, initialDeposit);
|
|
184
|
+
}
|
|
185
|
+
return { channelId, txHash };
|
|
186
|
+
}
|
|
187
|
+
async deposit(channelId, tokenAddress, amount) {
|
|
188
|
+
const { signer, ethers } = await this._ensureInitialized();
|
|
189
|
+
const tokenNetwork = await this.getTokenNetworkContract(tokenAddress);
|
|
190
|
+
const myAddress = await signer.getAddress();
|
|
191
|
+
const state = await this.getChannelState(channelId, tokenAddress);
|
|
192
|
+
const newTotalDeposit = state.myDeposit + amount;
|
|
193
|
+
this.logger.info('Depositing to channel', {
|
|
194
|
+
channelId,
|
|
195
|
+
amount: amount.toString(),
|
|
196
|
+
newTotalDeposit: newTotalDeposit.toString(),
|
|
197
|
+
});
|
|
198
|
+
const token = new ethers.Contract(tokenAddress, ERC20_ABI, signer);
|
|
199
|
+
const tokenNetworkAddress = await tokenNetwork.getAddress();
|
|
200
|
+
const currentAllowance = (await token.allowance(myAddress, tokenNetworkAddress));
|
|
201
|
+
if (currentAllowance < newTotalDeposit) {
|
|
202
|
+
const maxApproval = ethers.MaxUint256;
|
|
203
|
+
this.logger.info('Approving max token allowance for TokenNetwork', {
|
|
204
|
+
channelId,
|
|
205
|
+
currentAllowance: currentAllowance.toString(),
|
|
206
|
+
requiredAmount: newTotalDeposit.toString(),
|
|
207
|
+
approvalAmount: 'max uint256',
|
|
208
|
+
tokenNetworkAddress,
|
|
209
|
+
});
|
|
210
|
+
let approveTx;
|
|
211
|
+
let retries = 0;
|
|
212
|
+
const maxRetries = 3;
|
|
213
|
+
while (retries < maxRetries) {
|
|
214
|
+
try {
|
|
215
|
+
const currentNonce = await this.provider.getTransactionCount(myAddress, 'pending');
|
|
216
|
+
this.logger.debug('Sending approve transaction', {
|
|
217
|
+
channelId,
|
|
218
|
+
nonce: currentNonce,
|
|
219
|
+
attempt: retries + 1,
|
|
220
|
+
});
|
|
221
|
+
approveTx = await token.approve(tokenNetworkAddress, maxApproval, {
|
|
222
|
+
nonce: currentNonce,
|
|
223
|
+
});
|
|
224
|
+
break;
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
const err = error;
|
|
228
|
+
if (err.code === 'NONCE_EXPIRED' && retries < maxRetries - 1) {
|
|
229
|
+
this.logger.warn('Nonce error on approve, retrying with fresh nonce', {
|
|
230
|
+
channelId,
|
|
231
|
+
attempt: retries + 1,
|
|
232
|
+
error: err.message,
|
|
233
|
+
});
|
|
234
|
+
retries++;
|
|
235
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
throw error;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
if (!approveTx) {
|
|
243
|
+
throw new Error('Failed to send approve transaction after retries');
|
|
244
|
+
}
|
|
245
|
+
await approveTx.wait();
|
|
246
|
+
this.logger.debug('Token approval confirmed', {
|
|
247
|
+
channelId,
|
|
248
|
+
approvedAmount: 'max uint256',
|
|
249
|
+
txHash: approveTx.hash,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
this.logger.debug('Sufficient token allowance already exists', {
|
|
254
|
+
channelId,
|
|
255
|
+
currentAllowance: currentAllowance.toString(),
|
|
256
|
+
requiredAmount: newTotalDeposit.toString(),
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
let depositTx;
|
|
260
|
+
let depositRetries = 0;
|
|
261
|
+
const maxDepositRetries = 3;
|
|
262
|
+
while (depositRetries < maxDepositRetries) {
|
|
263
|
+
try {
|
|
264
|
+
const currentNonce = await this.provider.getTransactionCount(myAddress, 'pending');
|
|
265
|
+
this.logger.debug('Sending setTotalDeposit transaction', {
|
|
266
|
+
channelId,
|
|
267
|
+
nonce: currentNonce,
|
|
268
|
+
attempt: depositRetries + 1,
|
|
269
|
+
});
|
|
270
|
+
depositTx = await tokenNetwork.setTotalDeposit(channelId, myAddress, newTotalDeposit, {
|
|
271
|
+
nonce: currentNonce,
|
|
272
|
+
});
|
|
273
|
+
break;
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
const err = error;
|
|
277
|
+
if (err.code === 'NONCE_EXPIRED' && depositRetries < maxDepositRetries - 1) {
|
|
278
|
+
this.logger.warn('Nonce error on setTotalDeposit, retrying', {
|
|
279
|
+
channelId,
|
|
280
|
+
attempt: depositRetries + 1,
|
|
281
|
+
error: err.message,
|
|
282
|
+
});
|
|
283
|
+
depositRetries++;
|
|
284
|
+
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
throw error;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
if (!depositTx) {
|
|
292
|
+
throw new Error('Failed to send setTotalDeposit transaction after retries');
|
|
293
|
+
}
|
|
294
|
+
await depositTx.wait();
|
|
295
|
+
if (this.channelStateCache.has(channelId)) {
|
|
296
|
+
const cached = this.channelStateCache.get(channelId);
|
|
297
|
+
cached.myDeposit = newTotalDeposit;
|
|
298
|
+
this.channelStateCache.set(channelId, cached);
|
|
299
|
+
}
|
|
300
|
+
this.logger.info('Deposit completed', {
|
|
301
|
+
channelId,
|
|
302
|
+
newTotalDeposit: newTotalDeposit.toString(),
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
async signBalanceProof(channelId, nonce, transferredAmount, lockedAmount = 0n, locksRoot) {
|
|
306
|
+
const { ethers } = await this._ensureInitialized();
|
|
307
|
+
const resolvedLocksRoot = locksRoot ?? ethers.ZeroHash;
|
|
308
|
+
let tokenNetworkAddress;
|
|
309
|
+
for (const [, contract] of this.tokenNetworkCache) {
|
|
310
|
+
try {
|
|
311
|
+
const channelData = await contract.channels(channelId);
|
|
312
|
+
if (channelData.state !== 0) {
|
|
313
|
+
tokenNetworkAddress = await contract.getAddress();
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
catch {
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
if (!tokenNetworkAddress) {
|
|
322
|
+
throw new Error(`Cannot determine TokenNetwork for channel ${channelId}`);
|
|
323
|
+
}
|
|
324
|
+
const network = await this.provider.getNetwork();
|
|
325
|
+
const chainId = network.chainId;
|
|
326
|
+
const domain = (0, eip712_helper_1.getDomainSeparator)(chainId, tokenNetworkAddress);
|
|
327
|
+
const types = (0, eip712_helper_1.getBalanceProofTypes)();
|
|
328
|
+
const balanceProof = {
|
|
329
|
+
channelId,
|
|
330
|
+
nonce,
|
|
331
|
+
transferredAmount,
|
|
332
|
+
lockedAmount,
|
|
333
|
+
locksRoot: resolvedLocksRoot,
|
|
334
|
+
};
|
|
335
|
+
const hash = ethers.TypedDataEncoder.hash(domain, types, balanceProof);
|
|
336
|
+
const signatureBuffer = await this.keyManager.sign(Buffer.from(hash.slice(2), 'hex'), this.evmKeyId);
|
|
337
|
+
const signature = '0x' + signatureBuffer.toString('hex');
|
|
338
|
+
this.logger.debug('Balance proof signed', {
|
|
339
|
+
channelId,
|
|
340
|
+
nonce,
|
|
341
|
+
transferredAmount: transferredAmount.toString(),
|
|
342
|
+
});
|
|
343
|
+
return signature;
|
|
344
|
+
}
|
|
345
|
+
async verifyBalanceProof(balanceProof, signature, expectedSigner) {
|
|
346
|
+
try {
|
|
347
|
+
const { ethers } = await this._ensureInitialized();
|
|
348
|
+
let tokenNetworkAddress;
|
|
349
|
+
for (const [, contract] of this.tokenNetworkCache) {
|
|
350
|
+
try {
|
|
351
|
+
const channelData = await contract.channels(balanceProof.channelId);
|
|
352
|
+
if (channelData.state !== 0) {
|
|
353
|
+
tokenNetworkAddress = await contract.getAddress();
|
|
354
|
+
break;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
catch {
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
if (!tokenNetworkAddress) {
|
|
362
|
+
this.logger.warn('Cannot determine TokenNetwork for balance proof verification', {
|
|
363
|
+
channelId: balanceProof.channelId,
|
|
364
|
+
});
|
|
365
|
+
return false;
|
|
366
|
+
}
|
|
367
|
+
const network = await this.provider.getNetwork();
|
|
368
|
+
const chainId = network.chainId;
|
|
369
|
+
const domain = (0, eip712_helper_1.getDomainSeparator)(chainId, tokenNetworkAddress);
|
|
370
|
+
const types = (0, eip712_helper_1.getBalanceProofTypes)();
|
|
371
|
+
const recoveredSigner = ethers.verifyTypedData(domain, types, balanceProof, signature);
|
|
372
|
+
const isValid = recoveredSigner.toLowerCase() === expectedSigner.toLowerCase();
|
|
373
|
+
if (!isValid) {
|
|
374
|
+
this.logger.warn('Balance proof verification failed', {
|
|
375
|
+
balanceProof,
|
|
376
|
+
expectedSigner,
|
|
377
|
+
recoveredSigner,
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
return isValid;
|
|
381
|
+
}
|
|
382
|
+
catch (error) {
|
|
383
|
+
this.logger.error('Balance proof verification error', { balanceProof, error });
|
|
384
|
+
return false;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
async closeChannel(channelId, tokenAddress) {
|
|
388
|
+
const tokenNetwork = await this.getTokenNetworkContract(tokenAddress);
|
|
389
|
+
const state = await this.getChannelState(channelId, tokenAddress);
|
|
390
|
+
if (state.status !== 'opened') {
|
|
391
|
+
throw new Error(`Cannot close channel in status: ${state.status}`);
|
|
392
|
+
}
|
|
393
|
+
this.logger.info('Closing channel (starting grace period)', { channelId });
|
|
394
|
+
const tx = await tokenNetwork.closeChannel(channelId);
|
|
395
|
+
const receipt = await tx.wait();
|
|
396
|
+
if (this.channelStateCache.has(channelId)) {
|
|
397
|
+
const cached = this.channelStateCache.get(channelId);
|
|
398
|
+
cached.status = 'closed';
|
|
399
|
+
const block = await this.provider.getBlock(receipt.blockNumber);
|
|
400
|
+
cached.closedAt = block.timestamp;
|
|
401
|
+
this.channelStateCache.set(channelId, cached);
|
|
402
|
+
}
|
|
403
|
+
this.logger.info('Channel closed, grace period started', { channelId, txHash: receipt.hash });
|
|
404
|
+
}
|
|
405
|
+
async claimFromChannel(channelId, tokenAddress, balanceProof, signature) {
|
|
406
|
+
const tokenNetwork = await this.getTokenNetworkContract(tokenAddress);
|
|
407
|
+
const state = await this.getChannelState(channelId, tokenAddress);
|
|
408
|
+
if (state.status !== 'opened' && state.status !== 'closed') {
|
|
409
|
+
throw new Error(`Cannot claim from channel in status: ${state.status}`);
|
|
410
|
+
}
|
|
411
|
+
this.logger.info('Claiming from channel', {
|
|
412
|
+
channelId,
|
|
413
|
+
nonce: balanceProof.nonce,
|
|
414
|
+
transferredAmount: balanceProof.transferredAmount.toString(),
|
|
415
|
+
});
|
|
416
|
+
const tx = await tokenNetwork.claimFromChannel(channelId, balanceProof, signature);
|
|
417
|
+
const receipt = await tx.wait();
|
|
418
|
+
this.channelStateCache.delete(channelId);
|
|
419
|
+
this.logger.info('Claim from channel completed', { channelId, txHash: receipt.hash });
|
|
420
|
+
}
|
|
421
|
+
async getClaimedAmount(channelId, tokenAddress, participant) {
|
|
422
|
+
const tokenNetwork = await this.getTokenNetworkContract(tokenAddress);
|
|
423
|
+
const claimed = await tokenNetwork.claimedAmounts(channelId, participant);
|
|
424
|
+
return claimed;
|
|
425
|
+
}
|
|
426
|
+
async settleChannel(channelId, tokenAddress) {
|
|
427
|
+
const tokenNetwork = await this.getTokenNetworkContract(tokenAddress);
|
|
428
|
+
const state = await this.getChannelState(channelId, tokenAddress);
|
|
429
|
+
if (state.status !== 'closed') {
|
|
430
|
+
throw new Error(`Cannot settle channel in status: ${state.status}`);
|
|
431
|
+
}
|
|
432
|
+
if (!state.closedAt) {
|
|
433
|
+
throw new Error('Channel closedAt timestamp is missing');
|
|
434
|
+
}
|
|
435
|
+
const latestBlock = await this.provider.getBlock('latest');
|
|
436
|
+
const now = latestBlock.timestamp;
|
|
437
|
+
const expiresAt = state.closedAt + state.settlementTimeout;
|
|
438
|
+
if (now < expiresAt) {
|
|
439
|
+
throw new ChallengeNotExpiredError(`Challenge period not expired. Expires at ${new Date(expiresAt * 1000).toISOString()}`, channelId, state.closedAt, state.settlementTimeout);
|
|
440
|
+
}
|
|
441
|
+
this.logger.info('Settling channel', { channelId });
|
|
442
|
+
const tx = await tokenNetwork.settleChannel(channelId);
|
|
443
|
+
const receipt = await tx.wait();
|
|
444
|
+
if (this.channelStateCache.has(channelId)) {
|
|
445
|
+
const cached = this.channelStateCache.get(channelId);
|
|
446
|
+
cached.status = 'settled';
|
|
447
|
+
this.channelStateCache.set(channelId, cached);
|
|
448
|
+
}
|
|
449
|
+
this.logger.info('Channel settled', { channelId, txHash: receipt.hash });
|
|
450
|
+
}
|
|
451
|
+
async getChannelState(channelId, tokenAddress) {
|
|
452
|
+
if (this.channelStateCache.has(channelId)) {
|
|
453
|
+
return this.channelStateCache.get(channelId);
|
|
454
|
+
}
|
|
455
|
+
const { signer } = await this._ensureInitialized();
|
|
456
|
+
const tokenNetwork = await this.getTokenNetworkContract(tokenAddress);
|
|
457
|
+
const myAddress = await signer.getAddress();
|
|
458
|
+
const channelData = await tokenNetwork.channels(channelId);
|
|
459
|
+
const [settlementTimeout, stateEnum, closedAt, openedAt, participant1, participant2] = [
|
|
460
|
+
channelData.settlementTimeout,
|
|
461
|
+
channelData.state,
|
|
462
|
+
channelData.closedAt,
|
|
463
|
+
channelData.openedAt,
|
|
464
|
+
channelData.participant1,
|
|
465
|
+
channelData.participant2,
|
|
466
|
+
];
|
|
467
|
+
const stateMap = {
|
|
468
|
+
0: 'settled',
|
|
469
|
+
1: 'opened',
|
|
470
|
+
2: 'closed',
|
|
471
|
+
3: 'settled',
|
|
472
|
+
};
|
|
473
|
+
const status = stateMap[stateEnum] || 'settled';
|
|
474
|
+
const myParticipantData = await tokenNetwork.participants(channelId, myAddress);
|
|
475
|
+
const counterparty = participant1.toLowerCase() === myAddress.toLowerCase() ? participant2 : participant1;
|
|
476
|
+
const theirParticipantData = await tokenNetwork.participants(channelId, counterparty);
|
|
477
|
+
const state = {
|
|
478
|
+
channelId,
|
|
479
|
+
participants: [participant1, participant2],
|
|
480
|
+
myDeposit: myParticipantData.deposit,
|
|
481
|
+
theirDeposit: theirParticipantData.deposit,
|
|
482
|
+
myNonce: Number(myParticipantData.nonce),
|
|
483
|
+
theirNonce: Number(theirParticipantData.nonce),
|
|
484
|
+
myTransferred: myParticipantData.transferredAmount,
|
|
485
|
+
theirTransferred: theirParticipantData.transferredAmount,
|
|
486
|
+
status,
|
|
487
|
+
settlementTimeout: Number(settlementTimeout),
|
|
488
|
+
closedAt: closedAt > 0 ? Number(closedAt) : undefined,
|
|
489
|
+
openedAt: Number(openedAt),
|
|
490
|
+
};
|
|
491
|
+
this.channelStateCache.set(channelId, state);
|
|
492
|
+
return state;
|
|
493
|
+
}
|
|
494
|
+
async getChannelStateByNetwork(channelId, tokenNetworkAddress) {
|
|
495
|
+
const { ethers } = await (0, optional_require_1.requireOptional)('ethers', 'EVM settlement');
|
|
496
|
+
const tokenNetwork = new ethers.Contract(tokenNetworkAddress, TOKEN_NETWORK_ABI, this.provider);
|
|
497
|
+
try {
|
|
498
|
+
const channelData = await tokenNetwork.channels(channelId);
|
|
499
|
+
const stateEnum = Number(channelData.state);
|
|
500
|
+
return {
|
|
501
|
+
exists: stateEnum !== 0,
|
|
502
|
+
state: stateEnum,
|
|
503
|
+
participant1: channelData.participant1,
|
|
504
|
+
participant2: channelData.participant2,
|
|
505
|
+
settlementTimeout: Number(channelData.settlementTimeout),
|
|
506
|
+
};
|
|
507
|
+
}
|
|
508
|
+
catch (error) {
|
|
509
|
+
this.logger.error('Failed to query channel state by network', {
|
|
510
|
+
channelId,
|
|
511
|
+
tokenNetworkAddress,
|
|
512
|
+
error,
|
|
513
|
+
});
|
|
514
|
+
throw error;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
async verifyBalanceProofWithDomain(balanceProof, signature, expectedSigner, chainId, tokenNetworkAddress) {
|
|
518
|
+
try {
|
|
519
|
+
const { ethers } = await (0, optional_require_1.requireOptional)('ethers', 'EVM settlement');
|
|
520
|
+
const domain = (0, eip712_helper_1.getDomainSeparator)(chainId, tokenNetworkAddress);
|
|
521
|
+
const types = (0, eip712_helper_1.getBalanceProofTypes)();
|
|
522
|
+
const recoveredSigner = ethers.verifyTypedData(domain, types, balanceProof, signature);
|
|
523
|
+
const isValid = recoveredSigner.toLowerCase() === expectedSigner.toLowerCase();
|
|
524
|
+
if (!isValid) {
|
|
525
|
+
this.logger.warn('Balance proof verification with explicit domain failed', {
|
|
526
|
+
channelId: balanceProof.channelId,
|
|
527
|
+
expectedSigner,
|
|
528
|
+
recoveredSigner,
|
|
529
|
+
chainId,
|
|
530
|
+
tokenNetworkAddress,
|
|
531
|
+
});
|
|
532
|
+
}
|
|
533
|
+
return isValid;
|
|
534
|
+
}
|
|
535
|
+
catch (error) {
|
|
536
|
+
this.logger.error('Balance proof verification with explicit domain error', {
|
|
537
|
+
channelId: balanceProof.channelId,
|
|
538
|
+
chainId,
|
|
539
|
+
tokenNetworkAddress,
|
|
540
|
+
error,
|
|
541
|
+
});
|
|
542
|
+
return false;
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
async getMyChannels(tokenAddress) {
|
|
546
|
+
const { signer } = await this._ensureInitialized();
|
|
547
|
+
const tokenNetwork = await this.getTokenNetworkContract(tokenAddress);
|
|
548
|
+
const myAddress = await signer.getAddress();
|
|
549
|
+
const filter = tokenNetwork.filters.ChannelOpened();
|
|
550
|
+
const events = await tokenNetwork.queryFilter(filter);
|
|
551
|
+
const myChannels = events
|
|
552
|
+
.filter((event) => {
|
|
553
|
+
const eventLog = event;
|
|
554
|
+
const participant1 = eventLog.args[1];
|
|
555
|
+
const participant2 = eventLog.args[2];
|
|
556
|
+
return (participant1.toLowerCase() === myAddress.toLowerCase() ||
|
|
557
|
+
participant2.toLowerCase() === myAddress.toLowerCase());
|
|
558
|
+
})
|
|
559
|
+
.map((event) => {
|
|
560
|
+
const eventLog = event;
|
|
561
|
+
return eventLog.args[0];
|
|
562
|
+
});
|
|
563
|
+
return myChannels;
|
|
564
|
+
}
|
|
565
|
+
async onChannelOpened(tokenAddress, callback) {
|
|
566
|
+
const tokenNetwork = await this.getTokenNetworkContract(tokenAddress);
|
|
567
|
+
const listener = (channelId, participant1, participant2, settlementTimeout) => {
|
|
568
|
+
const event = {
|
|
569
|
+
type: 'ChannelOpened',
|
|
570
|
+
channelId,
|
|
571
|
+
participant1,
|
|
572
|
+
participant2,
|
|
573
|
+
settlementTimeout: Number(settlementTimeout),
|
|
574
|
+
};
|
|
575
|
+
this.channelStateCache.set(channelId, {
|
|
576
|
+
channelId,
|
|
577
|
+
participants: [participant1, participant2],
|
|
578
|
+
myDeposit: 0n,
|
|
579
|
+
theirDeposit: 0n,
|
|
580
|
+
myNonce: 0,
|
|
581
|
+
theirNonce: 0,
|
|
582
|
+
myTransferred: 0n,
|
|
583
|
+
theirTransferred: 0n,
|
|
584
|
+
status: 'opened',
|
|
585
|
+
settlementTimeout: Number(settlementTimeout),
|
|
586
|
+
openedAt: Date.now() / 1000,
|
|
587
|
+
});
|
|
588
|
+
callback(event);
|
|
589
|
+
};
|
|
590
|
+
tokenNetwork.on('ChannelOpened', listener);
|
|
591
|
+
const key = `${tokenAddress}:ChannelOpened`;
|
|
592
|
+
if (!this.eventListeners.has(key)) {
|
|
593
|
+
this.eventListeners.set(key, []);
|
|
594
|
+
}
|
|
595
|
+
this.eventListeners.get(key).push(listener);
|
|
596
|
+
}
|
|
597
|
+
async onChannelClosed(tokenAddress, callback) {
|
|
598
|
+
const tokenNetwork = await this.getTokenNetworkContract(tokenAddress);
|
|
599
|
+
const listener = (channelId, closingParticipant, nonce, balanceHash) => {
|
|
600
|
+
const event = {
|
|
601
|
+
type: 'ChannelClosed',
|
|
602
|
+
channelId,
|
|
603
|
+
closingParticipant,
|
|
604
|
+
nonce: Number(nonce),
|
|
605
|
+
balanceHash,
|
|
606
|
+
};
|
|
607
|
+
if (this.channelStateCache.has(channelId)) {
|
|
608
|
+
const cached = this.channelStateCache.get(channelId);
|
|
609
|
+
cached.status = 'closed';
|
|
610
|
+
cached.closedAt = Date.now() / 1000;
|
|
611
|
+
this.channelStateCache.set(channelId, cached);
|
|
612
|
+
}
|
|
613
|
+
callback(event);
|
|
614
|
+
};
|
|
615
|
+
tokenNetwork.on('ChannelClosed', listener);
|
|
616
|
+
const key = `${tokenAddress}:ChannelClosed`;
|
|
617
|
+
if (!this.eventListeners.has(key)) {
|
|
618
|
+
this.eventListeners.set(key, []);
|
|
619
|
+
}
|
|
620
|
+
this.eventListeners.get(key).push(listener);
|
|
621
|
+
}
|
|
622
|
+
async onChannelSettled(tokenAddress, callback) {
|
|
623
|
+
const tokenNetwork = await this.getTokenNetworkContract(tokenAddress);
|
|
624
|
+
const listener = (channelId, participant1Amount, participant2Amount) => {
|
|
625
|
+
const event = {
|
|
626
|
+
type: 'ChannelSettled',
|
|
627
|
+
channelId,
|
|
628
|
+
participant1Amount,
|
|
629
|
+
participant2Amount,
|
|
630
|
+
};
|
|
631
|
+
if (this.channelStateCache.has(channelId)) {
|
|
632
|
+
const cached = this.channelStateCache.get(channelId);
|
|
633
|
+
cached.status = 'settled';
|
|
634
|
+
this.channelStateCache.set(channelId, cached);
|
|
635
|
+
}
|
|
636
|
+
callback(event);
|
|
637
|
+
};
|
|
638
|
+
tokenNetwork.on('ChannelSettled', listener);
|
|
639
|
+
const key = `${tokenAddress}:ChannelSettled`;
|
|
640
|
+
if (!this.eventListeners.has(key)) {
|
|
641
|
+
this.eventListeners.set(key, []);
|
|
642
|
+
}
|
|
643
|
+
this.eventListeners.get(key).push(listener);
|
|
644
|
+
}
|
|
645
|
+
async onChannelCooperativeSettled(tokenAddress, callback) {
|
|
646
|
+
const tokenNetwork = await this.getTokenNetworkContract(tokenAddress);
|
|
647
|
+
const listener = (channelId, participant1Amount, participant2Amount) => {
|
|
648
|
+
const event = {
|
|
649
|
+
type: 'ChannelCooperativeSettled',
|
|
650
|
+
channelId,
|
|
651
|
+
participant1Amount,
|
|
652
|
+
participant2Amount,
|
|
653
|
+
};
|
|
654
|
+
if (this.channelStateCache.has(channelId)) {
|
|
655
|
+
const cached = this.channelStateCache.get(channelId);
|
|
656
|
+
cached.status = 'settled';
|
|
657
|
+
this.channelStateCache.set(channelId, cached);
|
|
658
|
+
}
|
|
659
|
+
callback(event);
|
|
660
|
+
};
|
|
661
|
+
tokenNetwork.on('ChannelCooperativeSettled', listener);
|
|
662
|
+
const key = `${tokenAddress}:ChannelCooperativeSettled`;
|
|
663
|
+
if (!this.eventListeners.has(key)) {
|
|
664
|
+
this.eventListeners.set(key, []);
|
|
665
|
+
}
|
|
666
|
+
this.eventListeners.get(key).push(listener);
|
|
667
|
+
}
|
|
668
|
+
removeAllListeners() {
|
|
669
|
+
for (const [, contract] of this.tokenNetworkCache) {
|
|
670
|
+
contract.removeAllListeners();
|
|
671
|
+
}
|
|
672
|
+
this.eventListeners.clear();
|
|
673
|
+
this.logger.debug('All event listeners removed');
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
exports.PaymentChannelSDK = PaymentChannelSDK;
|
|
677
|
+
//# sourceMappingURL=payment-channel-sdk.js.map
|