@grantex/sdk 0.3.13 → 0.4.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 +108 -3
- package/dist/http.js +1 -1
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/oauth-agent.d.ts +71 -0
- package/dist/oauth-agent.d.ts.map +1 -0
- package/dist/oauth-agent.js +359 -0
- package/dist/oauth-agent.js.map +1 -0
- package/dist/prepaid-wallets.d.ts +179 -0
- package/dist/prepaid-wallets.d.ts.map +1 -0
- package/dist/prepaid-wallets.js +127 -0
- package/dist/prepaid-wallets.js.map +1 -0
- package/dist/resources/audit.d.ts +2 -1
- package/dist/resources/audit.d.ts.map +1 -1
- package/dist/resources/audit.js +3 -0
- package/dist/resources/audit.js.map +1 -1
- package/dist/resources/tokens.d.ts.map +1 -1
- package/dist/resources/tokens.js +5 -1
- package/dist/resources/tokens.js.map +1 -1
- package/dist/types.d.ts +32 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/verify.d.ts.map +1 -1
- package/dist/verify.js +1 -0
- package/dist/verify.js.map +1 -1
- package/dist/webhook.d.ts +41 -0
- package/dist/webhook.d.ts.map +1 -1
- package/dist/webhook.js +54 -0
- package/dist/webhook.js.map +1 -1
- package/package.json +6 -1
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import { createHash, randomBytes, randomUUID } from 'node:crypto';
|
|
2
|
+
import { calculateJwkThumbprint, exportJWK, generateKeyPair, importJWK, jwtVerify, SignJWT, } from 'jose';
|
|
3
|
+
import { generatePkce } from './pkce.js';
|
|
4
|
+
const TOKEN_EXCHANGE_GRANT = 'urn:ietf:params:oauth:grant-type:token-exchange';
|
|
5
|
+
const ACCESS_TOKEN_TYPE = 'urn:ietf:params:oauth:token-type:access_token';
|
|
6
|
+
export async function generateOAuthAgentKey() {
|
|
7
|
+
const generated = await generateKeyPair('ES256', { extractable: true });
|
|
8
|
+
const publicJwk = await exportJWK(generated.publicKey);
|
|
9
|
+
return {
|
|
10
|
+
privateKey: generated.privateKey,
|
|
11
|
+
publicJwk,
|
|
12
|
+
thumbprint: await calculateJwkThumbprint(publicJwk, 'sha256'),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export class OAuthAgentClient {
|
|
16
|
+
metadata;
|
|
17
|
+
clientId;
|
|
18
|
+
redirectUri;
|
|
19
|
+
resource;
|
|
20
|
+
publicJwk;
|
|
21
|
+
keyThumbprint;
|
|
22
|
+
#privateKey;
|
|
23
|
+
#allowInsecureLoopback;
|
|
24
|
+
#pending = new Map();
|
|
25
|
+
constructor(options) {
|
|
26
|
+
this.metadata = options.metadata;
|
|
27
|
+
this.clientId = options.clientId;
|
|
28
|
+
this.redirectUri = options.redirectUri;
|
|
29
|
+
this.resource = options.resource;
|
|
30
|
+
this.#privateKey = options.privateKey;
|
|
31
|
+
this.#allowInsecureLoopback = options.allowInsecureLoopback;
|
|
32
|
+
this.publicJwk = options.publicJwk;
|
|
33
|
+
this.keyThumbprint = options.keyThumbprint;
|
|
34
|
+
}
|
|
35
|
+
static async create(options) {
|
|
36
|
+
const expectedIssuer = options.issuer;
|
|
37
|
+
const allowInsecureLoopback = options.allowInsecureLoopback === true;
|
|
38
|
+
assertSecureEndpoint(expectedIssuer, allowInsecureLoopback);
|
|
39
|
+
const issuerUrl = new URL(expectedIssuer);
|
|
40
|
+
if (issuerUrl.search || issuerUrl.hash) {
|
|
41
|
+
throw new Error('issuer must not contain a query or fragment');
|
|
42
|
+
}
|
|
43
|
+
assertSecureEndpoint(options.redirectUri, allowInsecureLoopback);
|
|
44
|
+
assertSecureEndpoint(options.resource, allowInsecureLoopback);
|
|
45
|
+
if (new URL(options.redirectUri).hash || new URL(options.resource).hash) {
|
|
46
|
+
throw new Error('redirectUri and resource must not contain fragments');
|
|
47
|
+
}
|
|
48
|
+
const metadataUrl = authorizationServerMetadataUrl(expectedIssuer);
|
|
49
|
+
assertSecureEndpoint(metadataUrl, options.allowInsecureLoopback === true);
|
|
50
|
+
const response = await fetch(metadataUrl, { headers: { Accept: 'application/json' } });
|
|
51
|
+
if (!response.ok)
|
|
52
|
+
throw new Error(`Authorization-server metadata request failed with HTTP ${response.status}`);
|
|
53
|
+
const metadata = response.json();
|
|
54
|
+
const validatedMetadata = validateMetadata(await metadata, expectedIssuer, allowInsecureLoopback);
|
|
55
|
+
let privateKey = options.privateKey;
|
|
56
|
+
let publicJwk = options.publicJwk;
|
|
57
|
+
if ((privateKey === undefined) !== (publicJwk === undefined)) {
|
|
58
|
+
throw new Error('privateKey and publicJwk must be provided together');
|
|
59
|
+
}
|
|
60
|
+
if (!privateKey || !publicJwk) {
|
|
61
|
+
const generated = await generateOAuthAgentKey();
|
|
62
|
+
privateKey = generated.privateKey;
|
|
63
|
+
publicJwk = generated.publicJwk;
|
|
64
|
+
}
|
|
65
|
+
await validateAgentKeyPair(privateKey, publicJwk);
|
|
66
|
+
const keyThumbprint = await calculateJwkThumbprint(publicJwk, 'sha256');
|
|
67
|
+
return new OAuthAgentClient({
|
|
68
|
+
metadata: validatedMetadata,
|
|
69
|
+
clientId: options.clientId,
|
|
70
|
+
redirectUri: options.redirectUri,
|
|
71
|
+
resource: options.resource,
|
|
72
|
+
privateKey,
|
|
73
|
+
publicJwk,
|
|
74
|
+
keyThumbprint,
|
|
75
|
+
allowInsecureLoopback,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
async beginAuthorization(options) {
|
|
79
|
+
if (options.scopes.length === 0 || options.scopes.length > 100
|
|
80
|
+
|| new Set(options.scopes).size !== options.scopes.length
|
|
81
|
+
|| options.scopes.some((scope) => scope.length === 0 || scope.length > 256
|
|
82
|
+
|| !/^[\x21\x23-\x5B\x5D-\x7E]+$/.test(scope))) {
|
|
83
|
+
throw new Error('scopes must be a non-empty set of valid OAuth scope tokens');
|
|
84
|
+
}
|
|
85
|
+
if (options.principalHint !== undefined
|
|
86
|
+
&& (options.principalHint.length === 0 || options.principalHint.length > 256)) {
|
|
87
|
+
throw new Error('principalHint must contain 1 to 256 characters');
|
|
88
|
+
}
|
|
89
|
+
const state = randomBytes(32).toString('base64url');
|
|
90
|
+
const pkce = generatePkce();
|
|
91
|
+
const params = new URLSearchParams({
|
|
92
|
+
client_id: this.clientId,
|
|
93
|
+
response_type: 'code',
|
|
94
|
+
redirect_uri: this.redirectUri,
|
|
95
|
+
scope: options.scopes.join(' '),
|
|
96
|
+
state,
|
|
97
|
+
code_challenge: pkce.codeChallenge,
|
|
98
|
+
code_challenge_method: pkce.codeChallengeMethod,
|
|
99
|
+
resource: this.resource,
|
|
100
|
+
dpop_jkt: this.keyThumbprint,
|
|
101
|
+
});
|
|
102
|
+
if (options.principalHint !== undefined)
|
|
103
|
+
params.set('login_hint', options.principalHint);
|
|
104
|
+
if (options.authorizationDetails) {
|
|
105
|
+
params.set('authorization_details', JSON.stringify(options.authorizationDetails));
|
|
106
|
+
}
|
|
107
|
+
const proof = await this.createDpopProof('POST', this.metadata.pushed_authorization_request_endpoint);
|
|
108
|
+
const response = await fetch(this.metadata.pushed_authorization_request_endpoint, {
|
|
109
|
+
method: 'POST',
|
|
110
|
+
headers: {
|
|
111
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
112
|
+
Accept: 'application/json',
|
|
113
|
+
DPoP: proof,
|
|
114
|
+
},
|
|
115
|
+
body: params,
|
|
116
|
+
});
|
|
117
|
+
const result = await oauthJson(response);
|
|
118
|
+
this.#pending.set(state, {
|
|
119
|
+
codeVerifier: pkce.codeVerifier,
|
|
120
|
+
redirectUri: this.redirectUri,
|
|
121
|
+
issuer: this.metadata.issuer,
|
|
122
|
+
consumed: false,
|
|
123
|
+
});
|
|
124
|
+
const authorizationUrl = new URL(this.metadata.authorization_endpoint);
|
|
125
|
+
authorizationUrl.searchParams.set('client_id', this.clientId);
|
|
126
|
+
authorizationUrl.searchParams.set('request_uri', result.request_uri);
|
|
127
|
+
return {
|
|
128
|
+
authorizationUrl: authorizationUrl.toString(),
|
|
129
|
+
requestUri: result.request_uri,
|
|
130
|
+
state,
|
|
131
|
+
expiresIn: result.expires_in,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
async completeAuthorization(callbackUrl) {
|
|
135
|
+
const callback = new URL(callbackUrl);
|
|
136
|
+
const state = callback.searchParams.get('state');
|
|
137
|
+
if (!state)
|
|
138
|
+
throw new Error('Authorization response is missing state');
|
|
139
|
+
const pending = this.#pending.get(state);
|
|
140
|
+
if (!pending || pending.consumed)
|
|
141
|
+
throw new Error('Authorization response state is unknown or already consumed');
|
|
142
|
+
assertRedirectResponse(callback, pending.redirectUri);
|
|
143
|
+
pending.consumed = true;
|
|
144
|
+
this.#pending.delete(state);
|
|
145
|
+
const responseIssuer = callback.searchParams.get('iss');
|
|
146
|
+
if (responseIssuer !== pending.issuer)
|
|
147
|
+
throw new Error('Authorization response issuer does not match the initiating session');
|
|
148
|
+
const error = callback.searchParams.get('error');
|
|
149
|
+
if (error)
|
|
150
|
+
throw new Error(`Authorization failed: ${error}`);
|
|
151
|
+
const code = callback.searchParams.get('code');
|
|
152
|
+
if (!code)
|
|
153
|
+
throw new Error('Authorization response is missing code');
|
|
154
|
+
return this.tokenRequest(new URLSearchParams({
|
|
155
|
+
grant_type: 'authorization_code',
|
|
156
|
+
code,
|
|
157
|
+
client_id: this.clientId,
|
|
158
|
+
redirect_uri: pending.redirectUri,
|
|
159
|
+
code_verifier: pending.codeVerifier,
|
|
160
|
+
}));
|
|
161
|
+
}
|
|
162
|
+
refresh(refreshToken) {
|
|
163
|
+
return this.tokenRequest(new URLSearchParams({
|
|
164
|
+
grant_type: 'refresh_token',
|
|
165
|
+
refresh_token: refreshToken,
|
|
166
|
+
client_id: this.clientId,
|
|
167
|
+
}));
|
|
168
|
+
}
|
|
169
|
+
attenuate(accessToken, scopes) {
|
|
170
|
+
return this.tokenRequest(new URLSearchParams({
|
|
171
|
+
grant_type: TOKEN_EXCHANGE_GRANT,
|
|
172
|
+
client_id: this.clientId,
|
|
173
|
+
subject_token: accessToken,
|
|
174
|
+
subject_token_type: ACCESS_TOKEN_TYPE,
|
|
175
|
+
requested_token_type: ACCESS_TOKEN_TYPE,
|
|
176
|
+
scope: scopes.join(' '),
|
|
177
|
+
resource: this.resource,
|
|
178
|
+
}));
|
|
179
|
+
}
|
|
180
|
+
async revoke(token, tokenTypeHint) {
|
|
181
|
+
const proof = await this.createDpopProof('POST', this.metadata.revocation_endpoint);
|
|
182
|
+
const params = new URLSearchParams({ client_id: this.clientId, token });
|
|
183
|
+
if (tokenTypeHint)
|
|
184
|
+
params.set('token_type_hint', tokenTypeHint);
|
|
185
|
+
const response = await fetch(this.metadata.revocation_endpoint, {
|
|
186
|
+
method: 'POST',
|
|
187
|
+
headers: {
|
|
188
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
189
|
+
DPoP: proof,
|
|
190
|
+
},
|
|
191
|
+
body: params,
|
|
192
|
+
});
|
|
193
|
+
if (!response.ok)
|
|
194
|
+
await oauthJson(response);
|
|
195
|
+
}
|
|
196
|
+
async fetch(input, accessToken, init = {}) {
|
|
197
|
+
const target = new URL(input);
|
|
198
|
+
const resource = new URL(this.resource);
|
|
199
|
+
if (target.origin !== resource.origin) {
|
|
200
|
+
throw new Error('Protected-resource request origin does not match the configured resource');
|
|
201
|
+
}
|
|
202
|
+
assertSecureEndpoint(target.toString(), this.#allowInsecureLoopback);
|
|
203
|
+
const method = (init.method ?? 'GET').toUpperCase();
|
|
204
|
+
const proof = await this.createDpopProof(method, target.toString(), accessToken);
|
|
205
|
+
const headers = new Headers(init.headers);
|
|
206
|
+
headers.set('Authorization', `DPoP ${accessToken}`);
|
|
207
|
+
headers.set('DPoP', proof);
|
|
208
|
+
return fetch(target, { ...init, method, headers });
|
|
209
|
+
}
|
|
210
|
+
async createDpopProof(method, targetUri, accessToken) {
|
|
211
|
+
const target = new URL(targetUri);
|
|
212
|
+
target.search = '';
|
|
213
|
+
target.hash = '';
|
|
214
|
+
return new SignJWT({
|
|
215
|
+
htm: method.toUpperCase(),
|
|
216
|
+
htu: target.toString(),
|
|
217
|
+
jti: randomUUID(),
|
|
218
|
+
iat: Math.floor(Date.now() / 1000),
|
|
219
|
+
...(accessToken
|
|
220
|
+
? { ath: createHash('sha256').update(accessToken, 'ascii').digest('base64url') }
|
|
221
|
+
: {}),
|
|
222
|
+
})
|
|
223
|
+
.setProtectedHeader({ typ: 'dpop+jwt', alg: 'ES256', jwk: this.publicJwk })
|
|
224
|
+
.sign(this.#privateKey);
|
|
225
|
+
}
|
|
226
|
+
async tokenRequest(params) {
|
|
227
|
+
const proof = await this.createDpopProof('POST', this.metadata.token_endpoint);
|
|
228
|
+
const response = await fetch(this.metadata.token_endpoint, {
|
|
229
|
+
method: 'POST',
|
|
230
|
+
headers: {
|
|
231
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
232
|
+
Accept: 'application/json',
|
|
233
|
+
DPoP: proof,
|
|
234
|
+
},
|
|
235
|
+
body: params,
|
|
236
|
+
});
|
|
237
|
+
const result = await oauthJson(response);
|
|
238
|
+
return validateTokenResponse(result);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
function validateMetadata(value, expectedIssuer, allowInsecureLoopback) {
|
|
242
|
+
if (!value || typeof value !== 'object' || value.issuer !== expectedIssuer) {
|
|
243
|
+
throw new Error('Authorization-server metadata issuer does not match the configured issuer');
|
|
244
|
+
}
|
|
245
|
+
const endpoints = [
|
|
246
|
+
value.authorization_endpoint,
|
|
247
|
+
value.token_endpoint,
|
|
248
|
+
value.jwks_uri,
|
|
249
|
+
value.revocation_endpoint,
|
|
250
|
+
value.pushed_authorization_request_endpoint,
|
|
251
|
+
];
|
|
252
|
+
if (endpoints.some((endpoint) => typeof endpoint !== 'string')) {
|
|
253
|
+
throw new Error('Authorization-server metadata is missing a required endpoint');
|
|
254
|
+
}
|
|
255
|
+
for (const endpoint of endpoints)
|
|
256
|
+
assertSecureEndpoint(endpoint, allowInsecureLoopback);
|
|
257
|
+
if (value.require_pushed_authorization_requests !== true
|
|
258
|
+
|| value.authorization_response_iss_parameter_supported !== true
|
|
259
|
+
|| !value.response_types_supported?.includes('code')
|
|
260
|
+
|| !value.grant_types_supported?.includes('authorization_code')
|
|
261
|
+
|| !value.grant_types_supported?.includes(TOKEN_EXCHANGE_GRANT)
|
|
262
|
+
|| !value.grant_types_supported?.includes('refresh_token')
|
|
263
|
+
|| !value.code_challenge_methods_supported?.includes('S256')
|
|
264
|
+
|| !value.dpop_signing_alg_values_supported?.includes('ES256')
|
|
265
|
+
|| !value.token_endpoint_auth_methods_supported?.includes('none')
|
|
266
|
+
|| !value.revocation_endpoint_auth_methods_supported?.includes('none')) {
|
|
267
|
+
throw new Error('Authorization server does not advertise the capabilities required by the agent-grants profile');
|
|
268
|
+
}
|
|
269
|
+
return value;
|
|
270
|
+
}
|
|
271
|
+
function assertSecureEndpoint(value, allowInsecureLoopback) {
|
|
272
|
+
const parsed = new URL(value);
|
|
273
|
+
const loopback = parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1' || parsed.hostname === '[::1]';
|
|
274
|
+
if (parsed.protocol !== 'https:' && !(allowInsecureLoopback && loopback && parsed.protocol === 'http:')) {
|
|
275
|
+
throw new Error(`OAuth endpoint must use HTTPS: ${value}`);
|
|
276
|
+
}
|
|
277
|
+
if (parsed.username || parsed.password || parsed.hash)
|
|
278
|
+
throw new Error(`OAuth endpoint is malformed: ${value}`);
|
|
279
|
+
}
|
|
280
|
+
async function validateAgentKeyPair(privateKey, publicJwk) {
|
|
281
|
+
const privateFields = ['d', 'p', 'q', 'dp', 'dq', 'qi', 'oth', 'k'];
|
|
282
|
+
if (privateFields.some((field) => publicJwk[field] !== undefined)) {
|
|
283
|
+
throw new Error('publicJwk must not contain private key material');
|
|
284
|
+
}
|
|
285
|
+
if (publicJwk.kty !== 'EC' || publicJwk.crv !== 'P-256'
|
|
286
|
+
|| typeof publicJwk.x !== 'string' || typeof publicJwk.y !== 'string') {
|
|
287
|
+
throw new Error('OAuthAgentClient requires an ES256 P-256 public JWK');
|
|
288
|
+
}
|
|
289
|
+
try {
|
|
290
|
+
const probe = await new SignJWT({ probe: true })
|
|
291
|
+
.setProtectedHeader({ alg: 'ES256' })
|
|
292
|
+
.setIssuedAt()
|
|
293
|
+
.sign(privateKey);
|
|
294
|
+
const publicKey = await importJWK(publicJwk, 'ES256');
|
|
295
|
+
await jwtVerify(probe, publicKey, { algorithms: ['ES256'] });
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
throw new Error('privateKey does not match publicJwk or cannot sign ES256 proofs');
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
function assertRedirectResponse(callback, registeredRedirectUri) {
|
|
302
|
+
const registered = new URL(registeredRedirectUri);
|
|
303
|
+
if (registered.hash || callback.hash || callback.origin !== registered.origin
|
|
304
|
+
|| callback.pathname !== registered.pathname
|
|
305
|
+
|| callback.username || callback.password) {
|
|
306
|
+
throw new Error('Authorization response URL does not match the registered redirect URI');
|
|
307
|
+
}
|
|
308
|
+
for (const [name, value] of registered.searchParams) {
|
|
309
|
+
if (callback.searchParams.get(name) !== value) {
|
|
310
|
+
throw new Error('Authorization response URL does not match the registered redirect URI');
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
const responseParameters = new Set([
|
|
314
|
+
'code', 'state', 'iss', 'error', 'error_description', 'error_uri',
|
|
315
|
+
]);
|
|
316
|
+
for (const name of responseParameters) {
|
|
317
|
+
if (callback.searchParams.getAll(name).length > 1) {
|
|
318
|
+
throw new Error(`Authorization response parameter ${name} must occur at most once`);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
for (const name of callback.searchParams.keys()) {
|
|
322
|
+
if (!registered.searchParams.has(name) && !responseParameters.has(name)) {
|
|
323
|
+
throw new Error('Authorization response contains an unexpected redirect parameter');
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
function authorizationServerMetadataUrl(issuer) {
|
|
328
|
+
const parsed = new URL(issuer);
|
|
329
|
+
const issuerPath = parsed.pathname === '/' ? '' : parsed.pathname.replace(/\/$/, '');
|
|
330
|
+
parsed.pathname = `/.well-known/oauth-authorization-server${issuerPath}`;
|
|
331
|
+
parsed.search = '';
|
|
332
|
+
parsed.hash = '';
|
|
333
|
+
return parsed.toString();
|
|
334
|
+
}
|
|
335
|
+
function validateTokenResponse(value) {
|
|
336
|
+
if (!value || typeof value !== 'object'
|
|
337
|
+
|| typeof value.access_token !== 'string' || value.access_token.length === 0
|
|
338
|
+
|| value.token_type !== 'DPoP'
|
|
339
|
+
|| typeof value.expires_in !== 'number' || !Number.isSafeInteger(value.expires_in)
|
|
340
|
+
|| value.expires_in <= 0
|
|
341
|
+
|| typeof value.scope !== 'string' || value.scope.length === 0
|
|
342
|
+
|| (value.refresh_token !== undefined
|
|
343
|
+
&& (typeof value.refresh_token !== 'string' || value.refresh_token.length === 0))
|
|
344
|
+
|| (value.issued_token_type !== undefined
|
|
345
|
+
&& value.issued_token_type !== ACCESS_TOKEN_TYPE)) {
|
|
346
|
+
throw new Error('Authorization server returned an invalid DPoP token response');
|
|
347
|
+
}
|
|
348
|
+
return value;
|
|
349
|
+
}
|
|
350
|
+
async function oauthJson(response) {
|
|
351
|
+
const body = await response.json().catch(() => null);
|
|
352
|
+
if (!response.ok) {
|
|
353
|
+
const error = typeof body?.['error'] === 'string' ? body['error'] : `HTTP ${response.status}`;
|
|
354
|
+
const description = typeof body?.['error_description'] === 'string' ? body['error_description'] : '';
|
|
355
|
+
throw new Error(description ? `${error}: ${description}` : error);
|
|
356
|
+
}
|
|
357
|
+
return body;
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=oauth-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-agent.js","sourceRoot":"","sources":["../src/oauth-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import type { OAuthAgentClient } from './oauth-agent.js';
|
|
2
|
+
export type PrepaidCustodyMode = 'sandbox_ledger' | 'external';
|
|
3
|
+
export type PrepaidWalletStatus = 'active' | 'blocked' | 'closed';
|
|
4
|
+
export type WalletAssignmentStatus = 'active' | 'blocked' | 'revoked';
|
|
5
|
+
export interface PrepaidWallet {
|
|
6
|
+
walletId: string;
|
|
7
|
+
principalId: string;
|
|
8
|
+
name: string;
|
|
9
|
+
custodyMode: PrepaidCustodyMode;
|
|
10
|
+
provider: string | null;
|
|
11
|
+
providerWalletId: string | null;
|
|
12
|
+
walletAddress: string | null;
|
|
13
|
+
network: string;
|
|
14
|
+
asset: string;
|
|
15
|
+
decimals: number;
|
|
16
|
+
availableAmount: string;
|
|
17
|
+
reservedAmount: string;
|
|
18
|
+
lowBalanceThreshold: string;
|
|
19
|
+
status: PrepaidWalletStatus;
|
|
20
|
+
blockedAt: string | null;
|
|
21
|
+
blockedReason: string | null;
|
|
22
|
+
metadata: Record<string, unknown>;
|
|
23
|
+
createdAt: string;
|
|
24
|
+
updatedAt: string;
|
|
25
|
+
}
|
|
26
|
+
/** Agent-visible wallet projection. Custody provider identifiers and metadata are never exposed. */
|
|
27
|
+
export interface AssignedPrepaidWallet {
|
|
28
|
+
walletId: string;
|
|
29
|
+
name: string;
|
|
30
|
+
network: string;
|
|
31
|
+
asset: string;
|
|
32
|
+
decimals: number;
|
|
33
|
+
availableAmount: string;
|
|
34
|
+
reservedAmount: string;
|
|
35
|
+
lowBalanceThreshold: string;
|
|
36
|
+
status: PrepaidWalletStatus;
|
|
37
|
+
blockedAt: string | null;
|
|
38
|
+
blockedReason: string | null;
|
|
39
|
+
assignmentId: string;
|
|
40
|
+
assignmentStatus: WalletAssignmentStatus;
|
|
41
|
+
perTransactionLimit: string;
|
|
42
|
+
cumulativeLimit: string;
|
|
43
|
+
cumulativePeriodSeconds: number;
|
|
44
|
+
allowedRecipients: string[];
|
|
45
|
+
allowedScopes: string[];
|
|
46
|
+
validFrom: string;
|
|
47
|
+
validUntil: string | null;
|
|
48
|
+
allWalletsBlocked: boolean;
|
|
49
|
+
createdAt: string;
|
|
50
|
+
updatedAt: string;
|
|
51
|
+
}
|
|
52
|
+
export interface WalletAssignment {
|
|
53
|
+
assignmentId: string;
|
|
54
|
+
walletId: string;
|
|
55
|
+
agentId: string;
|
|
56
|
+
principalId: string;
|
|
57
|
+
status: WalletAssignmentStatus;
|
|
58
|
+
perTransactionLimit: string;
|
|
59
|
+
cumulativeLimit: string;
|
|
60
|
+
cumulativePeriodSeconds: number;
|
|
61
|
+
allowedRecipients: string[];
|
|
62
|
+
allowedScopes: string[];
|
|
63
|
+
validFrom: string;
|
|
64
|
+
validUntil: string | null;
|
|
65
|
+
blockedAt: string | null;
|
|
66
|
+
blockedReason: string | null;
|
|
67
|
+
createdAt: string;
|
|
68
|
+
updatedAt: string;
|
|
69
|
+
}
|
|
70
|
+
export interface CreatePrepaidWalletParams {
|
|
71
|
+
name: string;
|
|
72
|
+
custodyMode: PrepaidCustodyMode;
|
|
73
|
+
provider?: string;
|
|
74
|
+
providerWalletId?: string;
|
|
75
|
+
walletAddress?: string;
|
|
76
|
+
network: string;
|
|
77
|
+
asset: string;
|
|
78
|
+
decimals?: number;
|
|
79
|
+
lowBalanceThreshold?: string;
|
|
80
|
+
metadata?: Record<string, unknown>;
|
|
81
|
+
}
|
|
82
|
+
export interface AssignPrepaidWalletParams {
|
|
83
|
+
agentId: string;
|
|
84
|
+
perTransactionLimit: string;
|
|
85
|
+
cumulativeLimit: string;
|
|
86
|
+
cumulativePeriodSeconds: number;
|
|
87
|
+
allowedRecipients?: string[];
|
|
88
|
+
allowedScopes?: string[];
|
|
89
|
+
validUntil?: string;
|
|
90
|
+
}
|
|
91
|
+
export interface PrepaidAuthorizationRequest {
|
|
92
|
+
walletId?: string;
|
|
93
|
+
amount: string;
|
|
94
|
+
asset: string;
|
|
95
|
+
network: string;
|
|
96
|
+
recipient: string;
|
|
97
|
+
resource: string;
|
|
98
|
+
scope: string;
|
|
99
|
+
maxTimeoutSeconds: number;
|
|
100
|
+
idempotencyKey: string;
|
|
101
|
+
}
|
|
102
|
+
export interface PrepaidAuthorizationResponse {
|
|
103
|
+
authorization: string;
|
|
104
|
+
reservationId: string;
|
|
105
|
+
walletId: string;
|
|
106
|
+
assignmentId: string;
|
|
107
|
+
amount: string;
|
|
108
|
+
asset: string;
|
|
109
|
+
network: string;
|
|
110
|
+
recipient: string;
|
|
111
|
+
expiresAt: string;
|
|
112
|
+
remainingAvailable: string;
|
|
113
|
+
remainingCumulative: string;
|
|
114
|
+
}
|
|
115
|
+
export interface WalletReloadRequest {
|
|
116
|
+
reloadRequestId: string;
|
|
117
|
+
walletId: string;
|
|
118
|
+
assignmentId: string | null;
|
|
119
|
+
agentId: string | null;
|
|
120
|
+
amount: string;
|
|
121
|
+
reason: string | null;
|
|
122
|
+
status: 'pending' | 'approved' | 'rejected' | 'cancelled' | 'funded';
|
|
123
|
+
requestedBy: 'agent' | 'principal';
|
|
124
|
+
externalReference: string | null;
|
|
125
|
+
createdAt: string;
|
|
126
|
+
decidedAt: string | null;
|
|
127
|
+
fundedAt: string | null;
|
|
128
|
+
}
|
|
129
|
+
export interface PrepaidWalletActivity {
|
|
130
|
+
assignments: WalletAssignment[];
|
|
131
|
+
reservations: Array<Record<string, unknown>>;
|
|
132
|
+
reloadRequests: WalletReloadRequest[];
|
|
133
|
+
ledger: Array<Record<string, unknown>>;
|
|
134
|
+
}
|
|
135
|
+
interface DpopResourceClient {
|
|
136
|
+
fetch(input: string | URL, accessToken: string, init?: RequestInit): Promise<Response>;
|
|
137
|
+
}
|
|
138
|
+
export declare class PrepaidWalletAgentClient {
|
|
139
|
+
#private;
|
|
140
|
+
constructor(options: {
|
|
141
|
+
oauthClient: OAuthAgentClient | DpopResourceClient;
|
|
142
|
+
accessToken: string;
|
|
143
|
+
resourceUrl?: string;
|
|
144
|
+
});
|
|
145
|
+
setAccessToken(accessToken: string): void;
|
|
146
|
+
list(): Promise<AssignedPrepaidWallet[]>;
|
|
147
|
+
authorizePayment(params: PrepaidAuthorizationRequest): Promise<PrepaidAuthorizationResponse>;
|
|
148
|
+
requestReload(walletId: string, amount: string, idempotencyKey: string, reason?: string): Promise<WalletReloadRequest>;
|
|
149
|
+
/** Callback passed directly to @grantex/x402 createX402Agent(). */
|
|
150
|
+
readonly x402Authorizer: (params: PrepaidAuthorizationRequest) => Promise<PrepaidAuthorizationResponse>;
|
|
151
|
+
}
|
|
152
|
+
export declare class PrincipalPrepaidWalletClient {
|
|
153
|
+
#private;
|
|
154
|
+
constructor(options: {
|
|
155
|
+
baseUrl: string;
|
|
156
|
+
sessionToken: string;
|
|
157
|
+
});
|
|
158
|
+
setSessionToken(sessionToken: string): void;
|
|
159
|
+
create(params: CreatePrepaidWalletParams): Promise<PrepaidWallet>;
|
|
160
|
+
list(): Promise<PrepaidWallet[]>;
|
|
161
|
+
activity(walletId: string): Promise<PrepaidWalletActivity>;
|
|
162
|
+
assign(walletId: string, params: AssignPrepaidWalletParams): Promise<WalletAssignment>;
|
|
163
|
+
setAssignmentStatus(assignmentId: string, status: WalletAssignmentStatus, reason?: string): Promise<WalletAssignment>;
|
|
164
|
+
setWalletStatus(walletId: string, status: PrepaidWalletStatus, reason?: string): Promise<PrepaidWallet>;
|
|
165
|
+
setAgentBlocked(agentId: string, blocked: boolean, reason?: string): Promise<{
|
|
166
|
+
agentId: string;
|
|
167
|
+
allWalletsBlocked: boolean;
|
|
168
|
+
reason: string | null;
|
|
169
|
+
}>;
|
|
170
|
+
reload(walletId: string, amount: string, idempotencyKey: string, externalReference?: string): Promise<WalletReloadRequest>;
|
|
171
|
+
decideReload(requestId: string, decision: 'approved' | 'rejected'): Promise<WalletReloadRequest>;
|
|
172
|
+
fundReload(requestId: string, externalReference?: string): Promise<WalletReloadRequest>;
|
|
173
|
+
releaseReservation(reservationId: string, reason: string): Promise<{
|
|
174
|
+
reservationId: string;
|
|
175
|
+
status: 'released';
|
|
176
|
+
}>;
|
|
177
|
+
}
|
|
178
|
+
export {};
|
|
179
|
+
//# sourceMappingURL=prepaid-wallets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepaid-wallets.d.ts","sourceRoot":"","sources":["../src/prepaid-wallets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,MAAM,kBAAkB,GAAG,gBAAgB,GAAG,UAAU,CAAC;AAC/D,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAClE,MAAM,MAAM,sBAAsB,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAEtE,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,kBAAkB,CAAC;IAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,oGAAoG;AACpG,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,sBAAsB,CAAC;IACzC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,EAAE,MAAM,CAAC;IAChC,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,EAAE,MAAM,CAAC;IAChC,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,kBAAkB,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,EAAE,MAAM,CAAC;IAChC,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,4BAA4B;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;IACrE,WAAW,EAAE,OAAO,GAAG,WAAW,CAAC;IACnC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7C,cAAc,EAAE,mBAAmB,EAAE,CAAC;IACtC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACxC;AAED,UAAU,kBAAkB;IAC1B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACxF;AAED,qBAAa,wBAAwB;;IAKnC,YAAY,OAAO,EAAE;QACnB,WAAW,EAAE,gBAAgB,GAAG,kBAAkB,CAAC;QACnD,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,EAWA;IAED,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAGxC;IAEK,IAAI,IAAI,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAK7C;IAEK,gBAAgB,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAOjG;IAEK,aAAa,CACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,EACtB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,mBAAmB,CAAC,CAO9B;IAED,mEAAmE;IACnE,QAAQ,CAAC,cAAc,WAAY,2BAA2B,2CAAmC;CAClG;AAED,qBAAa,4BAA4B;;IAIvC,YAAY,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,EAI7D;IAED,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAG1C;IAED,MAAM,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,aAAa,CAAC,CAEhE;IAEK,IAAI,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAErC;IAED,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAEzD;IAED,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAKrF;IAED,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAKpH;IAED,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAKtG;IAED,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAKnJ;IAED,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAKzH;IAED,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAK/F;IAED,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAKtF;IAED,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,CAAC,CAKhH;CASF"}
|