@pay-skill/sdk 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/README.md +154 -0
  2. package/dist/auth.d.ts +47 -0
  3. package/dist/auth.d.ts.map +1 -0
  4. package/dist/auth.js +121 -0
  5. package/dist/auth.js.map +1 -0
  6. package/dist/client.d.ts +93 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +391 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/errors.d.ts +24 -0
  11. package/dist/errors.d.ts.map +1 -0
  12. package/dist/errors.js +42 -0
  13. package/dist/errors.js.map +1 -0
  14. package/dist/index.d.ts +13 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +7 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/models.d.ts +69 -0
  19. package/dist/models.d.ts.map +1 -0
  20. package/dist/models.js +2 -0
  21. package/dist/models.js.map +1 -0
  22. package/dist/ows-signer.d.ts +75 -0
  23. package/dist/ows-signer.d.ts.map +1 -0
  24. package/dist/ows-signer.js +130 -0
  25. package/dist/ows-signer.js.map +1 -0
  26. package/dist/signer.d.ts +46 -0
  27. package/dist/signer.d.ts.map +1 -0
  28. package/dist/signer.js +112 -0
  29. package/dist/signer.js.map +1 -0
  30. package/dist/wallet.d.ts +121 -0
  31. package/dist/wallet.d.ts.map +1 -0
  32. package/dist/wallet.js +328 -0
  33. package/dist/wallet.js.map +1 -0
  34. package/eslint.config.js +22 -0
  35. package/package.json +44 -0
  36. package/src/auth.ts +200 -0
  37. package/src/client.ts +644 -0
  38. package/src/eip3009.ts +79 -0
  39. package/src/errors.ts +48 -0
  40. package/src/index.ts +51 -0
  41. package/src/models.ts +77 -0
  42. package/src/ows-signer.ts +223 -0
  43. package/src/signer.ts +147 -0
  44. package/src/wallet.ts +445 -0
  45. package/tests/test_auth_rejection.ts +154 -0
  46. package/tests/test_crypto.ts +251 -0
  47. package/tests/test_e2e.ts +158 -0
  48. package/tests/test_errors.ts +36 -0
  49. package/tests/test_ows_integration.ts +92 -0
  50. package/tests/test_ows_signer.ts +365 -0
  51. package/tests/test_signer.ts +47 -0
  52. package/tests/test_validation.ts +66 -0
  53. package/tsconfig.json +19 -0
