@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 +145 -0
- package/dist/ethers.d.ts +56 -0
- package/dist/ethers.js +62 -0
- package/dist/ethers.js.map +1 -0
- package/dist/index-DqqC-Sa8.d.ts +80 -0
- package/dist/index.d.ts +198 -0
- package/dist/index.js +1376 -0
- package/dist/index.js.map +1 -0
- package/dist/viem.d.ts +6 -0
- package/dist/viem.js +41 -0
- package/dist/viem.js.map +1 -0
- package/package.json +71 -0
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
|
package/dist/ethers.d.ts
ADDED
|
@@ -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 };
|
package/dist/index.d.ts
ADDED
|
@@ -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 };
|