@opensea/wallet-adapters 0.1.0

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 ADDED
@@ -0,0 +1,145 @@
1
+ # @opensea/wallet-adapters
2
+
3
+ Provider-agnostic wallet adapters for signing and sending transactions across managed and local backends.
4
+
5
+ ## Features
6
+
7
+ - **Provider-agnostic interface** — unified `WalletAdapter` abstraction with capabilities declaration
8
+ - **Managed providers** — Privy, Turnkey, Fireblocks (handle gas/nonce server-side)
9
+ - **Local providers** — PrivateKey (handle gas/nonce client-side via RPC)
10
+ - **Framework bridges** — optional adapters for viem and ethers.js
11
+ - **Zero heavy dependencies** — core uses Web Crypto + `@noble/hashes` / `@noble/curves`
12
+ - **Auto-detection** — `createWalletFromEnv()` picks the right provider from environment variables
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ npm install @opensea/wallet-adapters
18
+ # or
19
+ pnpm add @opensea/wallet-adapters
20
+ ```
21
+
22
+ ## Quick Start
23
+
24
+ ```ts
25
+ import { createWalletFromEnv } from "@opensea/wallet-adapters"
26
+
27
+ // Auto-detects provider from environment variables
28
+ // Priority: Privy > Fireblocks > Turnkey > PrivateKey
29
+ const wallet = createWalletFromEnv()
30
+
31
+ const address = await wallet.getAddress()
32
+ const result = await wallet.sendTransaction({
33
+ to: "0x...",
34
+ data: "0x...",
35
+ value: "0",
36
+ chainId: 8453,
37
+ })
38
+ console.log(`TX hash: ${result.hash}`)
39
+ ```
40
+
41
+ ## Adapters
42
+
43
+ ### Privy
44
+
45
+ Server-side wallet via Privy's API. Handles gas estimation and nonce management.
46
+
47
+ ```ts
48
+ import { PrivyAdapter } from "@opensea/wallet-adapters"
49
+
50
+ const wallet = PrivyAdapter.fromEnv()
51
+ // Requires: PRIVY_APP_ID, PRIVY_APP_SECRET, PRIVY_WALLET_ID
52
+ ```
53
+
54
+ ### Fireblocks
55
+
56
+ Enterprise MPC custody via Fireblocks API.
57
+
58
+ ```ts
59
+ import { FireblocksAdapter } from "@opensea/wallet-adapters"
60
+
61
+ const wallet = FireblocksAdapter.fromEnv()
62
+ // Requires: FIREBLOCKS_API_KEY, FIREBLOCKS_API_SECRET, FIREBLOCKS_VAULT_ID
63
+ ```
64
+
65
+ ### Turnkey
66
+
67
+ HSM-backed signing with P-256 stamp authentication.
68
+
69
+ ```ts
70
+ import { TurnkeyAdapter } from "@opensea/wallet-adapters"
71
+
72
+ const wallet = TurnkeyAdapter.fromEnv()
73
+ // Requires: TURNKEY_API_PUBLIC_KEY, TURNKEY_API_PRIVATE_KEY,
74
+ // TURNKEY_ORGANIZATION_ID, TURNKEY_WALLET_ADDRESS, TURNKEY_RPC_URL
75
+ ```
76
+
77
+ ### PrivateKey
78
+
79
+ Local signing for development and testing.
80
+
81
+ ```ts
82
+ import { PrivateKeyAdapter } from "@opensea/wallet-adapters"
83
+
84
+ const wallet = PrivateKeyAdapter.fromEnv()
85
+ // Requires: PRIVATE_KEY, RPC_URL
86
+ ```
87
+
88
+ ## Framework Bridges
89
+
90
+ ### viem
91
+
92
+ ```ts
93
+ import { walletAdapterToViemClient } from "@opensea/wallet-adapters/viem"
94
+ import { base } from "viem/chains"
95
+
96
+ const client = walletAdapterToViemClient(wallet, base, "https://mainnet.base.org")
97
+ // Use as a standard viem WalletClient
98
+ ```
99
+
100
+ ### ethers.js
101
+
102
+ ```ts
103
+ import { walletAdapterToEthersSigner } from "@opensea/wallet-adapters/ethers"
104
+
105
+ const signer = walletAdapterToEthersSigner(wallet, provider)
106
+ // Use as a standard ethers.js Signer
107
+ ```
108
+
109
+ ## Capabilities
110
+
111
+ Each adapter declares its capabilities so consumers can check before calling:
112
+
113
+ ```ts
114
+ if (wallet.capabilities.signMessage) {
115
+ const sig = await wallet.signMessage({ message: "hello" })
116
+ }
117
+
118
+ if (wallet.capabilities.managedGas) {
119
+ // No need to estimate gas — the provider handles it
120
+ }
121
+ ```
122
+
123
+ | Capability | Privy | Fireblocks | Turnkey | PrivateKey |
124
+ |------------|-------|------------|---------|------------|
125
+ | `signMessage` | true | true | true | true |
126
+ | `signTypedData` | true | true | true | true |
127
+ | `managedGas` | true | true | false | false |
128
+ | `managedNonce` | true | true | false | false |
129
+
130
+ ## Observability
131
+
132
+ Attach hooks for tracing and monitoring:
133
+
134
+ ```ts
135
+ wallet.onRequest = (method, params) => {
136
+ console.log(`→ ${method}`, params)
137
+ }
138
+ wallet.onResponse = (method, result, durationMs) => {
139
+ console.log(`← ${method} (${durationMs}ms)`, result)
140
+ }
141
+ ```
142
+
143
+ ## License
144
+
145
+ MIT
@@ -0,0 +1,56 @@
1
+ import { W as WalletAdapter } from './index-DqqC-Sa8.js';
2
+
3
+ /**
4
+ * Bridge between WalletAdapter and ethers.js Signer.
5
+ *
6
+ * Creates an ethers.js AbstractSigner from any WalletAdapter, routing
7
+ * transaction signing through the adapter's signing backend.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import { createWalletFromEnv } from "@opensea/wallet-adapters"
12
+ * import { walletAdapterToEthersSigner } from "@opensea/wallet-adapters/ethers"
13
+ * import { JsonRpcProvider } from "ethers"
14
+ *
15
+ * const adapter = createWalletFromEnv()
16
+ * const provider = new JsonRpcProvider("https://...")
17
+ * const signer = walletAdapterToEthersSigner(adapter, provider)
18
+ * ```
19
+ *
20
+ * ethers v6 is a peer dependency — consumers must install it separately.
21
+ */
22
+
23
+ /**
24
+ * Create an ethers.js-compatible Signer from a WalletAdapter.
25
+ *
26
+ * Returns an object that implements the ethers.js Signer interface:
27
+ * - getAddress()
28
+ * - sendTransaction(tx)
29
+ * - signMessage(message) — only if adapter supports it
30
+ * - signTypedData(domain, types, value) — only if adapter supports it
31
+ */
32
+ declare function walletAdapterToEthersSigner(adapter: WalletAdapter, provider: any): EthersAdapterSigner;
33
+ declare class EthersAdapterSigner {
34
+ readonly adapter: WalletAdapter;
35
+ readonly provider: any;
36
+ constructor(adapter: WalletAdapter, provider: any);
37
+ getAddress(): Promise<string>;
38
+ sendTransaction(tx: {
39
+ to?: string;
40
+ data?: string;
41
+ value?: bigint | string;
42
+ chainId?: number | bigint;
43
+ gasLimit?: bigint | string;
44
+ maxFeePerGas?: bigint | string;
45
+ maxPriorityFeePerGas?: bigint | string;
46
+ nonce?: number;
47
+ }): Promise<{
48
+ hash: string;
49
+ wait: () => Promise<any>;
50
+ }>;
51
+ signMessage(message: string | Uint8Array): Promise<string>;
52
+ signTypedData(domain: Record<string, any>, types: Record<string, any>, value: Record<string, any>, primaryType?: string): Promise<string>;
53
+ connect(provider: any): EthersAdapterSigner;
54
+ }
55
+
56
+ export { EthersAdapterSigner, walletAdapterToEthersSigner };
package/dist/ethers.js ADDED
@@ -0,0 +1,62 @@
1
+ // src/bridges/ethers.ts
2
+ function walletAdapterToEthersSigner(adapter, provider) {
3
+ return new EthersAdapterSigner(adapter, provider);
4
+ }
5
+ var EthersAdapterSigner = class _EthersAdapterSigner {
6
+ adapter;
7
+ provider;
8
+ constructor(adapter, provider) {
9
+ this.adapter = adapter;
10
+ this.provider = provider;
11
+ }
12
+ async getAddress() {
13
+ return this.adapter.getAddress();
14
+ }
15
+ async sendTransaction(tx) {
16
+ const network = await this.provider.getNetwork();
17
+ const chainId = Number(tx.chainId ?? network.chainId);
18
+ const result = await this.adapter.sendTransaction({
19
+ to: tx.to ?? "",
20
+ data: tx.data ?? "0x",
21
+ value: tx.value ? String(BigInt(tx.value)) : "0",
22
+ chainId,
23
+ gas: tx.gasLimit ? String(BigInt(tx.gasLimit)) : void 0,
24
+ nonce: tx.nonce,
25
+ maxFeePerGas: tx.maxFeePerGas ? String(BigInt(tx.maxFeePerGas)) : void 0,
26
+ maxPriorityFeePerGas: tx.maxPriorityFeePerGas ? String(BigInt(tx.maxPriorityFeePerGas)) : void 0
27
+ });
28
+ return {
29
+ hash: result.hash,
30
+ wait: () => this.provider.waitForTransaction(result.hash)
31
+ };
32
+ }
33
+ async signMessage(message) {
34
+ if (!this.adapter.signMessage) {
35
+ throw new Error(
36
+ `signMessage is not supported by the ${this.adapter.name} adapter`
37
+ );
38
+ }
39
+ return this.adapter.signMessage({ message });
40
+ }
41
+ async signTypedData(domain, types, value, primaryType) {
42
+ if (!this.adapter.signTypedData) {
43
+ throw new Error(
44
+ `signTypedData is not supported by the ${this.adapter.name} adapter`
45
+ );
46
+ }
47
+ return this.adapter.signTypedData({
48
+ domain,
49
+ types,
50
+ message: value,
51
+ primaryType: primaryType ?? Object.keys(types).find((t) => t !== "EIP712Domain") ?? ""
52
+ });
53
+ }
54
+ connect(provider) {
55
+ return new _EthersAdapterSigner(this.adapter, provider);
56
+ }
57
+ };
58
+ export {
59
+ EthersAdapterSigner,
60
+ walletAdapterToEthersSigner
61
+ };
62
+ //# sourceMappingURL=ethers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bridges/ethers.ts"],"sourcesContent":["/**\n * Bridge between WalletAdapter and ethers.js Signer.\n *\n * Creates an ethers.js AbstractSigner from any WalletAdapter, routing\n * transaction signing through the adapter's signing backend.\n *\n * @example\n * ```ts\n * import { createWalletFromEnv } from \"@opensea/wallet-adapters\"\n * import { walletAdapterToEthersSigner } from \"@opensea/wallet-adapters/ethers\"\n * import { JsonRpcProvider } from \"ethers\"\n *\n * const adapter = createWalletFromEnv()\n * const provider = new JsonRpcProvider(\"https://...\")\n * const signer = walletAdapterToEthersSigner(adapter, provider)\n * ```\n *\n * ethers v6 is a peer dependency — consumers must install it separately.\n */\n\nimport type { WalletAdapter } from \"../types/index.js\"\n\n/**\n * Create an ethers.js-compatible Signer from a WalletAdapter.\n *\n * Returns an object that implements the ethers.js Signer interface:\n * - getAddress()\n * - sendTransaction(tx)\n * - signMessage(message) — only if adapter supports it\n * - signTypedData(domain, types, value) — only if adapter supports it\n */\nexport function walletAdapterToEthersSigner(\n adapter: WalletAdapter,\n provider: any,\n): EthersAdapterSigner {\n return new EthersAdapterSigner(adapter, provider)\n}\n\nexport class EthersAdapterSigner {\n readonly adapter: WalletAdapter\n readonly provider: any\n\n constructor(adapter: WalletAdapter, provider: any) {\n this.adapter = adapter\n this.provider = provider\n }\n\n async getAddress(): Promise<string> {\n return this.adapter.getAddress()\n }\n\n async sendTransaction(tx: {\n to?: string\n data?: string\n value?: bigint | string\n chainId?: number | bigint\n gasLimit?: bigint | string\n maxFeePerGas?: bigint | string\n maxPriorityFeePerGas?: bigint | string\n nonce?: number\n }): Promise<{ hash: string; wait: () => Promise<any> }> {\n const network = await this.provider.getNetwork()\n const chainId = Number(tx.chainId ?? network.chainId)\n\n const result = await this.adapter.sendTransaction({\n to: tx.to ?? \"\",\n data: (tx.data as string) ?? \"0x\",\n value: tx.value ? String(BigInt(tx.value)) : \"0\",\n chainId,\n gas: tx.gasLimit ? String(BigInt(tx.gasLimit)) : undefined,\n nonce: tx.nonce,\n maxFeePerGas: tx.maxFeePerGas\n ? String(BigInt(tx.maxFeePerGas))\n : undefined,\n maxPriorityFeePerGas: tx.maxPriorityFeePerGas\n ? String(BigInt(tx.maxPriorityFeePerGas))\n : undefined,\n })\n\n return {\n hash: result.hash,\n wait: () => this.provider.waitForTransaction(result.hash),\n }\n }\n\n async signMessage(message: string | Uint8Array): Promise<string> {\n if (!this.adapter.signMessage) {\n throw new Error(\n `signMessage is not supported by the ${this.adapter.name} adapter`,\n )\n }\n return this.adapter.signMessage({ message })\n }\n\n async signTypedData(\n domain: Record<string, any>,\n types: Record<string, any>,\n value: Record<string, any>,\n primaryType?: string,\n ): Promise<string> {\n if (!this.adapter.signTypedData) {\n throw new Error(\n `signTypedData is not supported by the ${this.adapter.name} adapter`,\n )\n }\n // ethers.js uses \"value\" while our interface uses \"message\"\n return this.adapter.signTypedData({\n domain,\n types,\n message: value,\n primaryType:\n primaryType ?? Object.keys(types).find(t => t !== \"EIP712Domain\") ?? \"\",\n })\n }\n\n connect(provider: any): EthersAdapterSigner {\n return new EthersAdapterSigner(this.adapter, provider)\n }\n}\n"],"mappings":";AA+BO,SAAS,4BACd,SACA,UACqB;AACrB,SAAO,IAAI,oBAAoB,SAAS,QAAQ;AAClD;AAEO,IAAM,sBAAN,MAAM,qBAAoB;AAAA,EACtB;AAAA,EACA;AAAA,EAET,YAAY,SAAwB,UAAe;AACjD,SAAK,UAAU;AACf,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAM,aAA8B;AAClC,WAAO,KAAK,QAAQ,WAAW;AAAA,EACjC;AAAA,EAEA,MAAM,gBAAgB,IASkC;AACtD,UAAM,UAAU,MAAM,KAAK,SAAS,WAAW;AAC/C,UAAM,UAAU,OAAO,GAAG,WAAW,QAAQ,OAAO;AAEpD,UAAM,SAAS,MAAM,KAAK,QAAQ,gBAAgB;AAAA,MAChD,IAAI,GAAG,MAAM;AAAA,MACb,MAAO,GAAG,QAAmB;AAAA,MAC7B,OAAO,GAAG,QAAQ,OAAO,OAAO,GAAG,KAAK,CAAC,IAAI;AAAA,MAC7C;AAAA,MACA,KAAK,GAAG,WAAW,OAAO,OAAO,GAAG,QAAQ,CAAC,IAAI;AAAA,MACjD,OAAO,GAAG;AAAA,MACV,cAAc,GAAG,eACb,OAAO,OAAO,GAAG,YAAY,CAAC,IAC9B;AAAA,MACJ,sBAAsB,GAAG,uBACrB,OAAO,OAAO,GAAG,oBAAoB,CAAC,IACtC;AAAA,IACN,CAAC;AAED,WAAO;AAAA,MACL,MAAM,OAAO;AAAA,MACb,MAAM,MAAM,KAAK,SAAS,mBAAmB,OAAO,IAAI;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,SAA+C;AAC/D,QAAI,CAAC,KAAK,QAAQ,aAAa;AAC7B,YAAM,IAAI;AAAA,QACR,uCAAuC,KAAK,QAAQ,IAAI;AAAA,MAC1D;AAAA,IACF;AACA,WAAO,KAAK,QAAQ,YAAY,EAAE,QAAQ,CAAC;AAAA,EAC7C;AAAA,EAEA,MAAM,cACJ,QACA,OACA,OACA,aACiB;AACjB,QAAI,CAAC,KAAK,QAAQ,eAAe;AAC/B,YAAM,IAAI;AAAA,QACR,yCAAyC,KAAK,QAAQ,IAAI;AAAA,MAC5D;AAAA,IACF;AAEA,WAAO,KAAK,QAAQ,cAAc;AAAA,MAChC;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,aACE,eAAe,OAAO,KAAK,KAAK,EAAE,KAAK,OAAK,MAAM,cAAc,KAAK;AAAA,IACzE,CAAC;AAAA,EACH;AAAA,EAEA,QAAQ,UAAoC;AAC1C,WAAO,IAAI,qBAAoB,KAAK,SAAS,QAAQ;AAAA,EACvD;AACF;","names":[]}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Core types for the wallet adapter interface.
3
+ *
4
+ * These types define the contract between consumers and wallet providers.
5
+ * Designed to be provider-agnostic and extensible for future signing
6
+ * capabilities (EIP-712, EIP-191, batch transactions, etc.).
7
+ */
8
+ interface TransactionRequest {
9
+ to: string;
10
+ data: string;
11
+ value: string;
12
+ chainId: number;
13
+ /** Pre-estimated gas limit (avoids redundant RPC call when provided) */
14
+ gas?: string;
15
+ /** Pre-fetched nonce */
16
+ nonce?: number;
17
+ maxFeePerGas?: string;
18
+ maxPriorityFeePerGas?: string;
19
+ }
20
+ interface TransactionResult {
21
+ hash: string;
22
+ }
23
+ interface SignMessageRequest {
24
+ message: string | Uint8Array;
25
+ }
26
+ interface SignTypedDataRequest {
27
+ domain: Record<string, unknown>;
28
+ types: Record<string, Array<{
29
+ name: string;
30
+ type: string;
31
+ }>>;
32
+ primaryType: string;
33
+ message: Record<string, unknown>;
34
+ }
35
+ /**
36
+ * Core wallet adapter interface.
37
+ *
38
+ * Implement this interface to add a new wallet provider. At minimum,
39
+ * a provider must support `getAddress()` and `sendTransaction()`.
40
+ * Optional capabilities (message signing, typed data signing) can be
41
+ * declared via the `capabilities` property.
42
+ */
43
+ interface WalletAdapter {
44
+ /** Human-readable provider name for logging and error messages */
45
+ readonly name: string;
46
+ /** Declared capabilities of this adapter */
47
+ readonly capabilities: WalletCapabilities;
48
+ /** Get the wallet address */
49
+ getAddress(): Promise<string>;
50
+ /** Sign and send a transaction, returns the tx hash */
51
+ sendTransaction(tx: TransactionRequest): Promise<TransactionResult>;
52
+ /** Sign a raw message (EIP-191). Throws if not supported. */
53
+ signMessage?(request: SignMessageRequest): Promise<string>;
54
+ /** Sign EIP-712 typed data. Throws if not supported. */
55
+ signTypedData?(request: SignTypedDataRequest): Promise<string>;
56
+ /** Optional RPC URL for read operations (gas estimation, nonce, etc.) */
57
+ getRpcUrl?(): string;
58
+ /** Optional hook called before each adapter request (for metrics/logging) */
59
+ onRequest?: (method: string, params: unknown) => void;
60
+ /** Optional hook called after each adapter response (for metrics/logging) */
61
+ onResponse?: (method: string, result: unknown, durationMs: number) => void;
62
+ }
63
+ /**
64
+ * Declares which optional operations an adapter supports.
65
+ * Consumers can check capabilities before calling optional methods.
66
+ */
67
+ interface WalletCapabilities {
68
+ /** Whether signMessage() is supported */
69
+ signMessage: boolean;
70
+ /** Whether signTypedData() is supported (EIP-712) */
71
+ signTypedData: boolean;
72
+ /** Whether the provider manages gas estimation internally */
73
+ managedGas: boolean;
74
+ /** Whether the provider manages nonce internally */
75
+ managedNonce: boolean;
76
+ }
77
+ type WalletProvider = "privy" | "turnkey" | "fireblocks" | "private-key";
78
+ declare const WALLET_PROVIDERS: WalletProvider[];
79
+
80
+ export { type SignMessageRequest as S, type TransactionRequest as T, type WalletAdapter as W, type WalletCapabilities as a, type TransactionResult as b, type SignTypedDataRequest as c, type WalletProvider as d, WALLET_PROVIDERS as e };
@@ -0,0 +1,198 @@
1
+ import { W as WalletAdapter, a as WalletCapabilities, T as TransactionRequest, b as TransactionResult, S as SignMessageRequest, c as SignTypedDataRequest, d as WalletProvider } from './index-DqqC-Sa8.js';
2
+ export { e as WALLET_PROVIDERS } from './index-DqqC-Sa8.js';
3
+
4
+ /**
5
+ * Fireblocks wallet adapter.
6
+ *
7
+ * Uses Fireblocks' REST API to sign and send transactions through their
8
+ * enterprise-grade MPC custody infrastructure.
9
+ *
10
+ * Required environment variables:
11
+ * FIREBLOCKS_API_KEY — Fireblocks API key
12
+ * FIREBLOCKS_API_SECRET — Fireblocks API secret (RSA private key, PEM-encoded)
13
+ * FIREBLOCKS_VAULT_ID — Fireblocks vault account ID
14
+ *
15
+ * Optional:
16
+ * FIREBLOCKS_API_BASE_URL — Override the API base URL
17
+ * FIREBLOCKS_ASSET_ID — Override the Fireblocks asset ID
18
+ * FIREBLOCKS_MAX_POLL_ATTEMPTS — Override max polling attempts (default: 60 = 120s)
19
+ *
20
+ * @see https://developers.fireblocks.com/docs/introduction
21
+ */
22
+
23
+ /** Map EVM chain IDs to Fireblocks asset IDs. */
24
+ declare const CHAIN_TO_FIREBLOCKS_ASSET: Record<number, string>;
25
+ interface FireblocksConfig {
26
+ apiKey: string;
27
+ apiSecret: string;
28
+ vaultId: string;
29
+ assetId?: string;
30
+ baseUrl?: string;
31
+ maxPollAttempts?: number;
32
+ }
33
+ declare class FireblocksAdapter implements WalletAdapter {
34
+ readonly name = "fireblocks";
35
+ readonly capabilities: WalletCapabilities;
36
+ onRequest?: (method: string, params: unknown) => void;
37
+ onResponse?: (method: string, result: unknown, durationMs: number) => void;
38
+ private config;
39
+ private cachedAddress?;
40
+ constructor(config: FireblocksConfig);
41
+ static fromEnv(): FireblocksAdapter;
42
+ private get baseUrl();
43
+ private createJwt;
44
+ private pemToBuffer;
45
+ private hashBody;
46
+ private resolveAssetId;
47
+ getAddress(): Promise<string>;
48
+ sendTransaction(tx: TransactionRequest): Promise<TransactionResult>;
49
+ signMessage(request: SignMessageRequest): Promise<string>;
50
+ signTypedData(request: SignTypedDataRequest): Promise<string>;
51
+ private signRawMessage;
52
+ private waitForSignature;
53
+ private waitForTransaction;
54
+ }
55
+
56
+ /**
57
+ * Private key wallet adapter.
58
+ *
59
+ * Signs and sends transactions using a raw private key with secp256k1.
60
+ *
61
+ * Intended for development and testing. For production use, prefer a
62
+ * managed wallet provider (Privy, Turnkey, Fireblocks).
63
+ *
64
+ * Required environment variables:
65
+ * PRIVATE_KEY — Hex-encoded private key (with or without 0x prefix)
66
+ * RPC_URL — JSON-RPC endpoint for broadcasting and gas estimation
67
+ *
68
+ * Optional:
69
+ * WALLET_ADDRESS — Pre-computed address (skips derivation)
70
+ */
71
+
72
+ interface PrivateKeyConfig {
73
+ privateKey: string;
74
+ rpcUrl: string;
75
+ address?: string;
76
+ }
77
+ declare class PrivateKeyAdapter implements WalletAdapter {
78
+ readonly name = "private-key";
79
+ readonly capabilities: WalletCapabilities;
80
+ onRequest?: (method: string, params: unknown) => void;
81
+ onResponse?: (method: string, result: unknown, durationMs: number) => void;
82
+ private config;
83
+ private cachedAddress?;
84
+ constructor(config: PrivateKeyConfig);
85
+ static fromEnv(): PrivateKeyAdapter;
86
+ getRpcUrl(): string;
87
+ getAddress(): Promise<string>;
88
+ sendTransaction(tx: TransactionRequest): Promise<TransactionResult>;
89
+ signMessage(request: SignMessageRequest): Promise<string>;
90
+ signTypedData(request: SignTypedDataRequest): Promise<string>;
91
+ private rpcCall;
92
+ }
93
+
94
+ /**
95
+ * Privy wallet adapter.
96
+ *
97
+ * Uses Privy's server-side wallet API to sign and send transactions.
98
+ * Transactions are governed by Privy's programmable policy engine —
99
+ * policies are evaluated in a trusted execution environment before signing.
100
+ *
101
+ * Required environment variables:
102
+ * PRIVY_APP_ID — Privy application ID
103
+ * PRIVY_APP_SECRET — Privy application secret
104
+ * PRIVY_WALLET_ID — Wallet ID to use for signing
105
+ *
106
+ * Optional:
107
+ * PRIVY_API_BASE_URL — Override the Privy API base URL
108
+ *
109
+ * @see https://docs.privy.io/wallets/wallets/server-side-access
110
+ * @see https://docs.privy.io/controls/policies/overview
111
+ */
112
+
113
+ interface PrivyConfig {
114
+ appId: string;
115
+ appSecret: string;
116
+ walletId: string;
117
+ baseUrl?: string;
118
+ }
119
+ declare class PrivyAdapter implements WalletAdapter {
120
+ readonly name = "privy";
121
+ readonly capabilities: WalletCapabilities;
122
+ onRequest?: (method: string, params: unknown) => void;
123
+ onResponse?: (method: string, result: unknown, durationMs: number) => void;
124
+ private config;
125
+ private cachedAddress?;
126
+ constructor(config: PrivyConfig);
127
+ static fromEnv(): PrivyAdapter;
128
+ private get baseUrl();
129
+ private get authHeaders();
130
+ getAddress(): Promise<string>;
131
+ sendTransaction(tx: TransactionRequest): Promise<TransactionResult>;
132
+ signMessage(request: SignMessageRequest): Promise<string>;
133
+ signTypedData(request: SignTypedDataRequest): Promise<string>;
134
+ }
135
+
136
+ /**
137
+ * Turnkey wallet adapter.
138
+ *
139
+ * Uses Turnkey's API to sign and send transactions via HSM-backed
140
+ * signing infrastructure. Authentication uses Turnkey's stamp scheme:
141
+ * each request body is hashed and signed with a P-256 ECDSA key.
142
+ *
143
+ * Required environment variables:
144
+ * TURNKEY_API_PUBLIC_KEY — Turnkey API public key (hex-encoded)
145
+ * TURNKEY_API_PRIVATE_KEY — Turnkey API private key (hex-encoded P-256)
146
+ * TURNKEY_ORGANIZATION_ID — Turnkey organization ID
147
+ * TURNKEY_WALLET_ADDRESS — Ethereum address managed by Turnkey
148
+ * TURNKEY_RPC_URL — RPC endpoint for gas estimation and broadcast
149
+ *
150
+ * Optional:
151
+ * TURNKEY_API_BASE_URL — Override the Turnkey API base URL
152
+ * TURNKEY_PRIVATE_KEY_ID — Turnkey private key ID (for signing with a specific key)
153
+ *
154
+ * @see https://docs.turnkey.com/
155
+ */
156
+
157
+ interface TurnkeyConfig {
158
+ apiPublicKey: string;
159
+ apiPrivateKey: string;
160
+ organizationId: string;
161
+ walletAddress: string;
162
+ rpcUrl: string;
163
+ privateKeyId?: string;
164
+ baseUrl?: string;
165
+ }
166
+ declare class TurnkeyAdapter implements WalletAdapter {
167
+ readonly name = "turnkey";
168
+ readonly capabilities: WalletCapabilities;
169
+ onRequest?: (method: string, params: unknown) => void;
170
+ onResponse?: (method: string, result: unknown, durationMs: number) => void;
171
+ private config;
172
+ constructor(config: TurnkeyConfig);
173
+ static fromEnv(): TurnkeyAdapter;
174
+ getRpcUrl(): string;
175
+ private get baseUrl();
176
+ private stamp;
177
+ private signedRequest;
178
+ getAddress(): Promise<string>;
179
+ sendTransaction(tx: TransactionRequest): Promise<TransactionResult>;
180
+ signMessage(request: SignMessageRequest): Promise<string>;
181
+ signTypedData(request: SignTypedDataRequest): Promise<string>;
182
+ private signRawPayload;
183
+ private estimateGasParams;
184
+ private rpcCall;
185
+ }
186
+
187
+ /**
188
+ * Auto-detection factory that creates a WalletAdapter based on
189
+ * which environment variables are present.
190
+ *
191
+ * Priority: Privy > Fireblocks > Turnkey > PrivateKey
192
+ */
193
+
194
+ declare function createWalletFromEnv(): WalletAdapter;
195
+ declare function createWalletForProvider(provider: WalletProvider): WalletAdapter;
196
+ declare function detectProvider(): WalletProvider | null;
197
+
198
+ export { CHAIN_TO_FIREBLOCKS_ASSET, FireblocksAdapter, type FireblocksConfig, PrivateKeyAdapter, type PrivateKeyConfig, PrivyAdapter, type PrivyConfig, SignMessageRequest, SignTypedDataRequest, TransactionRequest, TransactionResult, TurnkeyAdapter, type TurnkeyConfig, WalletAdapter, WalletCapabilities, WalletProvider, createWalletForProvider, createWalletFromEnv, detectProvider };