@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.
- package/README.md +154 -0
- package/dist/auth.d.ts +47 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +121 -0
- package/dist/auth.js.map +1 -0
- package/dist/client.d.ts +93 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +391 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +24 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +42 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/models.d.ts +69 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +2 -0
- package/dist/models.js.map +1 -0
- package/dist/ows-signer.d.ts +75 -0
- package/dist/ows-signer.d.ts.map +1 -0
- package/dist/ows-signer.js +130 -0
- package/dist/ows-signer.js.map +1 -0
- package/dist/signer.d.ts +46 -0
- package/dist/signer.d.ts.map +1 -0
- package/dist/signer.js +112 -0
- package/dist/signer.js.map +1 -0
- package/dist/wallet.d.ts +121 -0
- package/dist/wallet.d.ts.map +1 -0
- package/dist/wallet.js +328 -0
- package/dist/wallet.js.map +1 -0
- package/eslint.config.js +22 -0
- package/package.json +44 -0
- package/src/auth.ts +200 -0
- package/src/client.ts +644 -0
- package/src/eip3009.ts +79 -0
- package/src/errors.ts +48 -0
- package/src/index.ts +51 -0
- package/src/models.ts +77 -0
- package/src/ows-signer.ts +223 -0
- package/src/signer.ts +147 -0
- package/src/wallet.ts +445 -0
- package/tests/test_auth_rejection.ts +154 -0
- package/tests/test_crypto.ts +251 -0
- package/tests/test_e2e.ts +158 -0
- package/tests/test_errors.ts +36 -0
- package/tests/test_ows_integration.ts +92 -0
- package/tests/test_ows_signer.ts +365 -0
- package/tests/test_signer.ts +47 -0
- package/tests/test_validation.ts +66 -0
- 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
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
ADDED
|
@@ -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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"}
|