@opensea/wallet-adapters 0.2.1 → 0.3.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters/bankr.ts","../src/util/eip712.ts","../src/adapters/fireblocks.generated.ts","../src/adapters/fireblocks.ts","../src/adapters/private-key.ts","../src/adapters/turnkey.ts","../src/adapters/privy.ts","../src/factory.ts","../src/types/index.ts"],"sourcesContent":["/**\n * Bankr wallet adapter.\n *\n * Uses Bankr's Wallet API to sign and send transactions via a managed\n * agent wallet. Authentication is done via API key in the X-API-Key header.\n *\n * Required environment variables:\n * BANKR_API_KEY — Bankr API key with Wallet API access enabled\n *\n * Optional:\n * BANKR_API_BASE_URL — Override the Bankr API base URL\n *\n * @see https://docs.bankr.bot/agent-api/authentication\n * @see https://docs.bankr.bot/wallet-api/wallet-info\n */\n\nimport type {\n SignMessageRequest,\n SignTypedDataRequest,\n TransactionRequest,\n TransactionResult,\n WalletAdapter,\n WalletCapabilities,\n} from \"../types/index.js\"\n\nexport interface BankrConfig {\n apiKey: string\n baseUrl?: string\n}\n\nconst BANKR_API_BASE = \"https://api.bankr.bot\"\n\nexport class BankrAdapter implements WalletAdapter {\n readonly name = \"bankr\"\n readonly capabilities: WalletCapabilities = {\n signMessage: true,\n signTypedData: true,\n managedGas: true,\n managedNonce: true,\n }\n onRequest?: (method: string, params: unknown) => void\n onResponse?: (method: string, result: unknown, durationMs: number) => void\n private config: BankrConfig\n private cachedAddress?: string\n\n constructor(config: BankrConfig) {\n this.config = config\n }\n\n static fromEnv(): BankrAdapter {\n const apiKey = process.env.BANKR_API_KEY\n\n if (!apiKey) {\n throw new Error(\"BANKR_API_KEY environment variable is required\")\n }\n\n return new BankrAdapter({\n apiKey,\n baseUrl: process.env.BANKR_API_BASE_URL,\n })\n }\n\n private get baseUrl(): string {\n return this.config.baseUrl ?? BANKR_API_BASE\n }\n\n private get authHeaders(): Record<string, string> {\n return {\n \"X-API-Key\": this.config.apiKey,\n \"Content-Type\": \"application/json\",\n }\n }\n\n async getAddress(): Promise<string> {\n if (this.cachedAddress) return this.cachedAddress\n\n const response = await fetch(`${this.baseUrl}/wallet/me`, {\n headers: this.authHeaders,\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(`Bankr getAddress failed (${response.status}): ${body}`)\n }\n\n const data = (await response.json()) as {\n wallets: Array<{ chain: string; address: string }>\n }\n const evmWallet = data.wallets.find(w => w.chain === \"evm\")\n if (!evmWallet) {\n throw new Error(\"Bankr wallet has no EVM address\")\n }\n this.cachedAddress = evmWallet.address\n return evmWallet.address\n }\n\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResult> {\n this.onRequest?.(\"sendTransaction\", tx)\n const startTime = Date.now()\n\n const transaction: Record<string, unknown> = {\n to: tx.to,\n data: tx.data,\n value: tx.value,\n chainId: tx.chainId,\n }\n if (tx.gas) transaction.gas = tx.gas\n if (tx.nonce !== undefined) transaction.nonce = tx.nonce\n if (tx.maxFeePerGas) transaction.maxFeePerGas = tx.maxFeePerGas\n if (tx.maxPriorityFeePerGas)\n transaction.maxPriorityFeePerGas = tx.maxPriorityFeePerGas\n\n const response = await fetch(`${this.baseUrl}/wallet/submit`, {\n method: \"POST\",\n headers: this.authHeaders,\n body: JSON.stringify({\n transaction,\n waitForConfirmation: true,\n }),\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(\n `Bankr sendTransaction failed (${response.status}): ${body}`,\n )\n }\n\n const data = (await response.json()) as { transactionHash: string }\n const result = { hash: data.transactionHash }\n this.onResponse?.(\"sendTransaction\", result, Date.now() - startTime)\n return result\n }\n\n async signMessage(request: SignMessageRequest): Promise<string> {\n this.onRequest?.(\"signMessage\", request)\n const startTime = Date.now()\n\n const message =\n typeof request.message === \"string\"\n ? request.message\n : `0x${Buffer.from(request.message).toString(\"hex\")}`\n\n const response = await fetch(`${this.baseUrl}/wallet/sign`, {\n method: \"POST\",\n headers: this.authHeaders,\n body: JSON.stringify({\n signatureType: \"personal_sign\",\n message,\n }),\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(`Bankr signMessage failed (${response.status}): ${body}`)\n }\n\n const data = (await response.json()) as { signature: string }\n this.onResponse?.(\"signMessage\", data.signature, Date.now() - startTime)\n return data.signature\n }\n\n async signTypedData(request: SignTypedDataRequest): Promise<string> {\n this.onRequest?.(\"signTypedData\", request)\n const startTime = Date.now()\n\n const response = await fetch(`${this.baseUrl}/wallet/sign`, {\n method: \"POST\",\n headers: this.authHeaders,\n body: JSON.stringify({\n signatureType: \"eth_signTypedData_v4\",\n typedData: {\n domain: request.domain,\n types: request.types,\n primaryType: request.primaryType,\n message: request.message,\n },\n }),\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(\n `Bankr signTypedData failed (${response.status}): ${body}`,\n )\n }\n\n const data = (await response.json()) as { signature: string }\n this.onResponse?.(\"signTypedData\", data.signature, Date.now() - startTime)\n return data.signature\n }\n}\n","/**\n * EIP-712 typed data hashing utilities.\n *\n * Implements the EIP-712 encoding spec for computing domain separators\n * and struct hashes used by signTypedData across all adapters.\n */\n\nimport { keccak_256 } from \"@noble/hashes/sha3.js\"\n\nexport function hashTypedData(\n domain: Record<string, unknown>,\n primaryType: string,\n message: Record<string, unknown>,\n types: Record<string, Array<{ name: string; type: string }>>,\n): Uint8Array {\n const domainSeparator = hashStruct(\"EIP712Domain\", domain, {\n ...types,\n EIP712Domain: buildDomainType(domain),\n })\n const messageHash = hashStruct(primaryType, message, types)\n\n const packed = new Uint8Array(66)\n packed[0] = 0x19\n packed[1] = 0x01\n packed.set(domainSeparator, 2)\n packed.set(messageHash, 34)\n return keccak_256(packed)\n}\n\nexport function hashPersonalMessage(message: string | Uint8Array): Uint8Array {\n const msgBytes =\n typeof message === \"string\" ? new TextEncoder().encode(message) : message\n\n const prefix = new TextEncoder().encode(\n `\\x19Ethereum Signed Message:\\n${msgBytes.length}`,\n )\n const payload = new Uint8Array(prefix.length + msgBytes.length)\n payload.set(prefix, 0)\n payload.set(msgBytes, prefix.length)\n return keccak_256(payload)\n}\n\nfunction buildDomainType(\n domain: Record<string, unknown>,\n): Array<{ name: string; type: string }> {\n const fields: Array<{ name: string; type: string }> = []\n if (\"name\" in domain) fields.push({ name: \"name\", type: \"string\" })\n if (\"version\" in domain) fields.push({ name: \"version\", type: \"string\" })\n if (\"chainId\" in domain) fields.push({ name: \"chainId\", type: \"uint256\" })\n if (\"verifyingContract\" in domain)\n fields.push({ name: \"verifyingContract\", type: \"address\" })\n if (\"salt\" in domain) fields.push({ name: \"salt\", type: \"bytes32\" })\n return fields\n}\n\nfunction hashStruct(\n primaryType: string,\n data: Record<string, unknown>,\n types: Record<string, Array<{ name: string; type: string }>>,\n): Uint8Array {\n const typeHash = hashType(primaryType, types)\n const encodedValues = encodeData(primaryType, data, types)\n const combined = new Uint8Array(32 + encodedValues.length)\n combined.set(typeHash, 0)\n combined.set(encodedValues, 32)\n return keccak_256(combined)\n}\n\nfunction hashType(\n primaryType: string,\n types: Record<string, Array<{ name: string; type: string }>>,\n): Uint8Array {\n return keccak_256(new TextEncoder().encode(encodeType(primaryType, types)))\n}\n\nfunction encodeType(\n primaryType: string,\n types: Record<string, Array<{ name: string; type: string }>>,\n): string {\n const fields = types[primaryType]\n if (!fields) throw new Error(`Unknown type: ${primaryType}`)\n\n const deps = new Set<string>()\n findTypeDeps(primaryType, types, deps)\n deps.delete(primaryType)\n const sorted = [...deps].sort()\n\n let result = `${primaryType}(${fields.map(f => `${f.type} ${f.name}`).join(\",\")})`\n for (const dep of sorted) {\n const depFields = types[dep]\n if (depFields) {\n result += `${dep}(${depFields.map(f => `${f.type} ${f.name}`).join(\",\")})`\n }\n }\n return result\n}\n\nfunction findTypeDeps(\n type: string,\n types: Record<string, Array<{ name: string; type: string }>>,\n deps: Set<string>,\n): void {\n if (deps.has(type)) return\n const fields = types[type]\n if (!fields) return\n deps.add(type)\n for (const field of fields) {\n const baseType = field.type.replace(/\\[\\d*\\]$/, \"\")\n if (types[baseType]) {\n findTypeDeps(baseType, types, deps)\n }\n }\n}\n\nfunction encodeData(\n primaryType: string,\n data: Record<string, unknown>,\n types: Record<string, Array<{ name: string; type: string }>>,\n): Uint8Array {\n const fields = types[primaryType]\n if (!fields) throw new Error(`Unknown type: ${primaryType}`)\n\n const chunks: Uint8Array[] = []\n for (const field of fields) {\n const value = data[field.name]\n chunks.push(encodeValue(field.type, value, types))\n }\n\n const result = new Uint8Array(chunks.length * 32)\n for (let i = 0; i < chunks.length; i++) {\n result.set(chunks[i], i * 32)\n }\n return result\n}\n\nfunction encodeValue(\n type: string,\n value: unknown,\n types: Record<string, Array<{ name: string; type: string }>>,\n): Uint8Array {\n if (type === \"string\") {\n return keccak_256(new TextEncoder().encode(value as string))\n }\n if (type === \"bytes\") {\n const v = value as string\n const bytes = hexToBytes(v.startsWith(\"0x\") ? v.slice(2) : v)\n return keccak_256(bytes)\n }\n if (type.endsWith(\"]\")) {\n const baseType = type.replace(/\\[\\d*\\]$/, \"\")\n const arr = value as unknown[]\n const encoded = arr.map(item => encodeValue(baseType, item, types))\n const flat = new Uint8Array(encoded.length * 32)\n for (let i = 0; i < encoded.length; i++) flat.set(encoded[i], i * 32)\n return keccak_256(flat)\n }\n if (types[type]) {\n return hashStruct(type, value as Record<string, unknown>, types)\n }\n if (type === \"address\") {\n const addr = (value as string).toLowerCase().replace(\"0x\", \"\")\n const padded = new Uint8Array(32)\n padded.set(hexToBytes(addr.padStart(40, \"0\")), 12)\n return padded\n }\n if (type === \"bool\") {\n const padded = new Uint8Array(32)\n padded[31] = value ? 1 : 0\n return padded\n }\n if (type.startsWith(\"uint\") || type.startsWith(\"int\")) {\n const padded = new Uint8Array(32)\n const n = BigInt(value as string | number | bigint)\n const hex = (n < 0n ? n + (1n << 256n) : n).toString(16).padStart(64, \"0\")\n padded.set(hexToBytes(hex), 0)\n return padded\n }\n if (type.startsWith(\"bytes\")) {\n const v = value as string\n const bytes = hexToBytes(v.startsWith(\"0x\") ? v.slice(2) : v)\n const padded = new Uint8Array(32)\n padded.set(bytes, 0)\n return padded\n }\n throw new Error(`Unsupported EIP-712 type: ${type}`)\n}\n\nfunction hexToBytes(hex: string): Uint8Array {\n const clean = hex.startsWith(\"0x\") ? hex.slice(2) : hex\n const bytes = new Uint8Array(clean.length / 2)\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Number.parseInt(clean.slice(i * 2, i * 2 + 2), 16)\n }\n return bytes\n}\n","/**\n * AUTO-GENERATED by scripts/sync-chains.ts — DO NOT EDIT.\n * Source of truth: OpenSea REST API + scripts/chain-data.json\n * Run `pnpm sync-chains` to regenerate.\n */\n\n/** Map EVM chain IDs to Fireblocks asset IDs. */\nexport const CHAIN_TO_FIREBLOCKS_ASSET: Record<number, string> = {\n 1: \"ETH\",\n 10: \"ETH-OPT\",\n 130: \"UNICHAIN_ETH\",\n 137: \"MATIC_POLYGON\",\n 360: \"SHAPE_ETH\",\n 1329: \"SEI_EVM\",\n 1868: \"SONEIUM_ETH\",\n 2741: \"ABSTRACT_ETH\",\n 8453: \"BASECHAIN_ETH\",\n 33139: \"APE_CHAIN\",\n 42161: \"ETH-AETH\",\n 43114: \"AVAX\",\n 80094: \"BERA_CHAIN\",\n 81457: \"BLAST_ETH\",\n 7777777: \"ZORA_ETH\",\n}\n","/**\n * Fireblocks wallet adapter.\n *\n * Uses Fireblocks' REST API to sign and send transactions through their\n * enterprise-grade MPC custody infrastructure.\n *\n * Required environment variables:\n * FIREBLOCKS_API_KEY — Fireblocks API key\n * FIREBLOCKS_API_SECRET — Fireblocks API secret (RSA private key, PEM-encoded)\n * FIREBLOCKS_VAULT_ID — Fireblocks vault account ID\n *\n * Optional:\n * FIREBLOCKS_API_BASE_URL — Override the API base URL\n * FIREBLOCKS_ASSET_ID — Override the Fireblocks asset ID\n * FIREBLOCKS_MAX_POLL_ATTEMPTS — Override max polling attempts (default: 60 = 120s)\n *\n * @see https://developers.fireblocks.com/docs/introduction\n */\n\nimport type {\n SignMessageRequest,\n SignTypedDataRequest,\n TransactionRequest,\n TransactionResult,\n WalletAdapter,\n WalletCapabilities,\n} from \"../types/index.js\"\nimport { hashPersonalMessage, hashTypedData } from \"../util/eip712.js\"\n\nimport { CHAIN_TO_FIREBLOCKS_ASSET } from \"./fireblocks.generated.js\"\n\nexport { CHAIN_TO_FIREBLOCKS_ASSET }\n\nexport interface FireblocksConfig {\n apiKey: string\n apiSecret: string\n vaultId: string\n assetId?: string\n baseUrl?: string\n maxPollAttempts?: number\n}\n\nconst FIREBLOCKS_API_BASE = \"https://api.fireblocks.io\"\n\nexport class FireblocksAdapter implements WalletAdapter {\n readonly name = \"fireblocks\"\n readonly capabilities: WalletCapabilities = {\n signMessage: true,\n signTypedData: true,\n managedGas: true,\n managedNonce: true,\n }\n onRequest?: (method: string, params: unknown) => void\n onResponse?: (method: string, result: unknown, durationMs: number) => void\n private config: FireblocksConfig\n private cachedAddress?: string\n\n constructor(config: FireblocksConfig) {\n this.config = config\n }\n\n static fromEnv(): FireblocksAdapter {\n const apiKey = process.env.FIREBLOCKS_API_KEY\n const apiSecret = process.env.FIREBLOCKS_API_SECRET\n const vaultId = process.env.FIREBLOCKS_VAULT_ID\n\n if (!apiKey) {\n throw new Error(\"FIREBLOCKS_API_KEY environment variable is required\")\n }\n if (!apiSecret) {\n throw new Error(\"FIREBLOCKS_API_SECRET environment variable is required\")\n }\n if (!vaultId) {\n throw new Error(\"FIREBLOCKS_VAULT_ID environment variable is required\")\n }\n\n const maxPollAttempts = process.env.FIREBLOCKS_MAX_POLL_ATTEMPTS\n ? Number.parseInt(process.env.FIREBLOCKS_MAX_POLL_ATTEMPTS, 10)\n : undefined\n\n return new FireblocksAdapter({\n apiKey,\n apiSecret,\n vaultId,\n assetId: process.env.FIREBLOCKS_ASSET_ID,\n baseUrl: process.env.FIREBLOCKS_API_BASE_URL,\n maxPollAttempts,\n })\n }\n\n private get baseUrl(): string {\n return this.config.baseUrl ?? FIREBLOCKS_API_BASE\n }\n\n private async createJwt(path: string, bodyHash: string): Promise<string> {\n const now = Math.floor(Date.now() / 1000)\n\n const header = { alg: \"RS256\", typ: \"JWT\" }\n const payload = {\n uri: path,\n nonce: crypto.randomUUID(),\n iat: now,\n exp: now + 30,\n sub: this.config.apiKey,\n bodyHash,\n }\n\n const b64url = (obj: unknown) =>\n Buffer.from(JSON.stringify(obj)).toString(\"base64url\")\n\n const unsigned = `${b64url(header)}.${b64url(payload)}`\n\n const key = await crypto.subtle.importKey(\n \"pkcs8\",\n this.pemToBuffer(this.config.apiSecret),\n { name: \"RSASSA-PKCS1-v1_5\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n )\n\n const sig = await crypto.subtle.sign(\n \"RSASSA-PKCS1-v1_5\",\n key,\n new TextEncoder().encode(unsigned),\n )\n\n return `${unsigned}.${Buffer.from(sig).toString(\"base64url\")}`\n }\n\n private pemToBuffer(pem: string): ArrayBuffer {\n const lines = pem\n .replace(/-----BEGIN .*-----/, \"\")\n .replace(/-----END .*-----/, \"\")\n .replace(/\\s/g, \"\")\n const buf = Buffer.from(lines, \"base64\")\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength)\n }\n\n private async hashBody(body: string): Promise<string> {\n const hash = await crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(body),\n )\n return Buffer.from(hash).toString(\"hex\")\n }\n\n private resolveAssetId(chainId: number): string {\n if (this.config.assetId) return this.config.assetId\n const asset = CHAIN_TO_FIREBLOCKS_ASSET[chainId]\n if (!asset) {\n throw new Error(\n `No Fireblocks asset ID mapping for chain ${chainId}. ` +\n `Set FIREBLOCKS_ASSET_ID explicitly or use a supported chain: ${Object.keys(CHAIN_TO_FIREBLOCKS_ASSET).join(\", \")}`,\n )\n }\n return asset\n }\n\n async getAddress(): Promise<string> {\n if (this.cachedAddress) return this.cachedAddress\n\n const assetId = this.config.assetId ?? \"ETH\"\n const path = `/v1/vault/accounts/${this.config.vaultId}/${assetId}/addresses`\n const bodyHash = await this.hashBody(\"\")\n const jwt = await this.createJwt(path, bodyHash)\n\n const response = await fetch(`${this.baseUrl}${path}`, {\n headers: {\n \"X-API-Key\": this.config.apiKey,\n Authorization: `Bearer ${jwt}`,\n },\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(\n `Fireblocks getAddress failed (${response.status}): ${body}`,\n )\n }\n\n const data = (await response.json()) as { address: string }[]\n if (!data[0]?.address) {\n throw new Error(\"Fireblocks returned no addresses for vault\")\n }\n this.cachedAddress = data[0].address\n return data[0].address\n }\n\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResult> {\n this.onRequest?.(\"sendTransaction\", tx)\n const startTime = Date.now()\n\n const assetId = this.resolveAssetId(tx.chainId)\n const path = \"/v1/transactions\"\n\n const requestBody = {\n assetId,\n operation: \"CONTRACT_CALL\",\n source: {\n type: \"VAULT_ACCOUNT\",\n id: this.config.vaultId,\n },\n destination: {\n type: \"ONE_TIME_ADDRESS\",\n oneTimeAddress: { address: tx.to },\n },\n amount: tx.value === \"0\" ? \"0\" : tx.value,\n extraParameters: {\n contractCallData: tx.data,\n },\n }\n\n const bodyStr = JSON.stringify(requestBody)\n const bodyHash = await this.hashBody(bodyStr)\n const jwt = await this.createJwt(path, bodyHash)\n\n const response = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": this.config.apiKey,\n Authorization: `Bearer ${jwt}`,\n },\n body: bodyStr,\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(\n `Fireblocks sendTransaction failed (${response.status}): ${body}`,\n )\n }\n\n const data = (await response.json()) as { id: string; txHash?: string }\n\n if (data.txHash) {\n const result = { hash: data.txHash }\n this.onResponse?.(\"sendTransaction\", result, Date.now() - startTime)\n return result\n }\n\n const result = await this.waitForTransaction(data.id)\n this.onResponse?.(\"sendTransaction\", result, Date.now() - startTime)\n return result\n }\n\n async signMessage(request: SignMessageRequest): Promise<string> {\n this.onRequest?.(\"signMessage\", request)\n const startTime = Date.now()\n\n const hash = Buffer.from(hashPersonalMessage(request.message)).toString(\n \"hex\",\n )\n const signature = await this.signRawMessage(hash)\n this.onResponse?.(\"signMessage\", signature, Date.now() - startTime)\n return signature\n }\n\n async signTypedData(request: SignTypedDataRequest): Promise<string> {\n this.onRequest?.(\"signTypedData\", request)\n const startTime = Date.now()\n\n const hash = Buffer.from(\n hashTypedData(\n request.domain,\n request.primaryType,\n request.message,\n request.types as Record<string, Array<{ name: string; type: string }>>,\n ),\n ).toString(\"hex\")\n const signature = await this.signRawMessage(hash)\n this.onResponse?.(\"signTypedData\", signature, Date.now() - startTime)\n return signature\n }\n\n private async signRawMessage(hashHex: string): Promise<string> {\n const path = \"/v1/transactions\"\n const requestBody = {\n assetId: this.config.assetId ?? \"ETH\",\n operation: \"RAW\",\n source: {\n type: \"VAULT_ACCOUNT\",\n id: this.config.vaultId,\n },\n extraParameters: {\n rawMessageData: {\n messages: [\n {\n content: hashHex,\n },\n ],\n },\n },\n }\n\n const bodyStr = JSON.stringify(requestBody)\n const bodyHash = await this.hashBody(bodyStr)\n const jwt = await this.createJwt(path, bodyHash)\n\n const response = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": this.config.apiKey,\n Authorization: `Bearer ${jwt}`,\n },\n body: bodyStr,\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(\n `Fireblocks signRawMessage failed (${response.status}): ${body}`,\n )\n }\n\n const data = (await response.json()) as { id: string }\n return this.waitForSignature(data.id)\n }\n\n private async waitForSignature(txId: string): Promise<string> {\n const maxAttempts = this.config.maxPollAttempts ?? 60\n const pollIntervalMs = 2000\n\n for (let i = 0; i < maxAttempts; i++) {\n const path = `/v1/transactions/${txId}`\n const bodyHash = await this.hashBody(\"\")\n const jwt = await this.createJwt(path, bodyHash)\n\n const response = await fetch(`${this.baseUrl}${path}`, {\n headers: {\n \"X-API-Key\": this.config.apiKey,\n Authorization: `Bearer ${jwt}`,\n },\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(\n `Fireblocks signature poll failed (${response.status}): ${body}`,\n )\n }\n\n const data = (await response.json()) as {\n status: string\n signedMessages?: Array<{\n signature: { r: string; s: string; v: number }\n }>\n }\n\n if (data.status === \"COMPLETED\" && data.signedMessages?.[0]) {\n const { r, s, v } = data.signedMessages[0].signature\n const rHex = r.padStart(64, \"0\")\n const sHex = s.padStart(64, \"0\")\n // Fireblocks RAW op returns recovery bit (0 or 1); Ethereum expects 27 or 28.\n const vHex = (v + 27).toString(16).padStart(2, \"0\")\n return `0x${rHex}${sHex}${vHex}`\n }\n\n if (\n data.status === \"FAILED\" ||\n data.status === \"REJECTED\" ||\n data.status === \"CANCELLED\" ||\n data.status === \"BLOCKED\"\n ) {\n throw new Error(\n `Fireblocks signing ${txId} ended with status: ${data.status}`,\n )\n }\n\n await new Promise(resolve => setTimeout(resolve, pollIntervalMs))\n }\n\n throw new Error(\n `Fireblocks signing ${txId} did not complete within ${(maxAttempts * pollIntervalMs) / 1000}s`,\n )\n }\n\n private async waitForTransaction(txId: string): Promise<TransactionResult> {\n const maxAttempts = this.config.maxPollAttempts ?? 60\n const pollIntervalMs = 2000\n\n for (let i = 0; i < maxAttempts; i++) {\n const path = `/v1/transactions/${txId}`\n const bodyHash = await this.hashBody(\"\")\n const jwt = await this.createJwt(path, bodyHash)\n\n const response = await fetch(`${this.baseUrl}${path}`, {\n headers: {\n \"X-API-Key\": this.config.apiKey,\n Authorization: `Bearer ${jwt}`,\n },\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(`Fireblocks poll failed (${response.status}): ${body}`)\n }\n\n const data = (await response.json()) as {\n status: string\n txHash?: string\n }\n\n if (data.status === \"COMPLETED\" && data.txHash) {\n return { hash: data.txHash }\n }\n\n if (\n data.status === \"FAILED\" ||\n data.status === \"REJECTED\" ||\n data.status === \"CANCELLED\" ||\n data.status === \"BLOCKED\"\n ) {\n throw new Error(\n `Fireblocks transaction ${txId} ended with status: ${data.status}`,\n )\n }\n\n await new Promise(resolve => setTimeout(resolve, pollIntervalMs))\n }\n\n throw new Error(\n `Fireblocks transaction ${txId} did not complete within ${(maxAttempts * pollIntervalMs) / 1000}s`,\n )\n }\n}\n","/**\n * Private key wallet adapter.\n *\n * Signs and sends transactions using a raw private key with secp256k1.\n *\n * Intended for development and testing. For production use, prefer a\n * managed wallet provider (Privy, Turnkey, Fireblocks).\n *\n * Required environment variables:\n * PRIVATE_KEY — Hex-encoded private key (with or without 0x prefix)\n * RPC_URL — JSON-RPC endpoint for broadcasting and gas estimation\n *\n * Optional:\n * WALLET_ADDRESS — Pre-computed address (skips derivation)\n */\n\nimport { secp256k1 } from \"@noble/curves/secp256k1\"\nimport { keccak_256 } from \"@noble/hashes/sha3.js\"\nimport { bytesToHex as nobleToHex } from \"@noble/hashes/utils.js\"\nimport type {\n SignMessageRequest,\n SignTypedDataRequest,\n TransactionRequest,\n TransactionResult,\n WalletAdapter,\n WalletCapabilities,\n} from \"../types/index.js\"\nimport { hashPersonalMessage, hashTypedData } from \"../util/eip712.js\"\nimport { bytesToHex, hexToBytes, rlpEncodeEip1559Tx } from \"./turnkey.js\"\n\nexport interface PrivateKeyConfig {\n privateKey: string\n rpcUrl: string\n address?: string\n}\n\nexport class PrivateKeyAdapter implements WalletAdapter {\n readonly name = \"private-key\"\n readonly capabilities: WalletCapabilities = {\n signMessage: true,\n signTypedData: true,\n managedGas: false,\n managedNonce: false,\n }\n onRequest?: (method: string, params: unknown) => void\n onResponse?: (method: string, result: unknown, durationMs: number) => void\n private config: PrivateKeyConfig\n private cachedAddress?: string\n\n constructor(config: PrivateKeyConfig) {\n this.config = config\n this.cachedAddress = config.address\n }\n\n static fromEnv(): PrivateKeyAdapter {\n const privateKey = process.env.PRIVATE_KEY\n const rpcUrl = process.env.RPC_URL\n\n if (!privateKey) {\n throw new Error(\"PRIVATE_KEY environment variable is required\")\n }\n if (!rpcUrl) {\n throw new Error(\"RPC_URL environment variable is required\")\n }\n\n const clean = privateKey.startsWith(\"0x\") ? privateKey.slice(2) : privateKey\n if (!/^[0-9a-fA-F]{64}$/.test(clean)) {\n throw new Error(\n \"PRIVATE_KEY must be a 64-character hex string (with or without 0x prefix)\",\n )\n }\n\n return new PrivateKeyAdapter({\n privateKey,\n rpcUrl,\n address: process.env.WALLET_ADDRESS,\n })\n }\n\n getRpcUrl(): string {\n return this.config.rpcUrl\n }\n\n async getAddress(): Promise<string> {\n if (this.cachedAddress) return this.cachedAddress\n\n const clean = this.config.privateKey.startsWith(\"0x\")\n ? this.config.privateKey.slice(2)\n : this.config.privateKey\n const pubKey = secp256k1.getPublicKey(clean, false)\n // keccak256 of uncompressed pubkey (without 04 prefix) → last 20 bytes\n const hash = keccak_256(pubKey.subarray(1))\n this.cachedAddress = `0x${nobleToHex(hash.subarray(12))}`\n return this.cachedAddress\n }\n\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResult> {\n this.onRequest?.(\"sendTransaction\", tx)\n const startTime = Date.now()\n\n const from = await this.getAddress()\n const { rpcUrl } = this.config\n\n let nonce: bigint\n let gasLimit: bigint\n let maxFeePerGas: bigint\n let maxPriorityFeePerGas: bigint\n\n if (tx.gas && tx.nonce !== undefined && tx.maxFeePerGas) {\n nonce = BigInt(tx.nonce)\n gasLimit = BigInt(tx.gas)\n maxFeePerGas = BigInt(tx.maxFeePerGas)\n maxPriorityFeePerGas = tx.maxPriorityFeePerGas\n ? BigInt(tx.maxPriorityFeePerGas)\n : 1_500_000_000n\n } else {\n const txValue =\n tx.value === \"0\" ? \"0x0\" : `0x${BigInt(tx.value).toString(16)}`\n\n const [nonceResult, gasEstimateResult, feeDataResult] = await Promise.all(\n [\n this.rpcCall(rpcUrl, \"eth_getTransactionCount\", [from, \"pending\"]),\n this.rpcCall(rpcUrl, \"eth_estimateGas\", [\n { from, to: tx.to, data: tx.data || \"0x\", value: txValue },\n ]),\n this.rpcCall(rpcUrl, \"eth_feeHistory\", [1, \"latest\", [50]]),\n ],\n )\n\n nonce = BigInt(nonceResult as string)\n const rawGas = BigInt(gasEstimateResult as string)\n gasLimit = (rawGas * 120n) / 100n\n\n const feeHistory = feeDataResult as {\n baseFeePerGas: string[]\n reward?: string[][]\n }\n const latestBaseFee = BigInt(\n feeHistory.baseFeePerGas[1] ?? feeHistory.baseFeePerGas[0],\n )\n maxPriorityFeePerGas = feeHistory.reward?.[0]?.[0]\n ? BigInt(feeHistory.reward[0][0])\n : 1_500_000_000n\n maxFeePerGas = latestBaseFee * 2n + maxPriorityFeePerGas\n }\n\n // RLP-encode unsigned EIP-1559 tx (includes 0x02 type prefix)\n const unsignedHex = rlpEncodeEip1559Tx({\n chainId: tx.chainId,\n nonce,\n maxPriorityFeePerGas,\n maxFeePerGas,\n gasLimit,\n to: tx.to,\n data: tx.data,\n value: tx.value,\n })\n\n // Hash the typed envelope for signing\n const unsignedBytes = hexToBytes(unsignedHex)\n const txHash = keccak_256(unsignedBytes)\n\n // Sign with secp256k1 (RFC 6979 deterministic k)\n const clean = this.config.privateKey.startsWith(\"0x\")\n ? this.config.privateKey.slice(2)\n : this.config.privateKey\n const sig = secp256k1.sign(txHash, clean)\n\n // Encode signed tx\n const signedHex = encodeSignedEip1559Tx(\n {\n chainId: tx.chainId,\n nonce,\n maxPriorityFeePerGas,\n maxFeePerGas,\n gasLimit,\n to: tx.to,\n data: tx.data,\n value: tx.value,\n },\n sig.recovery,\n sig.r,\n sig.s,\n )\n\n // Broadcast\n const hash = (await this.rpcCall(rpcUrl, \"eth_sendRawTransaction\", [\n `0x${signedHex}`,\n ])) as string\n\n const result = { hash }\n this.onResponse?.(\"sendTransaction\", result, Date.now() - startTime)\n return result\n }\n\n async signMessage(request: SignMessageRequest): Promise<string> {\n this.onRequest?.(\"signMessage\", request)\n const startTime = Date.now()\n\n const hash = hashPersonalMessage(request.message)\n const clean = this.config.privateKey.startsWith(\"0x\")\n ? this.config.privateKey.slice(2)\n : this.config.privateKey\n const sig = secp256k1.sign(hash, clean)\n const result = encodeEcdsaSignature(sig.r, sig.s, sig.recovery)\n this.onResponse?.(\"signMessage\", result, Date.now() - startTime)\n return result\n }\n\n async signTypedData(request: SignTypedDataRequest): Promise<string> {\n this.onRequest?.(\"signTypedData\", request)\n const startTime = Date.now()\n\n const hash = hashTypedData(\n request.domain,\n request.primaryType,\n request.message,\n request.types as Record<string, Array<{ name: string; type: string }>>,\n )\n const clean = this.config.privateKey.startsWith(\"0x\")\n ? this.config.privateKey.slice(2)\n : this.config.privateKey\n const sig = secp256k1.sign(hash, clean)\n const result = encodeEcdsaSignature(sig.r, sig.s, sig.recovery)\n this.onResponse?.(\"signTypedData\", result, Date.now() - startTime)\n return result\n }\n\n private async rpcCall(\n rpcUrl: string,\n method: string,\n params: unknown[],\n ): Promise<unknown> {\n const response = await fetch(rpcUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", id: 1, method, params }),\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(`RPC ${method} failed (${response.status}): ${body}`)\n }\n\n const data = (await response.json()) as {\n result?: unknown\n error?: { message: string }\n }\n\n if (data.error) {\n throw new Error(`RPC ${method} error: ${data.error.message}`)\n }\n\n return data.result\n }\n}\n\nfunction bigIntToMinBytes(value: bigint): Uint8Array {\n if (value === 0n) return new Uint8Array(0)\n const hex = value.toString(16)\n const padded = hex.length % 2 === 0 ? hex : `0${hex}`\n return hexToBytes(padded)\n}\n\nfunction rlpEncodeBytes(bytes: Uint8Array): Uint8Array {\n if (bytes.length === 1 && bytes[0] < 0x80) return bytes\n if (bytes.length === 0) return new Uint8Array([0x80])\n if (bytes.length <= 55) {\n const result = new Uint8Array(1 + bytes.length)\n result[0] = 0x80 + bytes.length\n result.set(bytes, 1)\n return result\n }\n const lenBytes = bigIntToMinBytes(BigInt(bytes.length))\n const result = new Uint8Array(1 + lenBytes.length + bytes.length)\n result[0] = 0xb7 + lenBytes.length\n result.set(lenBytes, 1)\n result.set(bytes, 1 + lenBytes.length)\n return result\n}\n\nfunction rlpEncodeList(items: Uint8Array[]): Uint8Array {\n let totalLen = 0\n for (const item of items) totalLen += item.length\n if (totalLen <= 55) {\n const result = new Uint8Array(1 + totalLen)\n result[0] = 0xc0 + totalLen\n let offset = 1\n for (const item of items) {\n result.set(item, offset)\n offset += item.length\n }\n return result\n }\n const lenBytes = bigIntToMinBytes(BigInt(totalLen))\n const result = new Uint8Array(1 + lenBytes.length + totalLen)\n result[0] = 0xf7 + lenBytes.length\n result.set(lenBytes, 1)\n let offset = 1 + lenBytes.length\n for (const item of items) {\n result.set(item, offset)\n offset += item.length\n }\n return result\n}\n\nfunction encodeSignedEip1559Tx(\n tx: {\n chainId: number\n nonce: bigint\n maxPriorityFeePerGas: bigint\n maxFeePerGas: bigint\n gasLimit: bigint\n to: string\n data: string\n value: string\n },\n v: number,\n r: bigint,\n s: bigint,\n): string {\n const fields = [\n rlpEncodeBytes(bigIntToMinBytes(BigInt(tx.chainId))),\n rlpEncodeBytes(bigIntToMinBytes(tx.nonce)),\n rlpEncodeBytes(bigIntToMinBytes(tx.maxPriorityFeePerGas)),\n rlpEncodeBytes(bigIntToMinBytes(tx.maxFeePerGas)),\n rlpEncodeBytes(bigIntToMinBytes(tx.gasLimit)),\n rlpEncodeBytes(hexToBytes(tx.to)),\n rlpEncodeBytes(\n tx.value === \"0\" ? new Uint8Array(0) : bigIntToMinBytes(BigInt(tx.value)),\n ),\n rlpEncodeBytes(tx.data ? hexToBytes(tx.data) : new Uint8Array(0)),\n rlpEncodeList([]), // empty access list\n rlpEncodeBytes(v === 0 ? new Uint8Array(0) : new Uint8Array([v])),\n rlpEncodeBytes(bigIntToMinBytes(r)),\n rlpEncodeBytes(bigIntToMinBytes(s)),\n ]\n\n const rlpList = rlpEncodeList(fields)\n const signed = new Uint8Array(1 + rlpList.length)\n signed[0] = 0x02\n signed.set(rlpList, 1)\n return bytesToHex(signed)\n}\n\nfunction encodeEcdsaSignature(r: bigint, s: bigint, v: number): string {\n const rHex = r.toString(16).padStart(64, \"0\")\n const sHex = s.toString(16).padStart(64, \"0\")\n const vHex = (v + 27).toString(16).padStart(2, \"0\")\n return `0x${rHex}${sHex}${vHex}`\n}\n","/**\n * Turnkey wallet adapter.\n *\n * Uses Turnkey's API to sign and send transactions via HSM-backed\n * signing infrastructure. Authentication uses Turnkey's stamp scheme:\n * each request body is hashed and signed with a P-256 ECDSA key.\n *\n * Required environment variables:\n * TURNKEY_API_PUBLIC_KEY — Turnkey API public key (hex-encoded)\n * TURNKEY_API_PRIVATE_KEY — Turnkey API private key (hex-encoded P-256)\n * TURNKEY_ORGANIZATION_ID — Turnkey organization ID\n * TURNKEY_WALLET_ADDRESS — Ethereum address managed by Turnkey\n * TURNKEY_RPC_URL — RPC endpoint for gas estimation and broadcast\n *\n * Optional:\n * TURNKEY_API_BASE_URL — Override the Turnkey API base URL\n * TURNKEY_PRIVATE_KEY_ID — Turnkey private key ID (for signing with a specific key)\n *\n * @see https://docs.turnkey.com/\n */\n\nimport type {\n SignMessageRequest,\n SignTypedDataRequest,\n TransactionRequest,\n TransactionResult,\n WalletAdapter,\n WalletCapabilities,\n} from \"../types/index.js\"\nimport { hashPersonalMessage, hashTypedData } from \"../util/eip712.js\"\n\nexport interface TurnkeyConfig {\n apiPublicKey: string\n apiPrivateKey: string\n organizationId: string\n walletAddress: string\n rpcUrl: string\n privateKeyId?: string\n baseUrl?: string\n}\n\nconst TURNKEY_API_BASE = \"https://api.turnkey.com\"\n\nexport class TurnkeyAdapter implements WalletAdapter {\n readonly name = \"turnkey\"\n readonly capabilities: WalletCapabilities = {\n signMessage: true,\n signTypedData: true,\n managedGas: false,\n managedNonce: false,\n }\n onRequest?: (method: string, params: unknown) => void\n onResponse?: (method: string, result: unknown, durationMs: number) => void\n private config: TurnkeyConfig\n\n constructor(config: TurnkeyConfig) {\n this.config = config\n }\n\n static fromEnv(): TurnkeyAdapter {\n const apiPublicKey = process.env.TURNKEY_API_PUBLIC_KEY\n const apiPrivateKey = process.env.TURNKEY_API_PRIVATE_KEY\n const organizationId = process.env.TURNKEY_ORGANIZATION_ID\n const walletAddress = process.env.TURNKEY_WALLET_ADDRESS\n\n if (!apiPublicKey) {\n throw new Error(\"TURNKEY_API_PUBLIC_KEY environment variable is required\")\n }\n if (!apiPrivateKey) {\n throw new Error(\n \"TURNKEY_API_PRIVATE_KEY environment variable is required\",\n )\n }\n if (!organizationId) {\n throw new Error(\n \"TURNKEY_ORGANIZATION_ID environment variable is required\",\n )\n }\n if (!walletAddress) {\n throw new Error(\"TURNKEY_WALLET_ADDRESS environment variable is required\")\n }\n\n const rpcUrl = process.env.TURNKEY_RPC_URL\n if (!rpcUrl) {\n throw new Error(\n \"TURNKEY_RPC_URL environment variable is required. \" +\n \"It is used for gas estimation and transaction broadcasting.\",\n )\n }\n\n return new TurnkeyAdapter({\n apiPublicKey,\n apiPrivateKey,\n organizationId,\n walletAddress,\n rpcUrl,\n privateKeyId: process.env.TURNKEY_PRIVATE_KEY_ID,\n baseUrl: process.env.TURNKEY_API_BASE_URL,\n })\n }\n\n getRpcUrl(): string {\n return this.config.rpcUrl\n }\n\n private get baseUrl(): string {\n return this.config.baseUrl ?? TURNKEY_API_BASE\n }\n\n private async stamp(body: string): Promise<string> {\n const encoder = new TextEncoder()\n const bodyHash = await crypto.subtle.digest(\"SHA-256\", encoder.encode(body))\n\n const keyData = hexToBytes(this.config.apiPrivateKey)\n const cryptoKey = await crypto.subtle.importKey(\n \"pkcs8\",\n derEncodeP256PrivateKey(keyData),\n { name: \"ECDSA\", namedCurve: \"P-256\" },\n false,\n [\"sign\"],\n )\n\n // WebCrypto ECDSA sign hashes internally, so this signs SHA-256(SHA-256(body)).\n // Turnkey's server verifier expects this — matches packages/cli/src/wallet/turnkey.ts.\n const p1363Sig = await crypto.subtle.sign(\n { name: \"ECDSA\", hash: \"SHA-256\" },\n cryptoKey,\n bodyHash,\n )\n\n const derSig = p1363ToDer(new Uint8Array(p1363Sig))\n const signatureHex = bytesToHex(derSig)\n\n const stampJson = JSON.stringify({\n publicKey: this.config.apiPublicKey,\n scheme: \"SIGNATURE_SCHEME_TK_API_P256\",\n signature: signatureHex,\n })\n\n return Buffer.from(stampJson).toString(\"base64url\")\n }\n\n private async signedRequest(\n path: string,\n body: Record<string, unknown>,\n ): Promise<Response> {\n const bodyStr = JSON.stringify(body)\n const stampValue = await this.stamp(bodyStr)\n\n return fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Stamp\": stampValue,\n },\n body: bodyStr,\n })\n }\n\n async getAddress(): Promise<string> {\n return this.config.walletAddress\n }\n\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResult> {\n this.onRequest?.(\"sendTransaction\", tx)\n const startTime = Date.now()\n\n const { rpcUrl } = this.config\n const gasParams = await this.estimateGasParams(rpcUrl, tx)\n\n const rlpHex = rlpEncodeEip1559Tx({\n chainId: tx.chainId,\n nonce: gasParams.nonce,\n maxPriorityFeePerGas: gasParams.maxPriorityFeePerGas,\n maxFeePerGas: gasParams.maxFeePerGas,\n gasLimit: gasParams.gasLimit,\n to: tx.to,\n data: tx.data,\n value: tx.value,\n })\n\n const signWith = this.config.privateKeyId ?? this.config.walletAddress\n\n const response = await this.signedRequest(\n \"/public/v1/submit/sign_transaction\",\n {\n type: \"ACTIVITY_TYPE_SIGN_TRANSACTION_V2\",\n organizationId: this.config.organizationId,\n timestampMs: Date.now().toString(),\n parameters: {\n signWith,\n type: \"TRANSACTION_TYPE_ETHEREUM\",\n unsignedTransaction: rlpHex,\n },\n },\n )\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(\n `Turnkey sendTransaction failed (${response.status}): ${body}`,\n )\n }\n\n const data = (await response.json()) as {\n activity: {\n status: string\n result?: {\n signTransactionResult?: { signedTransaction: string }\n }\n }\n }\n\n const signedTx =\n data.activity.result?.signTransactionResult?.signedTransaction\n if (!signedTx) {\n throw new Error(\n `Turnkey sign transaction did not return a signed payload (activity status: ${data.activity.status})`,\n )\n }\n\n const rpcResponse = await fetch(rpcUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"eth_sendRawTransaction\",\n params: [signedTx],\n }),\n })\n\n if (!rpcResponse.ok) {\n const rpcBody = await rpcResponse.text()\n throw new Error(\n `Turnkey broadcast failed (${rpcResponse.status}): ${rpcBody}`,\n )\n }\n\n const rpcData = (await rpcResponse.json()) as {\n result?: string\n error?: { message: string }\n }\n\n if (rpcData.error) {\n throw new Error(`Turnkey broadcast RPC error: ${rpcData.error.message}`)\n }\n\n if (!rpcData.result) {\n throw new Error(\"Turnkey broadcast returned no tx hash\")\n }\n\n const result = { hash: rpcData.result }\n this.onResponse?.(\"sendTransaction\", result, Date.now() - startTime)\n return result\n }\n\n async signMessage(request: SignMessageRequest): Promise<string> {\n this.onRequest?.(\"signMessage\", request)\n const startTime = Date.now()\n\n const hash = bytesToHex(hashPersonalMessage(request.message))\n const signature = await this.signRawPayload(hash)\n this.onResponse?.(\"signMessage\", signature, Date.now() - startTime)\n return signature\n }\n\n async signTypedData(request: SignTypedDataRequest): Promise<string> {\n this.onRequest?.(\"signTypedData\", request)\n const startTime = Date.now()\n\n const hash = bytesToHex(\n hashTypedData(\n request.domain,\n request.primaryType,\n request.message,\n request.types as Record<string, Array<{ name: string; type: string }>>,\n ),\n )\n const signature = await this.signRawPayload(hash)\n this.onResponse?.(\"signTypedData\", signature, Date.now() - startTime)\n return signature\n }\n\n private async signRawPayload(hashHex: string): Promise<string> {\n const signWith = this.config.privateKeyId ?? this.config.walletAddress\n\n const response = await this.signedRequest(\n \"/public/v1/submit/sign_raw_payload\",\n {\n type: \"ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2\",\n organizationId: this.config.organizationId,\n timestampMs: Date.now().toString(),\n parameters: {\n signWith,\n payload: hashHex,\n encoding: \"PAYLOAD_ENCODING_HEXADECIMAL\",\n hashFunction: \"HASH_FUNCTION_NO_OP\",\n },\n },\n )\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(\n `Turnkey signRawPayload failed (${response.status}): ${body}`,\n )\n }\n\n const data = (await response.json()) as {\n activity: {\n status: string\n result?: {\n signRawPayloadResult?: { r: string; s: string; v: string }\n }\n }\n }\n\n const sigResult = data.activity.result?.signRawPayloadResult\n if (!sigResult) {\n throw new Error(\n `Turnkey sign raw payload did not return a result (status: ${data.activity.status})`,\n )\n }\n\n const r = sigResult.r.padStart(64, \"0\")\n const s = sigResult.s.padStart(64, \"0\")\n const vNum = Number.parseInt(sigResult.v, 16) + 27\n const v = vNum.toString(16).padStart(2, \"0\")\n return `0x${r}${s}${v}`\n }\n\n private async estimateGasParams(\n rpcUrl: string,\n tx: TransactionRequest,\n ): Promise<{\n nonce: bigint\n gasLimit: bigint\n maxFeePerGas: bigint\n maxPriorityFeePerGas: bigint\n }> {\n // Use pre-estimated values if provided by caller (avoids double estimation)\n if (tx.gas && tx.nonce !== undefined && tx.maxFeePerGas) {\n return {\n nonce: BigInt(tx.nonce),\n gasLimit: BigInt(tx.gas),\n maxFeePerGas: BigInt(tx.maxFeePerGas),\n maxPriorityFeePerGas: tx.maxPriorityFeePerGas\n ? BigInt(tx.maxPriorityFeePerGas)\n : 1_500_000_000n,\n }\n }\n\n const from = this.config.walletAddress\n const txValue =\n tx.value === \"0\" ? \"0x0\" : `0x${BigInt(tx.value).toString(16)}`\n\n const [nonceResult, gasEstimateResult, feeDataResult] = await Promise.all([\n this.rpcCall(rpcUrl, \"eth_getTransactionCount\", [from, \"pending\"]),\n this.rpcCall(rpcUrl, \"eth_estimateGas\", [\n {\n from,\n to: tx.to,\n data: tx.data || \"0x\",\n value: txValue,\n },\n ]),\n this.rpcCall(rpcUrl, \"eth_feeHistory\", [1, \"latest\", [50]]),\n ])\n\n const nonce = BigInt(nonceResult as string)\n\n const rawGasLimit = BigInt(gasEstimateResult as string)\n const gasLimit = (rawGasLimit * 120n) / 100n\n\n const feeHistory = feeDataResult as {\n baseFeePerGas: string[]\n reward?: string[][]\n }\n const latestBaseFee = BigInt(\n feeHistory.baseFeePerGas[1] ?? feeHistory.baseFeePerGas[0],\n )\n const maxPriorityFeePerGas = feeHistory.reward?.[0]?.[0]\n ? BigInt(feeHistory.reward[0][0])\n : 1_500_000_000n\n\n const maxFeePerGas = latestBaseFee * 2n + maxPriorityFeePerGas\n\n return { nonce, gasLimit, maxFeePerGas, maxPriorityFeePerGas }\n }\n\n private async rpcCall(\n rpcUrl: string,\n method: string,\n params: unknown[],\n ): Promise<unknown> {\n const response = await fetch(rpcUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method,\n params,\n }),\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(\n `Turnkey RPC ${method} failed (${response.status}): ${body}`,\n )\n }\n\n const data = (await response.json()) as {\n result?: unknown\n error?: { message: string }\n }\n\n if (data.error) {\n throw new Error(`Turnkey RPC ${method} error: ${data.error.message}`)\n }\n\n return data.result\n }\n}\n\n/**\n * RLP-encode an unsigned EIP-1559 (type 2) transaction.\n * Returns hex string without 0x prefix, as expected by Turnkey.\n */\nexport function rlpEncodeEip1559Tx(tx: {\n chainId: number\n nonce: bigint\n maxPriorityFeePerGas: bigint\n maxFeePerGas: bigint\n gasLimit: bigint\n to: string\n data: string\n value: string\n}): string {\n const chainIdBytes = bigIntToBytes(BigInt(tx.chainId))\n const nonce = bigIntToBytes(tx.nonce)\n const maxPriorityFeePerGas = bigIntToBytes(tx.maxPriorityFeePerGas)\n const maxFeePerGas = bigIntToBytes(tx.maxFeePerGas)\n const gasLimit = bigIntToBytes(tx.gasLimit)\n const toBytes = hexToBytes(tx.to)\n const valueBytes =\n tx.value === \"0\" ? new Uint8Array(0) : bigIntToBytes(BigInt(tx.value))\n const dataBytes = tx.data ? hexToBytes(tx.data) : new Uint8Array(0)\n\n const fields = [\n rlpEncodeBytes(chainIdBytes),\n rlpEncodeBytes(nonce),\n rlpEncodeBytes(maxPriorityFeePerGas),\n rlpEncodeBytes(maxFeePerGas),\n rlpEncodeBytes(gasLimit),\n rlpEncodeBytes(toBytes),\n rlpEncodeBytes(valueBytes),\n rlpEncodeBytes(dataBytes),\n rlpEncodeList([]),\n ]\n\n const rlpList = rlpEncodeList(fields)\n\n const result = new Uint8Array(1 + rlpList.length)\n result[0] = 0x02\n result.set(rlpList, 1)\n\n return bytesToHex(result)\n}\n\nfunction rlpEncodeBytes(bytes: Uint8Array): Uint8Array {\n if (bytes.length === 1 && bytes[0] < 0x80) {\n return bytes\n }\n if (bytes.length === 0) {\n return new Uint8Array([0x80])\n }\n if (bytes.length <= 55) {\n const result = new Uint8Array(1 + bytes.length)\n result[0] = 0x80 + bytes.length\n result.set(bytes, 1)\n return result\n }\n const lenBytes = bigIntToBytes(BigInt(bytes.length))\n const result = new Uint8Array(1 + lenBytes.length + bytes.length)\n result[0] = 0xb7 + lenBytes.length\n result.set(lenBytes, 1)\n result.set(bytes, 1 + lenBytes.length)\n return result\n}\n\nfunction rlpEncodeList(items: Uint8Array[]): Uint8Array {\n let totalLen = 0\n for (const item of items) totalLen += item.length\n\n if (totalLen <= 55) {\n const result = new Uint8Array(1 + totalLen)\n result[0] = 0xc0 + totalLen\n let offset = 1\n for (const item of items) {\n result.set(item, offset)\n offset += item.length\n }\n return result\n }\n\n const lenBytes = bigIntToBytes(BigInt(totalLen))\n const result = new Uint8Array(1 + lenBytes.length + totalLen)\n result[0] = 0xf7 + lenBytes.length\n result.set(lenBytes, 1)\n let offset = 1 + lenBytes.length\n for (const item of items) {\n result.set(item, offset)\n offset += item.length\n }\n return result\n}\n\nfunction bigIntToBytes(value: bigint): Uint8Array {\n if (value === 0n) return new Uint8Array(0)\n const hex = value.toString(16)\n const padded = hex.length % 2 === 0 ? hex : `0${hex}`\n return hexToBytes(padded)\n}\n\nexport function hexToBytes(hex: string): Uint8Array {\n const clean = hex.startsWith(\"0x\") ? hex.slice(2) : hex\n const bytes = new Uint8Array(clean.length / 2)\n for (let i = 0; i < clean.length; i += 2) {\n bytes[i / 2] = Number.parseInt(clean.slice(i, i + 2), 16)\n }\n return bytes\n}\n\nexport function bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map(b => b.toString(16).padStart(2, \"0\"))\n .join(\"\")\n}\n\n/**\n * Convert an ECDSA signature from IEEE P1363 format (raw r||s) to DER encoding.\n */\nexport function p1363ToDer(p1363: Uint8Array): Uint8Array {\n const r = p1363.subarray(0, 32)\n const s = p1363.subarray(32, 64)\n\n const rDer = integerToDer(r)\n const sDer = integerToDer(s)\n\n const seqLen = rDer.length + sDer.length\n const result = new Uint8Array(2 + seqLen)\n result[0] = 0x30\n result[1] = seqLen\n result.set(rDer, 2)\n result.set(sDer, 2 + rDer.length)\n return result\n}\n\nfunction integerToDer(bytes: Uint8Array): Uint8Array {\n let start = 0\n while (start < bytes.length - 1 && bytes[start] === 0) start++\n const stripped = bytes.subarray(start)\n\n const needsPad = stripped[0] >= 0x80\n const len = stripped.length + (needsPad ? 1 : 0)\n\n const result = new Uint8Array(2 + len)\n result[0] = 0x02\n result[1] = len\n if (needsPad) {\n result[2] = 0x00\n result.set(stripped, 3)\n } else {\n result.set(stripped, 2)\n }\n return result\n}\n\nfunction derEncodeP256PrivateKey(rawKey: Uint8Array): ArrayBuffer {\n const header = new Uint8Array([\n 0x30, 0x41, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48,\n 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03,\n 0x01, 0x07, 0x04, 0x27, 0x30, 0x25, 0x02, 0x01, 0x01, 0x04, 0x20,\n ])\n\n const result = new Uint8Array(header.length + rawKey.length)\n result.set(header)\n result.set(rawKey, header.length)\n return result.buffer\n}\n","/**\n * Privy wallet adapter.\n *\n * Uses Privy's server-side wallet API to sign and send transactions.\n * Transactions are governed by Privy's programmable policy engine —\n * policies are evaluated in a trusted execution environment before signing.\n *\n * Required environment variables:\n * PRIVY_APP_ID — Privy application ID\n * PRIVY_APP_SECRET — Privy application secret\n * PRIVY_WALLET_ID — Wallet ID to use for signing\n *\n * Optional:\n * PRIVY_API_BASE_URL — Override the Privy API base URL\n *\n * @see https://docs.privy.io/wallets/wallets/server-side-access\n * @see https://docs.privy.io/controls/policies/overview\n */\n\nimport type {\n SignMessageRequest,\n SignTypedDataRequest,\n TransactionRequest,\n TransactionResult,\n WalletAdapter,\n WalletCapabilities,\n} from \"../types/index.js\"\n\nexport interface PrivyConfig {\n appId: string\n appSecret: string\n walletId: string\n baseUrl?: string\n}\n\nconst PRIVY_API_BASE = \"https://api.privy.io\"\n\nexport class PrivyAdapter implements WalletAdapter {\n readonly name = \"privy\"\n readonly capabilities: WalletCapabilities = {\n signMessage: true,\n signTypedData: true,\n managedGas: true,\n managedNonce: true,\n }\n onRequest?: (method: string, params: unknown) => void\n onResponse?: (method: string, result: unknown, durationMs: number) => void\n private config: PrivyConfig\n private cachedAddress?: string\n\n constructor(config: PrivyConfig) {\n this.config = config\n }\n\n static fromEnv(): PrivyAdapter {\n const appId = process.env.PRIVY_APP_ID\n const appSecret = process.env.PRIVY_APP_SECRET\n const walletId = process.env.PRIVY_WALLET_ID\n\n if (!appId) {\n throw new Error(\"PRIVY_APP_ID environment variable is required\")\n }\n if (!appSecret) {\n throw new Error(\"PRIVY_APP_SECRET environment variable is required\")\n }\n if (!walletId) {\n throw new Error(\"PRIVY_WALLET_ID environment variable is required\")\n }\n\n return new PrivyAdapter({\n appId,\n appSecret,\n walletId,\n baseUrl: process.env.PRIVY_API_BASE_URL,\n })\n }\n\n private get baseUrl(): string {\n return this.config.baseUrl ?? PRIVY_API_BASE\n }\n\n private get authHeaders(): Record<string, string> {\n const credentials = Buffer.from(\n `${this.config.appId}:${this.config.appSecret}`,\n ).toString(\"base64\")\n return {\n Authorization: `Basic ${credentials}`,\n \"privy-app-id\": this.config.appId,\n \"Content-Type\": \"application/json\",\n }\n }\n\n async getAddress(): Promise<string> {\n if (this.cachedAddress) return this.cachedAddress\n\n const response = await fetch(\n `${this.baseUrl}/v1/wallets/${this.config.walletId}`,\n { headers: this.authHeaders },\n )\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(`Privy getAddress failed (${response.status}): ${body}`)\n }\n\n const data = (await response.json()) as { address: string }\n this.cachedAddress = data.address\n return data.address\n }\n\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResult> {\n this.onRequest?.(\"sendTransaction\", tx)\n const startTime = Date.now()\n\n const caip2 = `eip155:${tx.chainId}`\n\n const response = await fetch(\n `${this.baseUrl}/v1/wallets/${this.config.walletId}/rpc`,\n {\n method: \"POST\",\n headers: this.authHeaders,\n body: JSON.stringify({\n method: \"eth_sendTransaction\",\n caip2,\n params: {\n transaction: {\n to: tx.to,\n data: tx.data,\n value: tx.value,\n },\n },\n }),\n },\n )\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(\n `Privy sendTransaction failed (${response.status}): ${body}`,\n )\n }\n\n const data = (await response.json()) as { data: { hash: string } }\n const result = { hash: data.data.hash }\n this.onResponse?.(\"sendTransaction\", result, Date.now() - startTime)\n return result\n }\n\n async signMessage(request: SignMessageRequest): Promise<string> {\n this.onRequest?.(\"signMessage\", request)\n const startTime = Date.now()\n\n const message =\n typeof request.message === \"string\"\n ? request.message\n : `0x${Buffer.from(request.message).toString(\"hex\")}`\n\n const response = await fetch(\n `${this.baseUrl}/v1/wallets/${this.config.walletId}/rpc`,\n {\n method: \"POST\",\n headers: this.authHeaders,\n body: JSON.stringify({\n method: \"personal_sign\",\n params: { message },\n }),\n },\n )\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(`Privy signMessage failed (${response.status}): ${body}`)\n }\n\n const data = (await response.json()) as { data: { signature: string } }\n this.onResponse?.(\n \"signMessage\",\n data.data.signature,\n Date.now() - startTime,\n )\n return data.data.signature\n }\n\n async signTypedData(request: SignTypedDataRequest): Promise<string> {\n this.onRequest?.(\"signTypedData\", request)\n const startTime = Date.now()\n\n const response = await fetch(\n `${this.baseUrl}/v1/wallets/${this.config.walletId}/rpc`,\n {\n method: \"POST\",\n headers: this.authHeaders,\n body: JSON.stringify({\n method: \"eth_signTypedData_v4\",\n params: {\n typedData: JSON.stringify({\n domain: request.domain,\n types: request.types,\n primaryType: request.primaryType,\n message: request.message,\n }),\n },\n }),\n },\n )\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(\n `Privy signTypedData failed (${response.status}): ${body}`,\n )\n }\n\n const data = (await response.json()) as { data: { signature: string } }\n this.onResponse?.(\n \"signTypedData\",\n data.data.signature,\n Date.now() - startTime,\n )\n return data.data.signature\n }\n}\n","/**\n * Auto-detection factory that creates a WalletAdapter based on\n * which environment variables are present.\n *\n * Priority: Privy > Fireblocks > Turnkey > Bankr > PrivateKey\n */\n\nimport { BankrAdapter } from \"./adapters/bankr.js\"\nimport { FireblocksAdapter } from \"./adapters/fireblocks.js\"\nimport { PrivateKeyAdapter } from \"./adapters/private-key.js\"\nimport { PrivyAdapter } from \"./adapters/privy.js\"\nimport { TurnkeyAdapter } from \"./adapters/turnkey.js\"\nimport type { WalletAdapter, WalletProvider } from \"./types/index.js\"\n\nexport function createWalletFromEnv(): WalletAdapter {\n if (process.env.PRIVY_APP_ID && process.env.PRIVY_WALLET_ID) {\n return PrivyAdapter.fromEnv()\n }\n\n if (process.env.FIREBLOCKS_API_KEY && process.env.FIREBLOCKS_VAULT_ID) {\n return FireblocksAdapter.fromEnv()\n }\n\n if (\n process.env.TURNKEY_API_PUBLIC_KEY &&\n process.env.TURNKEY_WALLET_ADDRESS\n ) {\n return TurnkeyAdapter.fromEnv()\n }\n\n if (process.env.BANKR_API_KEY) {\n return BankrAdapter.fromEnv()\n }\n\n if (process.env.PRIVATE_KEY) {\n return PrivateKeyAdapter.fromEnv()\n }\n\n throw new Error(\n \"No wallet provider configured. Set environment variables for one of:\\n\" +\n \" • Privy: PRIVY_APP_ID, PRIVY_APP_SECRET, PRIVY_WALLET_ID\\n\" +\n \" • Fireblocks: FIREBLOCKS_API_KEY, FIREBLOCKS_API_SECRET, FIREBLOCKS_VAULT_ID\\n\" +\n \" • Turnkey: TURNKEY_API_PUBLIC_KEY, TURNKEY_API_PRIVATE_KEY, TURNKEY_ORGANIZATION_ID, TURNKEY_WALLET_ADDRESS, TURNKEY_RPC_URL\\n\" +\n \" • Bankr: BANKR_API_KEY\\n\" +\n \" • PrivateKey: PRIVATE_KEY, RPC_URL\",\n )\n}\n\nexport function createWalletForProvider(\n provider: WalletProvider,\n): WalletAdapter {\n switch (provider) {\n case \"bankr\":\n return BankrAdapter.fromEnv()\n case \"privy\":\n return PrivyAdapter.fromEnv()\n case \"fireblocks\":\n return FireblocksAdapter.fromEnv()\n case \"turnkey\":\n return TurnkeyAdapter.fromEnv()\n case \"private-key\":\n return PrivateKeyAdapter.fromEnv()\n default:\n throw new Error(`Unknown wallet provider: ${provider}`)\n }\n}\n\nexport function detectProvider(): WalletProvider | null {\n if (process.env.PRIVY_APP_ID && process.env.PRIVY_WALLET_ID) return \"privy\"\n if (process.env.FIREBLOCKS_API_KEY && process.env.FIREBLOCKS_VAULT_ID)\n return \"fireblocks\"\n if (process.env.TURNKEY_API_PUBLIC_KEY && process.env.TURNKEY_WALLET_ADDRESS)\n return \"turnkey\"\n if (process.env.BANKR_API_KEY) return \"bankr\"\n if (process.env.PRIVATE_KEY) return \"private-key\"\n return null\n}\n","/**\n * Core types for the wallet adapter interface.\n *\n * These types define the contract between consumers and wallet providers.\n * Designed to be provider-agnostic and extensible for future signing\n * capabilities (EIP-712, EIP-191, batch transactions, etc.).\n */\n\nexport interface TransactionRequest {\n to: string\n data: string\n value: string\n chainId: number\n /** Pre-estimated gas limit (avoids redundant RPC call when provided) */\n gas?: string\n /** Pre-fetched nonce */\n nonce?: number\n maxFeePerGas?: string\n maxPriorityFeePerGas?: string\n}\n\nexport interface TransactionResult {\n hash: string\n}\n\nexport interface SignMessageRequest {\n message: string | Uint8Array\n}\n\nexport interface SignTypedDataRequest {\n domain: Record<string, unknown>\n types: Record<string, Array<{ name: string; type: string }>>\n primaryType: string\n message: Record<string, unknown>\n}\n\n/**\n * Core wallet adapter interface.\n *\n * Implement this interface to add a new wallet provider. At minimum,\n * a provider must support `getAddress()` and `sendTransaction()`.\n * Optional capabilities (message signing, typed data signing) can be\n * declared via the `capabilities` property.\n */\nexport interface WalletAdapter {\n /** Human-readable provider name for logging and error messages */\n readonly name: string\n\n /** Declared capabilities of this adapter */\n readonly capabilities: WalletCapabilities\n\n /** Get the wallet address */\n getAddress(): Promise<string>\n\n /** Sign and send a transaction, returns the tx hash */\n sendTransaction(tx: TransactionRequest): Promise<TransactionResult>\n\n /** Sign a raw message (EIP-191). Throws if not supported. */\n signMessage?(request: SignMessageRequest): Promise<string>\n\n /** Sign EIP-712 typed data. Throws if not supported. */\n signTypedData?(request: SignTypedDataRequest): Promise<string>\n\n /** Optional RPC URL for read operations (gas estimation, nonce, etc.) */\n getRpcUrl?(): string\n\n /** Optional hook called before each adapter request (for metrics/logging) */\n onRequest?: (method: string, params: unknown) => void\n\n /** Optional hook called after each adapter response (for metrics/logging) */\n onResponse?: (method: string, result: unknown, durationMs: number) => void\n}\n\n/**\n * Declares which optional operations an adapter supports.\n * Consumers can check capabilities before calling optional methods.\n */\nexport interface WalletCapabilities {\n /** Whether signMessage() is supported */\n signMessage: boolean\n /** Whether signTypedData() is supported (EIP-712) */\n signTypedData: boolean\n /** Whether the provider manages gas estimation internally */\n managedGas: boolean\n /** Whether the provider manages nonce internally */\n managedNonce: boolean\n}\n\nexport type WalletProvider =\n | \"privy\"\n | \"turnkey\"\n | \"fireblocks\"\n | \"bankr\"\n | \"private-key\"\n\nexport const WALLET_PROVIDERS: WalletProvider[] = [\n \"privy\",\n \"turnkey\",\n \"fireblocks\",\n \"bankr\",\n \"private-key\",\n]\n"],"mappings":"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","names":["result","keccak_256","hexToBytes","result","offset","keccak_256","hexToBytes","rlpEncodeBytes","result","rlpEncodeList","offset"]}
1
+ {"version":3,"sources":["../src/adapters/bankr.ts","../src/util/eip712.ts","../src/adapters/fireblocks.generated.ts","../src/adapters/fireblocks.ts","../src/adapters/private-key.ts","../src/adapters/turnkey.ts","../src/adapters/privy.ts","../src/factory.ts","../src/types/index.ts"],"sourcesContent":["/**\n * Bankr wallet adapter.\n *\n * Uses Bankr's Wallet API to sign and send transactions via a managed\n * agent wallet. Authentication is done via API key in the X-API-Key header.\n *\n * # Security model\n *\n * This adapter is **signing-only by design.** It exposes only the\n * primitives an agent needs: `getAddress`, `sendTransaction`,\n * `signMessage`, `signTypedData`, and `getWalletInfo`. Future\n * contributors: do not add scope-mutation or key-management surfaces\n * here — Bankr does not expose them via API anyway, and adding\n * adapter-side wrappers around dashboard ops would be a footgun.\n *\n * Effective hardening is done at the API key configuration level on\n * bankr.bot/api, not in this adapter:\n *\n * 1. For monitoring-only agents, enable the key's `readOnly` flag —\n * `/wallet/sign` and `/wallet/submit` will return 403.\n *\n * 2. For signing agents, set `allowedRecipients` (an EVM/Solana\n * address allowlist) and `allowedIps` (CIDR allowlist) on the\n * key. Disable `agentApiEnabled` if the agent does not need\n * Bankr's prompt API.\n *\n * 3. Set per-key daily message limits at bankr.bot/api.\n *\n * 4. Bankr does not expose key-scope flags via API, so\n * `getWalletInfo()` cannot verify these settings at runtime —\n * `opensea wallet info` reminds the user to verify scope at the\n * dashboard. Re-confirm after any key rotation.\n *\n * 5. Bankr keys cannot enforce aggregate dollar/ETH spend caps; daily\n * message-quota limits are not the same thing. Use the hot/cold\n * wallet float pattern documented in\n * `packages/skill/opensea-wallet/references/wallet-funding.md`.\n *\n * Required environment variables:\n * BANKR_API_KEY — Bankr API key with Wallet API access enabled\n *\n * Optional:\n * BANKR_API_BASE_URL — Override the Bankr API base URL\n *\n * @see https://docs.bankr.bot/agent-api/authentication\n * @see https://docs.bankr.bot/agent-api/access-control\n */\n\nimport type {\n SignMessageRequest,\n SignTypedDataRequest,\n TransactionRequest,\n TransactionResult,\n WalletAdapter,\n WalletCapabilities,\n WalletInfo,\n} from \"../types/index.js\"\n\nexport interface BankrConfig {\n apiKey: string\n baseUrl?: string\n}\n\nconst BANKR_API_BASE = \"https://api.bankr.bot\"\n\nexport class BankrAdapter implements WalletAdapter {\n readonly name = \"bankr\"\n readonly capabilities: WalletCapabilities = {\n signMessage: true,\n signTypedData: true,\n managedGas: true,\n managedNonce: true,\n }\n onRequest?: (method: string, params: unknown) => void\n onResponse?: (method: string, result: unknown, durationMs: number) => void\n private config: BankrConfig\n private cachedAddress?: string\n\n constructor(config: BankrConfig) {\n this.config = config\n }\n\n static fromEnv(): BankrAdapter {\n const apiKey = process.env.BANKR_API_KEY\n\n if (!apiKey) {\n throw new Error(\"BANKR_API_KEY environment variable is required\")\n }\n\n return new BankrAdapter({\n apiKey,\n baseUrl: process.env.BANKR_API_BASE_URL,\n })\n }\n\n private get baseUrl(): string {\n return this.config.baseUrl ?? BANKR_API_BASE\n }\n\n private get authHeaders(): Record<string, string> {\n return {\n \"X-API-Key\": this.config.apiKey,\n \"Content-Type\": \"application/json\",\n }\n }\n\n async getAddress(): Promise<string> {\n if (this.cachedAddress) return this.cachedAddress\n\n const response = await fetch(`${this.baseUrl}/wallet/me`, {\n headers: this.authHeaders,\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(`Bankr getAddress failed (${response.status}): ${body}`)\n }\n\n const data = (await response.json()) as {\n wallets: Array<{ chain: string; address: string }>\n }\n const evmWallet = data.wallets.find(w => w.chain === \"evm\")\n if (!evmWallet) {\n throw new Error(\"Bankr wallet has no EVM address\")\n }\n this.cachedAddress = evmWallet.address\n return evmWallet.address\n }\n\n async getWalletInfo(): Promise<WalletInfo> {\n const address = await this.getAddress()\n return {\n provider: \"bankr\",\n address,\n scopeIntrospectable: false,\n }\n }\n\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResult> {\n this.onRequest?.(\"sendTransaction\", tx)\n const startTime = Date.now()\n\n const transaction: Record<string, unknown> = {\n to: tx.to,\n data: tx.data,\n value: tx.value,\n chainId: tx.chainId,\n }\n if (tx.gas) transaction.gas = tx.gas\n if (tx.nonce !== undefined) transaction.nonce = tx.nonce\n if (tx.maxFeePerGas) transaction.maxFeePerGas = tx.maxFeePerGas\n if (tx.maxPriorityFeePerGas)\n transaction.maxPriorityFeePerGas = tx.maxPriorityFeePerGas\n\n const response = await fetch(`${this.baseUrl}/wallet/submit`, {\n method: \"POST\",\n headers: this.authHeaders,\n body: JSON.stringify({\n transaction,\n waitForConfirmation: true,\n }),\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(\n `Bankr sendTransaction failed (${response.status}): ${body}`,\n )\n }\n\n const data = (await response.json()) as { transactionHash: string }\n const result = { hash: data.transactionHash }\n this.onResponse?.(\"sendTransaction\", result, Date.now() - startTime)\n return result\n }\n\n async signMessage(request: SignMessageRequest): Promise<string> {\n this.onRequest?.(\"signMessage\", request)\n const startTime = Date.now()\n\n const message =\n typeof request.message === \"string\"\n ? request.message\n : `0x${Buffer.from(request.message).toString(\"hex\")}`\n\n const response = await fetch(`${this.baseUrl}/wallet/sign`, {\n method: \"POST\",\n headers: this.authHeaders,\n body: JSON.stringify({\n signatureType: \"personal_sign\",\n message,\n }),\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(`Bankr signMessage failed (${response.status}): ${body}`)\n }\n\n const data = (await response.json()) as { signature: string }\n this.onResponse?.(\"signMessage\", data.signature, Date.now() - startTime)\n return data.signature\n }\n\n async signTypedData(request: SignTypedDataRequest): Promise<string> {\n this.onRequest?.(\"signTypedData\", request)\n const startTime = Date.now()\n\n const response = await fetch(`${this.baseUrl}/wallet/sign`, {\n method: \"POST\",\n headers: this.authHeaders,\n body: JSON.stringify({\n signatureType: \"eth_signTypedData_v4\",\n typedData: {\n domain: request.domain,\n types: request.types,\n primaryType: request.primaryType,\n message: request.message,\n },\n }),\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(\n `Bankr signTypedData failed (${response.status}): ${body}`,\n )\n }\n\n const data = (await response.json()) as { signature: string }\n this.onResponse?.(\"signTypedData\", data.signature, Date.now() - startTime)\n return data.signature\n }\n}\n","/**\n * EIP-712 typed data hashing utilities.\n *\n * Implements the EIP-712 encoding spec for computing domain separators\n * and struct hashes used by signTypedData across all adapters.\n */\n\nimport { keccak_256 } from \"@noble/hashes/sha3.js\"\n\nexport function hashTypedData(\n domain: Record<string, unknown>,\n primaryType: string,\n message: Record<string, unknown>,\n types: Record<string, Array<{ name: string; type: string }>>,\n): Uint8Array {\n const domainSeparator = hashStruct(\"EIP712Domain\", domain, {\n ...types,\n EIP712Domain: buildDomainType(domain),\n })\n const messageHash = hashStruct(primaryType, message, types)\n\n const packed = new Uint8Array(66)\n packed[0] = 0x19\n packed[1] = 0x01\n packed.set(domainSeparator, 2)\n packed.set(messageHash, 34)\n return keccak_256(packed)\n}\n\nexport function hashPersonalMessage(message: string | Uint8Array): Uint8Array {\n const msgBytes =\n typeof message === \"string\" ? new TextEncoder().encode(message) : message\n\n const prefix = new TextEncoder().encode(\n `\\x19Ethereum Signed Message:\\n${msgBytes.length}`,\n )\n const payload = new Uint8Array(prefix.length + msgBytes.length)\n payload.set(prefix, 0)\n payload.set(msgBytes, prefix.length)\n return keccak_256(payload)\n}\n\nfunction buildDomainType(\n domain: Record<string, unknown>,\n): Array<{ name: string; type: string }> {\n const fields: Array<{ name: string; type: string }> = []\n if (\"name\" in domain) fields.push({ name: \"name\", type: \"string\" })\n if (\"version\" in domain) fields.push({ name: \"version\", type: \"string\" })\n if (\"chainId\" in domain) fields.push({ name: \"chainId\", type: \"uint256\" })\n if (\"verifyingContract\" in domain)\n fields.push({ name: \"verifyingContract\", type: \"address\" })\n if (\"salt\" in domain) fields.push({ name: \"salt\", type: \"bytes32\" })\n return fields\n}\n\nfunction hashStruct(\n primaryType: string,\n data: Record<string, unknown>,\n types: Record<string, Array<{ name: string; type: string }>>,\n): Uint8Array {\n const typeHash = hashType(primaryType, types)\n const encodedValues = encodeData(primaryType, data, types)\n const combined = new Uint8Array(32 + encodedValues.length)\n combined.set(typeHash, 0)\n combined.set(encodedValues, 32)\n return keccak_256(combined)\n}\n\nfunction hashType(\n primaryType: string,\n types: Record<string, Array<{ name: string; type: string }>>,\n): Uint8Array {\n return keccak_256(new TextEncoder().encode(encodeType(primaryType, types)))\n}\n\nfunction encodeType(\n primaryType: string,\n types: Record<string, Array<{ name: string; type: string }>>,\n): string {\n const fields = types[primaryType]\n if (!fields) throw new Error(`Unknown type: ${primaryType}`)\n\n const deps = new Set<string>()\n findTypeDeps(primaryType, types, deps)\n deps.delete(primaryType)\n const sorted = [...deps].sort()\n\n let result = `${primaryType}(${fields.map(f => `${f.type} ${f.name}`).join(\",\")})`\n for (const dep of sorted) {\n const depFields = types[dep]\n if (depFields) {\n result += `${dep}(${depFields.map(f => `${f.type} ${f.name}`).join(\",\")})`\n }\n }\n return result\n}\n\nfunction findTypeDeps(\n type: string,\n types: Record<string, Array<{ name: string; type: string }>>,\n deps: Set<string>,\n): void {\n if (deps.has(type)) return\n const fields = types[type]\n if (!fields) return\n deps.add(type)\n for (const field of fields) {\n const baseType = field.type.replace(/\\[\\d*\\]$/, \"\")\n if (types[baseType]) {\n findTypeDeps(baseType, types, deps)\n }\n }\n}\n\nfunction encodeData(\n primaryType: string,\n data: Record<string, unknown>,\n types: Record<string, Array<{ name: string; type: string }>>,\n): Uint8Array {\n const fields = types[primaryType]\n if (!fields) throw new Error(`Unknown type: ${primaryType}`)\n\n const chunks: Uint8Array[] = []\n for (const field of fields) {\n const value = data[field.name]\n chunks.push(encodeValue(field.type, value, types))\n }\n\n const result = new Uint8Array(chunks.length * 32)\n for (let i = 0; i < chunks.length; i++) {\n result.set(chunks[i], i * 32)\n }\n return result\n}\n\nfunction encodeValue(\n type: string,\n value: unknown,\n types: Record<string, Array<{ name: string; type: string }>>,\n): Uint8Array {\n if (type === \"string\") {\n return keccak_256(new TextEncoder().encode(value as string))\n }\n if (type === \"bytes\") {\n const v = value as string\n const bytes = hexToBytes(v.startsWith(\"0x\") ? v.slice(2) : v)\n return keccak_256(bytes)\n }\n if (type.endsWith(\"]\")) {\n const baseType = type.replace(/\\[\\d*\\]$/, \"\")\n const arr = value as unknown[]\n const encoded = arr.map(item => encodeValue(baseType, item, types))\n const flat = new Uint8Array(encoded.length * 32)\n for (let i = 0; i < encoded.length; i++) flat.set(encoded[i], i * 32)\n return keccak_256(flat)\n }\n if (types[type]) {\n return hashStruct(type, value as Record<string, unknown>, types)\n }\n if (type === \"address\") {\n const addr = (value as string).toLowerCase().replace(\"0x\", \"\")\n const padded = new Uint8Array(32)\n padded.set(hexToBytes(addr.padStart(40, \"0\")), 12)\n return padded\n }\n if (type === \"bool\") {\n const padded = new Uint8Array(32)\n padded[31] = value ? 1 : 0\n return padded\n }\n if (type.startsWith(\"uint\") || type.startsWith(\"int\")) {\n const padded = new Uint8Array(32)\n const n = BigInt(value as string | number | bigint)\n const hex = (n < 0n ? n + (1n << 256n) : n).toString(16).padStart(64, \"0\")\n padded.set(hexToBytes(hex), 0)\n return padded\n }\n if (type.startsWith(\"bytes\")) {\n const v = value as string\n const bytes = hexToBytes(v.startsWith(\"0x\") ? v.slice(2) : v)\n const padded = new Uint8Array(32)\n padded.set(bytes, 0)\n return padded\n }\n throw new Error(`Unsupported EIP-712 type: ${type}`)\n}\n\nfunction hexToBytes(hex: string): Uint8Array {\n const clean = hex.startsWith(\"0x\") ? hex.slice(2) : hex\n const bytes = new Uint8Array(clean.length / 2)\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Number.parseInt(clean.slice(i * 2, i * 2 + 2), 16)\n }\n return bytes\n}\n","/**\n * AUTO-GENERATED by scripts/sync-chains.ts — DO NOT EDIT.\n * Source of truth: OpenSea REST API + scripts/chain-data.json\n * Run `pnpm sync-chains` to regenerate.\n */\n\n/** Map EVM chain IDs to Fireblocks asset IDs. */\nexport const CHAIN_TO_FIREBLOCKS_ASSET: Record<number, string> = {\n 1: \"ETH\",\n 10: \"ETH-OPT\",\n 130: \"UNICHAIN_ETH\",\n 137: \"MATIC_POLYGON\",\n 360: \"SHAPE_ETH\",\n 1329: \"SEI_EVM\",\n 1868: \"SONEIUM_ETH\",\n 2741: \"ABSTRACT_ETH\",\n 8453: \"BASECHAIN_ETH\",\n 33139: \"APE_CHAIN\",\n 42161: \"ETH-AETH\",\n 43114: \"AVAX\",\n 80094: \"BERA_CHAIN\",\n 81457: \"BLAST_ETH\",\n 7777777: \"ZORA_ETH\",\n}\n","/**\n * Fireblocks wallet adapter.\n *\n * Uses Fireblocks' REST API to sign and send transactions through their\n * enterprise-grade MPC custody infrastructure.\n *\n * # Security model\n *\n * This adapter is **signing-only by design.** It exposes only the\n * primitives an agent needs to sign and send transactions:\n * `getAddress`, `sendTransaction`, `signMessage`, `signTypedData`, and\n * `getWalletInfo`. Future contributors: **do not add\n * `createTransactionAuthPolicy`, `updateUser`, `createApiUser`,\n * `whitelistAddress`, or any other administrative endpoint to this\n * adapter.** If they exist, an agent will find and use them.\n *\n * Effective hardening requires creating the API key with the **`Signer`\n * role** and nothing broader:\n *\n * 1. Fireblocks supports nine API key roles: Admin, Signer,\n * NCW_SIGNER, Non-Signing Admin, Approver, Editor, NCW_ADMIN,\n * Viewer, and Security Auditor. Only `Signer` (or `NCW_SIGNER`)\n * gives signing capability without governance access. Do not use\n * `Admin` for an agent.\n *\n * 2. Fireblocks does not expose API-user role via API — there is no\n * `/v1/users/me` introspection endpoint, and `GET /v1/users/{id}`\n * itself requires admin role. `getWalletInfo()` therefore cannot\n * verify the calling key's role at runtime; verify it manually at\n * console.fireblocks.io and re-confirm whenever you rotate the key.\n *\n * 3. TAP changes require admin quorum approval at the console — a\n * leaked Signer-role key cannot rewrite TAP. This is structurally\n * stronger than Privy or Turnkey, but only if the key is actually\n * `Signer` rather than `Admin`.\n *\n * 4. TAP rules cap per-tx values; aggregate (daily/weekly) caps are\n * not a TAP primitive. Use the hot/cold wallet float pattern\n * documented in\n * `packages/skill/opensea-wallet/references/wallet-funding.md`.\n *\n * Required environment variables:\n * FIREBLOCKS_API_KEY — Fireblocks API key (must be Signer role)\n * FIREBLOCKS_API_SECRET — Fireblocks API secret (RSA private key, PEM-encoded)\n * FIREBLOCKS_VAULT_ID — Fireblocks vault account ID\n *\n * Optional:\n * FIREBLOCKS_API_BASE_URL — Override the API base URL\n * FIREBLOCKS_ASSET_ID — Override the Fireblocks asset ID\n * FIREBLOCKS_MAX_POLL_ATTEMPTS — Override max polling attempts (default: 60 = 120s)\n *\n * @see https://developers.fireblocks.com/docs/manage-api-keys\n * @see https://developers.fireblocks.com/docs/manage-users\n */\n\nimport type {\n SignMessageRequest,\n SignTypedDataRequest,\n TransactionRequest,\n TransactionResult,\n WalletAdapter,\n WalletCapabilities,\n WalletInfo,\n} from \"../types/index.js\"\nimport { hashPersonalMessage, hashTypedData } from \"../util/eip712.js\"\n\nimport { CHAIN_TO_FIREBLOCKS_ASSET } from \"./fireblocks.generated.js\"\n\nexport { CHAIN_TO_FIREBLOCKS_ASSET }\n\nexport interface FireblocksConfig {\n apiKey: string\n apiSecret: string\n vaultId: string\n assetId?: string\n baseUrl?: string\n maxPollAttempts?: number\n}\n\nconst FIREBLOCKS_API_BASE = \"https://api.fireblocks.io\"\n\nexport class FireblocksAdapter implements WalletAdapter {\n readonly name = \"fireblocks\"\n readonly capabilities: WalletCapabilities = {\n signMessage: true,\n signTypedData: true,\n managedGas: true,\n managedNonce: true,\n }\n onRequest?: (method: string, params: unknown) => void\n onResponse?: (method: string, result: unknown, durationMs: number) => void\n private config: FireblocksConfig\n private cachedAddress?: string\n\n constructor(config: FireblocksConfig) {\n this.config = config\n }\n\n static fromEnv(): FireblocksAdapter {\n const apiKey = process.env.FIREBLOCKS_API_KEY\n const apiSecret = process.env.FIREBLOCKS_API_SECRET\n const vaultId = process.env.FIREBLOCKS_VAULT_ID\n\n if (!apiKey) {\n throw new Error(\"FIREBLOCKS_API_KEY environment variable is required\")\n }\n if (!apiSecret) {\n throw new Error(\"FIREBLOCKS_API_SECRET environment variable is required\")\n }\n if (!vaultId) {\n throw new Error(\"FIREBLOCKS_VAULT_ID environment variable is required\")\n }\n\n const maxPollAttempts = process.env.FIREBLOCKS_MAX_POLL_ATTEMPTS\n ? Number.parseInt(process.env.FIREBLOCKS_MAX_POLL_ATTEMPTS, 10)\n : undefined\n\n return new FireblocksAdapter({\n apiKey,\n apiSecret,\n vaultId,\n assetId: process.env.FIREBLOCKS_ASSET_ID,\n baseUrl: process.env.FIREBLOCKS_API_BASE_URL,\n maxPollAttempts,\n })\n }\n\n private get baseUrl(): string {\n return this.config.baseUrl ?? FIREBLOCKS_API_BASE\n }\n\n private async createJwt(path: string, bodyHash: string): Promise<string> {\n const now = Math.floor(Date.now() / 1000)\n\n const header = { alg: \"RS256\", typ: \"JWT\" }\n const payload = {\n uri: path,\n nonce: crypto.randomUUID(),\n iat: now,\n exp: now + 30,\n sub: this.config.apiKey,\n bodyHash,\n }\n\n const b64url = (obj: unknown) =>\n Buffer.from(JSON.stringify(obj)).toString(\"base64url\")\n\n const unsigned = `${b64url(header)}.${b64url(payload)}`\n\n const key = await crypto.subtle.importKey(\n \"pkcs8\",\n this.pemToBuffer(this.config.apiSecret),\n { name: \"RSASSA-PKCS1-v1_5\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n )\n\n const sig = await crypto.subtle.sign(\n \"RSASSA-PKCS1-v1_5\",\n key,\n new TextEncoder().encode(unsigned),\n )\n\n return `${unsigned}.${Buffer.from(sig).toString(\"base64url\")}`\n }\n\n private pemToBuffer(pem: string): ArrayBuffer {\n const lines = pem\n .replace(/-----BEGIN .*-----/, \"\")\n .replace(/-----END .*-----/, \"\")\n .replace(/\\s/g, \"\")\n const buf = Buffer.from(lines, \"base64\")\n return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength)\n }\n\n private async hashBody(body: string): Promise<string> {\n const hash = await crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(body),\n )\n return Buffer.from(hash).toString(\"hex\")\n }\n\n private resolveAssetId(chainId: number): string {\n if (this.config.assetId) return this.config.assetId\n const asset = CHAIN_TO_FIREBLOCKS_ASSET[chainId]\n if (!asset) {\n throw new Error(\n `No Fireblocks asset ID mapping for chain ${chainId}. ` +\n `Set FIREBLOCKS_ASSET_ID explicitly or use a supported chain: ${Object.keys(CHAIN_TO_FIREBLOCKS_ASSET).join(\", \")}`,\n )\n }\n return asset\n }\n\n async getAddress(): Promise<string> {\n if (this.cachedAddress) return this.cachedAddress\n\n const assetId = this.config.assetId ?? \"ETH\"\n const path = `/v1/vault/accounts/${this.config.vaultId}/${assetId}/addresses`\n const bodyHash = await this.hashBody(\"\")\n const jwt = await this.createJwt(path, bodyHash)\n\n const response = await fetch(`${this.baseUrl}${path}`, {\n headers: {\n \"X-API-Key\": this.config.apiKey,\n Authorization: `Bearer ${jwt}`,\n },\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(\n `Fireblocks getAddress failed (${response.status}): ${body}`,\n )\n }\n\n const data = (await response.json()) as { address: string }[]\n if (!data[0]?.address) {\n throw new Error(\"Fireblocks returned no addresses for vault\")\n }\n this.cachedAddress = data[0].address\n return data[0].address\n }\n\n async getWalletInfo(): Promise<WalletInfo> {\n const address = await this.getAddress()\n return {\n provider: \"fireblocks\",\n address,\n vaultId: this.config.vaultId,\n roleIntrospectable: false,\n }\n }\n\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResult> {\n this.onRequest?.(\"sendTransaction\", tx)\n const startTime = Date.now()\n\n const assetId = this.resolveAssetId(tx.chainId)\n const path = \"/v1/transactions\"\n\n const requestBody = {\n assetId,\n operation: \"CONTRACT_CALL\",\n source: {\n type: \"VAULT_ACCOUNT\",\n id: this.config.vaultId,\n },\n destination: {\n type: \"ONE_TIME_ADDRESS\",\n oneTimeAddress: { address: tx.to },\n },\n amount: tx.value === \"0\" ? \"0\" : tx.value,\n extraParameters: {\n contractCallData: tx.data,\n },\n }\n\n const bodyStr = JSON.stringify(requestBody)\n const bodyHash = await this.hashBody(bodyStr)\n const jwt = await this.createJwt(path, bodyHash)\n\n const response = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": this.config.apiKey,\n Authorization: `Bearer ${jwt}`,\n },\n body: bodyStr,\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(\n `Fireblocks sendTransaction failed (${response.status}): ${body}`,\n )\n }\n\n const data = (await response.json()) as { id: string; txHash?: string }\n\n if (data.txHash) {\n const result = { hash: data.txHash }\n this.onResponse?.(\"sendTransaction\", result, Date.now() - startTime)\n return result\n }\n\n const result = await this.waitForTransaction(data.id)\n this.onResponse?.(\"sendTransaction\", result, Date.now() - startTime)\n return result\n }\n\n async signMessage(request: SignMessageRequest): Promise<string> {\n this.onRequest?.(\"signMessage\", request)\n const startTime = Date.now()\n\n const hash = Buffer.from(hashPersonalMessage(request.message)).toString(\n \"hex\",\n )\n const signature = await this.signRawMessage(hash)\n this.onResponse?.(\"signMessage\", signature, Date.now() - startTime)\n return signature\n }\n\n async signTypedData(request: SignTypedDataRequest): Promise<string> {\n this.onRequest?.(\"signTypedData\", request)\n const startTime = Date.now()\n\n const hash = Buffer.from(\n hashTypedData(\n request.domain,\n request.primaryType,\n request.message,\n request.types as Record<string, Array<{ name: string; type: string }>>,\n ),\n ).toString(\"hex\")\n const signature = await this.signRawMessage(hash)\n this.onResponse?.(\"signTypedData\", signature, Date.now() - startTime)\n return signature\n }\n\n private async signRawMessage(hashHex: string): Promise<string> {\n const path = \"/v1/transactions\"\n const requestBody = {\n assetId: this.config.assetId ?? \"ETH\",\n operation: \"RAW\",\n source: {\n type: \"VAULT_ACCOUNT\",\n id: this.config.vaultId,\n },\n extraParameters: {\n rawMessageData: {\n messages: [\n {\n content: hashHex,\n },\n ],\n },\n },\n }\n\n const bodyStr = JSON.stringify(requestBody)\n const bodyHash = await this.hashBody(bodyStr)\n const jwt = await this.createJwt(path, bodyHash)\n\n const response = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-API-Key\": this.config.apiKey,\n Authorization: `Bearer ${jwt}`,\n },\n body: bodyStr,\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(\n `Fireblocks signRawMessage failed (${response.status}): ${body}`,\n )\n }\n\n const data = (await response.json()) as { id: string }\n return this.waitForSignature(data.id)\n }\n\n private async waitForSignature(txId: string): Promise<string> {\n const maxAttempts = this.config.maxPollAttempts ?? 60\n const pollIntervalMs = 2000\n\n for (let i = 0; i < maxAttempts; i++) {\n const path = `/v1/transactions/${txId}`\n const bodyHash = await this.hashBody(\"\")\n const jwt = await this.createJwt(path, bodyHash)\n\n const response = await fetch(`${this.baseUrl}${path}`, {\n headers: {\n \"X-API-Key\": this.config.apiKey,\n Authorization: `Bearer ${jwt}`,\n },\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(\n `Fireblocks signature poll failed (${response.status}): ${body}`,\n )\n }\n\n const data = (await response.json()) as {\n status: string\n signedMessages?: Array<{\n signature: { r: string; s: string; v: number }\n }>\n }\n\n if (data.status === \"COMPLETED\" && data.signedMessages?.[0]) {\n const { r, s, v } = data.signedMessages[0].signature\n const rHex = r.padStart(64, \"0\")\n const sHex = s.padStart(64, \"0\")\n // Fireblocks RAW op returns recovery bit (0 or 1); Ethereum expects 27 or 28.\n const vHex = (v + 27).toString(16).padStart(2, \"0\")\n return `0x${rHex}${sHex}${vHex}`\n }\n\n if (\n data.status === \"FAILED\" ||\n data.status === \"REJECTED\" ||\n data.status === \"CANCELLED\" ||\n data.status === \"BLOCKED\"\n ) {\n throw new Error(\n `Fireblocks signing ${txId} ended with status: ${data.status}`,\n )\n }\n\n await new Promise(resolve => setTimeout(resolve, pollIntervalMs))\n }\n\n throw new Error(\n `Fireblocks signing ${txId} did not complete within ${(maxAttempts * pollIntervalMs) / 1000}s`,\n )\n }\n\n private async waitForTransaction(txId: string): Promise<TransactionResult> {\n const maxAttempts = this.config.maxPollAttempts ?? 60\n const pollIntervalMs = 2000\n\n for (let i = 0; i < maxAttempts; i++) {\n const path = `/v1/transactions/${txId}`\n const bodyHash = await this.hashBody(\"\")\n const jwt = await this.createJwt(path, bodyHash)\n\n const response = await fetch(`${this.baseUrl}${path}`, {\n headers: {\n \"X-API-Key\": this.config.apiKey,\n Authorization: `Bearer ${jwt}`,\n },\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(`Fireblocks poll failed (${response.status}): ${body}`)\n }\n\n const data = (await response.json()) as {\n status: string\n txHash?: string\n }\n\n if (data.status === \"COMPLETED\" && data.txHash) {\n return { hash: data.txHash }\n }\n\n if (\n data.status === \"FAILED\" ||\n data.status === \"REJECTED\" ||\n data.status === \"CANCELLED\" ||\n data.status === \"BLOCKED\"\n ) {\n throw new Error(\n `Fireblocks transaction ${txId} ended with status: ${data.status}`,\n )\n }\n\n await new Promise(resolve => setTimeout(resolve, pollIntervalMs))\n }\n\n throw new Error(\n `Fireblocks transaction ${txId} did not complete within ${(maxAttempts * pollIntervalMs) / 1000}s`,\n )\n }\n}\n","/**\n * Private key wallet adapter.\n *\n * Signs and sends transactions using a raw private key with secp256k1.\n *\n * Intended for development and testing. For production use, prefer a\n * managed wallet provider (Privy, Turnkey, Fireblocks).\n *\n * Required environment variables:\n * PRIVATE_KEY — Hex-encoded private key (with or without 0x prefix)\n *\n * Optional:\n * RPC_URL — JSON-RPC endpoint for broadcasting and gas estimation\n * (required only when sending transactions)\n * WALLET_ADDRESS — Pre-computed address (skips derivation)\n */\n\nimport { secp256k1 } from \"@noble/curves/secp256k1\"\nimport { keccak_256 } from \"@noble/hashes/sha3.js\"\nimport { bytesToHex as nobleToHex } from \"@noble/hashes/utils.js\"\nimport type {\n SignMessageRequest,\n SignTypedDataRequest,\n TransactionRequest,\n TransactionResult,\n WalletAdapter,\n WalletCapabilities,\n} from \"../types/index.js\"\nimport { hashPersonalMessage, hashTypedData } from \"../util/eip712.js\"\nimport { bytesToHex, hexToBytes, rlpEncodeEip1559Tx } from \"./turnkey.js\"\n\nexport interface PrivateKeyConfig {\n privateKey: string\n rpcUrl?: string\n address?: string\n}\n\nexport class PrivateKeyAdapter implements WalletAdapter {\n readonly name = \"private-key\"\n readonly capabilities: WalletCapabilities = {\n signMessage: true,\n signTypedData: true,\n managedGas: false,\n managedNonce: false,\n }\n onRequest?: (method: string, params: unknown) => void\n onResponse?: (method: string, result: unknown, durationMs: number) => void\n private config: PrivateKeyConfig\n private cachedAddress?: string\n\n constructor(config: PrivateKeyConfig) {\n this.config = config\n this.cachedAddress = config.address\n }\n\n static fromEnv(): PrivateKeyAdapter {\n const privateKey = process.env.PRIVATE_KEY\n const rpcUrl = process.env.RPC_URL\n\n if (!privateKey) {\n throw new Error(\"PRIVATE_KEY environment variable is required\")\n }\n\n const clean = privateKey.startsWith(\"0x\") ? privateKey.slice(2) : privateKey\n if (!/^[0-9a-fA-F]{64}$/.test(clean)) {\n throw new Error(\n \"PRIVATE_KEY must be a 64-character hex string (with or without 0x prefix)\",\n )\n }\n\n return new PrivateKeyAdapter({\n privateKey,\n rpcUrl,\n address: process.env.WALLET_ADDRESS,\n })\n }\n\n getRpcUrl(): string | undefined {\n return this.config.rpcUrl\n }\n\n async getAddress(): Promise<string> {\n if (this.cachedAddress) return this.cachedAddress\n\n const clean = this.config.privateKey.startsWith(\"0x\")\n ? this.config.privateKey.slice(2)\n : this.config.privateKey\n const pubKey = secp256k1.getPublicKey(clean, false)\n // keccak256 of uncompressed pubkey (without 04 prefix) → last 20 bytes\n const hash = keccak_256(pubKey.subarray(1))\n this.cachedAddress = `0x${nobleToHex(hash.subarray(12))}`\n return this.cachedAddress\n }\n\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResult> {\n this.onRequest?.(\"sendTransaction\", tx)\n const startTime = Date.now()\n\n const from = await this.getAddress()\n const rpcUrl = this.config.rpcUrl\n if (!rpcUrl) {\n throw new Error(\n \"RPC_URL is required for sending transactions. Set the RPC_URL environment variable or pass --rpc-url.\",\n )\n }\n\n let nonce: bigint\n let gasLimit: bigint\n let maxFeePerGas: bigint\n let maxPriorityFeePerGas: bigint\n\n if (tx.gas && tx.nonce !== undefined && tx.maxFeePerGas) {\n nonce = BigInt(tx.nonce)\n gasLimit = BigInt(tx.gas)\n maxFeePerGas = BigInt(tx.maxFeePerGas)\n maxPriorityFeePerGas = tx.maxPriorityFeePerGas\n ? BigInt(tx.maxPriorityFeePerGas)\n : 1_500_000_000n\n } else {\n const txValue =\n tx.value === \"0\" ? \"0x0\" : `0x${BigInt(tx.value).toString(16)}`\n\n const [nonceResult, gasEstimateResult, feeDataResult] = await Promise.all(\n [\n this.rpcCall(rpcUrl, \"eth_getTransactionCount\", [from, \"pending\"]),\n this.rpcCall(rpcUrl, \"eth_estimateGas\", [\n { from, to: tx.to, data: tx.data || \"0x\", value: txValue },\n ]),\n this.rpcCall(rpcUrl, \"eth_feeHistory\", [1, \"latest\", [50]]),\n ],\n )\n\n nonce = BigInt(nonceResult as string)\n const rawGas = BigInt(gasEstimateResult as string)\n gasLimit = (rawGas * 120n) / 100n\n\n const feeHistory = feeDataResult as {\n baseFeePerGas: string[]\n reward?: string[][]\n }\n const latestBaseFee = BigInt(\n feeHistory.baseFeePerGas[1] ?? feeHistory.baseFeePerGas[0],\n )\n maxPriorityFeePerGas = feeHistory.reward?.[0]?.[0]\n ? BigInt(feeHistory.reward[0][0])\n : 1_500_000_000n\n maxFeePerGas = latestBaseFee * 2n + maxPriorityFeePerGas\n }\n\n // RLP-encode unsigned EIP-1559 tx (includes 0x02 type prefix)\n const unsignedHex = rlpEncodeEip1559Tx({\n chainId: tx.chainId,\n nonce,\n maxPriorityFeePerGas,\n maxFeePerGas,\n gasLimit,\n to: tx.to,\n data: tx.data,\n value: tx.value,\n })\n\n // Hash the typed envelope for signing\n const unsignedBytes = hexToBytes(unsignedHex)\n const txHash = keccak_256(unsignedBytes)\n\n // Sign with secp256k1 (RFC 6979 deterministic k)\n const clean = this.config.privateKey.startsWith(\"0x\")\n ? this.config.privateKey.slice(2)\n : this.config.privateKey\n const sig = secp256k1.sign(txHash, clean)\n\n // Encode signed tx\n const signedHex = encodeSignedEip1559Tx(\n {\n chainId: tx.chainId,\n nonce,\n maxPriorityFeePerGas,\n maxFeePerGas,\n gasLimit,\n to: tx.to,\n data: tx.data,\n value: tx.value,\n },\n sig.recovery,\n sig.r,\n sig.s,\n )\n\n // Broadcast\n const hash = (await this.rpcCall(rpcUrl, \"eth_sendRawTransaction\", [\n `0x${signedHex}`,\n ])) as string\n\n const result = { hash }\n this.onResponse?.(\"sendTransaction\", result, Date.now() - startTime)\n return result\n }\n\n async signMessage(request: SignMessageRequest): Promise<string> {\n this.onRequest?.(\"signMessage\", request)\n const startTime = Date.now()\n\n const hash = hashPersonalMessage(request.message)\n const clean = this.config.privateKey.startsWith(\"0x\")\n ? this.config.privateKey.slice(2)\n : this.config.privateKey\n const sig = secp256k1.sign(hash, clean)\n const result = encodeEcdsaSignature(sig.r, sig.s, sig.recovery)\n this.onResponse?.(\"signMessage\", result, Date.now() - startTime)\n return result\n }\n\n async signTypedData(request: SignTypedDataRequest): Promise<string> {\n this.onRequest?.(\"signTypedData\", request)\n const startTime = Date.now()\n\n const hash = hashTypedData(\n request.domain,\n request.primaryType,\n request.message,\n request.types as Record<string, Array<{ name: string; type: string }>>,\n )\n const clean = this.config.privateKey.startsWith(\"0x\")\n ? this.config.privateKey.slice(2)\n : this.config.privateKey\n const sig = secp256k1.sign(hash, clean)\n const result = encodeEcdsaSignature(sig.r, sig.s, sig.recovery)\n this.onResponse?.(\"signTypedData\", result, Date.now() - startTime)\n return result\n }\n\n private async rpcCall(\n rpcUrl: string,\n method: string,\n params: unknown[],\n ): Promise<unknown> {\n const response = await fetch(rpcUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ jsonrpc: \"2.0\", id: 1, method, params }),\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(`RPC ${method} failed (${response.status}): ${body}`)\n }\n\n const data = (await response.json()) as {\n result?: unknown\n error?: { message: string }\n }\n\n if (data.error) {\n throw new Error(`RPC ${method} error: ${data.error.message}`)\n }\n\n return data.result\n }\n}\n\nfunction bigIntToMinBytes(value: bigint): Uint8Array {\n if (value === 0n) return new Uint8Array(0)\n const hex = value.toString(16)\n const padded = hex.length % 2 === 0 ? hex : `0${hex}`\n return hexToBytes(padded)\n}\n\nfunction rlpEncodeBytes(bytes: Uint8Array): Uint8Array {\n if (bytes.length === 1 && bytes[0] < 0x80) return bytes\n if (bytes.length === 0) return new Uint8Array([0x80])\n if (bytes.length <= 55) {\n const result = new Uint8Array(1 + bytes.length)\n result[0] = 0x80 + bytes.length\n result.set(bytes, 1)\n return result\n }\n const lenBytes = bigIntToMinBytes(BigInt(bytes.length))\n const result = new Uint8Array(1 + lenBytes.length + bytes.length)\n result[0] = 0xb7 + lenBytes.length\n result.set(lenBytes, 1)\n result.set(bytes, 1 + lenBytes.length)\n return result\n}\n\nfunction rlpEncodeList(items: Uint8Array[]): Uint8Array {\n let totalLen = 0\n for (const item of items) totalLen += item.length\n if (totalLen <= 55) {\n const result = new Uint8Array(1 + totalLen)\n result[0] = 0xc0 + totalLen\n let offset = 1\n for (const item of items) {\n result.set(item, offset)\n offset += item.length\n }\n return result\n }\n const lenBytes = bigIntToMinBytes(BigInt(totalLen))\n const result = new Uint8Array(1 + lenBytes.length + totalLen)\n result[0] = 0xf7 + lenBytes.length\n result.set(lenBytes, 1)\n let offset = 1 + lenBytes.length\n for (const item of items) {\n result.set(item, offset)\n offset += item.length\n }\n return result\n}\n\nfunction encodeSignedEip1559Tx(\n tx: {\n chainId: number\n nonce: bigint\n maxPriorityFeePerGas: bigint\n maxFeePerGas: bigint\n gasLimit: bigint\n to: string\n data: string\n value: string\n },\n v: number,\n r: bigint,\n s: bigint,\n): string {\n const fields = [\n rlpEncodeBytes(bigIntToMinBytes(BigInt(tx.chainId))),\n rlpEncodeBytes(bigIntToMinBytes(tx.nonce)),\n rlpEncodeBytes(bigIntToMinBytes(tx.maxPriorityFeePerGas)),\n rlpEncodeBytes(bigIntToMinBytes(tx.maxFeePerGas)),\n rlpEncodeBytes(bigIntToMinBytes(tx.gasLimit)),\n rlpEncodeBytes(hexToBytes(tx.to)),\n rlpEncodeBytes(\n tx.value === \"0\" ? new Uint8Array(0) : bigIntToMinBytes(BigInt(tx.value)),\n ),\n rlpEncodeBytes(tx.data ? hexToBytes(tx.data) : new Uint8Array(0)),\n rlpEncodeList([]), // empty access list\n rlpEncodeBytes(v === 0 ? new Uint8Array(0) : new Uint8Array([v])),\n rlpEncodeBytes(bigIntToMinBytes(r)),\n rlpEncodeBytes(bigIntToMinBytes(s)),\n ]\n\n const rlpList = rlpEncodeList(fields)\n const signed = new Uint8Array(1 + rlpList.length)\n signed[0] = 0x02\n signed.set(rlpList, 1)\n return bytesToHex(signed)\n}\n\nfunction encodeEcdsaSignature(r: bigint, s: bigint, v: number): string {\n const rHex = r.toString(16).padStart(64, \"0\")\n const sHex = s.toString(16).padStart(64, \"0\")\n const vHex = (v + 27).toString(16).padStart(2, \"0\")\n return `0x${rHex}${sHex}${vHex}`\n}\n","/**\n * Turnkey wallet adapter.\n *\n * Uses Turnkey's API to sign and send transactions via HSM-backed\n * signing infrastructure. Authentication uses Turnkey's stamp scheme:\n * each request body is hashed and signed with a P-256 ECDSA key.\n *\n * # Security model\n *\n * This adapter is **signing-only by design.** It exposes only the\n * primitives an agent needs to sign transactions and read user\n * metadata: `getAddress`, `sendTransaction`, `signMessage`,\n * `signTypedData`, and `getWalletInfo`. Future contributors: **do not\n * add `createPolicy`, `deletePolicy`, `createApiKeys`, `updateUser`,\n * `exportWallet`, or any other administrative activity submission to\n * this adapter.** If they exist, an agent will find and use them.\n *\n * Effective hardening requires creating the API user as a **non-root\n * user** with a tightly scoped sign-only policy:\n *\n * 1. Root users in Turnkey bypass the policy engine entirely. A\n * leaked root-user API key has the same blast radius as a raw\n * private key — it can sign anything, mutate any policy, mint new\n * wallets, and export keys. Do not use a root user as the agent's\n * API user.\n *\n * 2. Create a non-root API user, then attach a policy that allows\n * only `ACTIVITY_TYPE_SIGN_TRANSACTION_V2` (and\n * `ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2` if EIP-712 is needed) for\n * the wallet addresses the agent should be able to sign for.\n * Default-deny on everything else; Turnkey policies default to\n * deny so this is mostly a matter of writing the allowlist.\n *\n * 3. Note that Turnkey policies are stateless per-activity\n * evaluators — they cannot enforce aggregate (daily/weekly) caps.\n * Use the hot/cold wallet float pattern documented in\n * `packages/skill/opensea-wallet/references/wallet-funding.md`\n * for aggregate ceilings.\n *\n * `getWalletInfo()` calls `whoami` and `get_organization` to surface\n * whether the API user is in the root quorum, so `opensea wallet info`\n * can warn loudly if the agent is running as root.\n *\n * Required environment variables:\n * TURNKEY_API_PUBLIC_KEY — Turnkey API public key (hex-encoded)\n * TURNKEY_API_PRIVATE_KEY — Turnkey API private key (hex-encoded P-256)\n * TURNKEY_ORGANIZATION_ID — Turnkey organization ID\n * TURNKEY_WALLET_ADDRESS — Ethereum address managed by Turnkey\n * TURNKEY_RPC_URL — RPC endpoint for gas estimation and broadcast\n *\n * Optional:\n * TURNKEY_API_BASE_URL — Override the Turnkey API base URL\n * TURNKEY_PRIVATE_KEY_ID — Turnkey private key ID (for signing with a specific key)\n *\n * @see https://docs.turnkey.com/concepts/policies/overview\n * @see https://docs.turnkey.com/concepts/users/best-practices\n */\n\nimport type {\n SignMessageRequest,\n SignTypedDataRequest,\n TransactionRequest,\n TransactionResult,\n WalletAdapter,\n WalletCapabilities,\n WalletInfo,\n} from \"../types/index.js\"\nimport { hashPersonalMessage, hashTypedData } from \"../util/eip712.js\"\n\nexport interface TurnkeyConfig {\n apiPublicKey: string\n apiPrivateKey: string\n organizationId: string\n walletAddress: string\n rpcUrl: string\n privateKeyId?: string\n baseUrl?: string\n}\n\nconst TURNKEY_API_BASE = \"https://api.turnkey.com\"\n\nexport class TurnkeyAdapter implements WalletAdapter {\n readonly name = \"turnkey\"\n readonly capabilities: WalletCapabilities = {\n signMessage: true,\n signTypedData: true,\n managedGas: false,\n managedNonce: false,\n }\n onRequest?: (method: string, params: unknown) => void\n onResponse?: (method: string, result: unknown, durationMs: number) => void\n private config: TurnkeyConfig\n\n constructor(config: TurnkeyConfig) {\n this.config = config\n }\n\n static fromEnv(): TurnkeyAdapter {\n const apiPublicKey = process.env.TURNKEY_API_PUBLIC_KEY\n const apiPrivateKey = process.env.TURNKEY_API_PRIVATE_KEY\n const organizationId = process.env.TURNKEY_ORGANIZATION_ID\n const walletAddress = process.env.TURNKEY_WALLET_ADDRESS\n\n if (!apiPublicKey) {\n throw new Error(\"TURNKEY_API_PUBLIC_KEY environment variable is required\")\n }\n if (!apiPrivateKey) {\n throw new Error(\n \"TURNKEY_API_PRIVATE_KEY environment variable is required\",\n )\n }\n if (!organizationId) {\n throw new Error(\n \"TURNKEY_ORGANIZATION_ID environment variable is required\",\n )\n }\n if (!walletAddress) {\n throw new Error(\"TURNKEY_WALLET_ADDRESS environment variable is required\")\n }\n\n const rpcUrl = process.env.TURNKEY_RPC_URL\n if (!rpcUrl) {\n throw new Error(\n \"TURNKEY_RPC_URL environment variable is required. \" +\n \"It is used for gas estimation and transaction broadcasting.\",\n )\n }\n\n return new TurnkeyAdapter({\n apiPublicKey,\n apiPrivateKey,\n organizationId,\n walletAddress,\n rpcUrl,\n privateKeyId: process.env.TURNKEY_PRIVATE_KEY_ID,\n baseUrl: process.env.TURNKEY_API_BASE_URL,\n })\n }\n\n getRpcUrl(): string {\n return this.config.rpcUrl\n }\n\n private get baseUrl(): string {\n return this.config.baseUrl ?? TURNKEY_API_BASE\n }\n\n private async stamp(body: string): Promise<string> {\n const encoder = new TextEncoder()\n const bodyHash = await crypto.subtle.digest(\"SHA-256\", encoder.encode(body))\n\n const keyData = hexToBytes(this.config.apiPrivateKey)\n const cryptoKey = await crypto.subtle.importKey(\n \"pkcs8\",\n derEncodeP256PrivateKey(keyData),\n { name: \"ECDSA\", namedCurve: \"P-256\" },\n false,\n [\"sign\"],\n )\n\n // WebCrypto ECDSA sign hashes internally, so this signs SHA-256(SHA-256(body)).\n // Turnkey's server verifier expects this — matches packages/cli/src/wallet/turnkey.ts.\n const p1363Sig = await crypto.subtle.sign(\n { name: \"ECDSA\", hash: \"SHA-256\" },\n cryptoKey,\n bodyHash,\n )\n\n const derSig = p1363ToDer(new Uint8Array(p1363Sig))\n const signatureHex = bytesToHex(derSig)\n\n const stampJson = JSON.stringify({\n publicKey: this.config.apiPublicKey,\n scheme: \"SIGNATURE_SCHEME_TK_API_P256\",\n signature: signatureHex,\n })\n\n return Buffer.from(stampJson).toString(\"base64url\")\n }\n\n private async signedRequest(\n path: string,\n body: Record<string, unknown>,\n ): Promise<Response> {\n const bodyStr = JSON.stringify(body)\n const stampValue = await this.stamp(bodyStr)\n\n return fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Stamp\": stampValue,\n },\n body: bodyStr,\n })\n }\n\n async getAddress(): Promise<string> {\n return this.config.walletAddress\n }\n\n async getWalletInfo(): Promise<WalletInfo> {\n const whoamiResponse = await this.signedRequest(\"/public/v1/query/whoami\", {\n organizationId: this.config.organizationId,\n })\n\n if (!whoamiResponse.ok) {\n const body = await whoamiResponse.text()\n throw new Error(\n `Turnkey getWalletInfo whoami failed (${whoamiResponse.status}): ${body}`,\n )\n }\n\n const whoami = (await whoamiResponse.json()) as {\n organizationId: string\n organizationName?: string\n userId: string\n username?: string\n }\n\n const orgResponse = await this.signedRequest(\n \"/public/v1/query/get_organization\",\n { organizationId: this.config.organizationId },\n )\n\n if (!orgResponse.ok) {\n const body = await orgResponse.text()\n throw new Error(\n `Turnkey getWalletInfo get_organization failed (${orgResponse.status}): ${body}`,\n )\n }\n\n const orgData = (await orgResponse.json()) as {\n organizationData?: {\n rootQuorum?: { userIds?: string[] }\n }\n }\n const rootUserIds = orgData.organizationData?.rootQuorum?.userIds ?? []\n\n return {\n provider: \"turnkey\",\n address: this.config.walletAddress,\n organizationId: whoami.organizationId,\n userId: whoami.userId,\n username: whoami.username ?? \"\",\n isRootUser: rootUserIds.includes(whoami.userId),\n }\n }\n\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResult> {\n this.onRequest?.(\"sendTransaction\", tx)\n const startTime = Date.now()\n\n const { rpcUrl } = this.config\n const gasParams = await this.estimateGasParams(rpcUrl, tx)\n\n const rlpHex = rlpEncodeEip1559Tx({\n chainId: tx.chainId,\n nonce: gasParams.nonce,\n maxPriorityFeePerGas: gasParams.maxPriorityFeePerGas,\n maxFeePerGas: gasParams.maxFeePerGas,\n gasLimit: gasParams.gasLimit,\n to: tx.to,\n data: tx.data,\n value: tx.value,\n })\n\n const signWith = this.config.privateKeyId ?? this.config.walletAddress\n\n const response = await this.signedRequest(\n \"/public/v1/submit/sign_transaction\",\n {\n type: \"ACTIVITY_TYPE_SIGN_TRANSACTION_V2\",\n organizationId: this.config.organizationId,\n timestampMs: Date.now().toString(),\n parameters: {\n signWith,\n type: \"TRANSACTION_TYPE_ETHEREUM\",\n unsignedTransaction: rlpHex,\n },\n },\n )\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(\n `Turnkey sendTransaction failed (${response.status}): ${body}`,\n )\n }\n\n const data = (await response.json()) as {\n activity: {\n status: string\n result?: {\n signTransactionResult?: { signedTransaction: string }\n }\n }\n }\n\n const signedTx =\n data.activity.result?.signTransactionResult?.signedTransaction\n if (!signedTx) {\n throw new Error(\n `Turnkey sign transaction did not return a signed payload (activity status: ${data.activity.status})`,\n )\n }\n\n const rpcResponse = await fetch(rpcUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"eth_sendRawTransaction\",\n params: [signedTx],\n }),\n })\n\n if (!rpcResponse.ok) {\n const rpcBody = await rpcResponse.text()\n throw new Error(\n `Turnkey broadcast failed (${rpcResponse.status}): ${rpcBody}`,\n )\n }\n\n const rpcData = (await rpcResponse.json()) as {\n result?: string\n error?: { message: string }\n }\n\n if (rpcData.error) {\n throw new Error(`Turnkey broadcast RPC error: ${rpcData.error.message}`)\n }\n\n if (!rpcData.result) {\n throw new Error(\"Turnkey broadcast returned no tx hash\")\n }\n\n const result = { hash: rpcData.result }\n this.onResponse?.(\"sendTransaction\", result, Date.now() - startTime)\n return result\n }\n\n async signMessage(request: SignMessageRequest): Promise<string> {\n this.onRequest?.(\"signMessage\", request)\n const startTime = Date.now()\n\n const hash = bytesToHex(hashPersonalMessage(request.message))\n const signature = await this.signRawPayload(hash)\n this.onResponse?.(\"signMessage\", signature, Date.now() - startTime)\n return signature\n }\n\n async signTypedData(request: SignTypedDataRequest): Promise<string> {\n this.onRequest?.(\"signTypedData\", request)\n const startTime = Date.now()\n\n const hash = bytesToHex(\n hashTypedData(\n request.domain,\n request.primaryType,\n request.message,\n request.types as Record<string, Array<{ name: string; type: string }>>,\n ),\n )\n const signature = await this.signRawPayload(hash)\n this.onResponse?.(\"signTypedData\", signature, Date.now() - startTime)\n return signature\n }\n\n private async signRawPayload(hashHex: string): Promise<string> {\n const signWith = this.config.privateKeyId ?? this.config.walletAddress\n\n const response = await this.signedRequest(\n \"/public/v1/submit/sign_raw_payload\",\n {\n type: \"ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2\",\n organizationId: this.config.organizationId,\n timestampMs: Date.now().toString(),\n parameters: {\n signWith,\n payload: hashHex,\n encoding: \"PAYLOAD_ENCODING_HEXADECIMAL\",\n hashFunction: \"HASH_FUNCTION_NO_OP\",\n },\n },\n )\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(\n `Turnkey signRawPayload failed (${response.status}): ${body}`,\n )\n }\n\n const data = (await response.json()) as {\n activity: {\n status: string\n result?: {\n signRawPayloadResult?: { r: string; s: string; v: string }\n }\n }\n }\n\n const sigResult = data.activity.result?.signRawPayloadResult\n if (!sigResult) {\n throw new Error(\n `Turnkey sign raw payload did not return a result (status: ${data.activity.status})`,\n )\n }\n\n const r = sigResult.r.padStart(64, \"0\")\n const s = sigResult.s.padStart(64, \"0\")\n const vNum = Number.parseInt(sigResult.v, 16) + 27\n const v = vNum.toString(16).padStart(2, \"0\")\n return `0x${r}${s}${v}`\n }\n\n private async estimateGasParams(\n rpcUrl: string,\n tx: TransactionRequest,\n ): Promise<{\n nonce: bigint\n gasLimit: bigint\n maxFeePerGas: bigint\n maxPriorityFeePerGas: bigint\n }> {\n // Use pre-estimated values if provided by caller (avoids double estimation)\n if (tx.gas && tx.nonce !== undefined && tx.maxFeePerGas) {\n return {\n nonce: BigInt(tx.nonce),\n gasLimit: BigInt(tx.gas),\n maxFeePerGas: BigInt(tx.maxFeePerGas),\n maxPriorityFeePerGas: tx.maxPriorityFeePerGas\n ? BigInt(tx.maxPriorityFeePerGas)\n : 1_500_000_000n,\n }\n }\n\n const from = this.config.walletAddress\n const txValue =\n tx.value === \"0\" ? \"0x0\" : `0x${BigInt(tx.value).toString(16)}`\n\n const [nonceResult, gasEstimateResult, feeDataResult] = await Promise.all([\n this.rpcCall(rpcUrl, \"eth_getTransactionCount\", [from, \"pending\"]),\n this.rpcCall(rpcUrl, \"eth_estimateGas\", [\n {\n from,\n to: tx.to,\n data: tx.data || \"0x\",\n value: txValue,\n },\n ]),\n this.rpcCall(rpcUrl, \"eth_feeHistory\", [1, \"latest\", [50]]),\n ])\n\n const nonce = BigInt(nonceResult as string)\n\n const rawGasLimit = BigInt(gasEstimateResult as string)\n const gasLimit = (rawGasLimit * 120n) / 100n\n\n const feeHistory = feeDataResult as {\n baseFeePerGas: string[]\n reward?: string[][]\n }\n const latestBaseFee = BigInt(\n feeHistory.baseFeePerGas[1] ?? feeHistory.baseFeePerGas[0],\n )\n const maxPriorityFeePerGas = feeHistory.reward?.[0]?.[0]\n ? BigInt(feeHistory.reward[0][0])\n : 1_500_000_000n\n\n const maxFeePerGas = latestBaseFee * 2n + maxPriorityFeePerGas\n\n return { nonce, gasLimit, maxFeePerGas, maxPriorityFeePerGas }\n }\n\n private async rpcCall(\n rpcUrl: string,\n method: string,\n params: unknown[],\n ): Promise<unknown> {\n const response = await fetch(rpcUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method,\n params,\n }),\n })\n\n if (!response.ok) {\n const body = await response.text()\n throw new Error(\n `Turnkey RPC ${method} failed (${response.status}): ${body}`,\n )\n }\n\n const data = (await response.json()) as {\n result?: unknown\n error?: { message: string }\n }\n\n if (data.error) {\n throw new Error(`Turnkey RPC ${method} error: ${data.error.message}`)\n }\n\n return data.result\n }\n}\n\n/**\n * RLP-encode an unsigned EIP-1559 (type 2) transaction.\n * Returns hex string without 0x prefix, as expected by Turnkey.\n */\nexport function rlpEncodeEip1559Tx(tx: {\n chainId: number\n nonce: bigint\n maxPriorityFeePerGas: bigint\n maxFeePerGas: bigint\n gasLimit: bigint\n to: string\n data: string\n value: string\n}): string {\n const chainIdBytes = bigIntToBytes(BigInt(tx.chainId))\n const nonce = bigIntToBytes(tx.nonce)\n const maxPriorityFeePerGas = bigIntToBytes(tx.maxPriorityFeePerGas)\n const maxFeePerGas = bigIntToBytes(tx.maxFeePerGas)\n const gasLimit = bigIntToBytes(tx.gasLimit)\n const toBytes = hexToBytes(tx.to)\n const valueBytes =\n tx.value === \"0\" ? new Uint8Array(0) : bigIntToBytes(BigInt(tx.value))\n const dataBytes = tx.data ? hexToBytes(tx.data) : new Uint8Array(0)\n\n const fields = [\n rlpEncodeBytes(chainIdBytes),\n rlpEncodeBytes(nonce),\n rlpEncodeBytes(maxPriorityFeePerGas),\n rlpEncodeBytes(maxFeePerGas),\n rlpEncodeBytes(gasLimit),\n rlpEncodeBytes(toBytes),\n rlpEncodeBytes(valueBytes),\n rlpEncodeBytes(dataBytes),\n rlpEncodeList([]),\n ]\n\n const rlpList = rlpEncodeList(fields)\n\n const result = new Uint8Array(1 + rlpList.length)\n result[0] = 0x02\n result.set(rlpList, 1)\n\n return bytesToHex(result)\n}\n\nfunction rlpEncodeBytes(bytes: Uint8Array): Uint8Array {\n if (bytes.length === 1 && bytes[0] < 0x80) {\n return bytes\n }\n if (bytes.length === 0) {\n return new Uint8Array([0x80])\n }\n if (bytes.length <= 55) {\n const result = new Uint8Array(1 + bytes.length)\n result[0] = 0x80 + bytes.length\n result.set(bytes, 1)\n return result\n }\n const lenBytes = bigIntToBytes(BigInt(bytes.length))\n const result = new Uint8Array(1 + lenBytes.length + bytes.length)\n result[0] = 0xb7 + lenBytes.length\n result.set(lenBytes, 1)\n result.set(bytes, 1 + lenBytes.length)\n return result\n}\n\nfunction rlpEncodeList(items: Uint8Array[]): Uint8Array {\n let totalLen = 0\n for (const item of items) totalLen += item.length\n\n if (totalLen <= 55) {\n const result = new Uint8Array(1 + totalLen)\n result[0] = 0xc0 + totalLen\n let offset = 1\n for (const item of items) {\n result.set(item, offset)\n offset += item.length\n }\n return result\n }\n\n const lenBytes = bigIntToBytes(BigInt(totalLen))\n const result = new Uint8Array(1 + lenBytes.length + totalLen)\n result[0] = 0xf7 + lenBytes.length\n result.set(lenBytes, 1)\n let offset = 1 + lenBytes.length\n for (const item of items) {\n result.set(item, offset)\n offset += item.length\n }\n return result\n}\n\nfunction bigIntToBytes(value: bigint): Uint8Array {\n if (value === 0n) return new Uint8Array(0)\n const hex = value.toString(16)\n const padded = hex.length % 2 === 0 ? hex : `0${hex}`\n return hexToBytes(padded)\n}\n\nexport function hexToBytes(hex: string): Uint8Array {\n const clean = hex.startsWith(\"0x\") ? hex.slice(2) : hex\n const bytes = new Uint8Array(clean.length / 2)\n for (let i = 0; i < clean.length; i += 2) {\n bytes[i / 2] = Number.parseInt(clean.slice(i, i + 2), 16)\n }\n return bytes\n}\n\nexport function bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map(b => b.toString(16).padStart(2, \"0\"))\n .join(\"\")\n}\n\n/**\n * Convert an ECDSA signature from IEEE P1363 format (raw r||s) to DER encoding.\n */\nexport function p1363ToDer(p1363: Uint8Array): Uint8Array {\n const r = p1363.subarray(0, 32)\n const s = p1363.subarray(32, 64)\n\n const rDer = integerToDer(r)\n const sDer = integerToDer(s)\n\n const seqLen = rDer.length + sDer.length\n const result = new Uint8Array(2 + seqLen)\n result[0] = 0x30\n result[1] = seqLen\n result.set(rDer, 2)\n result.set(sDer, 2 + rDer.length)\n return result\n}\n\nfunction integerToDer(bytes: Uint8Array): Uint8Array {\n let start = 0\n while (start < bytes.length - 1 && bytes[start] === 0) start++\n const stripped = bytes.subarray(start)\n\n const needsPad = stripped[0] >= 0x80\n const len = stripped.length + (needsPad ? 1 : 0)\n\n const result = new Uint8Array(2 + len)\n result[0] = 0x02\n result[1] = len\n if (needsPad) {\n result[2] = 0x00\n result.set(stripped, 3)\n } else {\n result.set(stripped, 2)\n }\n return result\n}\n\nfunction derEncodeP256PrivateKey(rawKey: Uint8Array): ArrayBuffer {\n const header = new Uint8Array([\n 0x30, 0x41, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48,\n 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03,\n 0x01, 0x07, 0x04, 0x27, 0x30, 0x25, 0x02, 0x01, 0x01, 0x04, 0x20,\n ])\n\n const result = new Uint8Array(header.length + rawKey.length)\n result.set(header)\n result.set(rawKey, header.length)\n return result.buffer\n}\n","/**\n * Privy wallet adapter.\n *\n * Uses Privy's server-side wallet API to sign and send transactions.\n * Transactions are governed by Privy's programmable policy engine —\n * policies are evaluated in a trusted execution environment before signing.\n *\n * # Security model\n *\n * This adapter is **signing-only by design.** It exposes only the\n * primitives an agent needs to sign transactions and read wallet\n * metadata: `getAddress`, `sendTransaction`, `signMessage`,\n * `signTypedData`, and `getWalletInfo`. It deliberately does not, and\n * should not, expose policy mutation, owner-key rotation, additional-\n * signer changes, key export, or wallet deletion. Future contributors:\n * **do not add `setPolicy`, `rotateOwner`, `addSigner`, or similar\n * mutation methods to this adapter.** If they exist, an agent will find\n * and use them — including raising its own spending cap.\n *\n * Effective hardening requires Privy-side configuration in addition to\n * this adapter's defaults:\n *\n * 1. Create the wallet with an `owner_id` (a key quorum). The owner's\n * private key MUST live outside the agent environment — on a\n * trusted operator machine, in a hardware wallet, or in a separate\n * vault. The owner gates all `PATCH /v1/wallets/{id}` and similar\n * administrative operations.\n *\n * 2. Register the agent's signing key as an `additional_signer` on the\n * wallet, with `override_policy_ids` set to the policy you want\n * the agent to be subject to. The agent's signing key may live in\n * env (`PRIVY_AUTH_SIGNING_KEY`) — it has signing power but cannot\n * mutate policy, signers, or owner.\n *\n * 3. Apply a Privy policy that caps per-tx spend, allowlists\n * contracts, and restricts chains. Policies are stateless per-tx\n * evaluators — they cannot enforce aggregate (daily/weekly)\n * caps. Use the hot/cold wallet float pattern documented in\n * `packages/skill/opensea-wallet/references/wallet-funding.md`\n * for aggregate ceilings.\n *\n * Required environment variables:\n * PRIVY_APP_ID — Privy application ID\n * PRIVY_APP_SECRET — Privy application secret\n * PRIVY_WALLET_ID — Wallet ID to use for signing\n *\n * Optional:\n * PRIVY_API_BASE_URL — Override the Privy API base URL\n * PRIVY_AUTH_SIGNING_KEY — Base64-encoded PKCS8 P-256 private key for\n * an `additional_signer` on this wallet. When\n * set, the adapter signs every POST /rpc\n * request with it and attaches the\n * `privy-authorization-signature` header.\n * Required when the wallet has an `owner_id`\n * set; ignored when it does not.\n *\n * @see https://docs.privy.io/wallets/wallets\n * @see https://docs.privy.io/controls/policies/overview\n * @see https://docs.privy.io/controls/authorization-keys/overview\n */\n\nimport type {\n SignMessageRequest,\n SignTypedDataRequest,\n TransactionRequest,\n TransactionResult,\n WalletAdapter,\n WalletCapabilities,\n WalletInfo,\n} from \"../types/index.js\"\n\nexport interface PrivyConfig {\n appId: string\n appSecret: string\n walletId: string\n baseUrl?: string\n /**\n * Optional base64-encoded PKCS8 P-256 authorization private key.\n * When set, every POST /v1/wallets/{id}/rpc request is signed with it\n * and the resulting signature is attached as\n * `privy-authorization-signature`. Use this when the wallet has an\n * `owner_id` configured and the agent's key is registered as an\n * `additional_signer`.\n */\n authSigningKey?: string\n}\n\nconst PRIVY_API_BASE = \"https://api.privy.io\"\n\nconst PRIVY_401_ECHO_HINT =\n \" (hint: if you're verifying credentials via curl, use \" +\n `'printf %s \"$PRIVY_APP_ID:$PRIVY_APP_SECRET\" | base64' — ` +\n \"'echo' adds a trailing newline that breaks basic auth)\"\n\ninterface PrivyWalletResponse {\n id: string\n address: string\n chain_type: string\n policy_ids?: string[]\n owner_id?: string | null\n additional_signers?: Array<{ signer_id: string }>\n}\n\nexport class PrivyAdapter implements WalletAdapter {\n readonly name = \"privy\"\n readonly capabilities: WalletCapabilities = {\n signMessage: true,\n signTypedData: true,\n managedGas: true,\n managedNonce: true,\n }\n onRequest?: (method: string, params: unknown) => void\n onResponse?: (method: string, result: unknown, durationMs: number) => void\n private config: PrivyConfig\n private cachedAddress?: string\n\n constructor(config: PrivyConfig) {\n this.config = config\n }\n\n static fromEnv(): PrivyAdapter {\n const appId = process.env.PRIVY_APP_ID\n const appSecret = process.env.PRIVY_APP_SECRET\n const walletId = process.env.PRIVY_WALLET_ID\n\n if (!appId) {\n throw new Error(\"PRIVY_APP_ID environment variable is required\")\n }\n if (!appSecret) {\n throw new Error(\"PRIVY_APP_SECRET environment variable is required\")\n }\n if (!walletId) {\n throw new Error(\"PRIVY_WALLET_ID environment variable is required\")\n }\n\n return new PrivyAdapter({\n appId,\n appSecret,\n walletId,\n baseUrl: process.env.PRIVY_API_BASE_URL,\n authSigningKey: process.env.PRIVY_AUTH_SIGNING_KEY,\n })\n }\n\n private get baseUrl(): string {\n return this.config.baseUrl ?? PRIVY_API_BASE\n }\n\n private get basicAuthHeaders(): Record<string, string> {\n const credentials = Buffer.from(\n `${this.config.appId}:${this.config.appSecret}`,\n ).toString(\"base64\")\n return {\n Authorization: `Basic ${credentials}`,\n \"privy-app-id\": this.config.appId,\n \"Content-Type\": \"application/json\",\n }\n }\n\n /**\n * Build headers for a POST /rpc call, including the authorization\n * signature when `authSigningKey` is configured. Lazy-imports\n * `@privy-io/node` so users who don't enable auth-key signing don't\n * need the optional peer dependency installed.\n */\n private async rpcHeaders(\n body: Record<string, unknown>,\n rpcUrl: string,\n ): Promise<Record<string, string>> {\n const headers = { ...this.basicAuthHeaders }\n if (!this.config.authSigningKey) return headers\n\n let generateAuthorizationSignature: typeof import(\"@privy-io/node\").generateAuthorizationSignature\n try {\n ;({ generateAuthorizationSignature } = await import(\"@privy-io/node\"))\n } catch (cause) {\n throw new Error(\n \"PRIVY_AUTH_SIGNING_KEY is set but @privy-io/node is not installed. \" +\n \"Install it with `pnpm add @privy-io/node` (or your package manager equivalent).\",\n { cause: cause as Error },\n )\n }\n\n const signature = generateAuthorizationSignature({\n authorizationPrivateKey: this.config.authSigningKey,\n input: {\n version: 1,\n method: \"POST\",\n url: rpcUrl,\n body,\n headers: { \"privy-app-id\": this.config.appId },\n },\n })\n headers[\"privy-authorization-signature\"] = signature\n return headers\n }\n\n async getAddress(): Promise<string> {\n if (this.cachedAddress) return this.cachedAddress\n\n const response = await fetch(\n `${this.baseUrl}/v1/wallets/${this.config.walletId}`,\n { headers: this.basicAuthHeaders },\n )\n\n if (!response.ok) {\n const body = await response.text()\n const hint =\n response.status === 401 && body.includes(\"Invalid app ID or app secret\")\n ? PRIVY_401_ECHO_HINT\n : \"\"\n throw new Error(\n `Privy getAddress failed (${response.status}): ${body}${hint}`,\n )\n }\n\n const data = (await response.json()) as PrivyWalletResponse\n this.cachedAddress = data.address\n return data.address\n }\n\n async getWalletInfo(): Promise<WalletInfo> {\n const response = await fetch(\n `${this.baseUrl}/v1/wallets/${this.config.walletId}`,\n { headers: this.basicAuthHeaders },\n )\n\n if (!response.ok) {\n const body = await response.text()\n const hint =\n response.status === 401 && body.includes(\"Invalid app ID or app secret\")\n ? PRIVY_401_ECHO_HINT\n : \"\"\n throw new Error(\n `Privy getWalletInfo failed (${response.status}): ${body}${hint}`,\n )\n }\n\n const data = (await response.json()) as PrivyWalletResponse\n // Same endpoint as getAddress(); seed the cache so a follow-up\n // getAddress() call (common in `wallet info` flows) doesn't re-fetch.\n this.cachedAddress = data.address\n const ownerKeyId = data.owner_id ?? null\n return {\n provider: \"privy\",\n address: data.address,\n chainType: data.chain_type,\n policyIds: data.policy_ids ?? [],\n ownerKeyId,\n additionalSignerCount: data.additional_signers?.length ?? 0,\n ownerEnforcesAuthKey: ownerKeyId !== null,\n }\n }\n\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResult> {\n this.onRequest?.(\"sendTransaction\", tx)\n const startTime = Date.now()\n\n const caip2 = `eip155:${tx.chainId}`\n const rpcUrl = `${this.baseUrl}/v1/wallets/${this.config.walletId}/rpc`\n\n const body = {\n method: \"eth_sendTransaction\",\n caip2,\n params: {\n transaction: {\n to: tx.to,\n data: tx.data,\n value: tx.value,\n },\n },\n }\n\n const response = await fetch(rpcUrl, {\n method: \"POST\",\n headers: await this.rpcHeaders(body, rpcUrl),\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n const responseBody = await response.text()\n throw new Error(\n `Privy sendTransaction failed (${response.status}): ${responseBody}`,\n )\n }\n\n const data = (await response.json()) as { data: { hash: string } }\n const result = { hash: data.data.hash }\n this.onResponse?.(\"sendTransaction\", result, Date.now() - startTime)\n return result\n }\n\n async signMessage(request: SignMessageRequest): Promise<string> {\n this.onRequest?.(\"signMessage\", request)\n const startTime = Date.now()\n\n const isBytes = typeof request.message !== \"string\"\n const message = isBytes\n ? `0x${Buffer.from(request.message as Uint8Array).toString(\"hex\")}`\n : (request.message as string)\n\n const rpcUrl = `${this.baseUrl}/v1/wallets/${this.config.walletId}/rpc`\n const body = {\n method: \"personal_sign\",\n params: { message, encoding: isBytes ? \"hex\" : \"utf-8\" },\n }\n\n const response = await fetch(rpcUrl, {\n method: \"POST\",\n headers: await this.rpcHeaders(body, rpcUrl),\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n const responseBody = await response.text()\n throw new Error(\n `Privy signMessage failed (${response.status}): ${responseBody}`,\n )\n }\n\n const data = (await response.json()) as { data: { signature: string } }\n this.onResponse?.(\n \"signMessage\",\n data.data.signature,\n Date.now() - startTime,\n )\n return data.data.signature\n }\n\n async signTypedData(request: SignTypedDataRequest): Promise<string> {\n this.onRequest?.(\"signTypedData\", request)\n const startTime = Date.now()\n\n const rpcUrl = `${this.baseUrl}/v1/wallets/${this.config.walletId}/rpc`\n const body = {\n method: \"eth_signTypedData_v4\",\n params: {\n typedData: JSON.stringify({\n domain: request.domain,\n types: request.types,\n primaryType: request.primaryType,\n message: request.message,\n }),\n },\n }\n\n const response = await fetch(rpcUrl, {\n method: \"POST\",\n headers: await this.rpcHeaders(body, rpcUrl),\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n const responseBody = await response.text()\n throw new Error(\n `Privy signTypedData failed (${response.status}): ${responseBody}`,\n )\n }\n\n const data = (await response.json()) as { data: { signature: string } }\n this.onResponse?.(\n \"signTypedData\",\n data.data.signature,\n Date.now() - startTime,\n )\n return data.data.signature\n }\n}\n","/**\n * Auto-detection factory that creates a WalletAdapter based on\n * which environment variables are present.\n *\n * Priority: Privy > Fireblocks > Turnkey > Bankr > PrivateKey\n */\n\nimport { BankrAdapter } from \"./adapters/bankr.js\"\nimport { FireblocksAdapter } from \"./adapters/fireblocks.js\"\nimport { PrivateKeyAdapter } from \"./adapters/private-key.js\"\nimport { PrivyAdapter } from \"./adapters/privy.js\"\nimport { TurnkeyAdapter } from \"./adapters/turnkey.js\"\nimport type { WalletAdapter, WalletProvider } from \"./types/index.js\"\n\nexport function createWalletFromEnv(): WalletAdapter {\n if (process.env.PRIVY_APP_ID && process.env.PRIVY_WALLET_ID) {\n return PrivyAdapter.fromEnv()\n }\n\n if (process.env.FIREBLOCKS_API_KEY && process.env.FIREBLOCKS_VAULT_ID) {\n return FireblocksAdapter.fromEnv()\n }\n\n if (\n process.env.TURNKEY_API_PUBLIC_KEY &&\n process.env.TURNKEY_WALLET_ADDRESS\n ) {\n return TurnkeyAdapter.fromEnv()\n }\n\n if (process.env.BANKR_API_KEY) {\n return BankrAdapter.fromEnv()\n }\n\n if (process.env.PRIVATE_KEY) {\n return PrivateKeyAdapter.fromEnv()\n }\n\n throw new Error(\n \"No wallet provider configured. Set environment variables for one of:\\n\" +\n \" • Privy: PRIVY_APP_ID, PRIVY_APP_SECRET, PRIVY_WALLET_ID\\n\" +\n \" • Fireblocks: FIREBLOCKS_API_KEY, FIREBLOCKS_API_SECRET, FIREBLOCKS_VAULT_ID\\n\" +\n \" • Turnkey: TURNKEY_API_PUBLIC_KEY, TURNKEY_API_PRIVATE_KEY, TURNKEY_ORGANIZATION_ID, TURNKEY_WALLET_ADDRESS, TURNKEY_RPC_URL\\n\" +\n \" • Bankr: BANKR_API_KEY\\n\" +\n \" • PrivateKey: PRIVATE_KEY (optionally RPC_URL for sending transactions)\",\n )\n}\n\nexport function createWalletForProvider(\n provider: WalletProvider,\n): WalletAdapter {\n switch (provider) {\n case \"bankr\":\n return BankrAdapter.fromEnv()\n case \"privy\":\n return PrivyAdapter.fromEnv()\n case \"fireblocks\":\n return FireblocksAdapter.fromEnv()\n case \"turnkey\":\n return TurnkeyAdapter.fromEnv()\n case \"private-key\":\n return PrivateKeyAdapter.fromEnv()\n default:\n throw new Error(`Unknown wallet provider: ${provider}`)\n }\n}\n\nexport function detectProvider(): WalletProvider | null {\n if (process.env.PRIVY_APP_ID && process.env.PRIVY_WALLET_ID) return \"privy\"\n if (process.env.FIREBLOCKS_API_KEY && process.env.FIREBLOCKS_VAULT_ID)\n return \"fireblocks\"\n if (process.env.TURNKEY_API_PUBLIC_KEY && process.env.TURNKEY_WALLET_ADDRESS)\n return \"turnkey\"\n if (process.env.BANKR_API_KEY) return \"bankr\"\n if (process.env.PRIVATE_KEY) return \"private-key\"\n return null\n}\n","/**\n * Core types for the wallet adapter interface.\n *\n * These types define the contract between consumers and wallet providers.\n * Designed to be provider-agnostic and extensible for future signing\n * capabilities (EIP-712, EIP-191, batch transactions, etc.).\n */\n\n/**\n * Provider-shaped wallet metadata used by the `opensea wallet info` CLI\n * command and by callers auditing the security posture of an agent wallet.\n *\n * Each variant surfaces only what the provider's API actually exposes for\n * the calling credentials. Fields whose absence indicates a hardening gap\n * (no on-chain policy enforcement, no off-machine credential gating\n * administrative changes, etc.) are intentionally surfaced as falsy values\n * rather than hidden, so callers can warn the user.\n */\nexport type WalletInfo =\n | {\n provider: \"privy\"\n address: string\n chainType: string\n policyIds: string[]\n ownerKeyId: string | null\n additionalSignerCount: number\n /**\n * True iff the wallet has an `owner_id` set, in which case all\n * `/v1/wallets/{id}/rpc` requests must carry an authorization\n * signature from the owner's key quorum. False means the env app\n * secret can sign and rewrite policy unilaterally.\n */\n ownerEnforcesAuthKey: boolean\n }\n | {\n provider: \"turnkey\"\n address: string\n organizationId: string\n userId: string\n username: string\n /**\n * True iff the calling API user is in the organization's root\n * quorum. Root users bypass Turnkey's policy engine entirely, so a\n * leaked root API key has the same blast radius as a raw private\n * key — sign, mutate, export, all unconstrained.\n */\n isRootUser: boolean\n }\n | {\n provider: \"fireblocks\"\n address: string\n vaultId: string\n /**\n * Fireblocks does not expose API-user role via API. The CLI\n * surfaces a static reminder to verify the role at the console.\n */\n roleIntrospectable: false\n }\n | {\n provider: \"bankr\"\n address: string\n /**\n * Bankr does not expose key-scope flags via API. The CLI surfaces\n * a static reminder to verify scope at bankr.bot/api.\n */\n scopeIntrospectable: false\n }\n\nexport interface TransactionRequest {\n to: string\n data: string\n value: string\n chainId: number\n /** Pre-estimated gas limit (avoids redundant RPC call when provided) */\n gas?: string\n /** Pre-fetched nonce */\n nonce?: number\n maxFeePerGas?: string\n maxPriorityFeePerGas?: string\n}\n\nexport interface TransactionResult {\n hash: string\n}\n\nexport interface SignMessageRequest {\n message: string | Uint8Array\n}\n\nexport interface SignTypedDataRequest {\n domain: Record<string, unknown>\n types: Record<string, Array<{ name: string; type: string }>>\n primaryType: string\n message: Record<string, unknown>\n}\n\n/**\n * Core wallet adapter interface.\n *\n * Implement this interface to add a new wallet provider. At minimum,\n * a provider must support `getAddress()` and `sendTransaction()`.\n * Optional capabilities (message signing, typed data signing) can be\n * declared via the `capabilities` property.\n */\nexport interface WalletAdapter {\n /** Human-readable provider name for logging and error messages */\n readonly name: string\n\n /** Declared capabilities of this adapter */\n readonly capabilities: WalletCapabilities\n\n /** Get the wallet address */\n getAddress(): Promise<string>\n\n /** Sign and send a transaction, returns the tx hash */\n sendTransaction(tx: TransactionRequest): Promise<TransactionResult>\n\n /** Sign a raw message (EIP-191). Throws if not supported. */\n signMessage?(request: SignMessageRequest): Promise<string>\n\n /** Sign EIP-712 typed data. Throws if not supported. */\n signTypedData?(request: SignTypedDataRequest): Promise<string>\n\n /**\n * Read-only metadata about the wallet's security posture. Used by the\n * `opensea wallet info` CLI to surface hardening gaps (no policy, no\n * authorization-key gating, root-user API key, etc.). Optional because\n * not every adapter has a meaningful introspection surface — the\n * private-key adapter, for instance, has nothing to report.\n */\n getWalletInfo?(): Promise<WalletInfo>\n\n /** Optional RPC URL for read operations (gas estimation, nonce, etc.) */\n getRpcUrl?(): string | undefined\n\n /** Optional hook called before each adapter request (for metrics/logging) */\n onRequest?: (method: string, params: unknown) => void\n\n /** Optional hook called after each adapter response (for metrics/logging) */\n onResponse?: (method: string, result: unknown, durationMs: number) => void\n}\n\n/**\n * Declares which optional operations an adapter supports.\n * Consumers can check capabilities before calling optional methods.\n */\nexport interface WalletCapabilities {\n /** Whether signMessage() is supported */\n signMessage: boolean\n /** Whether signTypedData() is supported (EIP-712) */\n signTypedData: boolean\n /** Whether the provider manages gas estimation internally */\n managedGas: boolean\n /** Whether the provider manages nonce internally */\n managedNonce: boolean\n}\n\nexport type WalletProvider =\n | \"privy\"\n | \"turnkey\"\n | \"fireblocks\"\n | \"bankr\"\n | \"private-key\"\n\nexport const WALLET_PROVIDERS: WalletProvider[] = [\n \"privy\",\n \"turnkey\",\n \"fireblocks\",\n \"bankr\",\n \"private-key\",\n]\n"],"mappings":"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","names":["result","keccak_256","hexToBytes","result","offset","keccak_256","hexToBytes","rlpEncodeBytes","result","rlpEncodeList","offset"]}
package/dist/viem.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as viem from 'viem';
2
- import { W as WalletAdapter } from './index-DFTwYt_e.js';
2
+ import { W as WalletAdapter } from './index-jjHnOuwA.js';
3
3
 
4
4
  declare function walletAdapterToViemClient(adapter: WalletAdapter, chain: viem.Chain, rpcUrl?: string): Promise<viem.WalletClient>;
5
5
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opensea/wallet-adapters",
3
- "version": "0.2.1",
3
+ "version": "0.3.1",
4
4
  "type": "module",
5
5
  "description": "Provider-agnostic wallet adapters for signing and sending transactions across managed and local backends",
6
6
  "license": "MIT",
@@ -41,10 +41,14 @@
41
41
  "@noble/curves": "1.9.1"
42
42
  },
43
43
  "peerDependencies": {
44
+ "@privy-io/node": ">=0.16.0",
44
45
  "viem": ">=2.0.0",
45
46
  "ethers": ">=6.0.0"
46
47
  },
47
48
  "peerDependenciesMeta": {
49
+ "@privy-io/node": {
50
+ "optional": true
51
+ },
48
52
  "viem": {
49
53
  "optional": true
50
54
  },
@@ -53,6 +57,7 @@
53
57
  }
54
58
  },
55
59
  "devDependencies": {
60
+ "@privy-io/node": "0.16.0",
56
61
  "@types/node": "22.7.5",
57
62
  "tsup": "8.5.1",
58
63
  "typescript": "6.0.2",