run402 1.40.1 → 1.40.2
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/lib/sdk.mjs +1 -1
- package/package.json +4 -3
- package/sdk/core-dist/allowance-auth.js +129 -0
- package/sdk/core-dist/allowance.js +25 -0
- package/sdk/core-dist/client.js +42 -0
- package/sdk/core-dist/config.js +26 -0
- package/sdk/core-dist/keystore.js +97 -0
- package/sdk/core-dist/wallet-auth.js +62 -0
- package/sdk/core-dist/wallet.js +25 -0
- package/sdk/dist/credentials.d.ts +70 -0
- package/sdk/dist/credentials.d.ts.map +1 -0
- package/sdk/dist/credentials.js +19 -0
- package/sdk/dist/credentials.js.map +1 -0
- package/sdk/dist/errors.d.ts +34 -0
- package/sdk/dist/errors.d.ts.map +1 -0
- package/sdk/dist/errors.js +46 -0
- package/sdk/dist/errors.js.map +1 -0
- package/sdk/dist/index.d.ts +68 -0
- package/sdk/dist/index.d.ts.map +1 -0
- package/sdk/dist/index.js +81 -0
- package/sdk/dist/index.js.map +1 -0
- package/sdk/dist/kernel.d.ts +47 -0
- package/sdk/dist/kernel.d.ts.map +1 -0
- package/sdk/dist/kernel.js +76 -0
- package/sdk/dist/kernel.js.map +1 -0
- package/sdk/dist/namespaces/admin.d.ts +30 -0
- package/sdk/dist/namespaces/admin.d.ts.map +1 -0
- package/sdk/dist/namespaces/admin.js +36 -0
- package/sdk/dist/namespaces/admin.js.map +1 -0
- package/sdk/dist/namespaces/ai.d.ts +57 -0
- package/sdk/dist/namespaces/ai.d.ts.map +1 -0
- package/sdk/dist/namespaces/ai.js +62 -0
- package/sdk/dist/namespaces/ai.js.map +1 -0
- package/sdk/dist/namespaces/allowance.d.ts +51 -0
- package/sdk/dist/namespaces/allowance.d.ts.map +1 -0
- package/sdk/dist/namespaces/allowance.js +116 -0
- package/sdk/dist/namespaces/allowance.js.map +1 -0
- package/sdk/dist/namespaces/apps.d.ts +158 -0
- package/sdk/dist/namespaces/apps.d.ts.map +1 -0
- package/sdk/dist/namespaces/apps.js +150 -0
- package/sdk/dist/namespaces/apps.js.map +1 -0
- package/sdk/dist/namespaces/auth.d.ts +53 -0
- package/sdk/dist/namespaces/auth.d.ts.map +1 -0
- package/sdk/dist/namespaces/auth.js +106 -0
- package/sdk/dist/namespaces/auth.js.map +1 -0
- package/sdk/dist/namespaces/billing.d.ts +64 -0
- package/sdk/dist/namespaces/billing.d.ts.map +1 -0
- package/sdk/dist/namespaces/billing.js +105 -0
- package/sdk/dist/namespaces/billing.js.map +1 -0
- package/sdk/dist/namespaces/blobs.d.ts +41 -0
- package/sdk/dist/namespaces/blobs.d.ts.map +1 -0
- package/sdk/dist/namespaces/blobs.js +202 -0
- package/sdk/dist/namespaces/blobs.js.map +1 -0
- package/sdk/dist/namespaces/blobs.types.d.ts +58 -0
- package/sdk/dist/namespaces/blobs.types.d.ts.map +1 -0
- package/sdk/dist/namespaces/blobs.types.js +9 -0
- package/sdk/dist/namespaces/blobs.types.js.map +1 -0
- package/sdk/dist/namespaces/contracts.d.ts +65 -0
- package/sdk/dist/namespaces/contracts.d.ts.map +1 -0
- package/sdk/dist/namespaces/contracts.js +163 -0
- package/sdk/dist/namespaces/contracts.js.map +1 -0
- package/sdk/dist/namespaces/domains.d.ts +57 -0
- package/sdk/dist/namespaces/domains.d.ts.map +1 -0
- package/sdk/dist/namespaces/domains.js +60 -0
- package/sdk/dist/namespaces/domains.js.map +1 -0
- package/sdk/dist/namespaces/email.d.ts +131 -0
- package/sdk/dist/namespaces/email.d.ts.map +1 -0
- package/sdk/dist/namespaces/email.js +318 -0
- package/sdk/dist/namespaces/email.js.map +1 -0
- package/sdk/dist/namespaces/functions.d.ts +43 -0
- package/sdk/dist/namespaces/functions.d.ts.map +1 -0
- package/sdk/dist/namespaces/functions.js +146 -0
- package/sdk/dist/namespaces/functions.js.map +1 -0
- package/sdk/dist/namespaces/functions.types.d.ts +96 -0
- package/sdk/dist/namespaces/functions.types.d.ts.map +1 -0
- package/sdk/dist/namespaces/functions.types.js +6 -0
- package/sdk/dist/namespaces/functions.types.js.map +1 -0
- package/sdk/dist/namespaces/projects.d.ts +97 -0
- package/sdk/dist/namespaces/projects.d.ts.map +1 -0
- package/sdk/dist/namespaces/projects.js +214 -0
- package/sdk/dist/namespaces/projects.js.map +1 -0
- package/sdk/dist/namespaces/projects.types.d.ts +112 -0
- package/sdk/dist/namespaces/projects.types.d.ts.map +1 -0
- package/sdk/dist/namespaces/projects.types.js +9 -0
- package/sdk/dist/namespaces/projects.types.js.map +1 -0
- package/sdk/dist/namespaces/secrets.d.ts +23 -0
- package/sdk/dist/namespaces/secrets.d.ts.map +1 -0
- package/sdk/dist/namespaces/secrets.js +45 -0
- package/sdk/dist/namespaces/secrets.js.map +1 -0
- package/sdk/dist/namespaces/sender-domain.d.ts +40 -0
- package/sdk/dist/namespaces/sender-domain.d.ts.map +1 -0
- package/sdk/dist/namespaces/sender-domain.js +69 -0
- package/sdk/dist/namespaces/sender-domain.js.map +1 -0
- package/sdk/dist/namespaces/service.d.ts +51 -0
- package/sdk/dist/namespaces/service.d.ts.map +1 -0
- package/sdk/dist/namespaces/service.js +25 -0
- package/sdk/dist/namespaces/service.js.map +1 -0
- package/sdk/dist/namespaces/sites.d.ts +50 -0
- package/sdk/dist/namespaces/sites.d.ts.map +1 -0
- package/sdk/dist/namespaces/sites.js +38 -0
- package/sdk/dist/namespaces/sites.js.map +1 -0
- package/sdk/dist/namespaces/subdomains.d.ts +36 -0
- package/sdk/dist/namespaces/subdomains.d.ts.map +1 -0
- package/sdk/dist/namespaces/subdomains.js +54 -0
- package/sdk/dist/namespaces/subdomains.js.map +1 -0
- package/sdk/dist/namespaces/tier.d.ts +36 -0
- package/sdk/dist/namespaces/tier.d.ts.map +1 -0
- package/sdk/dist/namespaces/tier.js +31 -0
- package/sdk/dist/namespaces/tier.js.map +1 -0
- package/sdk/dist/node/credentials.d.ts +26 -0
- package/sdk/dist/node/credentials.d.ts.map +1 -0
- package/sdk/dist/node/credentials.js +69 -0
- package/sdk/dist/node/credentials.js.map +1 -0
- package/sdk/dist/node/index.d.ts +44 -0
- package/sdk/dist/node/index.d.ts.map +1 -0
- package/sdk/dist/node/index.js +43 -0
- package/sdk/dist/node/index.js.map +1 -0
- package/sdk/dist/node/paid-fetch.d.ts +22 -0
- package/sdk/dist/node/paid-fetch.d.ts.map +1 -0
- package/sdk/dist/node/paid-fetch.js +116 -0
- package/sdk/dist/node/paid-fetch.js.map +1 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `billing` namespace — wallet-scoped billing accounts and Stripe checkouts.
|
|
3
|
+
* All operations are public (no service key required); they identify the
|
|
4
|
+
* account by wallet address or email.
|
|
5
|
+
*/
|
|
6
|
+
import type { Client } from "../kernel.js";
|
|
7
|
+
export interface BillingBalance {
|
|
8
|
+
wallet: string;
|
|
9
|
+
exists: boolean;
|
|
10
|
+
available_usd_micros: number;
|
|
11
|
+
held_usd_micros: number;
|
|
12
|
+
status?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface BillingHistoryEntry {
|
|
15
|
+
direction: string;
|
|
16
|
+
kind: string;
|
|
17
|
+
amount_usd_micros: number;
|
|
18
|
+
balance_after_available: number;
|
|
19
|
+
created_at: string;
|
|
20
|
+
}
|
|
21
|
+
export interface BillingHistoryResult {
|
|
22
|
+
wallet: string;
|
|
23
|
+
entries: BillingHistoryEntry[];
|
|
24
|
+
}
|
|
25
|
+
export interface CreateCheckoutResult {
|
|
26
|
+
checkout_url: string;
|
|
27
|
+
topup_id: string;
|
|
28
|
+
}
|
|
29
|
+
export interface EmailBillingAccount {
|
|
30
|
+
id: string;
|
|
31
|
+
email: string;
|
|
32
|
+
email_credits_remaining: number;
|
|
33
|
+
verification_sent: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface AccountIdentifier {
|
|
36
|
+
email?: string;
|
|
37
|
+
wallet?: string;
|
|
38
|
+
}
|
|
39
|
+
export interface AutoRechargeOptions {
|
|
40
|
+
billingAccountId: string;
|
|
41
|
+
enabled: boolean;
|
|
42
|
+
threshold?: number;
|
|
43
|
+
}
|
|
44
|
+
export declare class Billing {
|
|
45
|
+
private readonly client;
|
|
46
|
+
constructor(client: Client);
|
|
47
|
+
/** Check a wallet's billing balance (available / held / status). Public, no auth. */
|
|
48
|
+
checkBalance(wallet: string): Promise<BillingBalance>;
|
|
49
|
+
/** Fetch billing history for a wallet. */
|
|
50
|
+
history(wallet: string, limit?: number): Promise<BillingHistoryResult>;
|
|
51
|
+
/** Create a Stripe checkout URL to fund a wallet's billing balance. */
|
|
52
|
+
createCheckout(wallet: string, amountUsdMicros: number): Promise<CreateCheckoutResult>;
|
|
53
|
+
/** Create an email-only (no-wallet) billing account. Sends a verification email. */
|
|
54
|
+
createEmailAccount(email: string): Promise<EmailBillingAccount>;
|
|
55
|
+
/** Link a wallet to an existing email billing account to enable hybrid Stripe + x402. */
|
|
56
|
+
linkWallet(billingAccountId: string, wallet: string): Promise<void>;
|
|
57
|
+
/** Create a Stripe checkout for a tier subscription/renewal/upgrade. */
|
|
58
|
+
tierCheckout(tier: string, identifier: AccountIdentifier): Promise<CreateCheckoutResult>;
|
|
59
|
+
/** Buy a $5 email pack (10,000 emails). */
|
|
60
|
+
buyEmailPack(identifier: AccountIdentifier): Promise<CreateCheckoutResult>;
|
|
61
|
+
/** Enable/disable email-pack auto-recharge. */
|
|
62
|
+
setAutoRecharge(opts: AutoRechargeOptions): Promise<void>;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=billing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing.d.ts","sourceRoot":"","sources":["../../src/namespaces/billing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uBAAuB,EAAE,MAAM,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,uBAAuB,EAAE,MAAM,CAAC;IAChC,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,OAAO;IACN,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAE3C,qFAAqF;IAC/E,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAQ3D,0CAA0C;IACpC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAW5E,uEAAuE;IACjE,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAS5F,oFAAoF;IAC9E,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IASrE,yFAAyF;IACnF,UAAU,CAAC,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYzE,wEAAwE;IAClE,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAc9F,2CAA2C;IACrC,YAAY,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAchF,+CAA+C;IACzC,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;CAchE"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `billing` namespace — wallet-scoped billing accounts and Stripe checkouts.
|
|
3
|
+
* All operations are public (no service key required); they identify the
|
|
4
|
+
* account by wallet address or email.
|
|
5
|
+
*/
|
|
6
|
+
export class Billing {
|
|
7
|
+
client;
|
|
8
|
+
constructor(client) {
|
|
9
|
+
this.client = client;
|
|
10
|
+
}
|
|
11
|
+
/** Check a wallet's billing balance (available / held / status). Public, no auth. */
|
|
12
|
+
async checkBalance(wallet) {
|
|
13
|
+
const w = wallet.toLowerCase();
|
|
14
|
+
return this.client.request(`/billing/v1/accounts/${w}`, {
|
|
15
|
+
context: "checking balance",
|
|
16
|
+
withAuth: false,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
/** Fetch billing history for a wallet. */
|
|
20
|
+
async history(wallet, limit) {
|
|
21
|
+
const w = wallet.toLowerCase();
|
|
22
|
+
const path = limit
|
|
23
|
+
? `/billing/v1/accounts/${w}/history?limit=${limit}`
|
|
24
|
+
: `/billing/v1/accounts/${w}/history`;
|
|
25
|
+
return this.client.request(path, {
|
|
26
|
+
context: "fetching billing history",
|
|
27
|
+
withAuth: false,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/** Create a Stripe checkout URL to fund a wallet's billing balance. */
|
|
31
|
+
async createCheckout(wallet, amountUsdMicros) {
|
|
32
|
+
return this.client.request("/billing/v1/checkouts", {
|
|
33
|
+
method: "POST",
|
|
34
|
+
body: { wallet: wallet.toLowerCase(), amount_usd_micros: amountUsdMicros },
|
|
35
|
+
context: "creating checkout",
|
|
36
|
+
withAuth: false,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
/** Create an email-only (no-wallet) billing account. Sends a verification email. */
|
|
40
|
+
async createEmailAccount(email) {
|
|
41
|
+
return this.client.request("/billing/v1/accounts", {
|
|
42
|
+
method: "POST",
|
|
43
|
+
body: { email },
|
|
44
|
+
context: "creating email billing account",
|
|
45
|
+
withAuth: false,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/** Link a wallet to an existing email billing account to enable hybrid Stripe + x402. */
|
|
49
|
+
async linkWallet(billingAccountId, wallet) {
|
|
50
|
+
await this.client.request(`/billing/v1/accounts/${billingAccountId}/link-wallet`, {
|
|
51
|
+
method: "POST",
|
|
52
|
+
body: { wallet },
|
|
53
|
+
context: "linking wallet",
|
|
54
|
+
withAuth: false,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/** Create a Stripe checkout for a tier subscription/renewal/upgrade. */
|
|
58
|
+
async tierCheckout(tier, identifier) {
|
|
59
|
+
const body = {};
|
|
60
|
+
if (identifier.wallet)
|
|
61
|
+
body.wallet = identifier.wallet;
|
|
62
|
+
else if (identifier.email)
|
|
63
|
+
body.email = identifier.email;
|
|
64
|
+
else
|
|
65
|
+
throw new Error("Provide either `email` or `wallet` in identifier.");
|
|
66
|
+
return this.client.request(`/billing/v1/tiers/${tier}/checkout`, {
|
|
67
|
+
method: "POST",
|
|
68
|
+
body,
|
|
69
|
+
context: "creating tier checkout",
|
|
70
|
+
withAuth: false,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/** Buy a $5 email pack (10,000 emails). */
|
|
74
|
+
async buyEmailPack(identifier) {
|
|
75
|
+
const body = {};
|
|
76
|
+
if (identifier.wallet)
|
|
77
|
+
body.wallet = identifier.wallet;
|
|
78
|
+
else if (identifier.email)
|
|
79
|
+
body.email = identifier.email;
|
|
80
|
+
else
|
|
81
|
+
throw new Error("Provide either `email` or `wallet` in identifier.");
|
|
82
|
+
return this.client.request("/billing/v1/email-packs/checkout", {
|
|
83
|
+
method: "POST",
|
|
84
|
+
body,
|
|
85
|
+
context: "creating email pack checkout",
|
|
86
|
+
withAuth: false,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/** Enable/disable email-pack auto-recharge. */
|
|
90
|
+
async setAutoRecharge(opts) {
|
|
91
|
+
const body = {
|
|
92
|
+
billing_account_id: opts.billingAccountId,
|
|
93
|
+
enabled: opts.enabled,
|
|
94
|
+
};
|
|
95
|
+
if (opts.threshold !== undefined)
|
|
96
|
+
body.threshold = opts.threshold;
|
|
97
|
+
await this.client.request("/billing/v1/email-packs/auto-recharge", {
|
|
98
|
+
method: "POST",
|
|
99
|
+
body,
|
|
100
|
+
context: "setting auto-recharge",
|
|
101
|
+
withAuth: false,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=billing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/namespaces/billing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `blobs` namespace — direct-to-S3 blob storage.
|
|
3
|
+
*
|
|
4
|
+
* `put` encapsulates the 3-step upload flow (init → PUT parts to S3 →
|
|
5
|
+
* complete). The S3 PUT uses `client.fetch` directly (not the gateway's
|
|
6
|
+
* `request`) so it bypasses gateway auth and path-rewriting. The client's
|
|
7
|
+
* configured fetch still flows through any wrappers (e.g. test mocks).
|
|
8
|
+
*/
|
|
9
|
+
import type { Client } from "../kernel.js";
|
|
10
|
+
import type { BlobLsOptions, BlobLsResult, BlobPutOptions, BlobPutResult, BlobPutSource, BlobSignOptions, BlobSignResult } from "./blobs.types.js";
|
|
11
|
+
export declare class Blobs {
|
|
12
|
+
private readonly client;
|
|
13
|
+
constructor(client: Client);
|
|
14
|
+
/**
|
|
15
|
+
* Upload a blob via the 3-step direct-to-S3 flow. The bytes are PUT to
|
|
16
|
+
* presigned S3 URLs — they do NOT pass through the gateway, so uploads
|
|
17
|
+
* are not double-billed as API calls and large files stream efficiently.
|
|
18
|
+
*
|
|
19
|
+
* Pass `immutable: true` to produce a content-addressed URL (the server
|
|
20
|
+
* computes no hash — the SDK does it locally and attests via `sha256`).
|
|
21
|
+
*
|
|
22
|
+
* @throws {ProjectNotFound} if `projectId` is not in the provider.
|
|
23
|
+
*/
|
|
24
|
+
put(projectId: string, key: string, source: BlobPutSource, opts?: BlobPutOptions): Promise<BlobPutResult>;
|
|
25
|
+
/**
|
|
26
|
+
* Download a blob. Returns the raw `Response` so callers can stream to
|
|
27
|
+
* disk, pipe to another sink, or buffer with `.bytes()` / `.arrayBuffer()`.
|
|
28
|
+
* This avoids forcing large blobs through a JS buffer.
|
|
29
|
+
*
|
|
30
|
+
* @throws {ProjectNotFound} if `projectId` is not in the provider.
|
|
31
|
+
* @throws {ApiError} on non-2xx (includes the error text from the response body).
|
|
32
|
+
*/
|
|
33
|
+
get(projectId: string, key: string): Promise<Response>;
|
|
34
|
+
/** List blobs with optional prefix + pagination. */
|
|
35
|
+
ls(projectId: string, opts?: BlobLsOptions): Promise<BlobLsResult>;
|
|
36
|
+
/** Delete a blob and decrement the project's storage_bytes. */
|
|
37
|
+
rm(projectId: string, key: string): Promise<void>;
|
|
38
|
+
/** Generate a time-boxed S3 presigned GET URL for a blob. Default TTL 1 hour, max 7 days. */
|
|
39
|
+
sign(projectId: string, key: string, opts?: BlobSignOptions): Promise<BlobSignResult>;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=blobs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blobs.d.ts","sourceRoot":"","sources":["../../src/namespaces/blobs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,cAAc,EACd,aAAa,EACb,aAAa,EACb,eAAe,EACf,cAAc,EACf,MAAM,kBAAkB,CAAC;AA6C1B,qBAAa,KAAK;IACJ,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAE3C;;;;;;;;;OASG;IACG,GAAG,CACP,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,aAAa,EACrB,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,aAAa,CAAC;IA+EzB;;;;;;;OAOG;IACG,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAuB5D,oDAAoD;IAC9C,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,CAAC;IAoB5E,+DAA+D;IACzD,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcvD,6FAA6F;IACvF,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC;CAoBhG"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `blobs` namespace — direct-to-S3 blob storage.
|
|
3
|
+
*
|
|
4
|
+
* `put` encapsulates the 3-step upload flow (init → PUT parts to S3 →
|
|
5
|
+
* complete). The S3 PUT uses `client.fetch` directly (not the gateway's
|
|
6
|
+
* `request`) so it bypasses gateway auth and path-rewriting. The client's
|
|
7
|
+
* configured fetch still flows through any wrappers (e.g. test mocks).
|
|
8
|
+
*/
|
|
9
|
+
import { ApiError, ProjectNotFound } from "../errors.js";
|
|
10
|
+
function encodeKey(key) {
|
|
11
|
+
return key.split("/").map(encodeURIComponent).join("/");
|
|
12
|
+
}
|
|
13
|
+
function guessContentType(key) {
|
|
14
|
+
const ext = key.slice(key.lastIndexOf(".") + 1).toLowerCase();
|
|
15
|
+
const map = {
|
|
16
|
+
png: "image/png",
|
|
17
|
+
jpg: "image/jpeg",
|
|
18
|
+
jpeg: "image/jpeg",
|
|
19
|
+
gif: "image/gif",
|
|
20
|
+
svg: "image/svg+xml",
|
|
21
|
+
webp: "image/webp",
|
|
22
|
+
html: "text/html",
|
|
23
|
+
css: "text/css",
|
|
24
|
+
js: "text/javascript",
|
|
25
|
+
json: "application/json",
|
|
26
|
+
txt: "text/plain",
|
|
27
|
+
md: "text/markdown",
|
|
28
|
+
pdf: "application/pdf",
|
|
29
|
+
zip: "application/zip",
|
|
30
|
+
tgz: "application/gzip",
|
|
31
|
+
gz: "application/gzip",
|
|
32
|
+
};
|
|
33
|
+
return map[ext] ?? "application/octet-stream";
|
|
34
|
+
}
|
|
35
|
+
async function sha256Hex(bytes) {
|
|
36
|
+
// crypto.subtle.digest typings disallow SharedArrayBuffer-backed views;
|
|
37
|
+
// cast through BufferSource to accept the concrete Uint8Array instance.
|
|
38
|
+
const hash = await crypto.subtle.digest("SHA-256", bytes);
|
|
39
|
+
return Array.from(new Uint8Array(hash))
|
|
40
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
41
|
+
.join("");
|
|
42
|
+
}
|
|
43
|
+
export class Blobs {
|
|
44
|
+
client;
|
|
45
|
+
constructor(client) {
|
|
46
|
+
this.client = client;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Upload a blob via the 3-step direct-to-S3 flow. The bytes are PUT to
|
|
50
|
+
* presigned S3 URLs — they do NOT pass through the gateway, so uploads
|
|
51
|
+
* are not double-billed as API calls and large files stream efficiently.
|
|
52
|
+
*
|
|
53
|
+
* Pass `immutable: true` to produce a content-addressed URL (the server
|
|
54
|
+
* computes no hash — the SDK does it locally and attests via `sha256`).
|
|
55
|
+
*
|
|
56
|
+
* @throws {ProjectNotFound} if `projectId` is not in the provider.
|
|
57
|
+
*/
|
|
58
|
+
async put(projectId, key, source, opts = {}) {
|
|
59
|
+
const project = await this.client.getProject(projectId);
|
|
60
|
+
if (!project)
|
|
61
|
+
throw new ProjectNotFound(projectId, "uploading blob");
|
|
62
|
+
if ((source.content !== undefined && source.bytes !== undefined) ||
|
|
63
|
+
(source.content === undefined && source.bytes === undefined)) {
|
|
64
|
+
throw new Error("Provide exactly one of `content` or `bytes` in BlobPutSource.");
|
|
65
|
+
}
|
|
66
|
+
const bytes = source.bytes
|
|
67
|
+
? source.bytes
|
|
68
|
+
: new TextEncoder().encode(source.content);
|
|
69
|
+
const sizeBytes = bytes.byteLength;
|
|
70
|
+
if (source.content !== undefined && sizeBytes > 1_048_576) {
|
|
71
|
+
throw new Error("`content` is limited to 1 MB. Use `bytes` for larger uploads.");
|
|
72
|
+
}
|
|
73
|
+
const contentType = opts.contentType ?? guessContentType(key);
|
|
74
|
+
const sha256 = opts.immutable ? await sha256Hex(bytes) : undefined;
|
|
75
|
+
// 1. Init upload — gateway returns presigned S3 URLs for each part.
|
|
76
|
+
const init = await this.client.request("/storage/v1/uploads", {
|
|
77
|
+
method: "POST",
|
|
78
|
+
headers: {
|
|
79
|
+
apikey: project.anon_key,
|
|
80
|
+
Authorization: `Bearer ${project.anon_key}`,
|
|
81
|
+
},
|
|
82
|
+
body: {
|
|
83
|
+
key,
|
|
84
|
+
size_bytes: sizeBytes,
|
|
85
|
+
content_type: contentType,
|
|
86
|
+
visibility: opts.visibility ?? "public",
|
|
87
|
+
immutable: opts.immutable ?? false,
|
|
88
|
+
sha256,
|
|
89
|
+
},
|
|
90
|
+
context: "initializing upload",
|
|
91
|
+
});
|
|
92
|
+
// 2. PUT each part directly to S3 via the presigned URL.
|
|
93
|
+
const partEtags = new Array(init.part_count);
|
|
94
|
+
for (const part of init.parts) {
|
|
95
|
+
const partBytes = bytes.subarray(part.byte_start, part.byte_end + 1);
|
|
96
|
+
const putRes = await this.client.fetch(part.url, {
|
|
97
|
+
method: "PUT",
|
|
98
|
+
body: partBytes,
|
|
99
|
+
});
|
|
100
|
+
if (!putRes.ok) {
|
|
101
|
+
const errText = await putRes.text().catch(() => "");
|
|
102
|
+
throw new ApiError(`Part ${part.part_number} PUT failed (HTTP ${putRes.status} ${putRes.statusText})${errText ? ": " + errText.slice(0, 200) : ""}`, putRes.status, errText, "uploading blob part");
|
|
103
|
+
}
|
|
104
|
+
partEtags[part.part_number - 1] = {
|
|
105
|
+
etag: (putRes.headers.get("etag") ?? "").replace(/^"|"$/g, ""),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
// 3. Complete upload — gateway finalizes (commits multipart, writes DB row).
|
|
109
|
+
const completeBody = init.mode === "multipart"
|
|
110
|
+
? { parts: partEtags.map((e, i) => ({ part_number: i + 1, etag: `"${e.etag}"` })) }
|
|
111
|
+
: {};
|
|
112
|
+
return this.client.request(`/storage/v1/uploads/${init.upload_id}/complete`, {
|
|
113
|
+
method: "POST",
|
|
114
|
+
headers: {
|
|
115
|
+
apikey: project.anon_key,
|
|
116
|
+
Authorization: `Bearer ${project.anon_key}`,
|
|
117
|
+
},
|
|
118
|
+
body: completeBody,
|
|
119
|
+
context: "completing upload",
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Download a blob. Returns the raw `Response` so callers can stream to
|
|
124
|
+
* disk, pipe to another sink, or buffer with `.bytes()` / `.arrayBuffer()`.
|
|
125
|
+
* This avoids forcing large blobs through a JS buffer.
|
|
126
|
+
*
|
|
127
|
+
* @throws {ProjectNotFound} if `projectId` is not in the provider.
|
|
128
|
+
* @throws {ApiError} on non-2xx (includes the error text from the response body).
|
|
129
|
+
*/
|
|
130
|
+
async get(projectId, key) {
|
|
131
|
+
const project = await this.client.getProject(projectId);
|
|
132
|
+
if (!project)
|
|
133
|
+
throw new ProjectNotFound(projectId, "downloading blob");
|
|
134
|
+
const url = `${this.client.apiBase}/storage/v1/blob/${encodeKey(key)}`;
|
|
135
|
+
const res = await this.client.fetch(url, {
|
|
136
|
+
headers: {
|
|
137
|
+
apikey: project.anon_key,
|
|
138
|
+
Authorization: `Bearer ${project.anon_key}`,
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
if (!res.ok) {
|
|
142
|
+
const errText = await res.text().catch(() => "");
|
|
143
|
+
throw new ApiError(`Downloading blob failed (HTTP ${res.status})`, res.status, errText, "downloading blob");
|
|
144
|
+
}
|
|
145
|
+
return res;
|
|
146
|
+
}
|
|
147
|
+
/** List blobs with optional prefix + pagination. */
|
|
148
|
+
async ls(projectId, opts = {}) {
|
|
149
|
+
const project = await this.client.getProject(projectId);
|
|
150
|
+
if (!project)
|
|
151
|
+
throw new ProjectNotFound(projectId, "listing blobs");
|
|
152
|
+
const qs = new URLSearchParams();
|
|
153
|
+
if (opts.prefix)
|
|
154
|
+
qs.set("prefix", opts.prefix);
|
|
155
|
+
if (opts.limit !== undefined)
|
|
156
|
+
qs.set("limit", String(opts.limit));
|
|
157
|
+
if (opts.cursor)
|
|
158
|
+
qs.set("cursor", opts.cursor);
|
|
159
|
+
const query = qs.toString();
|
|
160
|
+
const path = `/storage/v1/blobs${query ? "?" + query : ""}`;
|
|
161
|
+
return this.client.request(path, {
|
|
162
|
+
headers: {
|
|
163
|
+
apikey: project.anon_key,
|
|
164
|
+
Authorization: `Bearer ${project.anon_key}`,
|
|
165
|
+
},
|
|
166
|
+
context: "listing blobs",
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
/** Delete a blob and decrement the project's storage_bytes. */
|
|
170
|
+
async rm(projectId, key) {
|
|
171
|
+
const project = await this.client.getProject(projectId);
|
|
172
|
+
if (!project)
|
|
173
|
+
throw new ProjectNotFound(projectId, "deleting blob");
|
|
174
|
+
await this.client.request(`/storage/v1/blob/${encodeKey(key)}`, {
|
|
175
|
+
method: "DELETE",
|
|
176
|
+
headers: {
|
|
177
|
+
apikey: project.anon_key,
|
|
178
|
+
Authorization: `Bearer ${project.anon_key}`,
|
|
179
|
+
},
|
|
180
|
+
context: "deleting blob",
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
/** Generate a time-boxed S3 presigned GET URL for a blob. Default TTL 1 hour, max 7 days. */
|
|
184
|
+
async sign(projectId, key, opts = {}) {
|
|
185
|
+
const project = await this.client.getProject(projectId);
|
|
186
|
+
if (!project)
|
|
187
|
+
throw new ProjectNotFound(projectId, "signing blob URL");
|
|
188
|
+
const body = {};
|
|
189
|
+
if (opts.ttl_seconds !== undefined)
|
|
190
|
+
body.ttl_seconds = opts.ttl_seconds;
|
|
191
|
+
return this.client.request(`/storage/v1/blob/${encodeKey(key)}/sign`, {
|
|
192
|
+
method: "POST",
|
|
193
|
+
headers: {
|
|
194
|
+
apikey: project.anon_key,
|
|
195
|
+
Authorization: `Bearer ${project.anon_key}`,
|
|
196
|
+
},
|
|
197
|
+
body,
|
|
198
|
+
context: "signing blob URL",
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=blobs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blobs.js","sourceRoot":"","sources":["../../src/namespaces/blobs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request and response types for the `blobs` namespace.
|
|
3
|
+
*
|
|
4
|
+
* Covers the direct-to-S3 blob storage API: `PUT /storage/v1/uploads` +
|
|
5
|
+
* multipart S3 uploads, `GET /storage/v1/blob/:key`, `GET /storage/v1/blobs`,
|
|
6
|
+
* `DELETE /storage/v1/blob/:key`, `POST /storage/v1/blob/:key/sign`.
|
|
7
|
+
*/
|
|
8
|
+
export type BlobVisibility = "public" | "private";
|
|
9
|
+
/** Source for an upload. Pass exactly one of `content` (UTF-8 string) or `bytes`. */
|
|
10
|
+
export interface BlobPutSource {
|
|
11
|
+
content?: string;
|
|
12
|
+
bytes?: Uint8Array;
|
|
13
|
+
}
|
|
14
|
+
export interface BlobPutOptions {
|
|
15
|
+
/** MIME type. Auto-detected from `key`'s extension when omitted. */
|
|
16
|
+
contentType?: string;
|
|
17
|
+
/** Default: `"public"`. Public blobs get a CDN URL; private requires auth. */
|
|
18
|
+
visibility?: BlobVisibility;
|
|
19
|
+
/** When true, the returned URL includes a content-hash suffix — overwrites produce distinct URLs. Forces sha256 computation. */
|
|
20
|
+
immutable?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface BlobPutResult {
|
|
23
|
+
key: string;
|
|
24
|
+
size_bytes: number;
|
|
25
|
+
sha256: string | null;
|
|
26
|
+
visibility: BlobVisibility;
|
|
27
|
+
url: string | null;
|
|
28
|
+
immutable_url: string | null;
|
|
29
|
+
}
|
|
30
|
+
export interface BlobLsOptions {
|
|
31
|
+
/** Filter: only return blobs whose key starts with this prefix. */
|
|
32
|
+
prefix?: string;
|
|
33
|
+
/** Max results. Server default 100, max 1000. */
|
|
34
|
+
limit?: number;
|
|
35
|
+
/** Pagination cursor from a previous response's `next_cursor`. */
|
|
36
|
+
cursor?: string;
|
|
37
|
+
}
|
|
38
|
+
export interface BlobSummary {
|
|
39
|
+
key: string;
|
|
40
|
+
size_bytes: number;
|
|
41
|
+
content_type: string | null;
|
|
42
|
+
visibility: BlobVisibility;
|
|
43
|
+
created_at: string;
|
|
44
|
+
}
|
|
45
|
+
export interface BlobLsResult {
|
|
46
|
+
blobs: BlobSummary[];
|
|
47
|
+
next_cursor: string | null;
|
|
48
|
+
}
|
|
49
|
+
export interface BlobSignOptions {
|
|
50
|
+
/** URL lifetime in seconds. 60–604800 (7 days). Server default 3600. */
|
|
51
|
+
ttl_seconds?: number;
|
|
52
|
+
}
|
|
53
|
+
export interface BlobSignResult {
|
|
54
|
+
signed_url: string;
|
|
55
|
+
expires_at: string;
|
|
56
|
+
expires_in: number;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=blobs.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blobs.types.d.ts","sourceRoot":"","sources":["../../src/namespaces/blobs.types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,CAAC;AAElD,qFAAqF;AACrF,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,gIAAgI;IAChI,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,EAAE,cAAc,CAAC;IAC3B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,cAAc,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request and response types for the `blobs` namespace.
|
|
3
|
+
*
|
|
4
|
+
* Covers the direct-to-S3 blob storage API: `PUT /storage/v1/uploads` +
|
|
5
|
+
* multipart S3 uploads, `GET /storage/v1/blob/:key`, `GET /storage/v1/blobs`,
|
|
6
|
+
* `DELETE /storage/v1/blob/:key`, `POST /storage/v1/blob/:key/sign`.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=blobs.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blobs.types.js","sourceRoot":"","sources":["../../src/namespaces/blobs.types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `contracts` namespace — AWS KMS-backed Ethereum contract wallets.
|
|
3
|
+
*
|
|
4
|
+
* Contract wallets sign smart-contract write transactions. Private keys
|
|
5
|
+
* never leave KMS. Pricing: $0.04/day rental ($1.20/month) plus $0.000005
|
|
6
|
+
* per sign. Non-custodial.
|
|
7
|
+
*
|
|
8
|
+
* NOTE: The contracts API surface is frozen — this namespace preserves the
|
|
9
|
+
* existing request/response shapes verbatim.
|
|
10
|
+
*/
|
|
11
|
+
import type { Client } from "../kernel.js";
|
|
12
|
+
export type EvmChain = "base-mainnet" | "base-sepolia";
|
|
13
|
+
export interface ProvisionWalletOptions {
|
|
14
|
+
chain: EvmChain;
|
|
15
|
+
recoveryAddress?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ContractCallOptions {
|
|
18
|
+
walletId: string;
|
|
19
|
+
chain: EvmChain;
|
|
20
|
+
contractAddress: string;
|
|
21
|
+
abiFragment: unknown[];
|
|
22
|
+
functionName: string;
|
|
23
|
+
args: unknown[];
|
|
24
|
+
value?: string;
|
|
25
|
+
idempotencyKey?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface ContractReadOptions {
|
|
28
|
+
chain: EvmChain;
|
|
29
|
+
contractAddress: string;
|
|
30
|
+
abiFragment: unknown[];
|
|
31
|
+
functionName: string;
|
|
32
|
+
args: unknown[];
|
|
33
|
+
}
|
|
34
|
+
export declare class Contracts {
|
|
35
|
+
private readonly client;
|
|
36
|
+
constructor(client: Client);
|
|
37
|
+
/** Provision a new KMS-backed contract wallet. */
|
|
38
|
+
provisionWallet(projectId: string, opts: ProvisionWalletOptions): Promise<unknown>;
|
|
39
|
+
/** Get a wallet's metadata + live balance. */
|
|
40
|
+
getWallet(projectId: string, walletId: string): Promise<unknown>;
|
|
41
|
+
/** List all wallets owned by the project, including deleted ones. */
|
|
42
|
+
listWallets(projectId: string): Promise<unknown>;
|
|
43
|
+
/** Set or clear the recovery address used for auto-drain on day-90 deletion. */
|
|
44
|
+
setRecovery(projectId: string, walletId: string, recoveryAddress: string | null): Promise<void>;
|
|
45
|
+
/** Set the low-balance threshold (in wei) for email alerts. */
|
|
46
|
+
setLowBalanceAlert(projectId: string, walletId: string, thresholdWei: string): Promise<void>;
|
|
47
|
+
/** Submit a smart-contract write call. Idempotent on `idempotencyKey`. */
|
|
48
|
+
call(projectId: string, opts: ContractCallOptions): Promise<unknown>;
|
|
49
|
+
/** Read-only smart-contract call (view/pure). No auth, no gas, no billing. */
|
|
50
|
+
read(opts: ContractReadOptions): Promise<unknown>;
|
|
51
|
+
/** Look up a previously submitted call by id. */
|
|
52
|
+
callStatus(projectId: string, callId: string): Promise<unknown>;
|
|
53
|
+
/**
|
|
54
|
+
* Drain the wallet's native-token balance to a destination address.
|
|
55
|
+
* Works on suspended wallets. Requires `X-Confirm-Drain: <wallet_id>`
|
|
56
|
+
* confirmation header (sent automatically by the SDK).
|
|
57
|
+
*/
|
|
58
|
+
drain(projectId: string, walletId: string, destinationAddress: string): Promise<unknown>;
|
|
59
|
+
/**
|
|
60
|
+
* Schedule the KMS key for deletion (7-day AWS minimum window). Refused
|
|
61
|
+
* if the wallet has on-chain balance ≥ dust — drain first.
|
|
62
|
+
*/
|
|
63
|
+
deleteWallet(projectId: string, walletId: string): Promise<unknown>;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/namespaces/contracts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,MAAM,MAAM,QAAQ,GAAG,cAAc,GAAG,cAAc,CAAC;AAEvD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,QAAQ,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,QAAQ,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,OAAO,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,QAAQ,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,OAAO,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,OAAO,EAAE,CAAC;CACjB;AAED,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAE3C,kDAAkD;IAC5C,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC;IAaxF,8CAA8C;IACxC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYtE,qEAAqE;IAC/D,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAStD,gFAAgF;IAC1E,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAcrG,+DAA+D;IACzD,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAclG,0EAA0E;IACpE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IAyB1E,8EAA8E;IACxE,IAAI,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IAevD,iDAAiD;IAC3C,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYrE;;;;OAIG;IACG,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiB9F;;;OAGG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAe1E"}
|