@bronlabs/bron-ethers-signer 1.0.10 → 1.0.13

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.
@@ -36,10 +36,6 @@ interface EIP712TypedData {
36
36
  domain: TypedDataDomain;
37
37
  message: Record<string, unknown>;
38
38
  }
39
- /**
40
- * Bron transaction status
41
- */
42
- type TransactionStatus = 'pending' | 'awaiting-approval' | 'approved' | 'signing' | 'broadcasting' | 'completed' | 'failed' | 'rejected' | 'canceled';
43
39
 
44
40
  /**
45
41
  * Ethers.js compatible signer that uses Bron custody platform for signing operations.
@@ -121,4 +117,4 @@ declare class BronSigner extends AbstractSigner {
121
117
  private pollTransaction;
122
118
  }
123
119
 
124
- export { BronSigner as B, type EIP712TypedData as E, type NetworkMapping as N, type TransactionStatus as T, type BronSignerOptions as a };
120
+ export { BronSigner as B, type EIP712TypedData as E, type NetworkMapping as N, type BronSignerOptions as a };
@@ -36,10 +36,6 @@ interface EIP712TypedData {
36
36
  domain: TypedDataDomain;
37
37
  message: Record<string, unknown>;
38
38
  }
39
- /**
40
- * Bron transaction status
41
- */
42
- type TransactionStatus = 'pending' | 'awaiting-approval' | 'approved' | 'signing' | 'broadcasting' | 'completed' | 'failed' | 'rejected' | 'canceled';
43
39
 
