@teneo-protocol/sdk 2.2.2 → 3.0.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/.github/ISSUE_TEMPLATE/config.yml +1 -1
- package/CHANGELOG.md +366 -15
- package/CONCEPTS.md +182 -44
- package/README.md +524 -94
- package/dist/constants.d.ts +3 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +5 -3
- package/dist/constants.js.map +1 -1
- package/dist/core/websocket-client.d.ts.map +1 -1
- package/dist/core/websocket-client.js +9 -5
- package/dist/core/websocket-client.js.map +1 -1
- package/dist/formatters/response-formatter.d.ts +6 -6
- package/dist/handlers/message-handlers/agent-details-response-handler.d.ts +1080 -756
- package/dist/handlers/message-handlers/agent-details-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/agent-details-response-handler.js +2 -2
- package/dist/handlers/message-handlers/agent-details-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/agent-error-handler.d.ts +91 -0
- package/dist/handlers/message-handlers/agent-error-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-error-handler.js +44 -0
- package/dist/handlers/message-handlers/agent-error-handler.js.map +1 -0
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/agent-status-update-handler.d.ts +1080 -756
- package/dist/handlers/message-handlers/agent-status-update-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/agent-status-update-handler.js +2 -7
- package/dist/handlers/message-handlers/agent-status-update-handler.js.map +1 -1
- package/dist/handlers/message-handlers/all-agents-response-handler.d.ts +135 -54
- package/dist/handlers/message-handlers/all-agents-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/all-agents-response-handler.js +2 -2
- package/dist/handlers/message-handlers/all-agents-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/auth-error-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-message-handler.js +6 -1
- package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -1
- package/dist/handlers/message-handlers/auth-required-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/auth-success-handler.js +6 -1
- package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -1
- package/dist/handlers/message-handlers/base-handler.d.ts +2 -1
- package/dist/handlers/message-handlers/base-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/base-handler.js +24 -4
- package/dist/handlers/message-handlers/base-handler.js.map +1 -1
- package/dist/handlers/message-handlers/challenge-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/error-message-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/index.d.ts +4 -0
- package/dist/handlers/message-handlers/index.d.ts.map +1 -1
- package/dist/handlers/message-handlers/index.js +23 -1
- package/dist/handlers/message-handlers/index.js.map +1 -1
- package/dist/handlers/message-handlers/list-available-agents-handler.d.ts +1116 -756
- package/dist/handlers/message-handlers/list-available-agents-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/list-available-agents-handler.js +23 -10
- package/dist/handlers/message-handlers/list-available-agents-handler.js.map +1 -1
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts +1080 -756
- package/dist/handlers/message-handlers/list-room-agents-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/list-room-agents-handler.js +2 -6
- package/dist/handlers/message-handlers/list-room-agents-handler.js.map +1 -1
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/list-rooms-response-handler.js +2 -5
- package/dist/handlers/message-handlers/list-rooms-response-handler.js.map +1 -1
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts +52 -4
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/ping-pong-handler.js +23 -4
- package/dist/handlers/message-handlers/ping-pong-handler.js.map +1 -1
- package/dist/handlers/message-handlers/rate-limit-notification-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/rate-limit-notification-handler.js +3 -2
- package/dist/handlers/message-handlers/rate-limit-notification-handler.js.map +1 -1
- package/dist/handlers/message-handlers/regular-message-handler.d.ts +6 -0
- package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +12 -6
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/success-handler.d.ts +82 -0
- package/dist/handlers/message-handlers/success-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/success-handler.js +24 -0
- package/dist/handlers/message-handlers/success-handler.js.map +1 -0
- package/dist/handlers/message-handlers/task-confirmed-handler.d.ts +110 -0
- package/dist/handlers/message-handlers/task-confirmed-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/task-confirmed-handler.js +46 -0
- package/dist/handlers/message-handlers/task-confirmed-handler.js.map +1 -0
- package/dist/handlers/message-handlers/trigger-wallet-tx-handler.d.ts +244 -0
- package/dist/handlers/message-handlers/trigger-wallet-tx-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/trigger-wallet-tx-handler.js +58 -0
- package/dist/handlers/message-handlers/trigger-wallet-tx-handler.js.map +1 -0
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +12 -6
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -1
- package/dist/handlers/message-handlers/user-authenticated-handler.js +2 -2
- package/dist/handlers/message-handlers/user-authenticated-handler.js.map +1 -1
- package/dist/handlers/message-handlers/user-count-handler.js +2 -2
- package/dist/handlers/message-handlers/user-count-handler.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -4
- package/dist/index.js.map +1 -1
- package/dist/managers/admin-manager.d.ts +3 -1
- package/dist/managers/admin-manager.d.ts.map +1 -1
- package/dist/managers/admin-manager.js +4 -3
- package/dist/managers/admin-manager.js.map +1 -1
- package/dist/managers/agent-room-manager.d.ts +89 -11
- package/dist/managers/agent-room-manager.d.ts.map +1 -1
- package/dist/managers/agent-room-manager.js +99 -35
- package/dist/managers/agent-room-manager.js.map +1 -1
- package/dist/managers/index.d.ts +1 -1
- package/dist/managers/index.d.ts.map +1 -1
- package/dist/managers/index.js.map +1 -1
- package/dist/managers/message-router.d.ts +45 -5
- package/dist/managers/message-router.d.ts.map +1 -1
- package/dist/managers/message-router.js +96 -24
- package/dist/managers/message-router.js.map +1 -1
- package/dist/managers/room-manager.d.ts +29 -7
- package/dist/managers/room-manager.d.ts.map +1 -1
- package/dist/managers/room-manager.js +37 -11
- package/dist/managers/room-manager.js.map +1 -1
- package/dist/payments/index.d.ts +3 -1
- package/dist/payments/index.d.ts.map +1 -1
- package/dist/payments/index.js +17 -3
- package/dist/payments/index.js.map +1 -1
- package/dist/payments/networks.d.ts +59 -0
- package/dist/payments/networks.d.ts.map +1 -0
- package/dist/payments/networks.js +192 -0
- package/dist/payments/networks.js.map +1 -0
- package/dist/payments/payment-client.d.ts +55 -10
- package/dist/payments/payment-client.d.ts.map +1 -1
- package/dist/payments/payment-client.js +172 -51
- package/dist/payments/payment-client.js.map +1 -1
- package/dist/teneo-sdk.d.ts +215 -41
- package/dist/teneo-sdk.d.ts.map +1 -1
- package/dist/teneo-sdk.js +361 -84
- package/dist/teneo-sdk.js.map +1 -1
- package/dist/types/config.d.ts +334 -25
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +114 -22
- package/dist/types/config.js.map +1 -1
- package/dist/types/events.d.ts +60 -14
- package/dist/types/events.d.ts.map +1 -1
- package/dist/types/events.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +11 -4
- package/dist/types/index.js.map +1 -1
- package/dist/types/messages.d.ts +13110 -7451
- package/dist/types/messages.d.ts.map +1 -1
- package/dist/types/messages.js +195 -44
- package/dist/types/messages.js.map +1 -1
- package/dist/utils/pricing-resolver.d.ts +1 -1
- package/dist/utils/pricing-resolver.d.ts.map +1 -1
- package/dist/utils/pricing-resolver.js +9 -1
- package/dist/utils/pricing-resolver.js.map +1 -1
- package/examples/agent-room-management-example.ts +5 -5
- package/examples/basic-usage.ts +26 -6
- package/examples/claude-agent-x-follower/index.ts +1 -1
- package/examples/minimal-chat.ts +4 -3
- package/examples/n8n-teneo/index.ts +2 -2
- package/examples/nestjs-dashboard/README.md +1 -1
- package/examples/nestjs-dashboard/src/teneo/agents.controller.ts +3 -3
- package/examples/nestjs-dashboard/src/teneo/rooms.controller.ts +5 -5
- package/examples/nestjs-dashboard/src/teneo/teneo.service.ts +8 -8
- package/examples/openai-teneo/index.ts +1 -1
- package/examples/payment-flow.ts +143 -0
- package/examples/production-dashboard/README.md +6 -8
- package/examples/production-dashboard/server.ts +22 -10
- package/examples/room-management-example.ts +2 -2
- package/examples/usage/01-connect.ts +0 -3
- package/examples/usage/02-list-agents.ts +0 -2
- package/examples/usage/03-pick-agent.ts +3 -4
- package/examples/usage/04-find-by-capability.ts +10 -12
- package/examples/usage/05-webhook-example.ts +2 -4
- package/examples/usage/06-simple-api-server.ts +13 -9
- package/examples/usage/07-event-listener.ts +1 -13
- package/examples/usage/README.md +33 -7
- package/examples/webhook-integration.ts +9 -9
- package/examples/x-influencer-battle-server.ts +1 -1
- package/package.json +1 -1
- package/scripts/diagnose-connection.ts +86 -0
- package/scripts/investigate-payload.ts +163 -0
- package/scripts/list-agents.ts +58 -0
- package/scripts/live-multi-network-test.ts +230 -0
- package/src/constants.ts +5 -3
- package/src/core/websocket-client.ts +10 -9
- package/src/handlers/message-handlers/agent-details-response-handler.ts +2 -2
- package/src/handlers/message-handlers/agent-error-handler.ts +47 -0
- package/src/handlers/message-handlers/agent-status-update-handler.ts +2 -7
- package/src/handlers/message-handlers/all-agents-response-handler.ts +2 -2
- package/src/handlers/message-handlers/auth-message-handler.ts +7 -1
- package/src/handlers/message-handlers/auth-success-handler.ts +7 -1
- package/src/handlers/message-handlers/base-handler.ts +24 -4
- package/src/handlers/message-handlers/index.ts +24 -0
- package/src/handlers/message-handlers/list-available-agents-handler.ts +24 -11
- package/src/handlers/message-handlers/list-room-agents-handler.ts +2 -6
- package/src/handlers/message-handlers/list-rooms-response-handler.ts +2 -5
- package/src/handlers/message-handlers/ping-pong-handler.ts +29 -4
- package/src/handlers/message-handlers/rate-limit-notification-handler.ts +3 -2
- package/src/handlers/message-handlers/success-handler.ts +26 -0
- package/src/handlers/message-handlers/task-confirmed-handler.ts +49 -0
- package/src/handlers/message-handlers/trigger-wallet-tx-handler.ts +62 -0
- package/src/handlers/message-handlers/user-authenticated-handler.ts +2 -2
- package/src/handlers/message-handlers/user-count-handler.ts +2 -2
- package/src/index.ts +12 -4
- package/src/managers/admin-manager.ts +6 -3
- package/src/managers/agent-room-manager.ts +155 -26
- package/src/managers/index.ts +6 -1
- package/src/managers/message-router.ts +122 -27
- package/src/managers/room-manager.ts +39 -11
- package/src/payments/index.ts +20 -5
- package/src/payments/networks.ts +208 -0
- package/src/payments/payment-client.ts +211 -56
- package/src/teneo-sdk.ts +402 -71
- package/src/types/config.test.ts +24 -4
- package/src/types/config.ts +123 -25
- package/src/types/events.ts +36 -2
- package/src/types/index.ts +16 -3
- package/src/types/messages.ts +235 -60
- package/src/utils/pricing-resolver.ts +10 -2
- package/tests/direct-agent-test.ts +1 -1
- package/tests/integration/real-server.test.ts +1 -1
- package/tests/integration/websocket.test.ts +3 -3
- package/tests/multi-network-payment.test.ts +309 -0
- package/tests/multi-network.test.ts +296 -0
- package/tests/payment-flow-test.ts +6 -4
- package/tests/unit/handlers/agent-error-handler.test.ts +388 -0
- package/tests/unit/handlers/agent-room-operation-response-handler.test.ts +9 -6
- package/tests/unit/handlers/agent-status-update-handler.test.ts +11 -16
- package/tests/unit/handlers/list-available-agents-handler.test.ts +11 -14
- package/tests/unit/handlers/list-room-agents-handler.test.ts +11 -15
- package/tests/unit/handlers/room-operation-response-handler.test.ts +9 -6
- package/tests/unit/handlers/trigger-wallet-tx-handler.test.ts +431 -0
- package/tests/unit/managers/admin-manager.test.ts +183 -0
- package/tests/unit/managers/agent-room-manager.test.ts +189 -33
- package/tests/unit/sdk-new-methods.test.ts +221 -0
|
@@ -2,40 +2,19 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* PaymentClient - Handles x402 payment header generation for quote-approve flow
|
|
4
4
|
*
|
|
5
|
-
* Creates x402 V2 payment headers for USDC payments on
|
|
5
|
+
* Creates x402 V2 payment headers for USDC payments on multiple networks.
|
|
6
6
|
* Implements ERC-3009 TransferWithAuthorization signing using viem's EIP-712.
|
|
7
|
+
*
|
|
8
|
+
* v2.3.0: Multi-network support with dynamic chain configuration
|
|
7
9
|
*/
|
|
8
10
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.PaymentClient = exports.PEAQ_CHAIN_ID = exports.USDC_CONTRACT = exports.
|
|
11
|
+
exports.PaymentClient = exports.PEAQ_CHAIN_ID = exports.USDC_CONTRACT = exports.DEFAULT_PAY_TO_ADDRESS = exports.DEFAULT_PAYMENT_TIMEOUT_SECONDS = exports.X402_VERSION = exports.USDC_DECIMALS = void 0;
|
|
10
12
|
exports.buildX402ResourceUrl = buildX402ResourceUrl;
|
|
11
13
|
exports.usdcToUnits = usdcToUnits;
|
|
12
14
|
exports.unitsToUsdc = unitsToUsdc;
|
|
13
15
|
const viem_1 = require("viem");
|
|
14
16
|
const accounts_1 = require("viem/accounts");
|
|
15
|
-
|
|
16
|
-
const peaq = (0, viem_1.defineChain)({
|
|
17
|
-
id: 3338,
|
|
18
|
-
name: "peaq",
|
|
19
|
-
network: "peaq",
|
|
20
|
-
nativeCurrency: {
|
|
21
|
-
decimals: 18,
|
|
22
|
-
name: "PEAQ",
|
|
23
|
-
symbol: "PEAQ"
|
|
24
|
-
},
|
|
25
|
-
rpcUrls: {
|
|
26
|
-
default: {
|
|
27
|
-
http: ["https://peaq.api.onfinality.io/public"]
|
|
28
|
-
},
|
|
29
|
-
public: {
|
|
30
|
-
http: ["https://peaq.api.onfinality.io/public"]
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
// USDC contract on PEAQ
|
|
35
|
-
const USDC_CONTRACT = "0xbbA60da06c2c5424f03f7434542280FCAd453d10";
|
|
36
|
-
exports.USDC_CONTRACT = USDC_CONTRACT;
|
|
37
|
-
const PEAQ_NETWORK_CAIP2 = "eip155:3338";
|
|
38
|
-
exports.PEAQ_CHAIN_ID = PEAQ_NETWORK_CAIP2;
|
|
17
|
+
const networks_1 = require("./networks");
|
|
39
18
|
// ERC-3009 TransferWithAuthorization EIP-712 types
|
|
40
19
|
const ERC3009_TYPES = {
|
|
41
20
|
TransferWithAuthorization: [
|
|
@@ -52,7 +31,9 @@ exports.USDC_DECIMALS = 6;
|
|
|
52
31
|
exports.X402_VERSION = 2;
|
|
53
32
|
exports.DEFAULT_PAYMENT_TIMEOUT_SECONDS = 60;
|
|
54
33
|
exports.DEFAULT_PAY_TO_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
55
|
-
|
|
34
|
+
// Re-export for backwards compatibility
|
|
35
|
+
exports.USDC_CONTRACT = "0xbbA60da06c2c5424f03f7434542280FCAd453d10"; // PEAQ USDC
|
|
36
|
+
exports.PEAQ_CHAIN_ID = "eip155:3338";
|
|
56
37
|
/**
|
|
57
38
|
* Converts a WebSocket URL to an HTTP(S) URL for x402 resource specification.
|
|
58
39
|
* The x402 protocol requires HTTP URLs, not WebSocket URLs.
|
|
@@ -94,34 +75,107 @@ function generateNonce() {
|
|
|
94
75
|
crypto.getRandomValues(randomBytes);
|
|
95
76
|
return (0, viem_1.toHex)(randomBytes);
|
|
96
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Validates that a string is a valid Ethereum address
|
|
80
|
+
* @param address - String to validate
|
|
81
|
+
* @returns True if valid Ethereum address format
|
|
82
|
+
*/
|
|
83
|
+
function isValidEthereumAddress(address) {
|
|
84
|
+
return /^0x[a-fA-F0-9]{40}$/.test(address);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Resolve network configuration from various input formats
|
|
88
|
+
*
|
|
89
|
+
* @param config - PaymentClientConfig with network options
|
|
90
|
+
* @returns Resolved NetworkConfig
|
|
91
|
+
*/
|
|
92
|
+
function resolveNetworkConfig(config) {
|
|
93
|
+
// Priority: chainId > network name > default
|
|
94
|
+
if (config.networkChainId) {
|
|
95
|
+
return (0, networks_1.getNetwork)(config.networkChainId);
|
|
96
|
+
}
|
|
97
|
+
if (config.network) {
|
|
98
|
+
return (0, networks_1.getNetwork)(config.network);
|
|
99
|
+
}
|
|
100
|
+
return (0, networks_1.getDefaultNetwork)();
|
|
101
|
+
}
|
|
97
102
|
/**
|
|
98
103
|
* PaymentClient handles creation of x402 V2 payment headers
|
|
99
104
|
* for the quote-approve payment flow.
|
|
105
|
+
*
|
|
106
|
+
* Supports multiple networks with dynamic configuration.
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```typescript
|
|
110
|
+
* // Default network (PEAQ or TENEO_NETWORK env var)
|
|
111
|
+
* const client = new PaymentClient(secureKey, walletAddress);
|
|
112
|
+
*
|
|
113
|
+
* // Specific network by name
|
|
114
|
+
* const baseClient = new PaymentClient(secureKey, walletAddress, {
|
|
115
|
+
* network: "base"
|
|
116
|
+
* });
|
|
117
|
+
*
|
|
118
|
+
* // Specific network by chain ID
|
|
119
|
+
* const avaxClient = new PaymentClient(secureKey, walletAddress, {
|
|
120
|
+
* networkChainId: 43114
|
|
121
|
+
* });
|
|
122
|
+
* ```
|
|
100
123
|
*/
|
|
101
124
|
class PaymentClient {
|
|
102
125
|
secureKey;
|
|
103
126
|
walletAddress;
|
|
104
|
-
|
|
105
|
-
|
|
127
|
+
networkConfig;
|
|
128
|
+
assetOverride;
|
|
106
129
|
resourceUrl;
|
|
107
130
|
constructor(secureKey, walletAddress, config = {}) {
|
|
131
|
+
if (!isValidEthereumAddress(walletAddress)) {
|
|
132
|
+
throw new Error(`Invalid wallet address: ${walletAddress}`);
|
|
133
|
+
}
|
|
108
134
|
this.secureKey = secureKey;
|
|
109
135
|
this.walletAddress = walletAddress;
|
|
110
|
-
this.
|
|
111
|
-
this.
|
|
136
|
+
this.networkConfig = resolveNetworkConfig(config);
|
|
137
|
+
this.assetOverride = config.asset;
|
|
112
138
|
this.resourceUrl = config.resourceUrl ?? "";
|
|
113
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* Get the current network configuration
|
|
142
|
+
*/
|
|
143
|
+
get network() {
|
|
144
|
+
return this.networkConfig;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Get the USDC contract address for the current network
|
|
148
|
+
*/
|
|
149
|
+
get asset() {
|
|
150
|
+
return this.assetOverride ?? this.networkConfig.usdcContract;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get the CAIP-2 network identifier
|
|
154
|
+
*/
|
|
155
|
+
get caip2() {
|
|
156
|
+
return this.networkConfig.caip2;
|
|
157
|
+
}
|
|
114
158
|
/**
|
|
115
159
|
* Creates an x402 V2 payment header for a specific amount and recipient.
|
|
116
160
|
*
|
|
117
161
|
* @param amountMicroUnits - Amount in micro-units (e.g., 1000 = 0.001 USDC)
|
|
118
162
|
* @param recipientAddress - Wallet address of the payment recipient (agent)
|
|
119
163
|
* @param resourceUrl - Optional override for x402 resource URL
|
|
164
|
+
* @param networkOverride - Optional network override for this specific payment
|
|
165
|
+
* @param settlementData - Backend-provided settlement data for x402x-router-settlement
|
|
120
166
|
* @returns Base64 encoded x402 V2 payment header
|
|
121
167
|
*/
|
|
122
|
-
async createPaymentHeader(amountMicroUnits, recipientAddress, resourceUrl) {
|
|
168
|
+
async createPaymentHeader(amountMicroUnits, recipientAddress, resourceUrl, networkOverride, settlementData) {
|
|
169
|
+
if (!isValidEthereumAddress(recipientAddress)) {
|
|
170
|
+
throw new Error(`Invalid recipient address: ${recipientAddress}`);
|
|
171
|
+
}
|
|
123
172
|
const resource = resourceUrl || this.resourceUrl || this.getDefaultResourceUrl();
|
|
124
173
|
const amountStr = Math.round(amountMicroUnits).toString();
|
|
174
|
+
// Resolve network for this payment (allows per-request override)
|
|
175
|
+
const network = networkOverride ? (0, networks_1.getNetwork)(networkOverride) : this.networkConfig;
|
|
176
|
+
// When using a per-request network override, always use that network's asset contract
|
|
177
|
+
const asset = networkOverride ? network.usdcContract : (this.assetOverride ?? network.usdcContract);
|
|
178
|
+
const chain = (0, networks_1.createChainDefinition)(network);
|
|
125
179
|
// Create payment header using the secure key
|
|
126
180
|
const header = await this.secureKey.use(async (privateKey) => {
|
|
127
181
|
const account = (0, accounts_1.privateKeyToAccount)(privateKey);
|
|
@@ -129,22 +183,61 @@ class PaymentClient {
|
|
|
129
183
|
const now = Math.floor(Date.now() / 1000);
|
|
130
184
|
const validAfter = now - 60; // Valid from 60 seconds ago
|
|
131
185
|
const validBefore = now + 60; // Valid until 60 seconds from now
|
|
132
|
-
|
|
133
|
-
//
|
|
186
|
+
// Use backend-provided settlement data or fall back to defaults
|
|
187
|
+
// CRITICAL: For x402x-router-settlement to work, we MUST use the values
|
|
188
|
+
// provided by the backend in the task_quote response
|
|
189
|
+
const salt = settlementData?.salt ?? generateNonce();
|
|
190
|
+
const facilitatorFee = settlementData?.facilitatorFee ?? "1000";
|
|
191
|
+
const hookData = (settlementData?.hookData ?? "0x");
|
|
192
|
+
const settlementRouter = settlementData?.settlementRouter ?? network.settlementRouter;
|
|
193
|
+
const hook = settlementData?.hook ?? network.transferHook;
|
|
194
|
+
// Calculate commitment hash (becomes the EIP-3009 nonce)
|
|
195
|
+
// This cryptographically binds all settlement parameters to the signature
|
|
196
|
+
const commitment = (0, viem_1.keccak256)((0, viem_1.encodePacked)([
|
|
197
|
+
"string", // Protocol identifier
|
|
198
|
+
"uint256", // Chain ID
|
|
199
|
+
"address", // Hub (settlementRouter)
|
|
200
|
+
"address", // Token (USDC)
|
|
201
|
+
"address", // From (payer)
|
|
202
|
+
"uint256", // Value
|
|
203
|
+
"uint256", // Valid after
|
|
204
|
+
"uint256", // Valid before
|
|
205
|
+
"bytes32", // Salt
|
|
206
|
+
"address", // Pay to (final recipient)
|
|
207
|
+
"uint256", // Facilitator fee
|
|
208
|
+
"address", // Hook
|
|
209
|
+
"bytes32" // keccak256(hookData)
|
|
210
|
+
], [
|
|
211
|
+
"X402/settle/v1",
|
|
212
|
+
BigInt(chain.id),
|
|
213
|
+
settlementRouter,
|
|
214
|
+
asset,
|
|
215
|
+
account.address,
|
|
216
|
+
BigInt(amountStr),
|
|
217
|
+
BigInt(validAfter),
|
|
218
|
+
BigInt(validBefore),
|
|
219
|
+
salt,
|
|
220
|
+
recipientAddress,
|
|
221
|
+
BigInt(facilitatorFee),
|
|
222
|
+
hook,
|
|
223
|
+
(0, viem_1.keccak256)(hookData)
|
|
224
|
+
]));
|
|
225
|
+
// EIP-712 domain using network-specific parameters
|
|
134
226
|
const domain = {
|
|
135
|
-
name:
|
|
136
|
-
version:
|
|
137
|
-
chainId: BigInt(
|
|
138
|
-
verifyingContract:
|
|
227
|
+
name: network.eip712.name,
|
|
228
|
+
version: network.eip712.version,
|
|
229
|
+
chainId: BigInt(chain.id),
|
|
230
|
+
verifyingContract: asset
|
|
139
231
|
};
|
|
140
232
|
// ERC-3009 TransferWithAuthorization message
|
|
233
|
+
// x402x: "to" is settlementRouter, nonce is commitment hash
|
|
141
234
|
const message = {
|
|
142
235
|
from: account.address,
|
|
143
|
-
to:
|
|
236
|
+
to: settlementRouter, // Router receives funds first
|
|
144
237
|
value: BigInt(amountStr),
|
|
145
238
|
validAfter: BigInt(validAfter),
|
|
146
239
|
validBefore: BigInt(validBefore),
|
|
147
|
-
nonce: nonce
|
|
240
|
+
nonce: commitment // Commitment hash as nonce
|
|
148
241
|
};
|
|
149
242
|
// Sign the EIP-712 typed data
|
|
150
243
|
const signature = await (0, accounts_1.signTypedData)({
|
|
@@ -158,15 +251,17 @@ class PaymentClient {
|
|
|
158
251
|
const v1Payload = {
|
|
159
252
|
authorization: {
|
|
160
253
|
from: account.address,
|
|
161
|
-
to:
|
|
254
|
+
to: settlementRouter, // Router address
|
|
162
255
|
value: amountStr,
|
|
163
256
|
validAfter: validAfter.toString(),
|
|
164
257
|
validBefore: validBefore.toString(),
|
|
165
|
-
nonce:
|
|
258
|
+
nonce: commitment // Commitment hash
|
|
166
259
|
},
|
|
167
260
|
signature: signature
|
|
168
261
|
};
|
|
169
|
-
//
|
|
262
|
+
// Convert facilitator fee to hex format (required by facilitator)
|
|
263
|
+
const facilitatorFeeHex = `0x${BigInt(facilitatorFee).toString(16)}`;
|
|
264
|
+
// Build V2 payload with x402x-router-settlement extension
|
|
170
265
|
const v2Payload = {
|
|
171
266
|
x402Version: 2,
|
|
172
267
|
resource: {
|
|
@@ -176,25 +271,51 @@ class PaymentClient {
|
|
|
176
271
|
},
|
|
177
272
|
accepted: {
|
|
178
273
|
scheme: "exact",
|
|
179
|
-
network:
|
|
274
|
+
network: network.caip2,
|
|
180
275
|
amount: amountStr,
|
|
181
|
-
asset:
|
|
182
|
-
payTo: recipientAddress,
|
|
276
|
+
asset: asset,
|
|
277
|
+
payTo: recipientAddress, // Final recipient (for display)
|
|
183
278
|
maxTimeoutSeconds: 60,
|
|
184
|
-
extra: {
|
|
279
|
+
extra: {
|
|
280
|
+
name: network.eip712.name,
|
|
281
|
+
version: network.eip712.version,
|
|
282
|
+
// Settlement router info - MUST include all fields for facilitator
|
|
283
|
+
settlementRouter: settlementRouter,
|
|
284
|
+
salt: salt,
|
|
285
|
+
payTo: recipientAddress, // finalPayTo
|
|
286
|
+
facilitatorFee: facilitatorFeeHex, // Must be hex format
|
|
287
|
+
hook: hook,
|
|
288
|
+
hookData: hookData
|
|
289
|
+
}
|
|
185
290
|
},
|
|
186
|
-
payload: v1Payload
|
|
291
|
+
payload: v1Payload,
|
|
292
|
+
// x402x router settlement extension (v2 format)
|
|
293
|
+
extensions: {
|
|
294
|
+
"x402x-router-settlement": {
|
|
295
|
+
info: {
|
|
296
|
+
settlementRouter: settlementRouter,
|
|
297
|
+
hook: hook,
|
|
298
|
+
hookData: hookData,
|
|
299
|
+
facilitatorFee: facilitatorFeeHex, // Must be hex format
|
|
300
|
+
salt: salt,
|
|
301
|
+
finalPayTo: recipientAddress // Final recipient of the payment
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
187
305
|
};
|
|
188
306
|
return Buffer.from(JSON.stringify(v2Payload)).toString("base64");
|
|
189
307
|
});
|
|
190
308
|
return header;
|
|
191
309
|
}
|
|
192
310
|
/**
|
|
193
|
-
* Get
|
|
311
|
+
* Get resource URL for x402 payments.
|
|
312
|
+
* Throws if no resource URL is configured.
|
|
194
313
|
*/
|
|
195
314
|
getDefaultResourceUrl() {
|
|
196
|
-
|
|
197
|
-
|
|
315
|
+
if (!this.resourceUrl) {
|
|
316
|
+
throw new Error("Resource URL not configured. Pass resourceUrl to PaymentClient or use buildX402ResourceUrl(wsUrl).");
|
|
317
|
+
}
|
|
318
|
+
return this.resourceUrl;
|
|
198
319
|
}
|
|
199
320
|
/**
|
|
200
321
|
* Gets the wallet address associated with this payment client.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-client.js","sourceRoot":"","sources":["../../src/payments/payment-client.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"payment-client.js","sourceRoot":"","sources":["../../src/payments/payment-client.ts"],"names":[],"mappings":"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"}
|