@teneo-protocol/sdk 1.0.1 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +11 -2
- package/.github/CODEOWNERS +2 -0
- package/.github/ISSUE_TEMPLATE/01-bug.yml +85 -0
- package/.github/ISSUE_TEMPLATE/config.yml +8 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
- package/.github/workflows/claude-code-review.yml +8 -3
- package/.github/workflows/claude-reviewer.yml +6 -4
- package/.github/workflows/publish-npm.yml +9 -6
- package/.github/workflows/push-to-main.yml +1 -1
- package/.github/workflows/top-issue.yml +102 -0
- package/CHANGELOG.md +334 -0
- package/CONCEPTS.md +747 -0
- package/README.md +577 -54
- package/dist/constants.js +8 -8
- package/dist/constants.js.map +1 -1
- package/dist/core/websocket-client.d.ts +25 -1
- package/dist/core/websocket-client.d.ts.map +1 -1
- package/dist/core/websocket-client.js +74 -15
- package/dist/core/websocket-client.js.map +1 -1
- package/dist/formatters/response-formatter.js +4 -0
- package/dist/formatters/response-formatter.js.map +1 -1
- package/dist/handlers/message-handler-registry.js +2 -1
- package/dist/handlers/message-handler-registry.js.map +1 -1
- package/dist/handlers/message-handlers/agent-details-response-handler.d.ts +1666 -0
- package/dist/handlers/message-handlers/agent-details-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-details-response-handler.js +38 -0
- package/dist/handlers/message-handlers/agent-details-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts +76 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.js +67 -0
- package/dist/handlers/message-handlers/agent-room-operation-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts +92 -38
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/agent-selected-handler.js +2 -5
- package/dist/handlers/message-handlers/agent-selected-handler.js.map +1 -1
- package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +1687 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.js +48 -0
- package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -0
- package/dist/handlers/message-handlers/agents-list-handler.js +2 -5
- package/dist/handlers/message-handlers/agents-list-handler.js.map +1 -1
- package/dist/handlers/message-handlers/all-agents-response-handler.d.ts +439 -0
- package/dist/handlers/message-handlers/all-agents-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/all-agents-response-handler.js +36 -0
- package/dist/handlers/message-handlers/all-agents-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-error-handler.d.ts +45 -31
- package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-error-handler.js +2 -5
- package/dist/handlers/message-handlers/auth-error-handler.js.map +1 -1
- package/dist/handlers/message-handlers/auth-message-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-message-handler.js +71 -10
- package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
- package/dist/handlers/message-handlers/auth-required-handler.d.ts +49 -31
- package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-required-handler.js +2 -5
- package/dist/handlers/message-handlers/auth-required-handler.js.map +1 -1
- package/dist/handlers/message-handlers/auth-success-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-success-handler.js +52 -9
- package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
- package/dist/handlers/message-handlers/base-handler.d.ts +4 -4
- package/dist/handlers/message-handlers/base-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/base-handler.js +3 -1
- package/dist/handlers/message-handlers/base-handler.js.map +1 -1
- package/dist/handlers/message-handlers/challenge-handler.d.ts +45 -31
- package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/challenge-handler.js +3 -2
- package/dist/handlers/message-handlers/challenge-handler.js.map +1 -1
- package/dist/handlers/message-handlers/error-message-handler.d.ts +49 -31
- package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/error-message-handler.js +2 -5
- package/dist/handlers/message-handlers/error-message-handler.js.map +1 -1
- package/dist/handlers/message-handlers/index.d.ts +11 -0
- package/dist/handlers/message-handlers/index.d.ts.map +1 -1
- package/dist/handlers/message-handlers/index.js +55 -1
- package/dist/handlers/message-handlers/index.js.map +1 -1
- package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +1660 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.js +35 -0
- package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +1669 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.js +48 -0
- package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +2 -110
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/list-rooms-response-handler.js +4 -6
- package/dist/handlers/message-handlers/list-rooms-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts +62 -58
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/ping-pong-handler.js +4 -10
- package/dist/handlers/message-handlers/ping-pong-handler.js.map +1 -1
- package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts +94 -0
- package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/rate-limit-notification-handler.js +35 -0
- package/dist/handlers/message-handlers/rate-limit-notification-handler.js.map +1 -0
- package/dist/handlers/message-handlers/regular-message-handler.d.ts +31 -29
- package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/regular-message-handler.js +4 -6
- package/dist/handlers/message-handlers/regular-message-handler.js.map +1 -1
- package/dist/handlers/message-handlers/room-operation-response-handler.d.ts +328 -0
- package/dist/handlers/message-handlers/room-operation-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/room-operation-response-handler.js +89 -0
- package/dist/handlers/message-handlers/room-operation-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +53 -31
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/subscribe-response-handler.js +4 -6
- package/dist/handlers/message-handlers/subscribe-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/task-quote-handler.d.ts +14 -0
- package/dist/handlers/message-handlers/task-quote-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/task-quote-handler.js +29 -0
- package/dist/handlers/message-handlers/task-quote-handler.js.map +1 -0
- package/dist/handlers/message-handlers/task-response-handler.js +2 -5
- package/dist/handlers/message-handlers/task-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/types.d.ts +21 -7
- package/dist/handlers/message-handlers/types.d.ts.map +1 -1
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +53 -31
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/unsubscribe-response-handler.js +4 -6
- package/dist/handlers/message-handlers/unsubscribe-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/user-authenticated-handler.d.ts +40 -0
- package/dist/handlers/message-handlers/user-authenticated-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/user-authenticated-handler.js +28 -0
- package/dist/handlers/message-handlers/user-authenticated-handler.js.map +1 -0
- package/dist/handlers/message-handlers/user-count-handler.d.ts +49 -0
- package/dist/handlers/message-handlers/user-count-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/user-count-handler.js +31 -0
- package/dist/handlers/message-handlers/user-count-handler.js.map +1 -0
- package/dist/handlers/webhook-handler.d.ts +1 -1
- package/dist/handlers/webhook-handler.d.ts.map +1 -1
- package/dist/handlers/webhook-handler.js +14 -5
- package/dist/handlers/webhook-handler.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -2
- package/dist/index.js.map +1 -1
- package/dist/managers/admin-manager.d.ts +116 -0
- package/dist/managers/admin-manager.d.ts.map +1 -0
- package/dist/managers/admin-manager.js +169 -0
- package/dist/managers/admin-manager.js.map +1 -0
- package/dist/managers/agent-registry.d.ts +52 -1
- package/dist/managers/agent-registry.d.ts.map +1 -1
- package/dist/managers/agent-registry.js +145 -6
- package/dist/managers/agent-registry.js.map +1 -1
- package/dist/managers/agent-room-manager.d.ts +216 -0
- package/dist/managers/agent-room-manager.d.ts.map +1 -0
- package/dist/managers/agent-room-manager.js +555 -0
- package/dist/managers/agent-room-manager.js.map +1 -0
- package/dist/managers/connection-manager.js +2 -0
- package/dist/managers/connection-manager.js.map +1 -1
- package/dist/managers/index.d.ts +4 -1
- package/dist/managers/index.d.ts.map +1 -1
- package/dist/managers/index.js +7 -1
- package/dist/managers/index.js.map +1 -1
- package/dist/managers/message-router.d.ts +56 -5
- package/dist/managers/message-router.d.ts.map +1 -1
- package/dist/managers/message-router.js +155 -8
- package/dist/managers/message-router.js.map +1 -1
- package/dist/managers/room-management-manager.d.ts +213 -0
- package/dist/managers/room-management-manager.d.ts.map +1 -0
- package/dist/managers/room-management-manager.js +442 -0
- package/dist/managers/room-management-manager.js.map +1 -0
- package/dist/managers/room-manager.d.ts +11 -9
- package/dist/managers/room-manager.d.ts.map +1 -1
- package/dist/managers/room-manager.js +14 -10
- package/dist/managers/room-manager.js.map +1 -1
- package/dist/payments/index.d.ts +5 -0
- package/dist/payments/index.d.ts.map +1 -0
- package/dist/payments/index.js +21 -0
- package/dist/payments/index.js.map +1 -0
- package/dist/payments/payment-client.d.ts +74 -0
- package/dist/payments/payment-client.d.ts.map +1 -0
- package/dist/payments/payment-client.js +207 -0
- package/dist/payments/payment-client.js.map +1 -0
- package/dist/teneo-sdk.d.ts +467 -33
- package/dist/teneo-sdk.d.ts.map +1 -1
- package/dist/teneo-sdk.js +735 -26
- package/dist/teneo-sdk.js.map +1 -1
- package/dist/types/categories.d.ts +22 -0
- package/dist/types/categories.d.ts.map +1 -0
- package/dist/types/categories.js +40 -0
- package/dist/types/categories.js.map +1 -0
- package/dist/types/config.d.ts +134 -54
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +70 -9
- package/dist/types/config.js.map +1 -1
- package/dist/types/error-codes.d.ts +10 -0
- package/dist/types/error-codes.d.ts.map +1 -1
- package/dist/types/error-codes.js +12 -0
- package/dist/types/error-codes.js.map +1 -1
- package/dist/types/events.d.ts +176 -68
- package/dist/types/events.d.ts.map +1 -1
- package/dist/types/events.js +19 -1
- package/dist/types/events.js.map +1 -1
- package/dist/types/index.d.ts +3 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +57 -2
- package/dist/types/index.js.map +1 -1
- package/dist/types/messages.d.ts +22225 -2592
- package/dist/types/messages.d.ts.map +1 -1
- package/dist/types/messages.js +537 -28
- package/dist/types/messages.js.map +1 -1
- package/dist/utils/bounded-queue.d.ts.map +1 -1
- package/dist/utils/bounded-queue.js +5 -2
- package/dist/utils/bounded-queue.js.map +1 -1
- package/dist/utils/circuit-breaker.js +11 -4
- package/dist/utils/circuit-breaker.js.map +1 -1
- package/dist/utils/deduplication-cache.js +3 -1
- package/dist/utils/deduplication-cache.js.map +1 -1
- package/dist/utils/event-waiter.d.ts +3 -3
- package/dist/utils/event-waiter.d.ts.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/pricing-resolver.d.ts +26 -0
- package/dist/utils/pricing-resolver.d.ts.map +1 -0
- package/dist/utils/pricing-resolver.js +85 -0
- package/dist/utils/pricing-resolver.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -1
- package/dist/utils/rate-limiter.js +6 -0
- package/dist/utils/rate-limiter.js.map +1 -1
- package/dist/utils/retry-policy.js +1 -0
- package/dist/utils/retry-policy.js.map +1 -1
- package/dist/utils/secure-private-key.js +3 -1
- package/dist/utils/secure-private-key.js.map +1 -1
- package/dist/utils/signature-verifier.d.ts.map +1 -1
- package/dist/utils/signature-verifier.js +3 -1
- package/dist/utils/signature-verifier.js.map +1 -1
- package/examples/.env.example +2 -2
- package/examples/agent-room-management-example.ts +335 -0
- package/examples/basic-usage.ts +3 -4
- package/examples/claude-agent-x-follower/.env.example +3 -3
- package/examples/claude-agent-x-follower/QUICKSTART.md +3 -3
- package/examples/claude-agent-x-follower/README.md +3 -3
- package/examples/claude-agent-x-follower/index.ts +120 -96
- package/examples/n8n-teneo/.env.example +3 -3
- package/examples/n8n-teneo/README.md +2 -2
- package/examples/n8n-teneo/index.ts +54 -44
- package/examples/nestjs-dashboard/.env.example +11 -0
- package/examples/nestjs-dashboard/README.md +297 -0
- package/examples/nestjs-dashboard/nest-cli.json +10 -0
- package/examples/nestjs-dashboard/package.json +44 -0
- package/examples/nestjs-dashboard/pnpm-lock.yaml +3079 -0
- package/examples/nestjs-dashboard/src/app.controller.ts +24 -0
- package/examples/nestjs-dashboard/src/app.module.ts +15 -0
- package/examples/nestjs-dashboard/src/main.ts +32 -0
- package/examples/nestjs-dashboard/src/public/dashboard.html +1144 -0
- package/examples/nestjs-dashboard/src/teneo/agents.controller.ts +54 -0
- package/examples/nestjs-dashboard/src/teneo/events.controller.ts +65 -0
- package/examples/nestjs-dashboard/src/teneo/messages.controller.ts +47 -0
- package/examples/nestjs-dashboard/src/teneo/rooms.controller.ts +258 -0
- package/examples/nestjs-dashboard/src/teneo/teneo.module.ts +13 -0
- package/examples/nestjs-dashboard/src/teneo/teneo.service.ts +484 -0
- package/examples/nestjs-dashboard/tsconfig.json +22 -0
- package/examples/openai-teneo/.env.example +3 -3
- package/examples/openai-teneo/README.md +3 -3
- package/examples/openai-teneo/index.ts +82 -71
- package/examples/production-dashboard/.env.example +3 -3
- package/examples/production-dashboard/README.md +90 -13
- package/examples/production-dashboard/public/dashboard.html +1173 -601
- package/examples/production-dashboard/server.ts +349 -7
- package/examples/room-management-example.ts +282 -0
- package/examples/usage/.env.example +2 -2
- package/examples/usage/01-connect.ts +3 -4
- package/examples/usage/02-list-agents.ts +2 -3
- package/examples/usage/03-pick-agent.ts +2 -3
- package/examples/usage/04-find-by-capability.ts +2 -3
- package/examples/usage/05-webhook-example.ts +2 -3
- package/examples/usage/06-simple-api-server.ts +2 -3
- package/examples/usage/07-event-listener.ts +2 -3
- package/examples/usage/README.md +1 -1
- package/examples/webhook-integration.ts +1 -1
- package/examples/x-influencer-battle-server.ts +2 -2
- package/package.json +12 -1
- package/src/core/websocket-client.test.ts +8 -3
- package/src/core/websocket-client.ts +58 -4
- package/src/formatters/response-formatter.test.ts +2 -0
- package/src/formatters/response-formatter.ts +3 -3
- package/src/handlers/message-handlers/agent-details-response-handler.ts +42 -0
- package/src/handlers/message-handlers/agent-room-operation-response-handler.ts +77 -0
- package/src/handlers/message-handlers/agent-status-update-handler.ts +52 -0
- package/src/handlers/message-handlers/all-agents-response-handler.ts +39 -0
- package/src/handlers/message-handlers/auth-message-handler.ts +78 -5
- package/src/handlers/message-handlers/auth-success-handler.ts +63 -6
- package/src/handlers/message-handlers/base-handler.ts +20 -7
- package/src/handlers/message-handlers/index.ts +53 -0
- package/src/handlers/message-handlers/list-available-agents-handler.ts +41 -0
- package/src/handlers/message-handlers/list-room-agents-handler.ts +58 -0
- package/src/handlers/message-handlers/list-rooms-response-handler.ts +4 -2
- package/src/handlers/message-handlers/rate-limit-notification-handler.ts +45 -0
- package/src/handlers/message-handlers/regular-message-handler.ts +3 -2
- package/src/handlers/message-handlers/room-operation-response-handler.ts +102 -0
- package/src/handlers/message-handlers/subscribe-response-handler.ts +12 -2
- package/src/handlers/message-handlers/task-quote-handler.ts +31 -0
- package/src/handlers/message-handlers/types.ts +41 -7
- package/src/handlers/message-handlers/unsubscribe-response-handler.ts +12 -2
- package/src/handlers/message-handlers/user-authenticated-handler.ts +31 -0
- package/src/handlers/message-handlers/user-count-handler.ts +34 -0
- package/src/handlers/webhook-handler.test.ts +3 -2
- package/src/handlers/webhook-handler.ts +13 -7
- package/src/index.ts +21 -0
- package/src/managers/admin-manager.ts +249 -0
- package/src/managers/agent-registry.test.ts +2 -1
- package/src/managers/agent-registry.ts +170 -2
- package/src/managers/agent-room-manager.ts +665 -0
- package/src/managers/index.ts +15 -1
- package/src/managers/message-router.ts +215 -17
- package/src/managers/room-management-manager.ts +520 -0
- package/src/managers/room-manager.ts +15 -20
- package/src/payments/index.ts +22 -0
- package/src/payments/payment-client.ts +240 -0
- package/src/teneo-sdk.ts +806 -30
- package/src/types/categories.ts +45 -0
- package/src/types/config.ts +80 -7
- package/src/types/error-codes.ts +14 -0
- package/src/types/events.test.ts +1 -0
- package/src/types/events.ts +67 -0
- package/src/types/index.ts +111 -0
- package/src/types/messages.test.ts +2 -1
- package/src/types/messages.ts +677 -42
- package/src/utils/bounded-queue.test.ts +1 -1
- package/src/utils/bounded-queue.ts +2 -1
- package/src/utils/circuit-breaker.test.ts +1 -1
- package/src/utils/deduplication-cache.test.ts +1 -1
- package/src/utils/event-waiter.test.ts +1 -1
- package/src/utils/event-waiter.ts +3 -3
- package/src/utils/index.ts +7 -0
- package/src/utils/logger.ts +8 -8
- package/src/utils/pricing-resolver.ts +128 -0
- package/src/utils/rate-limiter.test.ts +1 -1
- package/src/utils/rate-limiter.ts +1 -0
- package/src/utils/signature-verifier.test.ts +2 -2
- package/src/utils/signature-verifier.ts +3 -2
- package/tests/.env.example +7 -0
- package/tests/direct-agent-test.ts +151 -0
- package/tests/integration/real-server.test.ts +2 -0
- package/tests/integration/room-management.test.ts +516 -0
- package/tests/integration/websocket.test.ts +5 -2
- package/tests/payment-flow-test.ts +147 -0
- package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +382 -0
- package/tests/unit/handlers/agent-status-update-handler.test.ts +403 -0
- package/tests/unit/handlers/auth-success-handler-rooms.test.ts +697 -0
- package/tests/unit/handlers/list-available-agents-handler.test.ts +248 -0
- package/tests/unit/handlers/list-room-agents-handler.test.ts +290 -0
- package/tests/unit/handlers/room-operation-response-handler.test.ts +500 -0
- package/tests/unit/managers/agent-room-manager.test.ts +527 -0
- package/tests/unit/managers/room-management-manager.test.ts +420 -0
- package/tsconfig.json +2 -2
- package/vitest.config.ts +1 -0
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PaymentClient - Handles x402 payment header generation for quote-approve flow
|
|
3
|
+
*
|
|
4
|
+
* Creates x402 V2 payment headers for USDC payments on PEAQ network.
|
|
5
|
+
* Implements ERC-3009 TransferWithAuthorization signing using viem's EIP-712.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { defineChain, type Hex, toHex } from "viem";
|
|
9
|
+
import { privateKeyToAccount, signTypedData } from "viem/accounts";
|
|
10
|
+
import type { SecurePrivateKey } from "../utils/secure-private-key";
|
|
11
|
+
|
|
12
|
+
// PEAQ chain definition
|
|
13
|
+
const peaq = defineChain({
|
|
14
|
+
id: 3338,
|
|
15
|
+
name: "peaq",
|
|
16
|
+
network: "peaq",
|
|
17
|
+
nativeCurrency: {
|
|
18
|
+
decimals: 18,
|
|
19
|
+
name: "PEAQ",
|
|
20
|
+
symbol: "PEAQ"
|
|
21
|
+
},
|
|
22
|
+
rpcUrls: {
|
|
23
|
+
default: {
|
|
24
|
+
http: ["https://peaq.api.onfinality.io/public"]
|
|
25
|
+
},
|
|
26
|
+
public: {
|
|
27
|
+
http: ["https://peaq.api.onfinality.io/public"]
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// USDC contract on PEAQ
|
|
33
|
+
const USDC_CONTRACT = "0xbbA60da06c2c5424f03f7434542280FCAd453d10";
|
|
34
|
+
const PEAQ_NETWORK_CAIP2 = "eip155:3338";
|
|
35
|
+
|
|
36
|
+
// ERC-3009 TransferWithAuthorization EIP-712 types
|
|
37
|
+
const ERC3009_TYPES = {
|
|
38
|
+
TransferWithAuthorization: [
|
|
39
|
+
{ name: "from", type: "address" },
|
|
40
|
+
{ name: "to", type: "address" },
|
|
41
|
+
{ name: "value", type: "uint256" },
|
|
42
|
+
{ name: "validAfter", type: "uint256" },
|
|
43
|
+
{ name: "validBefore", type: "uint256" },
|
|
44
|
+
{ name: "nonce", type: "bytes32" }
|
|
45
|
+
]
|
|
46
|
+
} as const;
|
|
47
|
+
|
|
48
|
+
export interface PaymentClientConfig {
|
|
49
|
+
network?: string; // CAIP-2 format, default: "eip155:3338"
|
|
50
|
+
asset?: string; // Asset contract, default: USDC on PEAQ
|
|
51
|
+
resourceUrl?: string; // x402 resource URL
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// x402 constants
|
|
55
|
+
export const USDC_DECIMALS = 6;
|
|
56
|
+
export const X402_VERSION = 2;
|
|
57
|
+
export const DEFAULT_PAYMENT_TIMEOUT_SECONDS = 60;
|
|
58
|
+
export const DEFAULT_PAY_TO_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
59
|
+
export const DEFAULT_RPC_URL = "https://peaq.api.onfinality.io/public";
|
|
60
|
+
export type SupportedChain = "peaq";
|
|
61
|
+
|
|
62
|
+
// Re-export constants for external use
|
|
63
|
+
export { USDC_CONTRACT, PEAQ_NETWORK_CAIP2 as PEAQ_CHAIN_ID };
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Converts a WebSocket URL to an HTTP(S) URL for x402 resource specification.
|
|
67
|
+
* The x402 protocol requires HTTP URLs, not WebSocket URLs.
|
|
68
|
+
*
|
|
69
|
+
* @param wsUrl - WebSocket URL (wss:// or ws://)
|
|
70
|
+
* @returns HTTP URL (https:// or http://)
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* buildX402ResourceUrl("wss://api.teneo.com/ws") // "https://api.teneo.com/x402"
|
|
74
|
+
*/
|
|
75
|
+
export function buildX402ResourceUrl(wsUrl: string): string {
|
|
76
|
+
const httpUrl = wsUrl.replace(/^wss:\/\//, "https://").replace(/^ws:\/\//, "http://");
|
|
77
|
+
|
|
78
|
+
// Replace /ws endpoint with /x402, or append /x402 if URL doesn't end with /ws
|
|
79
|
+
return /\/ws\/?$/.test(httpUrl)
|
|
80
|
+
? httpUrl.replace(/\/ws\/?$/, "/x402")
|
|
81
|
+
: httpUrl.replace(/\/?$/, "/x402");
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Converts USDC human-readable amount to micro-units (6 decimals).
|
|
86
|
+
* @param usdc - Amount in USDC (e.g., 1.5)
|
|
87
|
+
* @returns Amount in micro-units (e.g., 1500000)
|
|
88
|
+
*/
|
|
89
|
+
export function usdcToUnits(usdc: number): number {
|
|
90
|
+
return Math.round(usdc * 10 ** USDC_DECIMALS);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Converts micro-units to USDC human-readable amount.
|
|
95
|
+
* @param units - Amount in micro-units (e.g., 1500000)
|
|
96
|
+
* @returns Amount in USDC (e.g., 1.5)
|
|
97
|
+
*/
|
|
98
|
+
export function unitsToUsdc(units: number): number {
|
|
99
|
+
return units / 10 ** USDC_DECIMALS;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Generate a random 32-byte nonce as hex string
|
|
104
|
+
*/
|
|
105
|
+
function generateNonce(): Hex {
|
|
106
|
+
const randomBytes = new Uint8Array(32);
|
|
107
|
+
crypto.getRandomValues(randomBytes);
|
|
108
|
+
return toHex(randomBytes);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* PaymentClient handles creation of x402 V2 payment headers
|
|
113
|
+
* for the quote-approve payment flow.
|
|
114
|
+
*/
|
|
115
|
+
export class PaymentClient {
|
|
116
|
+
private readonly secureKey: SecurePrivateKey;
|
|
117
|
+
private readonly walletAddress: string;
|
|
118
|
+
private readonly network: string;
|
|
119
|
+
private readonly asset: string;
|
|
120
|
+
private readonly resourceUrl: string;
|
|
121
|
+
|
|
122
|
+
constructor(
|
|
123
|
+
secureKey: SecurePrivateKey,
|
|
124
|
+
walletAddress: string,
|
|
125
|
+
config: PaymentClientConfig = {}
|
|
126
|
+
) {
|
|
127
|
+
this.secureKey = secureKey;
|
|
128
|
+
this.walletAddress = walletAddress;
|
|
129
|
+
this.network = config.network ?? PEAQ_NETWORK_CAIP2;
|
|
130
|
+
this.asset = config.asset ?? USDC_CONTRACT;
|
|
131
|
+
this.resourceUrl = config.resourceUrl ?? "";
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Creates an x402 V2 payment header for a specific amount and recipient.
|
|
136
|
+
*
|
|
137
|
+
* @param amountMicroUnits - Amount in micro-units (e.g., 1000 = 0.001 USDC)
|
|
138
|
+
* @param recipientAddress - Wallet address of the payment recipient (agent)
|
|
139
|
+
* @param resourceUrl - Optional override for x402 resource URL
|
|
140
|
+
* @returns Base64 encoded x402 V2 payment header
|
|
141
|
+
*/
|
|
142
|
+
async createPaymentHeader(
|
|
143
|
+
amountMicroUnits: number,
|
|
144
|
+
recipientAddress: string,
|
|
145
|
+
resourceUrl?: string
|
|
146
|
+
): Promise<string> {
|
|
147
|
+
const resource = resourceUrl || this.resourceUrl || this.getDefaultResourceUrl();
|
|
148
|
+
const amountStr = Math.round(amountMicroUnits).toString();
|
|
149
|
+
|
|
150
|
+
// Create payment header using the secure key
|
|
151
|
+
const header = await this.secureKey.use(async (privateKey) => {
|
|
152
|
+
const account = privateKeyToAccount(privateKey as `0x${string}`);
|
|
153
|
+
|
|
154
|
+
// Time bounds for the authorization (valid for 60 seconds)
|
|
155
|
+
const now = Math.floor(Date.now() / 1000);
|
|
156
|
+
const validAfter = now - 60; // Valid from 60 seconds ago
|
|
157
|
+
const validBefore = now + 60; // Valid until 60 seconds from now
|
|
158
|
+
const nonce = generateNonce();
|
|
159
|
+
|
|
160
|
+
// EIP-712 domain for USDC on PEAQ
|
|
161
|
+
const domain = {
|
|
162
|
+
name: "USDC",
|
|
163
|
+
version: "2",
|
|
164
|
+
chainId: BigInt(peaq.id),
|
|
165
|
+
verifyingContract: this.asset as `0x${string}`
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
// ERC-3009 TransferWithAuthorization message
|
|
169
|
+
const message = {
|
|
170
|
+
from: account.address,
|
|
171
|
+
to: recipientAddress as `0x${string}`,
|
|
172
|
+
value: BigInt(amountStr),
|
|
173
|
+
validAfter: BigInt(validAfter),
|
|
174
|
+
validBefore: BigInt(validBefore),
|
|
175
|
+
nonce: nonce
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
// Sign the EIP-712 typed data
|
|
179
|
+
const signature = await signTypedData({
|
|
180
|
+
privateKey: privateKey as `0x${string}`,
|
|
181
|
+
domain,
|
|
182
|
+
types: ERC3009_TYPES,
|
|
183
|
+
primaryType: "TransferWithAuthorization",
|
|
184
|
+
message
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
// Build V1 payload (authorization data)
|
|
188
|
+
const v1Payload = {
|
|
189
|
+
authorization: {
|
|
190
|
+
from: account.address,
|
|
191
|
+
to: recipientAddress,
|
|
192
|
+
value: amountStr,
|
|
193
|
+
validAfter: validAfter.toString(),
|
|
194
|
+
validBefore: validBefore.toString(),
|
|
195
|
+
nonce: nonce
|
|
196
|
+
},
|
|
197
|
+
signature: signature
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
// Build V2 payload (what the backend expects)
|
|
201
|
+
const v2Payload = {
|
|
202
|
+
x402Version: 2,
|
|
203
|
+
resource: {
|
|
204
|
+
url: resource,
|
|
205
|
+
description: "Teneo SDK payment",
|
|
206
|
+
mimeType: "application/json"
|
|
207
|
+
},
|
|
208
|
+
accepted: {
|
|
209
|
+
scheme: "exact",
|
|
210
|
+
network: this.network,
|
|
211
|
+
amount: amountStr,
|
|
212
|
+
asset: this.asset,
|
|
213
|
+
payTo: recipientAddress,
|
|
214
|
+
maxTimeoutSeconds: 60,
|
|
215
|
+
extra: { name: "USDC", version: "2" }
|
|
216
|
+
},
|
|
217
|
+
payload: v1Payload
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
return Buffer.from(JSON.stringify(v2Payload)).toString("base64");
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
return header;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Get default x402 resource URL from WebSocket URL
|
|
228
|
+
*/
|
|
229
|
+
private getDefaultResourceUrl(): string {
|
|
230
|
+
// Default fallback
|
|
231
|
+
return "https://dev-rooms-websocket-ai-core-o9fmb.ondigitalocean.app/x402";
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Gets the wallet address associated with this payment client.
|
|
236
|
+
*/
|
|
237
|
+
get address(): string {
|
|
238
|
+
return this.walletAddress;
|
|
239
|
+
}
|
|
240
|
+
}
|