package/README.md ADDED
@@ -0,0 +1,154 @@
1
+ # @pay-skill/sdk
2
+
3
+ TypeScript SDK for [pay](https://pay-skill.com) — payment infrastructure for AI agents. USDC on Base.
4
+
5
+ Three primitives: direct payments, tabs (pre-funded metered accounts), and x402 HTTP paywalls.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install @pay-skill/sdk
11
+ ```
12
+
13
+ Requires Node.js 20+.
14
+
15
+ ## Quick Start
16
+
17
+ ```typescript
18
+ import { PayClient } from "@pay-skill/sdk";
19
+
20
+ const client = new PayClient({ signer: "cli" }); // uses `pay sign` subprocess
21
+
22
+ // Pay another agent $5
23
+ const result = await client.payDirect("0xprovider...", 5_000_000, { memo: "task-42" });
24
+ console.log(result.txHash);
25
+
26
+ // Open a metered tab
27
+ const tab = await client.openTab("0xprovider...", 20_000_000, { maxChargePerCall: 500_000 });
28
+
29
+ // x402 request (SDK handles payment automatically)
30
+ const response = await client.request("https://api.example.com/data");
31
+ ```
32
+
33
+ All amounts are in USDC micro-units (6 decimals). `$1.00 = 1_000_000`.
34
+
35
+ ## API Reference
36
+
37
+ ### PayClient
38
+
39
+ ```typescript
40
+ import { PayClient } from "@pay-skill/sdk";
41
+
42
+ const client = new PayClient({
43
+ apiUrl: "https://pay-skill.com/api/v1", // default
44
+ signer: "cli", // "cli", "raw", "custom", or a Signer instance
45
+ });
46
+ ```
47
+
48
+ ### Direct Payment
49
+
50
+ One-shot USDC transfer. $1.00 minimum.
51
+
52
+ ```typescript
53
+ const result = await client.payDirect(to, amount, { memo });
54
+ // Returns: { txHash, status, amount, fee }
55
+ ```
56
+
57
+ ### Tab Management
58
+
59
+ Pre-funded metered account. $5.00 minimum to open.
60
+
61
+ ```typescript
62
+ // Open
63
+ const tab = await client.openTab(provider, amount, { maxChargePerCall });
64
+
65
+ // Query
66
+ const tabs = await client.listTabs();
67
+ const tab = await client.getTab(tabId);
68
+
69
+ // Top up (no extra activation fee)
70
+ const tab = await client.topUpTab(tabId, amount);
71
+
72
+ // Close (either party, unilateral)
73
+ const tab = await client.closeTab(tabId);
74
+ ```
75
+
76
+ Returns `Tab { tabId, provider, amount, balanceRemaining, totalCharged, chargeCount, maxChargePerCall, status }`.
77
+
78
+ ### x402 Requests
79
+
80
+ Transparent HTTP 402 handling. The SDK detects `402 Payment Required`, pays (via direct or tab), and retries.
81
+
82
+ ```typescript
83
+ const response = await client.request(url, { method, body, headers });
84
+ // Returns: Response (native fetch Response)
85
+ ```
86
+
87
+ If the provider requires tab settlement, the SDK auto-opens a tab at 10x the per-call price (minimum $5).
88
+
89
+ ### Wallet
90
+
91
+ ```typescript
92
+ const status = await client.getStatus();
93
+ // Returns: { address, balance, openTabs }
94
+ ```
95
+
96
+ ### Webhooks
97
+
98
+ ```typescript
99
+ const wh = await client.registerWebhook(url, { events: ["tab.opened"], secret: "whsec_..." });
100
+ const webhooks = await client.listWebhooks();
101
+ await client.deleteWebhook(webhookId);
102
+ ```
103
+
104
+ ### Funding
105
+
106
+ ```typescript
107
+ const fundUrl = await client.createFundLink(10_000_000); // Coinbase Onramp
108
+ const withdrawUrl = await client.createWithdrawLink(5_000_000);
109
+ ```
110
+
111
+ ## Signer Modes
112
+
113
+ | Mode | Usage | When |
114
+ |------|-------|------|
115
+ | `"cli"` | Subprocess call to `pay sign` | Default. Key in OS keychain. |
116
+ | `"raw"` | `PAYSKILL_KEY` env var | Dev/testing only. |
117
+ | `"custom"` | Your own callback | Custom key management. |
118
+
119
+ ```typescript
120
+ // CLI signer (default)
121
+ const client = new PayClient({ signer: "cli" });
122
+
123
+ // Raw key (dev only)
124
+ const client = new PayClient({ signer: "raw", signerOptions: { key: "0xdead..." } });
125
+
126
+ // Custom callback
127
+ import { CallbackSigner } from "@pay-skill/sdk";
128
+ const signer = new CallbackSigner((hash: Uint8Array) => mySign(hash));
129
+ const client = new PayClient({ signer });
130
+ ```
131
+
132
+ ## Error Handling
133
+
134
+ ```typescript
135
+ import {
136
+ PayError, // Base class
137
+ PayValidationError, // Bad input (has .field)
138
+ PayNetworkError, // Connection failed
139
+ PayServerError, // Server returned error (has .statusCode)
140
+ PayInsufficientFundsError, // Not enough USDC
141
+ } from "@pay-skill/sdk";
142
+ ```
143
+
144
+ ## Configuration
145
+
146
+ | Env Var | Purpose |
147
+ |---------|---------|
148
+ | `PAYSKILL_KEY` | Private key for raw signer mode |
149
+
150
+ The API URL is configurable via the `apiUrl` option. Default: `https://pay-skill.com/api/v1`.
151
+
152
+ ## License
153
+
154
+ MIT
package/dist/auth.d.ts ADDED
@@ -0,0 +1,47 @@
1
+ /**
2
+ * EIP-712 authentication for pay API requests.
3
+ *
4
+ * Every authenticated request includes four headers:
5
+ * X-Pay-Agent — wallet address (0x-prefixed, checksummed)
6
+ * X-Pay-Signature — EIP-712 signature (0x-prefixed hex, 65 bytes)
7
+ * X-Pay-Timestamp — unix timestamp in seconds
8
+ * X-Pay-Nonce — random 32-byte hex (0x-prefixed)
9
+ *
10
+ * The EIP-712 domain:
11
+ * name: "pay"
12
+ * version: "0.1"
13
+ * chainId: <from config>
14
+ * verifyingContract: <router address>
15
+ *
16
+ * The typed data:
17
+ * APIRequest(string method, string path, uint256 timestamp, bytes32 nonce)
18
+ */
19
+ import { type Hex, type Address } from "viem";
20
+ export interface AuthConfig {
21
+ chainId: number;
22
+ routerAddress: Address;
23
+ }
24
+ export interface AuthHeaders {
25
+ "X-Pay-Agent": string;
26
+ "X-Pay-Signature": string;
27
+ "X-Pay-Timestamp": string;
28
+ "X-Pay-Nonce": string;
29
+ }
30
+ /**
31
+ * Build auth headers for an API request using a private key.
32
+ */
33
+ export declare function buildAuthHeaders(privateKey: Hex, method: string, path: string, config: AuthConfig): Promise<AuthHeaders>;
34
+ /**
35
+ * Build auth headers using a generic signer (Signer interface).
36
+ * Computes the EIP-712 hash manually and delegates signing to the signer.
37
+ */
38
+ export declare function buildAuthHeadersWithSigner(signer: {
39
+ sign(hash: Uint8Array): Uint8Array;
40
+ address: string;
41
+ }, method: string, path: string, config: AuthConfig): AuthHeaders;
42
+ /**
43
+ * Compute the EIP-712 hash for an APIRequest.
44
+ * Must match the server's computation exactly.
45
+ */
46
+ export declare function computeEip712Hash(method: string, path: string, timestamp: bigint, nonce: Hex, chainId: number, verifyingContract: Address): Uint8Array;
47
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,KAAK,GAAG,EAAkC,KAAK,OAAO,EAAE,MAAM,MAAM,CAAC;AAI9E,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACvB;AAgBD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,GAAG,EACf,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,WAAW,CAAC,CA2BtB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE;IAAE,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAC/D,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,UAAU,GACjB,WAAW,CAsBb;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,GAAG,EACV,OAAO,EAAE,MAAM,EACf,iBAAiB,EAAE,OAAO,GACzB,UAAU,CA4DZ"}
package/dist/auth.js ADDED
@@ -0,0 +1,121 @@
1
+ /**
2
+ * EIP-712 authentication for pay API requests.
3
+ *
4
+ * Every authenticated request includes four headers:
5
+ * X-Pay-Agent — wallet address (0x-prefixed, checksummed)
6
+ * X-Pay-Signature — EIP-712 signature (0x-prefixed hex, 65 bytes)
7
+ * X-Pay-Timestamp — unix timestamp in seconds
8
+ * X-Pay-Nonce — random 32-byte hex (0x-prefixed)
9
+ *
10
+ * The EIP-712 domain:
11
+ * name: "pay"
12
+ * version: "0.1"
13
+ * chainId: <from config>
14
+ * verifyingContract: <router address>
15
+ *
16
+ * The typed data:
17
+ * APIRequest(string method, string path, uint256 timestamp, bytes32 nonce)
18
+ */
19
+ import { keccak256, encodePacked } from "viem";
20
+ import { privateKeyToAccount } from "viem/accounts";
21
+ import { randomBytes } from "node:crypto";
22
+ const EIP712_DOMAIN = {
23
+ name: "pay",
24
+ version: "0.1",
25
+ };
26
+ const API_REQUEST_TYPES = {
27
+ APIRequest: [
28
+ { name: "method", type: "string" },
29
+ { name: "path", type: "string" },
30
+ { name: "timestamp", type: "uint256" },
31
+ { name: "nonce", type: "bytes32" },
32
+ ],
33
+ };
34
+ /**
35
+ * Build auth headers for an API request using a private key.
36
+ */
37
+ export async function buildAuthHeaders(privateKey, method, path, config) {
38
+ const account = privateKeyToAccount(privateKey);
39
+ const timestamp = BigInt(Math.floor(Date.now() / 1000));
40
+ const nonce = ("0x" + randomBytes(32).toString("hex"));
41
+ const signature = await account.signTypedData({
42
+ domain: {
43
+ ...EIP712_DOMAIN,
44
+ chainId: config.chainId,
45
+ verifyingContract: config.routerAddress,
46
+ },
47
+ types: API_REQUEST_TYPES,
48
+ primaryType: "APIRequest",
49
+ message: {
50
+ method: method.toUpperCase(),
51
+ path,
52
+ timestamp,
53
+ nonce,
54
+ },
55
+ });
56
+ return {
57
+ "X-Pay-Agent": account.address,
58
+ "X-Pay-Signature": signature,
59
+ "X-Pay-Timestamp": timestamp.toString(),
60
+ "X-Pay-Nonce": nonce,
61
+ };
62
+ }
63
+ /**
64
+ * Build auth headers using a generic signer (Signer interface).
65
+ * Computes the EIP-712 hash manually and delegates signing to the signer.
66
+ */
67
+ export function buildAuthHeadersWithSigner(signer, method, path, config) {
68
+ const timestamp = BigInt(Math.floor(Date.now() / 1000));
69
+ const nonce = ("0x" + randomBytes(32).toString("hex"));
70
+ const hash = computeEip712Hash(method.toUpperCase(), path, timestamp, nonce, config.chainId, config.routerAddress);
71
+ const sigBytes = signer.sign(hash);
72
+ const signature = ("0x" + Buffer.from(sigBytes).toString("hex"));
73
+ return {
74
+ "X-Pay-Agent": signer.address,
75
+ "X-Pay-Signature": signature,
76
+ "X-Pay-Timestamp": timestamp.toString(),
77
+ "X-Pay-Nonce": nonce,
78
+ };
79
+ }
80
+ /**
81
+ * Compute the EIP-712 hash for an APIRequest.
82
+ * Must match the server's computation exactly.
83
+ */
84
+ export function computeEip712Hash(method, path, timestamp, nonce, chainId, verifyingContract) {
85
+ // Type hashes
86
+ const domainTypehash = keccak256(encodePacked(["string"], [
87
+ "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)",
88
+ ]));
89
+ const structTypehash = keccak256(encodePacked(["string"], [
90
+ "APIRequest(string method,string path,uint256 timestamp,bytes32 nonce)",
91
+ ]));
92
+ // Domain separator
93
+ const nameHash = keccak256(encodePacked(["string"], ["pay"]));
94
+ const versionHash = keccak256(encodePacked(["string"], ["0.1"]));
95
+ const domainSeparator = keccak256(encodePacked(["bytes32", "bytes32", "bytes32", "uint256", "address"], [
96
+ domainTypehash,
97
+ nameHash,
98
+ versionHash,
99
+ BigInt(chainId),
100
+ verifyingContract,
101
+ ]));
102
+ // Struct hash
103
+ const methodHash = keccak256(encodePacked(["string"], [method]));
104
+ const pathHash = keccak256(encodePacked(["string"], [path]));
105
+ // Pad nonce to bytes32
106
+ const nonceClean = nonce.startsWith("0x") ? nonce.slice(2) : nonce;
107
+ const noncePadded = ("0x" + nonceClean.padEnd(64, "0"));
108
+ const structHash = keccak256(encodePacked(["bytes32", "bytes32", "bytes32", "uint256", "bytes32"], [structTypehash, methodHash, pathHash, timestamp, noncePadded]));
109
+ // Final hash: keccak256("\x19\x01" || domainSeparator || structHash)
110
+ const finalHash = keccak256(encodePacked(["bytes2", "bytes32", "bytes32"], ["0x1901", domainSeparator, structHash]));
111
+ return hexToBytes(finalHash);
112
+ }
113
+ function hexToBytes(hex) {
114
+ const clean = hex.startsWith("0x") ? hex.slice(2) : hex;
115
+ const bytes = new Uint8Array(clean.length / 2);
116
+ for (let i = 0; i < bytes.length; i++) {
117
+ bytes[i] = parseInt(clean.slice(i * 2, i * 2 + 2), 16);
118
+ }
119
+ return bytes;
120
+ }
121
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAY,SAAS,EAAE,YAAY,EAAuB,MAAM,MAAM,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAc1C,MAAM,aAAa,GAAG;IACpB,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,KAAK;CACN,CAAC;AAEX,MAAM,iBAAiB,GAAG;IACxB,UAAU,EAAE;QACV,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;QAClC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE;QAChC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE;QACtC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;KACnC;CACO,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,UAAe,EACf,MAAc,EACd,IAAY,EACZ,MAAkB;IAElB,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,CAAC,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAQ,CAAC;IAE9D,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC;QAC5C,MAAM,EAAE;YACN,GAAG,aAAa;YAChB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,iBAAiB,EAAE,MAAM,CAAC,aAAa;SACxC;QACD,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,YAAY;QACzB,OAAO,EAAE;YACP,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE;YAC5B,IAAI;YACJ,SAAS;YACT,KAAK;SACN;KACF,CAAC,CAAC;IAEH,OAAO;QACL,aAAa,EAAE,OAAO,CAAC,OAAO;QAC9B,iBAAiB,EAAE,SAAS;QAC5B,iBAAiB,EAAE,SAAS,CAAC,QAAQ,EAAE;QACvC,aAAa,EAAE,KAAK;KACrB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,MAA+D,EAC/D,MAAc,EACd,IAAY,EACZ,MAAkB;IAElB,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,CAAC,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAQ,CAAC;IAE9D,MAAM,IAAI,GAAG,iBAAiB,CAC5B,MAAM,CAAC,WAAW,EAAE,EACpB,IAAI,EACJ,SAAS,EACT,KAAK,EACL,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,aAAa,CACrB,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAQ,CAAC;IAExE,OAAO;QACL,aAAa,EAAE,MAAM,CAAC,OAAO;QAC7B,iBAAiB,EAAE,SAAS;QAC5B,iBAAiB,EAAE,SAAS,CAAC,QAAQ,EAAE;QACvC,aAAa,EAAE,KAAK;KACrB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAc,EACd,IAAY,EACZ,SAAiB,EACjB,KAAU,EACV,OAAe,EACf,iBAA0B;IAE1B,cAAc;IACd,MAAM,cAAc,GAAG,SAAS,CAC9B,YAAY,CACV,CAAC,QAAQ,CAAC,EACV;QACE,oFAAoF;KACrF,CACF,CACF,CAAC;IACF,MAAM,cAAc,GAAG,SAAS,CAC9B,YAAY,CACV,CAAC,QAAQ,CAAC,EACV;QACE,uEAAuE;KACxE,CACF,CACF,CAAC;IAEF,mBAAmB;IACnB,MAAM,QAAQ,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEjE,MAAM,eAAe,GAAG,SAAS,CAC/B,YAAY,CACV,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EACvD;QACE,cAAc;QACd,QAAQ;QACR,WAAW;QACX,MAAM,CAAC,OAAO,CAAC;QACf,iBAAiB;KAClB,CACF,CACF,CAAC;IAEF,cAAc;IACd,MAAM,UAAU,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE7D,uBAAuB;IACvB,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACnE,MAAM,WAAW,GAAG,CAAC,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,CAAQ,CAAC;IAE/D,MAAM,UAAU,GAAG,SAAS,CAC1B,YAAY,CACV,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EACvD,CAAC,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,CAC/D,CACF,CAAC;IAEF,qEAAqE;IACrE,MAAM,SAAS,GAAG,SAAS,CACzB,YAAY,CACV,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,EAChC,CAAC,QAAe,EAAE,eAAe,EAAE,UAAU,CAAC,CAC/C,CACF,CAAC;IAEF,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACxD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * PayClient — single entry point for the pay SDK.
3
+ */
4
+ import type { DirectPaymentResult, StatusResponse, Tab, WebhookRegistration } from "./models.js";
5
+ import type { Signer } from "./signer.js";
6
+ export declare const DEFAULT_API_URL = "https://pay-skill.com/api/v1";
7
+ export interface PayClientOptions {
8
+ apiUrl?: string;
9
+ signer?: Signer | "cli" | "raw" | "custom";
10
+ signerOptions?: {
11
+ command?: string;
12
+ key?: string;
13
+ address?: string;
14
+ callback?: (hash: Uint8Array) => Uint8Array;
15
+ };
16
+ /** Private key for direct auth signing (alternative to signer). */
17
+ privateKey?: string;
18
+ /** Chain ID for EIP-712 domain (default: 8453 for Base). */
19
+ chainId?: number;
20
+ /** Router contract address for EIP-712 domain. */
21
+ routerAddress?: string;
22
+ }
23
+ export declare class PayClient {
24
+ private readonly apiUrl;
25
+ /** URL path prefix extracted from apiUrl (e.g., "/api/v1"). */
26
+ private readonly _basePath;
27
+ private readonly signer;
28
+ private readonly _privateKey;
29
+ private readonly _authConfig;
30
+ constructor(options?: PayClientOptions);
31
+ payDirect(to: string, amount: number, options?: {
32
+ memo?: string;
33
+ }): Promise<DirectPaymentResult>;
34
+ openTab(provider: string, amount: number, options: {
35
+ maxChargePerCall: number;
36
+ }): Promise<Tab>;
37
+ closeTab(tabId: string): Promise<Tab>;
38
+ withdrawTab(tabId: string): Promise<Tab>;
39
+ topUpTab(tabId: string, amount: number): Promise<Tab>;
40
+ listTabs(): Promise<Tab[]>;
41
+ getTab(tabId: string): Promise<Tab>;
42
+ private static readonly X402_TAB_MULTIPLIER;
43
+ request(url: string, options?: {
44
+ method?: string;
45
+ body?: unknown;
46
+ headers?: Record<string, string>;
47
+ }): Promise<Response>;
48
+ /**
49
+ * Parse x402 V2 payment requirements from a 402 response.
50
+ *
51
+ * Checks PAYMENT-REQUIRED header first (base64-encoded JSON),
52
+ * falls back to response body. Requires x402Version 2 with
53
+ * a non-empty `accepts` array.
54
+ */
55
+ private parse402Requirements;
56
+ /** Decode a base64 header and extract v2 requirements, or null if not v2. */
57
+ private tryParseV2;
58
+ private extractFromAccepted;
59
+ private handle402;
60
+ private settleViaDirect;
61
+ private settleViaTab;
62
+ getStatus(): Promise<StatusResponse>;
63
+ registerWebhook(url: string, options?: {
64
+ events?: string[];
65
+ secret?: string;
66
+ }): Promise<WebhookRegistration>;
67
+ listWebhooks(): Promise<WebhookRegistration[]>;
68
+ deleteWebhook(webhookId: string): Promise<void>;
69
+ /** Create a one-time fund link via the server. Returns the dashboard URL. */
70
+ createFundLink(options?: {
71
+ messages?: unknown[];
72
+ agentName?: string;
73
+ }): Promise<string>;
74
+ /** Create a one-time withdraw link via the server. Returns the dashboard URL. */
75
+ createWithdrawLink(options?: {
76
+ messages?: unknown[];
77
+ agentName?: string;
78
+ }): Promise<string>;
79
+ /**
80
+ * Prepare and sign a USDC EIP-2612 permit.
81
+ *
82
+ * 1. Calls GET /api/v1/permit/prepare to get the EIP-712 hash
83
+ * 2. Signs the hash with the agent's private key
84
+ * 3. Returns {nonce, deadline, v, r, s} for inclusion in payment body
85
+ */
86
+ private prepareAndSignPermit;
87
+ private authHeaders;
88
+ private get;
89
+ private post;
90
+ private del;
91
+ private handleResponse;
92
+ }
93
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}