44
40
  /**
45
41
  * Ethers.js compatible signer that uses Bron custody platform for signing operations.
@@ -121,4 +117,4 @@ declare class BronSigner extends AbstractSigner {
121
117
  private pollTransaction;
122
118
  }
123
119
 
124
- export { BronSigner as B, type EIP712TypedData as E, type NetworkMapping as N, type TransactionStatus as T, type BronSignerOptions as a };
120
+ export { BronSigner as B, type EIP712TypedData as E, type NetworkMapping as N, type BronSignerOptions as a };
package/dist/hardhat.cjs CHANGED
@@ -270,13 +270,12 @@ var BronSigner = class _BronSigner extends ethers.AbstractSigner {
270
270
  if (!tx) {
271
271
  throw new Error(`${logPrefix} ${transactionId} not found`);
272
272
  }
273
- const status = tx.status;
274
- if (status === "failed" || status === "rejected" || status === "canceled") {
275
- throw new Error(`${logPrefix} ${transactionId} ${status}`);
276
- }
277
- if (status === "completed") {
273
+ if (tx.status === "completed") {
278
274
  return tx;
279
275
  }
276
+ if (tx.terminatedAt) {
277
+ throw new Error(`${logPrefix} ${transactionId} failed: ${tx.status} ${tx.extra?.description}`);
278
+ }
280
279
  }
281
280
  }
282
281
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/networks.ts","../src/BronSigner.ts","../src/hardhat.ts"],"names":["AbstractSigner","BronClient","randomUUID"],"mappings":"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","file":"hardhat.cjs","sourcesContent":["import type { NetworkMapping } from './types.js';\n\n/**\n * Mapping from EVM chain IDs to Bron network configuration\n */\nexport const NETWORK_MAPPINGS: Record<number, NetworkMapping> = {\n // Mainnets\n 1: { networkId: 'ETH', gasTokenId: 2 }, // Ethereum\n 42161: { networkId: 'ARB', gasTokenId: 7 }, // Arbitrum\n 8453: { networkId: 'BASE', gasTokenId: 8 }, // Base\n 10: { networkId: 'OP', gasTokenId: 6 }, // Optimism\n 56: { networkId: 'BNB', gasTokenId: 9 }, // BNB Chain\n\n // Testnets\n 10006: { networkId: '10006', gasTokenId: 10006 }, // Hoodi ETH\n 11155111: { networkId: '10002', gasTokenId: 10002 }, // Sepolia ETH\n};\n\n/**\n * Get Bron network ID from EVM chain ID\n * @param chainId - EVM chain ID\n * @returns Bron network ID\n * @throws Error if chain ID is not supported\n */\nexport function getNetworkId(chainId: number | bigint): string {\n const id = Number(chainId);\n const mapping = NETWORK_MAPPINGS[id];\n if (!mapping) {\n throw new Error(`Unsupported EVM chainId: ${id}. Supported chains: ${Object.keys(NETWORK_MAPPINGS).join(', ')}`);\n }\n return mapping.networkId;\n}\n\n/**\n * Get Bron gas token asset ID from EVM chain ID\n * @param chainId - EVM chain ID\n * @returns Bron gas token asset ID\n * @throws Error if chain ID is not supported\n */\nexport function getGasTokenId(chainId: number | bigint): number {\n const id = Number(chainId);\n const mapping = NETWORK_MAPPINGS[id];\n if (!mapping) {\n throw new Error(`Unsupported EVM chainId: ${id}. Supported chains: ${Object.keys(NETWORK_MAPPINGS).join(', ')}`);\n }\n return mapping.gasTokenId;\n}\n\n/**\n * Check if a chain ID is supported\n * @param chainId - EVM chain ID\n * @returns true if supported\n */\nexport function isChainSupported(chainId: number | bigint): boolean {\n return Number(chainId) in NETWORK_MAPPINGS;\n}\n\n/**\n * Get all supported chain IDs\n * @returns Array of supported EVM chain IDs\n */\nexport function getSupportedChainIds(): number[] {\n return Object.keys(NETWORK_MAPPINGS).map(Number);\n}\n","import { AbstractSigner, type Provider, type TransactionRequest, type TransactionResponse, type TypedDataDomain, type TypedDataField } from 'ethers';\nimport { randomUUID } from 'node:crypto';\nimport BronClient from '@bronlabs/bron-sdk';\nimport type { FetchFunction } from '@bronlabs/bron-sdk/utils';\nimport { getNetworkId, getGasTokenId } from './networks.js';\nimport type { BronSignerOptions, EIP712TypedData, TransactionStatus } from './types.js';\n\n\nconst POLL_INTERVAL_MS = 3000;\n\n/**\n * Ethers.js compatible signer that uses Bron custody platform for signing operations.\n *\n * @example\n * ```typescript\n * import { BronSigner } from '@bronlabs/bron-ethers-signer';\n * import { ethers } from 'ethers';\n *\n * const provider = new ethers.JsonRpcProvider('https://mainnet.infura.io/v3/...');\n *\n * const signer = new BronSigner({\n * provider,\n * apiKey: process.env.BRON_API_KEY!,\n * workspaceId: process.env.BRON_WORKSPACE_ID!,\n * accountId: process.env.BRON_ACCOUNT_ID!,\n * });\n *\n * // Sign a message\n * const signature = await signer.signMessage('Hello World');\n *\n * // Sign typed data (EIP-712)\n * const typedSignature = await signer.signTypedData(domain, types, value);\n *\n * // Send a transaction\n * const tx = await signer.sendTransaction({ to: '0x...', value: ethers.parseEther('1') });\n * ```\n */\nexport class BronSigner extends AbstractSigner {\n private readonly bronApi: InstanceType<typeof BronClient>;\n private readonly apiKey: string;\n private readonly workspaceId: string;\n private readonly accountId: string;\n private readonly bronApiUrl?: string;\n private readonly fetchFn?: FetchFunction;\n\n constructor(options: BronSignerOptions) {\n super(options.provider);\n\n this.bronApi = new BronClient({\n baseUrl: options.bronApiUrl,\n apiKey: options.apiKey,\n workspaceId: options.workspaceId,\n fetchFn: options.fetchFn\n });\n\n this.apiKey = options.apiKey;\n this.workspaceId = options.workspaceId;\n this.accountId = options.accountId;\n this.bronApiUrl = options.bronApiUrl;\n this.fetchFn = options.fetchFn;\n }\n\n /**\n * Creates a new BronSigner connected to a different provider\n */\n connect(provider: Provider): BronSigner {\n return new BronSigner({\n provider,\n apiKey: this.apiKey,\n workspaceId: this.workspaceId,\n accountId: this.accountId,\n bronApiUrl: this.bronApiUrl,\n fetchFn: this.fetchFn\n });\n }\n\n /**\n * Returns the address associated with this signer's Bron account\n */\n async getAddress(): Promise<string> {\n this.assertProvider();\n\n const { addresses } = await this.bronApi.addresses.getDepositAddresses({\n accountId: this.accountId,\n networkId: await this.getBronNetworkId()\n });\n\n if (!addresses?.length) {\n throw new Error('No deposit addresses found for account');\n }\n\n const address = addresses[0].address;\n if (!address) {\n throw new Error('Deposit address is undefined');\n }\n\n return address;\n }\n\n /**\n * Sends a transaction through Bron custody platform.\n * The transaction will be signed and broadcast by Bron.\n */\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResponse> {\n this.assertProvider();\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-transaction' as any,\n params: {\n assetId: await this.getBronGasTokenId(),\n toAddress: tx.to,\n amount: tx.value,\n data: tx.data\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId) as { transactionId: string };\n const txEvents = await this.bronApi.transactions.getTransactionEvents(completedTx.transactionId);\n const blockchainTxId = txEvents?.events?.[0]?.blockchainTxId;\n\n if (!blockchainTxId) {\n throw new Error('Bron SDK returned no blockchainTxId');\n }\n\n const txResponse = await this.provider!.getTransaction(blockchainTxId);\n if (!txResponse) {\n throw new Error(`Transaction ${blockchainTxId} not found on chain`);\n }\n\n return txResponse;\n }\n\n /**\n * Transaction signing is not supported by BronSigner.\n * Use sendTransaction() instead which handles signing and broadcasting internally.\n * @throws Always throws - use sendTransaction instead\n */\n async signTransaction(_tx: TransactionRequest): Promise<string> {\n throw new Error('signTransaction is not supported by BronSigner. Use sendTransaction instead.');\n }\n\n /**\n * Signs a message using the Bron custody platform.\n * Uses EIP-191 personal_sign format.\n *\n * @param message - The message to sign (string, Buffer, or Uint8Array)\n * @returns The signature as a hex string\n */\n async signMessage(message: string | Uint8Array): Promise<string> {\n this.assertProvider();\n\n const messageHex = this.messageToHex(message);\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-message' as any,\n params: {\n networkId: await this.getBronNetworkId(),\n method: 'eth_sign',\n message: messageHex,\n externalBroadcast: false\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId, 'Signing request');\n const signature = (completedTx as any)._embedded?.currentSigningRequest?.signed?.signature;\n\n if (!signature) {\n throw new Error('Bron SDK returned no signature');\n }\n\n return signature;\n }\n\n /**\n * Signs typed data using EIP-712 standard through Bron custody platform.\n *\n * @param domain - The EIP-712 domain\n * @param types - The type definitions\n * @param value - The data to sign\n * @returns The signature as a hex string\n */\n async signTypedData(\n domain: TypedDataDomain,\n types: Record<string, TypedDataField[]>,\n value: Record<string, unknown>\n ): Promise<string> {\n this.assertProvider();\n\n const typedData = this.buildTypedData(domain, types, value);\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-message' as any,\n params: {\n networkId: await this.getBronNetworkId(),\n method: 'eth_signTypedData_v4',\n version: 'V4', // Required for EIP-712 signing\n message: JSON.stringify(typedData),\n externalBroadcast: false\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId, 'Signing request');\n const signature = (completedTx as any)._embedded?.currentSigningRequest?.signed?.signature;\n\n if (!signature) {\n throw new Error('Bron SDK returned no signature for typed data');\n }\n\n return signature;\n }\n\n // ============================================================\n // Private helpers\n // ============================================================\n\n private assertProvider(): asserts this is { provider: Provider } {\n if (!this.provider) {\n throw new Error('Provider required');\n }\n }\n\n private async getBronNetworkId(): Promise<string> {\n const network = await this.provider!.getNetwork();\n return getNetworkId(network.chainId);\n }\n\n private async getBronGasTokenId(): Promise<number> {\n const network = await this.provider!.getNetwork();\n return getGasTokenId(network.chainId);\n }\n\n private messageToHex(message: string | Uint8Array): string {\n if (typeof message === 'string') {\n if (message.startsWith('0x')) {\n return message;\n }\n return '0x' + Buffer.from(message, 'utf8').toString('hex');\n }\n\n if (message instanceof Uint8Array) {\n return '0x' + Buffer.from(message).toString('hex');\n }\n\n throw new Error('Unsupported message type for signing');\n }\n\n private buildTypedData(\n domain: TypedDataDomain,\n types: Record<string, TypedDataField[]>,\n value: Record<string, unknown>\n ): EIP712TypedData {\n // Build EIP712Domain type based on provided domain fields\n const eip712Domain: TypedDataField[] = [];\n if (domain.name !== undefined) eip712Domain.push({ name: 'name', type: 'string' });\n if (domain.version !== undefined) eip712Domain.push({ name: 'version', type: 'string' });\n if (domain.chainId !== undefined) eip712Domain.push({ name: 'chainId', type: 'uint256' });\n if (domain.verifyingContract !== undefined) eip712Domain.push({ name: 'verifyingContract', type: 'address' });\n if (domain.salt !== undefined) eip712Domain.push({ name: 'salt', type: 'bytes32' });\n\n return {\n types: {\n EIP712Domain: eip712Domain,\n ...types\n },\n primaryType: Object.keys(types)[0],\n domain: this.sanitizeForJson(domain) as TypedDataDomain,\n message: this.sanitizeForJson(value) as Record<string, unknown>\n };\n }\n\n private sanitizeForJson(obj: unknown): unknown {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj === 'bigint') return obj.toString();\n if (Array.isArray(obj)) return obj.map((item) => this.sanitizeForJson(item));\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(obj)) {\n result[key] = this.sanitizeForJson(val);\n }\n return result;\n }\n return obj;\n }\n\n private async pollTransaction(transactionId: string, logPrefix = 'Transaction'): Promise<unknown> {\n while (true) {\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n\n const response = await this.bronApi.transactions.getTransactions({\n transactionIds: [transactionId],\n includeCurrentSigningRequest: true\n });\n\n const tx = response.transactions?.[0];\n\n if (!tx) {\n throw new Error(`${logPrefix} ${transactionId} not found`);\n }\n\n const status = tx.status as TransactionStatus;\n\n if (status === 'failed' || status === 'rejected' || status === 'canceled') {\n throw new Error(`${logPrefix} ${transactionId} ${status}`);\n }\n\n if (status === 'completed') {\n return tx;\n }\n }\n }\n}\n","/**\n * Hardhat integration for BronSigner\n *\n * @example\n * ```javascript\n * // hardhat.config.js\n * const { extendHardhatWithBronSigner } = require('@bronlabs/bron-ethers-signer/hardhat');\n *\n * extendHardhatWithBronSigner({\n * apiKey: process.env.BRON_API_KEY,\n * workspaceId: process.env.BRON_WORKSPACE_ID,\n * accountId: process.env.BRON_ACCOUNT_ID,\n * });\n *\n * module.exports = { ... };\n * ```\n */\n\nimport type { FetchFunction } from '@bronlabs/bron-sdk/utils';\nimport { BronSigner } from './BronSigner.js';\n\nexport interface BronHardhatConfig {\n /** Bron API key */\n apiKey?: string;\n /** Bron workspace ID */\n workspaceId?: string;\n /** Bron account ID */\n accountId?: string;\n /** Networks to exclude from BronSigner (default: ['hardhat', 'localhost']) */\n excludeNetworks?: string[];\n /** Custom fetch function for HTTP requests (e.g. with proxy support) */\n fetchFn?: FetchFunction;\n}\n\n/**\n * Extends Hardhat environment to use BronSigner for getSigners() and getSigner()\n *\n * @param config - Bron configuration\n */\nexport function extendHardhatWithBronSigner(config: BronHardhatConfig = {}): void {\n const { extendEnvironment } = require('hardhat/config');\n\n const { apiKey, workspaceId, accountId, fetchFn } = config;\n const excludeNetworks = config.excludeNetworks ?? ['hardhat', 'localhost'];\n\n const useBronSigner = apiKey && workspaceId && accountId;\n\n if (!useBronSigner) {\n console.warn(\n '[bron-ethers-signer] Missing BRON_API_KEY, BRON_WORKSPACE_ID, or BRON_ACCOUNT_ID. Using default signers.'\n );\n return;\n }\n\n extendEnvironment((hre: any) => {\n const originalGetSigners = hre.ethers.getSigners.bind(hre.ethers);\n\n hre.ethers.getSigners = async () => {\n if (!excludeNetworks.includes(hre.network.name)) {\n const provider = hre.ethers.provider;\n const bronSigner = new BronSigner({\n provider,\n apiKey: apiKey!,\n workspaceId: workspaceId!,\n accountId: accountId!,\n fetchFn,\n });\n return [bronSigner];\n }\n return originalGetSigners();\n };\n\n const originalGetSigner = hre.ethers.getSigner?.bind(hre.ethers);\n if (originalGetSigner) {\n hre.ethers.getSigner = async (_address?: string) => {\n if (!excludeNetworks.includes(hre.network.name)) {\n const provider = hre.ethers.provider;\n return new BronSigner({\n provider,\n apiKey: apiKey!,\n workspaceId: workspaceId!,\n accountId: accountId!,\n fetchFn,\n });\n }\n return originalGetSigner(_address);\n };\n }\n });\n}\n\nexport { BronSigner };\n"]}
1
+ {"version":3,"sources":["../src/networks.ts","../src/BronSigner.ts","../src/hardhat.ts"],"names":["AbstractSigner","BronClient","randomUUID"],"mappings":"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","file":"hardhat.cjs","sourcesContent":["import type { NetworkMapping } from './types.js';\n\n/**\n * Mapping from EVM chain IDs to Bron network configuration\n */\nexport const NETWORK_MAPPINGS: Record<number, NetworkMapping> = {\n // Mainnets\n 1: { networkId: 'ETH', gasTokenId: 2 }, // Ethereum\n 42161: { networkId: 'ARB', gasTokenId: 7 }, // Arbitrum\n 8453: { networkId: 'BASE', gasTokenId: 8 }, // Base\n 10: { networkId: 'OP', gasTokenId: 6 }, // Optimism\n 56: { networkId: 'BNB', gasTokenId: 9 }, // BNB Chain\n\n // Testnets\n 10006: { networkId: '10006', gasTokenId: 10006 }, // Hoodi ETH\n 11155111: { networkId: '10002', gasTokenId: 10002 }, // Sepolia ETH\n};\n\n/**\n * Get Bron network ID from EVM chain ID\n * @param chainId - EVM chain ID\n * @returns Bron network ID\n * @throws Error if chain ID is not supported\n */\nexport function getNetworkId(chainId: number | bigint): string {\n const id = Number(chainId);\n const mapping = NETWORK_MAPPINGS[id];\n if (!mapping) {\n throw new Error(`Unsupported EVM chainId: ${id}. Supported chains: ${Object.keys(NETWORK_MAPPINGS).join(', ')}`);\n }\n return mapping.networkId;\n}\n\n/**\n * Get Bron gas token asset ID from EVM chain ID\n * @param chainId - EVM chain ID\n * @returns Bron gas token asset ID\n * @throws Error if chain ID is not supported\n */\nexport function getGasTokenId(chainId: number | bigint): number {\n const id = Number(chainId);\n const mapping = NETWORK_MAPPINGS[id];\n if (!mapping) {\n throw new Error(`Unsupported EVM chainId: ${id}. Supported chains: ${Object.keys(NETWORK_MAPPINGS).join(', ')}`);\n }\n return mapping.gasTokenId;\n}\n\n/**\n * Check if a chain ID is supported\n * @param chainId - EVM chain ID\n * @returns true if supported\n */\nexport function isChainSupported(chainId: number | bigint): boolean {\n return Number(chainId) in NETWORK_MAPPINGS;\n}\n\n/**\n * Get all supported chain IDs\n * @returns Array of supported EVM chain IDs\n */\nexport function getSupportedChainIds(): number[] {\n return Object.keys(NETWORK_MAPPINGS).map(Number);\n}\n","import { AbstractSigner, type Provider, type TransactionRequest, type TransactionResponse, type TypedDataDomain, type TypedDataField } from 'ethers';\nimport { randomUUID } from 'node:crypto';\nimport BronClient from '@bronlabs/bron-sdk';\nimport type { FetchFunction } from '@bronlabs/bron-sdk/utils';\nimport { getNetworkId, getGasTokenId } from './networks.js';\nimport type { BronSignerOptions, EIP712TypedData } from './types.js';\n\n\nconst POLL_INTERVAL_MS = 3000;\n\n/**\n * Ethers.js compatible signer that uses Bron custody platform for signing operations.\n *\n * @example\n * ```typescript\n * import { BronSigner } from '@bronlabs/bron-ethers-signer';\n * import { ethers } from 'ethers';\n *\n * const provider = new ethers.JsonRpcProvider('https://mainnet.infura.io/v3/...');\n *\n * const signer = new BronSigner({\n * provider,\n * apiKey: process.env.BRON_API_KEY!,\n * workspaceId: process.env.BRON_WORKSPACE_ID!,\n * accountId: process.env.BRON_ACCOUNT_ID!,\n * });\n *\n * // Sign a message\n * const signature = await signer.signMessage('Hello World');\n *\n * // Sign typed data (EIP-712)\n * const typedSignature = await signer.signTypedData(domain, types, value);\n *\n * // Send a transaction\n * const tx = await signer.sendTransaction({ to: '0x...', value: ethers.parseEther('1') });\n * ```\n */\nexport class BronSigner extends AbstractSigner {\n private readonly bronApi: InstanceType<typeof BronClient>;\n private readonly apiKey: string;\n private readonly workspaceId: string;\n private readonly accountId: string;\n private readonly bronApiUrl?: string;\n private readonly fetchFn?: FetchFunction;\n\n constructor(options: BronSignerOptions) {\n super(options.provider);\n\n this.bronApi = new BronClient({\n baseUrl: options.bronApiUrl,\n apiKey: options.apiKey,\n workspaceId: options.workspaceId,\n fetchFn: options.fetchFn\n });\n\n this.apiKey = options.apiKey;\n this.workspaceId = options.workspaceId;\n this.accountId = options.accountId;\n this.bronApiUrl = options.bronApiUrl;\n this.fetchFn = options.fetchFn;\n }\n\n /**\n * Creates a new BronSigner connected to a different provider\n */\n connect(provider: Provider): BronSigner {\n return new BronSigner({\n provider,\n apiKey: this.apiKey,\n workspaceId: this.workspaceId,\n accountId: this.accountId,\n bronApiUrl: this.bronApiUrl,\n fetchFn: this.fetchFn\n });\n }\n\n /**\n * Returns the address associated with this signer's Bron account\n */\n async getAddress(): Promise<string> {\n this.assertProvider();\n\n const { addresses } = await this.bronApi.addresses.getDepositAddresses({\n accountId: this.accountId,\n networkId: await this.getBronNetworkId()\n });\n\n if (!addresses?.length) {\n throw new Error('No deposit addresses found for account');\n }\n\n const address = addresses[0].address;\n if (!address) {\n throw new Error('Deposit address is undefined');\n }\n\n return address;\n }\n\n /**\n * Sends a transaction through Bron custody platform.\n * The transaction will be signed and broadcast by Bron.\n */\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResponse> {\n this.assertProvider();\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-transaction' as any,\n params: {\n assetId: await this.getBronGasTokenId(),\n toAddress: tx.to,\n amount: tx.value,\n data: tx.data\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId) as { transactionId: string };\n const txEvents = await this.bronApi.transactions.getTransactionEvents(completedTx.transactionId);\n const blockchainTxId = txEvents?.events?.[0]?.blockchainTxId;\n\n if (!blockchainTxId) {\n throw new Error('Bron SDK returned no blockchainTxId');\n }\n\n const txResponse = await this.provider!.getTransaction(blockchainTxId);\n if (!txResponse) {\n throw new Error(`Transaction ${blockchainTxId} not found on chain`);\n }\n\n return txResponse;\n }\n\n /**\n * Transaction signing is not supported by BronSigner.\n * Use sendTransaction() instead which handles signing and broadcasting internally.\n * @throws Always throws - use sendTransaction instead\n */\n async signTransaction(_tx: TransactionRequest): Promise<string> {\n throw new Error('signTransaction is not supported by BronSigner. Use sendTransaction instead.');\n }\n\n /**\n * Signs a message using the Bron custody platform.\n * Uses EIP-191 personal_sign format.\n *\n * @param message - The message to sign (string, Buffer, or Uint8Array)\n * @returns The signature as a hex string\n */\n async signMessage(message: string | Uint8Array): Promise<string> {\n this.assertProvider();\n\n const messageHex = this.messageToHex(message);\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-message' as any,\n params: {\n networkId: await this.getBronNetworkId(),\n method: 'eth_sign',\n message: messageHex,\n externalBroadcast: false\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId, 'Signing request');\n const signature = (completedTx as any)._embedded?.currentSigningRequest?.signed?.signature;\n\n if (!signature) {\n throw new Error('Bron SDK returned no signature');\n }\n\n return signature;\n }\n\n /**\n * Signs typed data using EIP-712 standard through Bron custody platform.\n *\n * @param domain - The EIP-712 domain\n * @param types - The type definitions\n * @param value - The data to sign\n * @returns The signature as a hex string\n */\n async signTypedData(\n domain: TypedDataDomain,\n types: Record<string, TypedDataField[]>,\n value: Record<string, unknown>\n ): Promise<string> {\n this.assertProvider();\n\n const typedData = this.buildTypedData(domain, types, value);\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-message' as any,\n params: {\n networkId: await this.getBronNetworkId(),\n method: 'eth_signTypedData_v4',\n version: 'V4', // Required for EIP-712 signing\n message: JSON.stringify(typedData),\n externalBroadcast: false\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId, 'Signing request');\n const signature = (completedTx as any)._embedded?.currentSigningRequest?.signed?.signature;\n\n if (!signature) {\n throw new Error('Bron SDK returned no signature for typed data');\n }\n\n return signature;\n }\n\n // ============================================================\n // Private helpers\n // ============================================================\n\n private assertProvider(): asserts this is { provider: Provider } {\n if (!this.provider) {\n throw new Error('Provider required');\n }\n }\n\n private async getBronNetworkId(): Promise<string> {\n const network = await this.provider!.getNetwork();\n return getNetworkId(network.chainId);\n }\n\n private async getBronGasTokenId(): Promise<number> {\n const network = await this.provider!.getNetwork();\n return getGasTokenId(network.chainId);\n }\n\n private messageToHex(message: string | Uint8Array): string {\n if (typeof message === 'string') {\n if (message.startsWith('0x')) {\n return message;\n }\n return '0x' + Buffer.from(message, 'utf8').toString('hex');\n }\n\n if (message instanceof Uint8Array) {\n return '0x' + Buffer.from(message).toString('hex');\n }\n\n throw new Error('Unsupported message type for signing');\n }\n\n private buildTypedData(\n domain: TypedDataDomain,\n types: Record<string, TypedDataField[]>,\n value: Record<string, unknown>\n ): EIP712TypedData {\n // Build EIP712Domain type based on provided domain fields\n const eip712Domain: TypedDataField[] = [];\n if (domain.name !== undefined) eip712Domain.push({ name: 'name', type: 'string' });\n if (domain.version !== undefined) eip712Domain.push({ name: 'version', type: 'string' });\n if (domain.chainId !== undefined) eip712Domain.push({ name: 'chainId', type: 'uint256' });\n if (domain.verifyingContract !== undefined) eip712Domain.push({ name: 'verifyingContract', type: 'address' });\n if (domain.salt !== undefined) eip712Domain.push({ name: 'salt', type: 'bytes32' });\n\n return {\n types: {\n EIP712Domain: eip712Domain,\n ...types\n },\n primaryType: Object.keys(types)[0],\n domain: this.sanitizeForJson(domain) as TypedDataDomain,\n message: this.sanitizeForJson(value) as Record<string, unknown>\n };\n }\n\n private sanitizeForJson(obj: unknown): unknown {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj === 'bigint') return obj.toString();\n if (Array.isArray(obj)) return obj.map((item) => this.sanitizeForJson(item));\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(obj)) {\n result[key] = this.sanitizeForJson(val);\n }\n return result;\n }\n return obj;\n }\n\n private async pollTransaction(transactionId: string, logPrefix = 'Transaction'): Promise<unknown> {\n while (true) {\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n\n const response = await this.bronApi.transactions.getTransactions({\n transactionIds: [transactionId],\n includeCurrentSigningRequest: true\n });\n\n const tx = response.transactions?.[0];\n\n if (!tx) {\n throw new Error(`${logPrefix} ${transactionId} not found`);\n }\n\n if (tx.status === 'completed') {\n return tx;\n }\n\n if (tx.terminatedAt) {\n throw new Error(`${logPrefix} ${transactionId} failed: ${tx.status} ${tx.extra?.description}`);\n }\n }\n }\n}\n","/**\n * Hardhat integration for BronSigner\n *\n * @example\n * ```javascript\n * // hardhat.config.js\n * const { extendHardhatWithBronSigner } = require('@bronlabs/bron-ethers-signer/hardhat');\n *\n * extendHardhatWithBronSigner({\n * apiKey: process.env.BRON_API_KEY,\n * workspaceId: process.env.BRON_WORKSPACE_ID,\n * accountId: process.env.BRON_ACCOUNT_ID,\n * });\n *\n * module.exports = { ... };\n * ```\n */\n\nimport type { FetchFunction } from '@bronlabs/bron-sdk/utils';\nimport { BronSigner } from './BronSigner.js';\n\nexport interface BronHardhatConfig {\n /** Bron API key */\n apiKey?: string;\n /** Bron workspace ID */\n workspaceId?: string;\n /** Bron account ID */\n accountId?: string;\n /** Networks to exclude from BronSigner (default: ['hardhat', 'localhost']) */\n excludeNetworks?: string[];\n /** Custom fetch function for HTTP requests (e.g. with proxy support) */\n fetchFn?: FetchFunction;\n}\n\n/**\n * Extends Hardhat environment to use BronSigner for getSigners() and getSigner()\n *\n * @param config - Bron configuration\n */\nexport function extendHardhatWithBronSigner(config: BronHardhatConfig = {}): void {\n const { extendEnvironment } = require('hardhat/config');\n\n const { apiKey, workspaceId, accountId, fetchFn } = config;\n const excludeNetworks = config.excludeNetworks ?? ['hardhat', 'localhost'];\n\n const useBronSigner = apiKey && workspaceId && accountId;\n\n if (!useBronSigner) {\n console.warn(\n '[bron-ethers-signer] Missing BRON_API_KEY, BRON_WORKSPACE_ID, or BRON_ACCOUNT_ID. Using default signers.'\n );\n return;\n }\n\n extendEnvironment((hre: any) => {\n const originalGetSigners = hre.ethers.getSigners.bind(hre.ethers);\n\n hre.ethers.getSigners = async () => {\n if (!excludeNetworks.includes(hre.network.name)) {\n const provider = hre.ethers.provider;\n const bronSigner = new BronSigner({\n provider,\n apiKey: apiKey!,\n workspaceId: workspaceId!,\n accountId: accountId!,\n fetchFn,\n });\n return [bronSigner];\n }\n return originalGetSigners();\n };\n\n const originalGetSigner = hre.ethers.getSigner?.bind(hre.ethers);\n if (originalGetSigner) {\n hre.ethers.getSigner = async (_address?: string) => {\n if (!excludeNetworks.includes(hre.network.name)) {\n const provider = hre.ethers.provider;\n return new BronSigner({\n provider,\n apiKey: apiKey!,\n workspaceId: workspaceId!,\n accountId: accountId!,\n fetchFn,\n });\n }\n return originalGetSigner(_address);\n };\n }\n });\n}\n\nexport { BronSigner };\n"]}
@@ -1,5 +1,5 @@
1
1
  import { FetchFunction } from '@bronlabs/bron-sdk/utils';
2
- export { B as BronSigner } from './BronSigner-CkNm6ZoM.cjs';
2
+ export { B as BronSigner } from './BronSigner-D6m6Vvbk.cjs';
3
3
  import 'ethers';
4
4
 
5
5
  /**
package/dist/hardhat.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { FetchFunction } from '@bronlabs/bron-sdk/utils';
2
- export { B as BronSigner } from './BronSigner-CkNm6ZoM.js';
2
+ export { B as BronSigner } from './BronSigner-D6m6Vvbk.js';
3
3
  import 'ethers';
4
4
 
5
5
  /**
package/dist/hardhat.js CHANGED
@@ -264,13 +264,12 @@ var BronSigner = class _BronSigner extends AbstractSigner {
264
264
  if (!tx) {
265
265
  throw new Error(`${logPrefix} ${transactionId} not found`);
266
266
  }
267
- const status = tx.status;
268
- if (status === "failed" || status === "rejected" || status === "canceled") {
269
- throw new Error(`${logPrefix} ${transactionId} ${status}`);
270
- }
271
- if (status === "completed") {
267
+ if (tx.status === "completed") {
272
268
  return tx;
273
269
  }
270
+ if (tx.terminatedAt) {
271
+ throw new Error(`${logPrefix} ${transactionId} failed: ${tx.status} ${tx.extra?.description}`);
272
+ }
274
273
  }
275
274
  }
276
275
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/networks.ts","../src/BronSigner.ts","../src/hardhat.ts"],"names":[],"mappings":"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","file":"hardhat.js","sourcesContent":["import type { NetworkMapping } from './types.js';\n\n/**\n * Mapping from EVM chain IDs to Bron network configuration\n */\nexport const NETWORK_MAPPINGS: Record<number, NetworkMapping> = {\n // Mainnets\n 1: { networkId: 'ETH', gasTokenId: 2 }, // Ethereum\n 42161: { networkId: 'ARB', gasTokenId: 7 }, // Arbitrum\n 8453: { networkId: 'BASE', gasTokenId: 8 }, // Base\n 10: { networkId: 'OP', gasTokenId: 6 }, // Optimism\n 56: { networkId: 'BNB', gasTokenId: 9 }, // BNB Chain\n\n // Testnets\n 10006: { networkId: '10006', gasTokenId: 10006 }, // Hoodi ETH\n 11155111: { networkId: '10002', gasTokenId: 10002 }, // Sepolia ETH\n};\n\n/**\n * Get Bron network ID from EVM chain ID\n * @param chainId - EVM chain ID\n * @returns Bron network ID\n * @throws Error if chain ID is not supported\n */\nexport function getNetworkId(chainId: number | bigint): string {\n const id = Number(chainId);\n const mapping = NETWORK_MAPPINGS[id];\n if (!mapping) {\n throw new Error(`Unsupported EVM chainId: ${id}. Supported chains: ${Object.keys(NETWORK_MAPPINGS).join(', ')}`);\n }\n return mapping.networkId;\n}\n\n/**\n * Get Bron gas token asset ID from EVM chain ID\n * @param chainId - EVM chain ID\n * @returns Bron gas token asset ID\n * @throws Error if chain ID is not supported\n */\nexport function getGasTokenId(chainId: number | bigint): number {\n const id = Number(chainId);\n const mapping = NETWORK_MAPPINGS[id];\n if (!mapping) {\n throw new Error(`Unsupported EVM chainId: ${id}. Supported chains: ${Object.keys(NETWORK_MAPPINGS).join(', ')}`);\n }\n return mapping.gasTokenId;\n}\n\n/**\n * Check if a chain ID is supported\n * @param chainId - EVM chain ID\n * @returns true if supported\n */\nexport function isChainSupported(chainId: number | bigint): boolean {\n return Number(chainId) in NETWORK_MAPPINGS;\n}\n\n/**\n * Get all supported chain IDs\n * @returns Array of supported EVM chain IDs\n */\nexport function getSupportedChainIds(): number[] {\n return Object.keys(NETWORK_MAPPINGS).map(Number);\n}\n","import { AbstractSigner, type Provider, type TransactionRequest, type TransactionResponse, type TypedDataDomain, type TypedDataField } from 'ethers';\nimport { randomUUID } from 'node:crypto';\nimport BronClient from '@bronlabs/bron-sdk';\nimport type { FetchFunction } from '@bronlabs/bron-sdk/utils';\nimport { getNetworkId, getGasTokenId } from './networks.js';\nimport type { BronSignerOptions, EIP712TypedData, TransactionStatus } from './types.js';\n\n\nconst POLL_INTERVAL_MS = 3000;\n\n/**\n * Ethers.js compatible signer that uses Bron custody platform for signing operations.\n *\n * @example\n * ```typescript\n * import { BronSigner } from '@bronlabs/bron-ethers-signer';\n * import { ethers } from 'ethers';\n *\n * const provider = new ethers.JsonRpcProvider('https://mainnet.infura.io/v3/...');\n *\n * const signer = new BronSigner({\n * provider,\n * apiKey: process.env.BRON_API_KEY!,\n * workspaceId: process.env.BRON_WORKSPACE_ID!,\n * accountId: process.env.BRON_ACCOUNT_ID!,\n * });\n *\n * // Sign a message\n * const signature = await signer.signMessage('Hello World');\n *\n * // Sign typed data (EIP-712)\n * const typedSignature = await signer.signTypedData(domain, types, value);\n *\n * // Send a transaction\n * const tx = await signer.sendTransaction({ to: '0x...', value: ethers.parseEther('1') });\n * ```\n */\nexport class BronSigner extends AbstractSigner {\n private readonly bronApi: InstanceType<typeof BronClient>;\n private readonly apiKey: string;\n private readonly workspaceId: string;\n private readonly accountId: string;\n private readonly bronApiUrl?: string;\n private readonly fetchFn?: FetchFunction;\n\n constructor(options: BronSignerOptions) {\n super(options.provider);\n\n this.bronApi = new BronClient({\n baseUrl: options.bronApiUrl,\n apiKey: options.apiKey,\n workspaceId: options.workspaceId,\n fetchFn: options.fetchFn\n });\n\n this.apiKey = options.apiKey;\n this.workspaceId = options.workspaceId;\n this.accountId = options.accountId;\n this.bronApiUrl = options.bronApiUrl;\n this.fetchFn = options.fetchFn;\n }\n\n /**\n * Creates a new BronSigner connected to a different provider\n */\n connect(provider: Provider): BronSigner {\n return new BronSigner({\n provider,\n apiKey: this.apiKey,\n workspaceId: this.workspaceId,\n accountId: this.accountId,\n bronApiUrl: this.bronApiUrl,\n fetchFn: this.fetchFn\n });\n }\n\n /**\n * Returns the address associated with this signer's Bron account\n */\n async getAddress(): Promise<string> {\n this.assertProvider();\n\n const { addresses } = await this.bronApi.addresses.getDepositAddresses({\n accountId: this.accountId,\n networkId: await this.getBronNetworkId()\n });\n\n if (!addresses?.length) {\n throw new Error('No deposit addresses found for account');\n }\n\n const address = addresses[0].address;\n if (!address) {\n throw new Error('Deposit address is undefined');\n }\n\n return address;\n }\n\n /**\n * Sends a transaction through Bron custody platform.\n * The transaction will be signed and broadcast by Bron.\n */\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResponse> {\n this.assertProvider();\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-transaction' as any,\n params: {\n assetId: await this.getBronGasTokenId(),\n toAddress: tx.to,\n amount: tx.value,\n data: tx.data\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId) as { transactionId: string };\n const txEvents = await this.bronApi.transactions.getTransactionEvents(completedTx.transactionId);\n const blockchainTxId = txEvents?.events?.[0]?.blockchainTxId;\n\n if (!blockchainTxId) {\n throw new Error('Bron SDK returned no blockchainTxId');\n }\n\n const txResponse = await this.provider!.getTransaction(blockchainTxId);\n if (!txResponse) {\n throw new Error(`Transaction ${blockchainTxId} not found on chain`);\n }\n\n return txResponse;\n }\n\n /**\n * Transaction signing is not supported by BronSigner.\n * Use sendTransaction() instead which handles signing and broadcasting internally.\n * @throws Always throws - use sendTransaction instead\n */\n async signTransaction(_tx: TransactionRequest): Promise<string> {\n throw new Error('signTransaction is not supported by BronSigner. Use sendTransaction instead.');\n }\n\n /**\n * Signs a message using the Bron custody platform.\n * Uses EIP-191 personal_sign format.\n *\n * @param message - The message to sign (string, Buffer, or Uint8Array)\n * @returns The signature as a hex string\n */\n async signMessage(message: string | Uint8Array): Promise<string> {\n this.assertProvider();\n\n const messageHex = this.messageToHex(message);\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-message' as any,\n params: {\n networkId: await this.getBronNetworkId(),\n method: 'eth_sign',\n message: messageHex,\n externalBroadcast: false\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId, 'Signing request');\n const signature = (completedTx as any)._embedded?.currentSigningRequest?.signed?.signature;\n\n if (!signature) {\n throw new Error('Bron SDK returned no signature');\n }\n\n return signature;\n }\n\n /**\n * Signs typed data using EIP-712 standard through Bron custody platform.\n *\n * @param domain - The EIP-712 domain\n * @param types - The type definitions\n * @param value - The data to sign\n * @returns The signature as a hex string\n */\n async signTypedData(\n domain: TypedDataDomain,\n types: Record<string, TypedDataField[]>,\n value: Record<string, unknown>\n ): Promise<string> {\n this.assertProvider();\n\n const typedData = this.buildTypedData(domain, types, value);\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-message' as any,\n params: {\n networkId: await this.getBronNetworkId(),\n method: 'eth_signTypedData_v4',\n version: 'V4', // Required for EIP-712 signing\n message: JSON.stringify(typedData),\n externalBroadcast: false\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId, 'Signing request');\n const signature = (completedTx as any)._embedded?.currentSigningRequest?.signed?.signature;\n\n if (!signature) {\n throw new Error('Bron SDK returned no signature for typed data');\n }\n\n return signature;\n }\n\n // ============================================================\n // Private helpers\n // ============================================================\n\n private assertProvider(): asserts this is { provider: Provider } {\n if (!this.provider) {\n throw new Error('Provider required');\n }\n }\n\n private async getBronNetworkId(): Promise<string> {\n const network = await this.provider!.getNetwork();\n return getNetworkId(network.chainId);\n }\n\n private async getBronGasTokenId(): Promise<number> {\n const network = await this.provider!.getNetwork();\n return getGasTokenId(network.chainId);\n }\n\n private messageToHex(message: string | Uint8Array): string {\n if (typeof message === 'string') {\n if (message.startsWith('0x')) {\n return message;\n }\n return '0x' + Buffer.from(message, 'utf8').toString('hex');\n }\n\n if (message instanceof Uint8Array) {\n return '0x' + Buffer.from(message).toString('hex');\n }\n\n throw new Error('Unsupported message type for signing');\n }\n\n private buildTypedData(\n domain: TypedDataDomain,\n types: Record<string, TypedDataField[]>,\n value: Record<string, unknown>\n ): EIP712TypedData {\n // Build EIP712Domain type based on provided domain fields\n const eip712Domain: TypedDataField[] = [];\n if (domain.name !== undefined) eip712Domain.push({ name: 'name', type: 'string' });\n if (domain.version !== undefined) eip712Domain.push({ name: 'version', type: 'string' });\n if (domain.chainId !== undefined) eip712Domain.push({ name: 'chainId', type: 'uint256' });\n if (domain.verifyingContract !== undefined) eip712Domain.push({ name: 'verifyingContract', type: 'address' });\n if (domain.salt !== undefined) eip712Domain.push({ name: 'salt', type: 'bytes32' });\n\n return {\n types: {\n EIP712Domain: eip712Domain,\n ...types\n },\n primaryType: Object.keys(types)[0],\n domain: this.sanitizeForJson(domain) as TypedDataDomain,\n message: this.sanitizeForJson(value) as Record<string, unknown>\n };\n }\n\n private sanitizeForJson(obj: unknown): unknown {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj === 'bigint') return obj.toString();\n if (Array.isArray(obj)) return obj.map((item) => this.sanitizeForJson(item));\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(obj)) {\n result[key] = this.sanitizeForJson(val);\n }\n return result;\n }\n return obj;\n }\n\n private async pollTransaction(transactionId: string, logPrefix = 'Transaction'): Promise<unknown> {\n while (true) {\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n\n const response = await this.bronApi.transactions.getTransactions({\n transactionIds: [transactionId],\n includeCurrentSigningRequest: true\n });\n\n const tx = response.transactions?.[0];\n\n if (!tx) {\n throw new Error(`${logPrefix} ${transactionId} not found`);\n }\n\n const status = tx.status as TransactionStatus;\n\n if (status === 'failed' || status === 'rejected' || status === 'canceled') {\n throw new Error(`${logPrefix} ${transactionId} ${status}`);\n }\n\n if (status === 'completed') {\n return tx;\n }\n }\n }\n}\n","/**\n * Hardhat integration for BronSigner\n *\n * @example\n * ```javascript\n * // hardhat.config.js\n * const { extendHardhatWithBronSigner } = require('@bronlabs/bron-ethers-signer/hardhat');\n *\n * extendHardhatWithBronSigner({\n * apiKey: process.env.BRON_API_KEY,\n * workspaceId: process.env.BRON_WORKSPACE_ID,\n * accountId: process.env.BRON_ACCOUNT_ID,\n * });\n *\n * module.exports = { ... };\n * ```\n */\n\nimport type { FetchFunction } from '@bronlabs/bron-sdk/utils';\nimport { BronSigner } from './BronSigner.js';\n\nexport interface BronHardhatConfig {\n /** Bron API key */\n apiKey?: string;\n /** Bron workspace ID */\n workspaceId?: string;\n /** Bron account ID */\n accountId?: string;\n /** Networks to exclude from BronSigner (default: ['hardhat', 'localhost']) */\n excludeNetworks?: string[];\n /** Custom fetch function for HTTP requests (e.g. with proxy support) */\n fetchFn?: FetchFunction;\n}\n\n/**\n * Extends Hardhat environment to use BronSigner for getSigners() and getSigner()\n *\n * @param config - Bron configuration\n */\nexport function extendHardhatWithBronSigner(config: BronHardhatConfig = {}): void {\n const { extendEnvironment } = require('hardhat/config');\n\n const { apiKey, workspaceId, accountId, fetchFn } = config;\n const excludeNetworks = config.excludeNetworks ?? ['hardhat', 'localhost'];\n\n const useBronSigner = apiKey && workspaceId && accountId;\n\n if (!useBronSigner) {\n console.warn(\n '[bron-ethers-signer] Missing BRON_API_KEY, BRON_WORKSPACE_ID, or BRON_ACCOUNT_ID. Using default signers.'\n );\n return;\n }\n\n extendEnvironment((hre: any) => {\n const originalGetSigners = hre.ethers.getSigners.bind(hre.ethers);\n\n hre.ethers.getSigners = async () => {\n if (!excludeNetworks.includes(hre.network.name)) {\n const provider = hre.ethers.provider;\n const bronSigner = new BronSigner({\n provider,\n apiKey: apiKey!,\n workspaceId: workspaceId!,\n accountId: accountId!,\n fetchFn,\n });\n return [bronSigner];\n }\n return originalGetSigners();\n };\n\n const originalGetSigner = hre.ethers.getSigner?.bind(hre.ethers);\n if (originalGetSigner) {\n hre.ethers.getSigner = async (_address?: string) => {\n if (!excludeNetworks.includes(hre.network.name)) {\n const provider = hre.ethers.provider;\n return new BronSigner({\n provider,\n apiKey: apiKey!,\n workspaceId: workspaceId!,\n accountId: accountId!,\n fetchFn,\n });\n }\n return originalGetSigner(_address);\n };\n }\n });\n}\n\nexport { BronSigner };\n"]}
1
+ {"version":3,"sources":["../src/networks.ts","../src/BronSigner.ts","../src/hardhat.ts"],"names":[],"mappings":"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","file":"hardhat.js","sourcesContent":["import type { NetworkMapping } from './types.js';\n\n/**\n * Mapping from EVM chain IDs to Bron network configuration\n */\nexport const NETWORK_MAPPINGS: Record<number, NetworkMapping> = {\n // Mainnets\n 1: { networkId: 'ETH', gasTokenId: 2 }, // Ethereum\n 42161: { networkId: 'ARB', gasTokenId: 7 }, // Arbitrum\n 8453: { networkId: 'BASE', gasTokenId: 8 }, // Base\n 10: { networkId: 'OP', gasTokenId: 6 }, // Optimism\n 56: { networkId: 'BNB', gasTokenId: 9 }, // BNB Chain\n\n // Testnets\n 10006: { networkId: '10006', gasTokenId: 10006 }, // Hoodi ETH\n 11155111: { networkId: '10002', gasTokenId: 10002 }, // Sepolia ETH\n};\n\n/**\n * Get Bron network ID from EVM chain ID\n * @param chainId - EVM chain ID\n * @returns Bron network ID\n * @throws Error if chain ID is not supported\n */\nexport function getNetworkId(chainId: number | bigint): string {\n const id = Number(chainId);\n const mapping = NETWORK_MAPPINGS[id];\n if (!mapping) {\n throw new Error(`Unsupported EVM chainId: ${id}. Supported chains: ${Object.keys(NETWORK_MAPPINGS).join(', ')}`);\n }\n return mapping.networkId;\n}\n\n/**\n * Get Bron gas token asset ID from EVM chain ID\n * @param chainId - EVM chain ID\n * @returns Bron gas token asset ID\n * @throws Error if chain ID is not supported\n */\nexport function getGasTokenId(chainId: number | bigint): number {\n const id = Number(chainId);\n const mapping = NETWORK_MAPPINGS[id];\n if (!mapping) {\n throw new Error(`Unsupported EVM chainId: ${id}. Supported chains: ${Object.keys(NETWORK_MAPPINGS).join(', ')}`);\n }\n return mapping.gasTokenId;\n}\n\n/**\n * Check if a chain ID is supported\n * @param chainId - EVM chain ID\n * @returns true if supported\n */\nexport function isChainSupported(chainId: number | bigint): boolean {\n return Number(chainId) in NETWORK_MAPPINGS;\n}\n\n/**\n * Get all supported chain IDs\n * @returns Array of supported EVM chain IDs\n */\nexport function getSupportedChainIds(): number[] {\n return Object.keys(NETWORK_MAPPINGS).map(Number);\n}\n","import { AbstractSigner, type Provider, type TransactionRequest, type TransactionResponse, type TypedDataDomain, type TypedDataField } from 'ethers';\nimport { randomUUID } from 'node:crypto';\nimport BronClient from '@bronlabs/bron-sdk';\nimport type { FetchFunction } from '@bronlabs/bron-sdk/utils';\nimport { getNetworkId, getGasTokenId } from './networks.js';\nimport type { BronSignerOptions, EIP712TypedData } from './types.js';\n\n\nconst POLL_INTERVAL_MS = 3000;\n\n/**\n * Ethers.js compatible signer that uses Bron custody platform for signing operations.\n *\n * @example\n * ```typescript\n * import { BronSigner } from '@bronlabs/bron-ethers-signer';\n * import { ethers } from 'ethers';\n *\n * const provider = new ethers.JsonRpcProvider('https://mainnet.infura.io/v3/...');\n *\n * const signer = new BronSigner({\n * provider,\n * apiKey: process.env.BRON_API_KEY!,\n * workspaceId: process.env.BRON_WORKSPACE_ID!,\n * accountId: process.env.BRON_ACCOUNT_ID!,\n * });\n *\n * // Sign a message\n * const signature = await signer.signMessage('Hello World');\n *\n * // Sign typed data (EIP-712)\n * const typedSignature = await signer.signTypedData(domain, types, value);\n *\n * // Send a transaction\n * const tx = await signer.sendTransaction({ to: '0x...', value: ethers.parseEther('1') });\n * ```\n */\nexport class BronSigner extends AbstractSigner {\n private readonly bronApi: InstanceType<typeof BronClient>;\n private readonly apiKey: string;\n private readonly workspaceId: string;\n private readonly accountId: string;\n private readonly bronApiUrl?: string;\n private readonly fetchFn?: FetchFunction;\n\n constructor(options: BronSignerOptions) {\n super(options.provider);\n\n this.bronApi = new BronClient({\n baseUrl: options.bronApiUrl,\n apiKey: options.apiKey,\n workspaceId: options.workspaceId,\n fetchFn: options.fetchFn\n });\n\n this.apiKey = options.apiKey;\n this.workspaceId = options.workspaceId;\n this.accountId = options.accountId;\n this.bronApiUrl = options.bronApiUrl;\n this.fetchFn = options.fetchFn;\n }\n\n /**\n * Creates a new BronSigner connected to a different provider\n */\n connect(provider: Provider): BronSigner {\n return new BronSigner({\n provider,\n apiKey: this.apiKey,\n workspaceId: this.workspaceId,\n accountId: this.accountId,\n bronApiUrl: this.bronApiUrl,\n fetchFn: this.fetchFn\n });\n }\n\n /**\n * Returns the address associated with this signer's Bron account\n */\n async getAddress(): Promise<string> {\n this.assertProvider();\n\n const { addresses } = await this.bronApi.addresses.getDepositAddresses({\n accountId: this.accountId,\n networkId: await this.getBronNetworkId()\n });\n\n if (!addresses?.length) {\n throw new Error('No deposit addresses found for account');\n }\n\n const address = addresses[0].address;\n if (!address) {\n throw new Error('Deposit address is undefined');\n }\n\n return address;\n }\n\n /**\n * Sends a transaction through Bron custody platform.\n * The transaction will be signed and broadcast by Bron.\n */\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResponse> {\n this.assertProvider();\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-transaction' as any,\n params: {\n assetId: await this.getBronGasTokenId(),\n toAddress: tx.to,\n amount: tx.value,\n data: tx.data\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId) as { transactionId: string };\n const txEvents = await this.bronApi.transactions.getTransactionEvents(completedTx.transactionId);\n const blockchainTxId = txEvents?.events?.[0]?.blockchainTxId;\n\n if (!blockchainTxId) {\n throw new Error('Bron SDK returned no blockchainTxId');\n }\n\n const txResponse = await this.provider!.getTransaction(blockchainTxId);\n if (!txResponse) {\n throw new Error(`Transaction ${blockchainTxId} not found on chain`);\n }\n\n return txResponse;\n }\n\n /**\n * Transaction signing is not supported by BronSigner.\n * Use sendTransaction() instead which handles signing and broadcasting internally.\n * @throws Always throws - use sendTransaction instead\n */\n async signTransaction(_tx: TransactionRequest): Promise<string> {\n throw new Error('signTransaction is not supported by BronSigner. Use sendTransaction instead.');\n }\n\n /**\n * Signs a message using the Bron custody platform.\n * Uses EIP-191 personal_sign format.\n *\n * @param message - The message to sign (string, Buffer, or Uint8Array)\n * @returns The signature as a hex string\n */\n async signMessage(message: string | Uint8Array): Promise<string> {\n this.assertProvider();\n\n const messageHex = this.messageToHex(message);\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-message' as any,\n params: {\n networkId: await this.getBronNetworkId(),\n method: 'eth_sign',\n message: messageHex,\n externalBroadcast: false\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId, 'Signing request');\n const signature = (completedTx as any)._embedded?.currentSigningRequest?.signed?.signature;\n\n if (!signature) {\n throw new Error('Bron SDK returned no signature');\n }\n\n return signature;\n }\n\n /**\n * Signs typed data using EIP-712 standard through Bron custody platform.\n *\n * @param domain - The EIP-712 domain\n * @param types - The type definitions\n * @param value - The data to sign\n * @returns The signature as a hex string\n */\n async signTypedData(\n domain: TypedDataDomain,\n types: Record<string, TypedDataField[]>,\n value: Record<string, unknown>\n ): Promise<string> {\n this.assertProvider();\n\n const typedData = this.buildTypedData(domain, types, value);\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-message' as any,\n params: {\n networkId: await this.getBronNetworkId(),\n method: 'eth_signTypedData_v4',\n version: 'V4', // Required for EIP-712 signing\n message: JSON.stringify(typedData),\n externalBroadcast: false\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId, 'Signing request');\n const signature = (completedTx as any)._embedded?.currentSigningRequest?.signed?.signature;\n\n if (!signature) {\n throw new Error('Bron SDK returned no signature for typed data');\n }\n\n return signature;\n }\n\n // ============================================================\n // Private helpers\n // ============================================================\n\n private assertProvider(): asserts this is { provider: Provider } {\n if (!this.provider) {\n throw new Error('Provider required');\n }\n }\n\n private async getBronNetworkId(): Promise<string> {\n const network = await this.provider!.getNetwork();\n return getNetworkId(network.chainId);\n }\n\n private async getBronGasTokenId(): Promise<number> {\n const network = await this.provider!.getNetwork();\n return getGasTokenId(network.chainId);\n }\n\n private messageToHex(message: string | Uint8Array): string {\n if (typeof message === 'string') {\n if (message.startsWith('0x')) {\n return message;\n }\n return '0x' + Buffer.from(message, 'utf8').toString('hex');\n }\n\n if (message instanceof Uint8Array) {\n return '0x' + Buffer.from(message).toString('hex');\n }\n\n throw new Error('Unsupported message type for signing');\n }\n\n private buildTypedData(\n domain: TypedDataDomain,\n types: Record<string, TypedDataField[]>,\n value: Record<string, unknown>\n ): EIP712TypedData {\n // Build EIP712Domain type based on provided domain fields\n const eip712Domain: TypedDataField[] = [];\n if (domain.name !== undefined) eip712Domain.push({ name: 'name', type: 'string' });\n if (domain.version !== undefined) eip712Domain.push({ name: 'version', type: 'string' });\n if (domain.chainId !== undefined) eip712Domain.push({ name: 'chainId', type: 'uint256' });\n if (domain.verifyingContract !== undefined) eip712Domain.push({ name: 'verifyingContract', type: 'address' });\n if (domain.salt !== undefined) eip712Domain.push({ name: 'salt', type: 'bytes32' });\n\n return {\n types: {\n EIP712Domain: eip712Domain,\n ...types\n },\n primaryType: Object.keys(types)[0],\n domain: this.sanitizeForJson(domain) as TypedDataDomain,\n message: this.sanitizeForJson(value) as Record<string, unknown>\n };\n }\n\n private sanitizeForJson(obj: unknown): unknown {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj === 'bigint') return obj.toString();\n if (Array.isArray(obj)) return obj.map((item) => this.sanitizeForJson(item));\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(obj)) {\n result[key] = this.sanitizeForJson(val);\n }\n return result;\n }\n return obj;\n }\n\n private async pollTransaction(transactionId: string, logPrefix = 'Transaction'): Promise<unknown> {\n while (true) {\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n\n const response = await this.bronApi.transactions.getTransactions({\n transactionIds: [transactionId],\n includeCurrentSigningRequest: true\n });\n\n const tx = response.transactions?.[0];\n\n if (!tx) {\n throw new Error(`${logPrefix} ${transactionId} not found`);\n }\n\n if (tx.status === 'completed') {\n return tx;\n }\n\n if (tx.terminatedAt) {\n throw new Error(`${logPrefix} ${transactionId} failed: ${tx.status} ${tx.extra?.description}`);\n }\n }\n }\n}\n","/**\n * Hardhat integration for BronSigner\n *\n * @example\n * ```javascript\n * // hardhat.config.js\n * const { extendHardhatWithBronSigner } = require('@bronlabs/bron-ethers-signer/hardhat');\n *\n * extendHardhatWithBronSigner({\n * apiKey: process.env.BRON_API_KEY,\n * workspaceId: process.env.BRON_WORKSPACE_ID,\n * accountId: process.env.BRON_ACCOUNT_ID,\n * });\n *\n * module.exports = { ... };\n * ```\n */\n\nimport type { FetchFunction } from '@bronlabs/bron-sdk/utils';\nimport { BronSigner } from './BronSigner.js';\n\nexport interface BronHardhatConfig {\n /** Bron API key */\n apiKey?: string;\n /** Bron workspace ID */\n workspaceId?: string;\n /** Bron account ID */\n accountId?: string;\n /** Networks to exclude from BronSigner (default: ['hardhat', 'localhost']) */\n excludeNetworks?: string[];\n /** Custom fetch function for HTTP requests (e.g. with proxy support) */\n fetchFn?: FetchFunction;\n}\n\n/**\n * Extends Hardhat environment to use BronSigner for getSigners() and getSigner()\n *\n * @param config - Bron configuration\n */\nexport function extendHardhatWithBronSigner(config: BronHardhatConfig = {}): void {\n const { extendEnvironment } = require('hardhat/config');\n\n const { apiKey, workspaceId, accountId, fetchFn } = config;\n const excludeNetworks = config.excludeNetworks ?? ['hardhat', 'localhost'];\n\n const useBronSigner = apiKey && workspaceId && accountId;\n\n if (!useBronSigner) {\n console.warn(\n '[bron-ethers-signer] Missing BRON_API_KEY, BRON_WORKSPACE_ID, or BRON_ACCOUNT_ID. Using default signers.'\n );\n return;\n }\n\n extendEnvironment((hre: any) => {\n const originalGetSigners = hre.ethers.getSigners.bind(hre.ethers);\n\n hre.ethers.getSigners = async () => {\n if (!excludeNetworks.includes(hre.network.name)) {\n const provider = hre.ethers.provider;\n const bronSigner = new BronSigner({\n provider,\n apiKey: apiKey!,\n workspaceId: workspaceId!,\n accountId: accountId!,\n fetchFn,\n });\n return [bronSigner];\n }\n return originalGetSigners();\n };\n\n const originalGetSigner = hre.ethers.getSigner?.bind(hre.ethers);\n if (originalGetSigner) {\n hre.ethers.getSigner = async (_address?: string) => {\n if (!excludeNetworks.includes(hre.network.name)) {\n const provider = hre.ethers.provider;\n return new BronSigner({\n provider,\n apiKey: apiKey!,\n workspaceId: workspaceId!,\n accountId: accountId!,\n fetchFn,\n });\n }\n return originalGetSigner(_address);\n };\n }\n });\n}\n\nexport { BronSigner };\n"]}
package/dist/index.cjs CHANGED
@@ -271,13 +271,12 @@ var BronSigner = class _BronSigner extends ethers.AbstractSigner {
271
271
  if (!tx) {
272
272
  throw new Error(`${logPrefix} ${transactionId} not found`);
273
273
  }
274
- const status = tx.status;
275
- if (status === "failed" || status === "rejected" || status === "canceled") {
276
- throw new Error(`${logPrefix} ${transactionId} ${status}`);
277
- }
278
- if (status === "completed") {
274
+ if (tx.status === "completed") {
279
275
  return tx;
280
276
  }
277
+ if (tx.terminatedAt) {
278
+ throw new Error(`${logPrefix} ${transactionId} failed: ${tx.status} ${tx.extra?.description}`);
279
+ }
281
280
  }
282
281
  }
283
282
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/networks.ts","../src/BronSigner.ts"],"names":["AbstractSigner","BronClient","randomUUID"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { NetworkMapping } from './types.js';\n\n/**\n * Mapping from EVM chain IDs to Bron network configuration\n */\nexport const NETWORK_MAPPINGS: Record<number, NetworkMapping> = {\n // Mainnets\n 1: { networkId: 'ETH', gasTokenId: 2 }, // Ethereum\n 42161: { networkId: 'ARB', gasTokenId: 7 }, // Arbitrum\n 8453: { networkId: 'BASE', gasTokenId: 8 }, // Base\n 10: { networkId: 'OP', gasTokenId: 6 }, // Optimism\n 56: { networkId: 'BNB', gasTokenId: 9 }, // BNB Chain\n\n // Testnets\n 10006: { networkId: '10006', gasTokenId: 10006 }, // Hoodi ETH\n 11155111: { networkId: '10002', gasTokenId: 10002 }, // Sepolia ETH\n};\n\n/**\n * Get Bron network ID from EVM chain ID\n * @param chainId - EVM chain ID\n * @returns Bron network ID\n * @throws Error if chain ID is not supported\n */\nexport function getNetworkId(chainId: number | bigint): string {\n const id = Number(chainId);\n const mapping = NETWORK_MAPPINGS[id];\n if (!mapping) {\n throw new Error(`Unsupported EVM chainId: ${id}. Supported chains: ${Object.keys(NETWORK_MAPPINGS).join(', ')}`);\n }\n return mapping.networkId;\n}\n\n/**\n * Get Bron gas token asset ID from EVM chain ID\n * @param chainId - EVM chain ID\n * @returns Bron gas token asset ID\n * @throws Error if chain ID is not supported\n */\nexport function getGasTokenId(chainId: number | bigint): number {\n const id = Number(chainId);\n const mapping = NETWORK_MAPPINGS[id];\n if (!mapping) {\n throw new Error(`Unsupported EVM chainId: ${id}. Supported chains: ${Object.keys(NETWORK_MAPPINGS).join(', ')}`);\n }\n return mapping.gasTokenId;\n}\n\n/**\n * Check if a chain ID is supported\n * @param chainId - EVM chain ID\n * @returns true if supported\n */\nexport function isChainSupported(chainId: number | bigint): boolean {\n return Number(chainId) in NETWORK_MAPPINGS;\n}\n\n/**\n * Get all supported chain IDs\n * @returns Array of supported EVM chain IDs\n */\nexport function getSupportedChainIds(): number[] {\n return Object.keys(NETWORK_MAPPINGS).map(Number);\n}\n","import { AbstractSigner, type Provider, type TransactionRequest, type TransactionResponse, type TypedDataDomain, type TypedDataField } from 'ethers';\nimport { randomUUID } from 'node:crypto';\nimport BronClient from '@bronlabs/bron-sdk';\nimport type { FetchFunction } from '@bronlabs/bron-sdk/utils';\nimport { getNetworkId, getGasTokenId } from './networks.js';\nimport type { BronSignerOptions, EIP712TypedData, TransactionStatus } from './types.js';\n\n\nconst POLL_INTERVAL_MS = 3000;\n\n/**\n * Ethers.js compatible signer that uses Bron custody platform for signing operations.\n *\n * @example\n * ```typescript\n * import { BronSigner } from '@bronlabs/bron-ethers-signer';\n * import { ethers } from 'ethers';\n *\n * const provider = new ethers.JsonRpcProvider('https://mainnet.infura.io/v3/...');\n *\n * const signer = new BronSigner({\n * provider,\n * apiKey: process.env.BRON_API_KEY!,\n * workspaceId: process.env.BRON_WORKSPACE_ID!,\n * accountId: process.env.BRON_ACCOUNT_ID!,\n * });\n *\n * // Sign a message\n * const signature = await signer.signMessage('Hello World');\n *\n * // Sign typed data (EIP-712)\n * const typedSignature = await signer.signTypedData(domain, types, value);\n *\n * // Send a transaction\n * const tx = await signer.sendTransaction({ to: '0x...', value: ethers.parseEther('1') });\n * ```\n */\nexport class BronSigner extends AbstractSigner {\n private readonly bronApi: InstanceType<typeof BronClient>;\n private readonly apiKey: string;\n private readonly workspaceId: string;\n private readonly accountId: string;\n private readonly bronApiUrl?: string;\n private readonly fetchFn?: FetchFunction;\n\n constructor(options: BronSignerOptions) {\n super(options.provider);\n\n this.bronApi = new BronClient({\n baseUrl: options.bronApiUrl,\n apiKey: options.apiKey,\n workspaceId: options.workspaceId,\n fetchFn: options.fetchFn\n });\n\n this.apiKey = options.apiKey;\n this.workspaceId = options.workspaceId;\n this.accountId = options.accountId;\n this.bronApiUrl = options.bronApiUrl;\n this.fetchFn = options.fetchFn;\n }\n\n /**\n * Creates a new BronSigner connected to a different provider\n */\n connect(provider: Provider): BronSigner {\n return new BronSigner({\n provider,\n apiKey: this.apiKey,\n workspaceId: this.workspaceId,\n accountId: this.accountId,\n bronApiUrl: this.bronApiUrl,\n fetchFn: this.fetchFn\n });\n }\n\n /**\n * Returns the address associated with this signer's Bron account\n */\n async getAddress(): Promise<string> {\n this.assertProvider();\n\n const { addresses } = await this.bronApi.addresses.getDepositAddresses({\n accountId: this.accountId,\n networkId: await this.getBronNetworkId()\n });\n\n if (!addresses?.length) {\n throw new Error('No deposit addresses found for account');\n }\n\n const address = addresses[0].address;\n if (!address) {\n throw new Error('Deposit address is undefined');\n }\n\n return address;\n }\n\n /**\n * Sends a transaction through Bron custody platform.\n * The transaction will be signed and broadcast by Bron.\n */\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResponse> {\n this.assertProvider();\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-transaction' as any,\n params: {\n assetId: await this.getBronGasTokenId(),\n toAddress: tx.to,\n amount: tx.value,\n data: tx.data\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId) as { transactionId: string };\n const txEvents = await this.bronApi.transactions.getTransactionEvents(completedTx.transactionId);\n const blockchainTxId = txEvents?.events?.[0]?.blockchainTxId;\n\n if (!blockchainTxId) {\n throw new Error('Bron SDK returned no blockchainTxId');\n }\n\n const txResponse = await this.provider!.getTransaction(blockchainTxId);\n if (!txResponse) {\n throw new Error(`Transaction ${blockchainTxId} not found on chain`);\n }\n\n return txResponse;\n }\n\n /**\n * Transaction signing is not supported by BronSigner.\n * Use sendTransaction() instead which handles signing and broadcasting internally.\n * @throws Always throws - use sendTransaction instead\n */\n async signTransaction(_tx: TransactionRequest): Promise<string> {\n throw new Error('signTransaction is not supported by BronSigner. Use sendTransaction instead.');\n }\n\n /**\n * Signs a message using the Bron custody platform.\n * Uses EIP-191 personal_sign format.\n *\n * @param message - The message to sign (string, Buffer, or Uint8Array)\n * @returns The signature as a hex string\n */\n async signMessage(message: string | Uint8Array): Promise<string> {\n this.assertProvider();\n\n const messageHex = this.messageToHex(message);\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-message' as any,\n params: {\n networkId: await this.getBronNetworkId(),\n method: 'eth_sign',\n message: messageHex,\n externalBroadcast: false\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId, 'Signing request');\n const signature = (completedTx as any)._embedded?.currentSigningRequest?.signed?.signature;\n\n if (!signature) {\n throw new Error('Bron SDK returned no signature');\n }\n\n return signature;\n }\n\n /**\n * Signs typed data using EIP-712 standard through Bron custody platform.\n *\n * @param domain - The EIP-712 domain\n * @param types - The type definitions\n * @param value - The data to sign\n * @returns The signature as a hex string\n */\n async signTypedData(\n domain: TypedDataDomain,\n types: Record<string, TypedDataField[]>,\n value: Record<string, unknown>\n ): Promise<string> {\n this.assertProvider();\n\n const typedData = this.buildTypedData(domain, types, value);\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-message' as any,\n params: {\n networkId: await this.getBronNetworkId(),\n method: 'eth_signTypedData_v4',\n version: 'V4', // Required for EIP-712 signing\n message: JSON.stringify(typedData),\n externalBroadcast: false\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId, 'Signing request');\n const signature = (completedTx as any)._embedded?.currentSigningRequest?.signed?.signature;\n\n if (!signature) {\n throw new Error('Bron SDK returned no signature for typed data');\n }\n\n return signature;\n }\n\n // ============================================================\n // Private helpers\n // ============================================================\n\n private assertProvider(): asserts this is { provider: Provider } {\n if (!this.provider) {\n throw new Error('Provider required');\n }\n }\n\n private async getBronNetworkId(): Promise<string> {\n const network = await this.provider!.getNetwork();\n return getNetworkId(network.chainId);\n }\n\n private async getBronGasTokenId(): Promise<number> {\n const network = await this.provider!.getNetwork();\n return getGasTokenId(network.chainId);\n }\n\n private messageToHex(message: string | Uint8Array): string {\n if (typeof message === 'string') {\n if (message.startsWith('0x')) {\n return message;\n }\n return '0x' + Buffer.from(message, 'utf8').toString('hex');\n }\n\n if (message instanceof Uint8Array) {\n return '0x' + Buffer.from(message).toString('hex');\n }\n\n throw new Error('Unsupported message type for signing');\n }\n\n private buildTypedData(\n domain: TypedDataDomain,\n types: Record<string, TypedDataField[]>,\n value: Record<string, unknown>\n ): EIP712TypedData {\n // Build EIP712Domain type based on provided domain fields\n const eip712Domain: TypedDataField[] = [];\n if (domain.name !== undefined) eip712Domain.push({ name: 'name', type: 'string' });\n if (domain.version !== undefined) eip712Domain.push({ name: 'version', type: 'string' });\n if (domain.chainId !== undefined) eip712Domain.push({ name: 'chainId', type: 'uint256' });\n if (domain.verifyingContract !== undefined) eip712Domain.push({ name: 'verifyingContract', type: 'address' });\n if (domain.salt !== undefined) eip712Domain.push({ name: 'salt', type: 'bytes32' });\n\n return {\n types: {\n EIP712Domain: eip712Domain,\n ...types\n },\n primaryType: Object.keys(types)[0],\n domain: this.sanitizeForJson(domain) as TypedDataDomain,\n message: this.sanitizeForJson(value) as Record<string, unknown>\n };\n }\n\n private sanitizeForJson(obj: unknown): unknown {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj === 'bigint') return obj.toString();\n if (Array.isArray(obj)) return obj.map((item) => this.sanitizeForJson(item));\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(obj)) {\n result[key] = this.sanitizeForJson(val);\n }\n return result;\n }\n return obj;\n }\n\n private async pollTransaction(transactionId: string, logPrefix = 'Transaction'): Promise<unknown> {\n while (true) {\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n\n const response = await this.bronApi.transactions.getTransactions({\n transactionIds: [transactionId],\n includeCurrentSigningRequest: true\n });\n\n const tx = response.transactions?.[0];\n\n if (!tx) {\n throw new Error(`${logPrefix} ${transactionId} not found`);\n }\n\n const status = tx.status as TransactionStatus;\n\n if (status === 'failed' || status === 'rejected' || status === 'canceled') {\n throw new Error(`${logPrefix} ${transactionId} ${status}`);\n }\n\n if (status === 'completed') {\n return tx;\n }\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/networks.ts","../src/BronSigner.ts"],"names":["AbstractSigner","BronClient","randomUUID"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { NetworkMapping } from './types.js';\n\n/**\n * Mapping from EVM chain IDs to Bron network configuration\n */\nexport const NETWORK_MAPPINGS: Record<number, NetworkMapping> = {\n // Mainnets\n 1: { networkId: 'ETH', gasTokenId: 2 }, // Ethereum\n 42161: { networkId: 'ARB', gasTokenId: 7 }, // Arbitrum\n 8453: { networkId: 'BASE', gasTokenId: 8 }, // Base\n 10: { networkId: 'OP', gasTokenId: 6 }, // Optimism\n 56: { networkId: 'BNB', gasTokenId: 9 }, // BNB Chain\n\n // Testnets\n 10006: { networkId: '10006', gasTokenId: 10006 }, // Hoodi ETH\n 11155111: { networkId: '10002', gasTokenId: 10002 }, // Sepolia ETH\n};\n\n/**\n * Get Bron network ID from EVM chain ID\n * @param chainId - EVM chain ID\n * @returns Bron network ID\n * @throws Error if chain ID is not supported\n */\nexport function getNetworkId(chainId: number | bigint): string {\n const id = Number(chainId);\n const mapping = NETWORK_MAPPINGS[id];\n if (!mapping) {\n throw new Error(`Unsupported EVM chainId: ${id}. Supported chains: ${Object.keys(NETWORK_MAPPINGS).join(', ')}`);\n }\n return mapping.networkId;\n}\n\n/**\n * Get Bron gas token asset ID from EVM chain ID\n * @param chainId - EVM chain ID\n * @returns Bron gas token asset ID\n * @throws Error if chain ID is not supported\n */\nexport function getGasTokenId(chainId: number | bigint): number {\n const id = Number(chainId);\n const mapping = NETWORK_MAPPINGS[id];\n if (!mapping) {\n throw new Error(`Unsupported EVM chainId: ${id}. Supported chains: ${Object.keys(NETWORK_MAPPINGS).join(', ')}`);\n }\n return mapping.gasTokenId;\n}\n\n/**\n * Check if a chain ID is supported\n * @param chainId - EVM chain ID\n * @returns true if supported\n */\nexport function isChainSupported(chainId: number | bigint): boolean {\n return Number(chainId) in NETWORK_MAPPINGS;\n}\n\n/**\n * Get all supported chain IDs\n * @returns Array of supported EVM chain IDs\n */\nexport function getSupportedChainIds(): number[] {\n return Object.keys(NETWORK_MAPPINGS).map(Number);\n}\n","import { AbstractSigner, type Provider, type TransactionRequest, type TransactionResponse, type TypedDataDomain, type TypedDataField } from 'ethers';\nimport { randomUUID } from 'node:crypto';\nimport BronClient from '@bronlabs/bron-sdk';\nimport type { FetchFunction } from '@bronlabs/bron-sdk/utils';\nimport { getNetworkId, getGasTokenId } from './networks.js';\nimport type { BronSignerOptions, EIP712TypedData } from './types.js';\n\n\nconst POLL_INTERVAL_MS = 3000;\n\n/**\n * Ethers.js compatible signer that uses Bron custody platform for signing operations.\n *\n * @example\n * ```typescript\n * import { BronSigner } from '@bronlabs/bron-ethers-signer';\n * import { ethers } from 'ethers';\n *\n * const provider = new ethers.JsonRpcProvider('https://mainnet.infura.io/v3/...');\n *\n * const signer = new BronSigner({\n * provider,\n * apiKey: process.env.BRON_API_KEY!,\n * workspaceId: process.env.BRON_WORKSPACE_ID!,\n * accountId: process.env.BRON_ACCOUNT_ID!,\n * });\n *\n * // Sign a message\n * const signature = await signer.signMessage('Hello World');\n *\n * // Sign typed data (EIP-712)\n * const typedSignature = await signer.signTypedData(domain, types, value);\n *\n * // Send a transaction\n * const tx = await signer.sendTransaction({ to: '0x...', value: ethers.parseEther('1') });\n * ```\n */\nexport class BronSigner extends AbstractSigner {\n private readonly bronApi: InstanceType<typeof BronClient>;\n private readonly apiKey: string;\n private readonly workspaceId: string;\n private readonly accountId: string;\n private readonly bronApiUrl?: string;\n private readonly fetchFn?: FetchFunction;\n\n constructor(options: BronSignerOptions) {\n super(options.provider);\n\n this.bronApi = new BronClient({\n baseUrl: options.bronApiUrl,\n apiKey: options.apiKey,\n workspaceId: options.workspaceId,\n fetchFn: options.fetchFn\n });\n\n this.apiKey = options.apiKey;\n this.workspaceId = options.workspaceId;\n this.accountId = options.accountId;\n this.bronApiUrl = options.bronApiUrl;\n this.fetchFn = options.fetchFn;\n }\n\n /**\n * Creates a new BronSigner connected to a different provider\n */\n connect(provider: Provider): BronSigner {\n return new BronSigner({\n provider,\n apiKey: this.apiKey,\n workspaceId: this.workspaceId,\n accountId: this.accountId,\n bronApiUrl: this.bronApiUrl,\n fetchFn: this.fetchFn\n });\n }\n\n /**\n * Returns the address associated with this signer's Bron account\n */\n async getAddress(): Promise<string> {\n this.assertProvider();\n\n const { addresses } = await this.bronApi.addresses.getDepositAddresses({\n accountId: this.accountId,\n networkId: await this.getBronNetworkId()\n });\n\n if (!addresses?.length) {\n throw new Error('No deposit addresses found for account');\n }\n\n const address = addresses[0].address;\n if (!address) {\n throw new Error('Deposit address is undefined');\n }\n\n return address;\n }\n\n /**\n * Sends a transaction through Bron custody platform.\n * The transaction will be signed and broadcast by Bron.\n */\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResponse> {\n this.assertProvider();\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-transaction' as any,\n params: {\n assetId: await this.getBronGasTokenId(),\n toAddress: tx.to,\n amount: tx.value,\n data: tx.data\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId) as { transactionId: string };\n const txEvents = await this.bronApi.transactions.getTransactionEvents(completedTx.transactionId);\n const blockchainTxId = txEvents?.events?.[0]?.blockchainTxId;\n\n if (!blockchainTxId) {\n throw new Error('Bron SDK returned no blockchainTxId');\n }\n\n const txResponse = await this.provider!.getTransaction(blockchainTxId);\n if (!txResponse) {\n throw new Error(`Transaction ${blockchainTxId} not found on chain`);\n }\n\n return txResponse;\n }\n\n /**\n * Transaction signing is not supported by BronSigner.\n * Use sendTransaction() instead which handles signing and broadcasting internally.\n * @throws Always throws - use sendTransaction instead\n */\n async signTransaction(_tx: TransactionRequest): Promise<string> {\n throw new Error('signTransaction is not supported by BronSigner. Use sendTransaction instead.');\n }\n\n /**\n * Signs a message using the Bron custody platform.\n * Uses EIP-191 personal_sign format.\n *\n * @param message - The message to sign (string, Buffer, or Uint8Array)\n * @returns The signature as a hex string\n */\n async signMessage(message: string | Uint8Array): Promise<string> {\n this.assertProvider();\n\n const messageHex = this.messageToHex(message);\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-message' as any,\n params: {\n networkId: await this.getBronNetworkId(),\n method: 'eth_sign',\n message: messageHex,\n externalBroadcast: false\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId, 'Signing request');\n const signature = (completedTx as any)._embedded?.currentSigningRequest?.signed?.signature;\n\n if (!signature) {\n throw new Error('Bron SDK returned no signature');\n }\n\n return signature;\n }\n\n /**\n * Signs typed data using EIP-712 standard through Bron custody platform.\n *\n * @param domain - The EIP-712 domain\n * @param types - The type definitions\n * @param value - The data to sign\n * @returns The signature as a hex string\n */\n async signTypedData(\n domain: TypedDataDomain,\n types: Record<string, TypedDataField[]>,\n value: Record<string, unknown>\n ): Promise<string> {\n this.assertProvider();\n\n const typedData = this.buildTypedData(domain, types, value);\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-message' as any,\n params: {\n networkId: await this.getBronNetworkId(),\n method: 'eth_signTypedData_v4',\n version: 'V4', // Required for EIP-712 signing\n message: JSON.stringify(typedData),\n externalBroadcast: false\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId, 'Signing request');\n const signature = (completedTx as any)._embedded?.currentSigningRequest?.signed?.signature;\n\n if (!signature) {\n throw new Error('Bron SDK returned no signature for typed data');\n }\n\n return signature;\n }\n\n // ============================================================\n // Private helpers\n // ============================================================\n\n private assertProvider(): asserts this is { provider: Provider } {\n if (!this.provider) {\n throw new Error('Provider required');\n }\n }\n\n private async getBronNetworkId(): Promise<string> {\n const network = await this.provider!.getNetwork();\n return getNetworkId(network.chainId);\n }\n\n private async getBronGasTokenId(): Promise<number> {\n const network = await this.provider!.getNetwork();\n return getGasTokenId(network.chainId);\n }\n\n private messageToHex(message: string | Uint8Array): string {\n if (typeof message === 'string') {\n if (message.startsWith('0x')) {\n return message;\n }\n return '0x' + Buffer.from(message, 'utf8').toString('hex');\n }\n\n if (message instanceof Uint8Array) {\n return '0x' + Buffer.from(message).toString('hex');\n }\n\n throw new Error('Unsupported message type for signing');\n }\n\n private buildTypedData(\n domain: TypedDataDomain,\n types: Record<string, TypedDataField[]>,\n value: Record<string, unknown>\n ): EIP712TypedData {\n // Build EIP712Domain type based on provided domain fields\n const eip712Domain: TypedDataField[] = [];\n if (domain.name !== undefined) eip712Domain.push({ name: 'name', type: 'string' });\n if (domain.version !== undefined) eip712Domain.push({ name: 'version', type: 'string' });\n if (domain.chainId !== undefined) eip712Domain.push({ name: 'chainId', type: 'uint256' });\n if (domain.verifyingContract !== undefined) eip712Domain.push({ name: 'verifyingContract', type: 'address' });\n if (domain.salt !== undefined) eip712Domain.push({ name: 'salt', type: 'bytes32' });\n\n return {\n types: {\n EIP712Domain: eip712Domain,\n ...types\n },\n primaryType: Object.keys(types)[0],\n domain: this.sanitizeForJson(domain) as TypedDataDomain,\n message: this.sanitizeForJson(value) as Record<string, unknown>\n };\n }\n\n private sanitizeForJson(obj: unknown): unknown {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj === 'bigint') return obj.toString();\n if (Array.isArray(obj)) return obj.map((item) => this.sanitizeForJson(item));\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(obj)) {\n result[key] = this.sanitizeForJson(val);\n }\n return result;\n }\n return obj;\n }\n\n private async pollTransaction(transactionId: string, logPrefix = 'Transaction'): Promise<unknown> {\n while (true) {\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n\n const response = await this.bronApi.transactions.getTransactions({\n transactionIds: [transactionId],\n includeCurrentSigningRequest: true\n });\n\n const tx = response.transactions?.[0];\n\n if (!tx) {\n throw new Error(`${logPrefix} ${transactionId} not found`);\n }\n\n if (tx.status === 'completed') {\n return tx;\n }\n\n if (tx.terminatedAt) {\n throw new Error(`${logPrefix} ${transactionId} failed: ${tx.status} ${tx.extra?.description}`);\n }\n }\n }\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { N as NetworkMapping } from './BronSigner-CkNm6ZoM.cjs';
2
- export { B as BronSigner, a as BronSignerOptions, E as EIP712TypedData, T as TransactionStatus } from './BronSigner-CkNm6ZoM.cjs';
1
+ import { N as NetworkMapping } from './BronSigner-D6m6Vvbk.cjs';
2
+ export { B as BronSigner, a as BronSignerOptions, E as EIP712TypedData } from './BronSigner-D6m6Vvbk.cjs';
3
3
  export { FetchFunction } from '@bronlabs/bron-sdk/utils';
4
4
  import 'ethers';
5
5
 
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { N as NetworkMapping } from './BronSigner-CkNm6ZoM.js';
2
- export { B as BronSigner, a as BronSignerOptions, E as EIP712TypedData, T as TransactionStatus } from './BronSigner-CkNm6ZoM.js';
1
+ import { N as NetworkMapping } from './BronSigner-D6m6Vvbk.js';
2
+ export { B as BronSigner, a as BronSignerOptions, E as EIP712TypedData } from './BronSigner-D6m6Vvbk.js';
3
3
  export { FetchFunction } from '@bronlabs/bron-sdk/utils';
4
4
  import 'ethers';
5
5
 
package/dist/index.js CHANGED
@@ -265,13 +265,12 @@ var BronSigner = class _BronSigner extends AbstractSigner {
265
265
  if (!tx) {
266
266
  throw new Error(`${logPrefix} ${transactionId} not found`);
267
267
  }
268
- const status = tx.status;
269
- if (status === "failed" || status === "rejected" || status === "canceled") {
270
- throw new Error(`${logPrefix} ${transactionId} ${status}`);
271
- }
272
- if (status === "completed") {
268
+ if (tx.status === "completed") {
273
269
  return tx;
274
270
  }
271
+ if (tx.terminatedAt) {
272
+ throw new Error(`${logPrefix} ${transactionId} failed: ${tx.status} ${tx.extra?.description}`);
273
+ }
275
274
  }
276
275
  }
277
276
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/networks.ts","../src/BronSigner.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { NetworkMapping } from './types.js';\n\n/**\n * Mapping from EVM chain IDs to Bron network configuration\n */\nexport const NETWORK_MAPPINGS: Record<number, NetworkMapping> = {\n // Mainnets\n 1: { networkId: 'ETH', gasTokenId: 2 }, // Ethereum\n 42161: { networkId: 'ARB', gasTokenId: 7 }, // Arbitrum\n 8453: { networkId: 'BASE', gasTokenId: 8 }, // Base\n 10: { networkId: 'OP', gasTokenId: 6 }, // Optimism\n 56: { networkId: 'BNB', gasTokenId: 9 }, // BNB Chain\n\n // Testnets\n 10006: { networkId: '10006', gasTokenId: 10006 }, // Hoodi ETH\n 11155111: { networkId: '10002', gasTokenId: 10002 }, // Sepolia ETH\n};\n\n/**\n * Get Bron network ID from EVM chain ID\n * @param chainId - EVM chain ID\n * @returns Bron network ID\n * @throws Error if chain ID is not supported\n */\nexport function getNetworkId(chainId: number | bigint): string {\n const id = Number(chainId);\n const mapping = NETWORK_MAPPINGS[id];\n if (!mapping) {\n throw new Error(`Unsupported EVM chainId: ${id}. Supported chains: ${Object.keys(NETWORK_MAPPINGS).join(', ')}`);\n }\n return mapping.networkId;\n}\n\n/**\n * Get Bron gas token asset ID from EVM chain ID\n * @param chainId - EVM chain ID\n * @returns Bron gas token asset ID\n * @throws Error if chain ID is not supported\n */\nexport function getGasTokenId(chainId: number | bigint): number {\n const id = Number(chainId);\n const mapping = NETWORK_MAPPINGS[id];\n if (!mapping) {\n throw new Error(`Unsupported EVM chainId: ${id}. Supported chains: ${Object.keys(NETWORK_MAPPINGS).join(', ')}`);\n }\n return mapping.gasTokenId;\n}\n\n/**\n * Check if a chain ID is supported\n * @param chainId - EVM chain ID\n * @returns true if supported\n */\nexport function isChainSupported(chainId: number | bigint): boolean {\n return Number(chainId) in NETWORK_MAPPINGS;\n}\n\n/**\n * Get all supported chain IDs\n * @returns Array of supported EVM chain IDs\n */\nexport function getSupportedChainIds(): number[] {\n return Object.keys(NETWORK_MAPPINGS).map(Number);\n}\n","import { AbstractSigner, type Provider, type TransactionRequest, type TransactionResponse, type TypedDataDomain, type TypedDataField } from 'ethers';\nimport { randomUUID } from 'node:crypto';\nimport BronClient from '@bronlabs/bron-sdk';\nimport type { FetchFunction } from '@bronlabs/bron-sdk/utils';\nimport { getNetworkId, getGasTokenId } from './networks.js';\nimport type { BronSignerOptions, EIP712TypedData, TransactionStatus } from './types.js';\n\n\nconst POLL_INTERVAL_MS = 3000;\n\n/**\n * Ethers.js compatible signer that uses Bron custody platform for signing operations.\n *\n * @example\n * ```typescript\n * import { BronSigner } from '@bronlabs/bron-ethers-signer';\n * import { ethers } from 'ethers';\n *\n * const provider = new ethers.JsonRpcProvider('https://mainnet.infura.io/v3/...');\n *\n * const signer = new BronSigner({\n * provider,\n * apiKey: process.env.BRON_API_KEY!,\n * workspaceId: process.env.BRON_WORKSPACE_ID!,\n * accountId: process.env.BRON_ACCOUNT_ID!,\n * });\n *\n * // Sign a message\n * const signature = await signer.signMessage('Hello World');\n *\n * // Sign typed data (EIP-712)\n * const typedSignature = await signer.signTypedData(domain, types, value);\n *\n * // Send a transaction\n * const tx = await signer.sendTransaction({ to: '0x...', value: ethers.parseEther('1') });\n * ```\n */\nexport class BronSigner extends AbstractSigner {\n private readonly bronApi: InstanceType<typeof BronClient>;\n private readonly apiKey: string;\n private readonly workspaceId: string;\n private readonly accountId: string;\n private readonly bronApiUrl?: string;\n private readonly fetchFn?: FetchFunction;\n\n constructor(options: BronSignerOptions) {\n super(options.provider);\n\n this.bronApi = new BronClient({\n baseUrl: options.bronApiUrl,\n apiKey: options.apiKey,\n workspaceId: options.workspaceId,\n fetchFn: options.fetchFn\n });\n\n this.apiKey = options.apiKey;\n this.workspaceId = options.workspaceId;\n this.accountId = options.accountId;\n this.bronApiUrl = options.bronApiUrl;\n this.fetchFn = options.fetchFn;\n }\n\n /**\n * Creates a new BronSigner connected to a different provider\n */\n connect(provider: Provider): BronSigner {\n return new BronSigner({\n provider,\n apiKey: this.apiKey,\n workspaceId: this.workspaceId,\n accountId: this.accountId,\n bronApiUrl: this.bronApiUrl,\n fetchFn: this.fetchFn\n });\n }\n\n /**\n * Returns the address associated with this signer's Bron account\n */\n async getAddress(): Promise<string> {\n this.assertProvider();\n\n const { addresses } = await this.bronApi.addresses.getDepositAddresses({\n accountId: this.accountId,\n networkId: await this.getBronNetworkId()\n });\n\n if (!addresses?.length) {\n throw new Error('No deposit addresses found for account');\n }\n\n const address = addresses[0].address;\n if (!address) {\n throw new Error('Deposit address is undefined');\n }\n\n return address;\n }\n\n /**\n * Sends a transaction through Bron custody platform.\n * The transaction will be signed and broadcast by Bron.\n */\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResponse> {\n this.assertProvider();\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-transaction' as any,\n params: {\n assetId: await this.getBronGasTokenId(),\n toAddress: tx.to,\n amount: tx.value,\n data: tx.data\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId) as { transactionId: string };\n const txEvents = await this.bronApi.transactions.getTransactionEvents(completedTx.transactionId);\n const blockchainTxId = txEvents?.events?.[0]?.blockchainTxId;\n\n if (!blockchainTxId) {\n throw new Error('Bron SDK returned no blockchainTxId');\n }\n\n const txResponse = await this.provider!.getTransaction(blockchainTxId);\n if (!txResponse) {\n throw new Error(`Transaction ${blockchainTxId} not found on chain`);\n }\n\n return txResponse;\n }\n\n /**\n * Transaction signing is not supported by BronSigner.\n * Use sendTransaction() instead which handles signing and broadcasting internally.\n * @throws Always throws - use sendTransaction instead\n */\n async signTransaction(_tx: TransactionRequest): Promise<string> {\n throw new Error('signTransaction is not supported by BronSigner. Use sendTransaction instead.');\n }\n\n /**\n * Signs a message using the Bron custody platform.\n * Uses EIP-191 personal_sign format.\n *\n * @param message - The message to sign (string, Buffer, or Uint8Array)\n * @returns The signature as a hex string\n */\n async signMessage(message: string | Uint8Array): Promise<string> {\n this.assertProvider();\n\n const messageHex = this.messageToHex(message);\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-message' as any,\n params: {\n networkId: await this.getBronNetworkId(),\n method: 'eth_sign',\n message: messageHex,\n externalBroadcast: false\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId, 'Signing request');\n const signature = (completedTx as any)._embedded?.currentSigningRequest?.signed?.signature;\n\n if (!signature) {\n throw new Error('Bron SDK returned no signature');\n }\n\n return signature;\n }\n\n /**\n * Signs typed data using EIP-712 standard through Bron custody platform.\n *\n * @param domain - The EIP-712 domain\n * @param types - The type definitions\n * @param value - The data to sign\n * @returns The signature as a hex string\n */\n async signTypedData(\n domain: TypedDataDomain,\n types: Record<string, TypedDataField[]>,\n value: Record<string, unknown>\n ): Promise<string> {\n this.assertProvider();\n\n const typedData = this.buildTypedData(domain, types, value);\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-message' as any,\n params: {\n networkId: await this.getBronNetworkId(),\n method: 'eth_signTypedData_v4',\n version: 'V4', // Required for EIP-712 signing\n message: JSON.stringify(typedData),\n externalBroadcast: false\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId, 'Signing request');\n const signature = (completedTx as any)._embedded?.currentSigningRequest?.signed?.signature;\n\n if (!signature) {\n throw new Error('Bron SDK returned no signature for typed data');\n }\n\n return signature;\n }\n\n // ============================================================\n // Private helpers\n // ============================================================\n\n private assertProvider(): asserts this is { provider: Provider } {\n if (!this.provider) {\n throw new Error('Provider required');\n }\n }\n\n private async getBronNetworkId(): Promise<string> {\n const network = await this.provider!.getNetwork();\n return getNetworkId(network.chainId);\n }\n\n private async getBronGasTokenId(): Promise<number> {\n const network = await this.provider!.getNetwork();\n return getGasTokenId(network.chainId);\n }\n\n private messageToHex(message: string | Uint8Array): string {\n if (typeof message === 'string') {\n if (message.startsWith('0x')) {\n return message;\n }\n return '0x' + Buffer.from(message, 'utf8').toString('hex');\n }\n\n if (message instanceof Uint8Array) {\n return '0x' + Buffer.from(message).toString('hex');\n }\n\n throw new Error('Unsupported message type for signing');\n }\n\n private buildTypedData(\n domain: TypedDataDomain,\n types: Record<string, TypedDataField[]>,\n value: Record<string, unknown>\n ): EIP712TypedData {\n // Build EIP712Domain type based on provided domain fields\n const eip712Domain: TypedDataField[] = [];\n if (domain.name !== undefined) eip712Domain.push({ name: 'name', type: 'string' });\n if (domain.version !== undefined) eip712Domain.push({ name: 'version', type: 'string' });\n if (domain.chainId !== undefined) eip712Domain.push({ name: 'chainId', type: 'uint256' });\n if (domain.verifyingContract !== undefined) eip712Domain.push({ name: 'verifyingContract', type: 'address' });\n if (domain.salt !== undefined) eip712Domain.push({ name: 'salt', type: 'bytes32' });\n\n return {\n types: {\n EIP712Domain: eip712Domain,\n ...types\n },\n primaryType: Object.keys(types)[0],\n domain: this.sanitizeForJson(domain) as TypedDataDomain,\n message: this.sanitizeForJson(value) as Record<string, unknown>\n };\n }\n\n private sanitizeForJson(obj: unknown): unknown {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj === 'bigint') return obj.toString();\n if (Array.isArray(obj)) return obj.map((item) => this.sanitizeForJson(item));\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(obj)) {\n result[key] = this.sanitizeForJson(val);\n }\n return result;\n }\n return obj;\n }\n\n private async pollTransaction(transactionId: string, logPrefix = 'Transaction'): Promise<unknown> {\n while (true) {\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n\n const response = await this.bronApi.transactions.getTransactions({\n transactionIds: [transactionId],\n includeCurrentSigningRequest: true\n });\n\n const tx = response.transactions?.[0];\n\n if (!tx) {\n throw new Error(`${logPrefix} ${transactionId} not found`);\n }\n\n const status = tx.status as TransactionStatus;\n\n if (status === 'failed' || status === 'rejected' || status === 'canceled') {\n throw new Error(`${logPrefix} ${transactionId} ${status}`);\n }\n\n if (status === 'completed') {\n return tx;\n }\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/networks.ts","../src/BronSigner.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { NetworkMapping } from './types.js';\n\n/**\n * Mapping from EVM chain IDs to Bron network configuration\n */\nexport const NETWORK_MAPPINGS: Record<number, NetworkMapping> = {\n // Mainnets\n 1: { networkId: 'ETH', gasTokenId: 2 }, // Ethereum\n 42161: { networkId: 'ARB', gasTokenId: 7 }, // Arbitrum\n 8453: { networkId: 'BASE', gasTokenId: 8 }, // Base\n 10: { networkId: 'OP', gasTokenId: 6 }, // Optimism\n 56: { networkId: 'BNB', gasTokenId: 9 }, // BNB Chain\n\n // Testnets\n 10006: { networkId: '10006', gasTokenId: 10006 }, // Hoodi ETH\n 11155111: { networkId: '10002', gasTokenId: 10002 }, // Sepolia ETH\n};\n\n/**\n * Get Bron network ID from EVM chain ID\n * @param chainId - EVM chain ID\n * @returns Bron network ID\n * @throws Error if chain ID is not supported\n */\nexport function getNetworkId(chainId: number | bigint): string {\n const id = Number(chainId);\n const mapping = NETWORK_MAPPINGS[id];\n if (!mapping) {\n throw new Error(`Unsupported EVM chainId: ${id}. Supported chains: ${Object.keys(NETWORK_MAPPINGS).join(', ')}`);\n }\n return mapping.networkId;\n}\n\n/**\n * Get Bron gas token asset ID from EVM chain ID\n * @param chainId - EVM chain ID\n * @returns Bron gas token asset ID\n * @throws Error if chain ID is not supported\n */\nexport function getGasTokenId(chainId: number | bigint): number {\n const id = Number(chainId);\n const mapping = NETWORK_MAPPINGS[id];\n if (!mapping) {\n throw new Error(`Unsupported EVM chainId: ${id}. Supported chains: ${Object.keys(NETWORK_MAPPINGS).join(', ')}`);\n }\n return mapping.gasTokenId;\n}\n\n/**\n * Check if a chain ID is supported\n * @param chainId - EVM chain ID\n * @returns true if supported\n */\nexport function isChainSupported(chainId: number | bigint): boolean {\n return Number(chainId) in NETWORK_MAPPINGS;\n}\n\n/**\n * Get all supported chain IDs\n * @returns Array of supported EVM chain IDs\n */\nexport function getSupportedChainIds(): number[] {\n return Object.keys(NETWORK_MAPPINGS).map(Number);\n}\n","import { AbstractSigner, type Provider, type TransactionRequest, type TransactionResponse, type TypedDataDomain, type TypedDataField } from 'ethers';\nimport { randomUUID } from 'node:crypto';\nimport BronClient from '@bronlabs/bron-sdk';\nimport type { FetchFunction } from '@bronlabs/bron-sdk/utils';\nimport { getNetworkId, getGasTokenId } from './networks.js';\nimport type { BronSignerOptions, EIP712TypedData } from './types.js';\n\n\nconst POLL_INTERVAL_MS = 3000;\n\n/**\n * Ethers.js compatible signer that uses Bron custody platform for signing operations.\n *\n * @example\n * ```typescript\n * import { BronSigner } from '@bronlabs/bron-ethers-signer';\n * import { ethers } from 'ethers';\n *\n * const provider = new ethers.JsonRpcProvider('https://mainnet.infura.io/v3/...');\n *\n * const signer = new BronSigner({\n * provider,\n * apiKey: process.env.BRON_API_KEY!,\n * workspaceId: process.env.BRON_WORKSPACE_ID!,\n * accountId: process.env.BRON_ACCOUNT_ID!,\n * });\n *\n * // Sign a message\n * const signature = await signer.signMessage('Hello World');\n *\n * // Sign typed data (EIP-712)\n * const typedSignature = await signer.signTypedData(domain, types, value);\n *\n * // Send a transaction\n * const tx = await signer.sendTransaction({ to: '0x...', value: ethers.parseEther('1') });\n * ```\n */\nexport class BronSigner extends AbstractSigner {\n private readonly bronApi: InstanceType<typeof BronClient>;\n private readonly apiKey: string;\n private readonly workspaceId: string;\n private readonly accountId: string;\n private readonly bronApiUrl?: string;\n private readonly fetchFn?: FetchFunction;\n\n constructor(options: BronSignerOptions) {\n super(options.provider);\n\n this.bronApi = new BronClient({\n baseUrl: options.bronApiUrl,\n apiKey: options.apiKey,\n workspaceId: options.workspaceId,\n fetchFn: options.fetchFn\n });\n\n this.apiKey = options.apiKey;\n this.workspaceId = options.workspaceId;\n this.accountId = options.accountId;\n this.bronApiUrl = options.bronApiUrl;\n this.fetchFn = options.fetchFn;\n }\n\n /**\n * Creates a new BronSigner connected to a different provider\n */\n connect(provider: Provider): BronSigner {\n return new BronSigner({\n provider,\n apiKey: this.apiKey,\n workspaceId: this.workspaceId,\n accountId: this.accountId,\n bronApiUrl: this.bronApiUrl,\n fetchFn: this.fetchFn\n });\n }\n\n /**\n * Returns the address associated with this signer's Bron account\n */\n async getAddress(): Promise<string> {\n this.assertProvider();\n\n const { addresses } = await this.bronApi.addresses.getDepositAddresses({\n accountId: this.accountId,\n networkId: await this.getBronNetworkId()\n });\n\n if (!addresses?.length) {\n throw new Error('No deposit addresses found for account');\n }\n\n const address = addresses[0].address;\n if (!address) {\n throw new Error('Deposit address is undefined');\n }\n\n return address;\n }\n\n /**\n * Sends a transaction through Bron custody platform.\n * The transaction will be signed and broadcast by Bron.\n */\n async sendTransaction(tx: TransactionRequest): Promise<TransactionResponse> {\n this.assertProvider();\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-transaction' as any,\n params: {\n assetId: await this.getBronGasTokenId(),\n toAddress: tx.to,\n amount: tx.value,\n data: tx.data\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId) as { transactionId: string };\n const txEvents = await this.bronApi.transactions.getTransactionEvents(completedTx.transactionId);\n const blockchainTxId = txEvents?.events?.[0]?.blockchainTxId;\n\n if (!blockchainTxId) {\n throw new Error('Bron SDK returned no blockchainTxId');\n }\n\n const txResponse = await this.provider!.getTransaction(blockchainTxId);\n if (!txResponse) {\n throw new Error(`Transaction ${blockchainTxId} not found on chain`);\n }\n\n return txResponse;\n }\n\n /**\n * Transaction signing is not supported by BronSigner.\n * Use sendTransaction() instead which handles signing and broadcasting internally.\n * @throws Always throws - use sendTransaction instead\n */\n async signTransaction(_tx: TransactionRequest): Promise<string> {\n throw new Error('signTransaction is not supported by BronSigner. Use sendTransaction instead.');\n }\n\n /**\n * Signs a message using the Bron custody platform.\n * Uses EIP-191 personal_sign format.\n *\n * @param message - The message to sign (string, Buffer, or Uint8Array)\n * @returns The signature as a hex string\n */\n async signMessage(message: string | Uint8Array): Promise<string> {\n this.assertProvider();\n\n const messageHex = this.messageToHex(message);\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-message' as any,\n params: {\n networkId: await this.getBronNetworkId(),\n method: 'eth_sign',\n message: messageHex,\n externalBroadcast: false\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId, 'Signing request');\n const signature = (completedTx as any)._embedded?.currentSigningRequest?.signed?.signature;\n\n if (!signature) {\n throw new Error('Bron SDK returned no signature');\n }\n\n return signature;\n }\n\n /**\n * Signs typed data using EIP-712 standard through Bron custody platform.\n *\n * @param domain - The EIP-712 domain\n * @param types - The type definitions\n * @param value - The data to sign\n * @returns The signature as a hex string\n */\n async signTypedData(\n domain: TypedDataDomain,\n types: Record<string, TypedDataField[]>,\n value: Record<string, unknown>\n ): Promise<string> {\n this.assertProvider();\n\n const typedData = this.buildTypedData(domain, types, value);\n\n const result = await this.bronApi.transactions.createTransaction({\n accountId: this.accountId,\n externalId: randomUUID(),\n transactionType: 'raw-message' as any,\n params: {\n networkId: await this.getBronNetworkId(),\n method: 'eth_signTypedData_v4',\n version: 'V4', // Required for EIP-712 signing\n message: JSON.stringify(typedData),\n externalBroadcast: false\n }\n });\n\n const completedTx = await this.pollTransaction(result.transactionId, 'Signing request');\n const signature = (completedTx as any)._embedded?.currentSigningRequest?.signed?.signature;\n\n if (!signature) {\n throw new Error('Bron SDK returned no signature for typed data');\n }\n\n return signature;\n }\n\n // ============================================================\n // Private helpers\n // ============================================================\n\n private assertProvider(): asserts this is { provider: Provider } {\n if (!this.provider) {\n throw new Error('Provider required');\n }\n }\n\n private async getBronNetworkId(): Promise<string> {\n const network = await this.provider!.getNetwork();\n return getNetworkId(network.chainId);\n }\n\n private async getBronGasTokenId(): Promise<number> {\n const network = await this.provider!.getNetwork();\n return getGasTokenId(network.chainId);\n }\n\n private messageToHex(message: string | Uint8Array): string {\n if (typeof message === 'string') {\n if (message.startsWith('0x')) {\n return message;\n }\n return '0x' + Buffer.from(message, 'utf8').toString('hex');\n }\n\n if (message instanceof Uint8Array) {\n return '0x' + Buffer.from(message).toString('hex');\n }\n\n throw new Error('Unsupported message type for signing');\n }\n\n private buildTypedData(\n domain: TypedDataDomain,\n types: Record<string, TypedDataField[]>,\n value: Record<string, unknown>\n ): EIP712TypedData {\n // Build EIP712Domain type based on provided domain fields\n const eip712Domain: TypedDataField[] = [];\n if (domain.name !== undefined) eip712Domain.push({ name: 'name', type: 'string' });\n if (domain.version !== undefined) eip712Domain.push({ name: 'version', type: 'string' });\n if (domain.chainId !== undefined) eip712Domain.push({ name: 'chainId', type: 'uint256' });\n if (domain.verifyingContract !== undefined) eip712Domain.push({ name: 'verifyingContract', type: 'address' });\n if (domain.salt !== undefined) eip712Domain.push({ name: 'salt', type: 'bytes32' });\n\n return {\n types: {\n EIP712Domain: eip712Domain,\n ...types\n },\n primaryType: Object.keys(types)[0],\n domain: this.sanitizeForJson(domain) as TypedDataDomain,\n message: this.sanitizeForJson(value) as Record<string, unknown>\n };\n }\n\n private sanitizeForJson(obj: unknown): unknown {\n if (obj === null || obj === undefined) return obj;\n if (typeof obj === 'bigint') return obj.toString();\n if (Array.isArray(obj)) return obj.map((item) => this.sanitizeForJson(item));\n if (typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(obj)) {\n result[key] = this.sanitizeForJson(val);\n }\n return result;\n }\n return obj;\n }\n\n private async pollTransaction(transactionId: string, logPrefix = 'Transaction'): Promise<unknown> {\n while (true) {\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n\n const response = await this.bronApi.transactions.getTransactions({\n transactionIds: [transactionId],\n includeCurrentSigningRequest: true\n });\n\n const tx = response.transactions?.[0];\n\n if (!tx) {\n throw new Error(`${logPrefix} ${transactionId} not found`);\n }\n\n if (tx.status === 'completed') {\n return tx;\n }\n\n if (tx.terminatedAt) {\n throw new Error(`${logPrefix} ${transactionId} failed: ${tx.status} ${tx.extra?.description}`);\n }\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bronlabs/bron-ethers-signer",
3
- "version": "1.0.10",
3
+ "version": "1.0.13",
4
4
  "description": "Ethers.js compatible signer for Bron Wallet platform",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",