@bronlabs/bron-ethers-signer 1.0.7 → 1.0.10

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.
@@ -1,4 +1,5 @@
1
1
  import { Provider, TypedDataField, TypedDataDomain, AbstractSigner, TransactionRequest, TransactionResponse } from 'ethers';
2
+ import { FetchFunction } from '@bronlabs/bron-sdk/utils';
2
3
 
3
4
  /**
4
5
  * Configuration options for BronSigner
@@ -14,6 +15,8 @@ interface BronSignerOptions {
14
15
  workspaceId: string;
15
16
  /** Bron account ID */
16
17
  accountId: string;
18
+ /** Custom fetch function for HTTP requests (e.g. with proxy support) */
19
+ fetchFn?: FetchFunction;
17
20
  }
18
21
  /**
19
22
  * Network mapping configuration
@@ -70,6 +73,8 @@ declare class BronSigner extends AbstractSigner {
70
73
  private readonly apiKey;
71
74
  private readonly workspaceId;
72
75
  private readonly accountId;
76
+ private readonly bronApiUrl?;
77
+ private readonly fetchFn?;
73
78
  constructor(options: BronSignerOptions);
74
79
  /**
75
80
  * Creates a new BronSigner connected to a different provider
@@ -1,4 +1,5 @@
1
1
  import { Provider, TypedDataField, TypedDataDomain, AbstractSigner, TransactionRequest, TransactionResponse } from 'ethers';
2
+ import { FetchFunction } from '@bronlabs/bron-sdk/utils';
2
3
 
3
4
  /**
4
5
  * Configuration options for BronSigner
@@ -14,6 +15,8 @@ interface BronSignerOptions {
14
15
  workspaceId: string;
15
16
  /** Bron account ID */
16
17
  accountId: string;
18
+ /** Custom fetch function for HTTP requests (e.g. with proxy support) */
19
+ fetchFn?: FetchFunction;
17
20
  }
18
21
  /**
19
22
  * Network mapping configuration
@@ -70,6 +73,8 @@ declare class BronSigner extends AbstractSigner {
70
73
  private readonly apiKey;
71
74
  private readonly workspaceId;
72
75
  private readonly accountId;
76
+ private readonly bronApiUrl?;
77
+ private readonly fetchFn?;
73
78
  constructor(options: BronSignerOptions);
74
79
  /**
75
80
  * Creates a new BronSigner connected to a different provider
package/dist/hardhat.cjs CHANGED
@@ -58,16 +58,21 @@ var BronSigner = class _BronSigner extends ethers.AbstractSigner {
58
58
  apiKey;
59
59
  workspaceId;
60
60
  accountId;
61
+ bronApiUrl;
62
+ fetchFn;
61
63
  constructor(options) {
62
64
  super(options.provider);
63
65
  this.bronApi = new BronClient__default.default({
64
66
  baseUrl: options.bronApiUrl,
65
67
  apiKey: options.apiKey,
66
- workspaceId: options.workspaceId
68
+ workspaceId: options.workspaceId,
69
+ fetchFn: options.fetchFn
67
70
  });
68
71
  this.apiKey = options.apiKey;
69
72
  this.workspaceId = options.workspaceId;
70
73
  this.accountId = options.accountId;
74
+ this.bronApiUrl = options.bronApiUrl;
75
+ this.fetchFn = options.fetchFn;
71
76
  }
72
77
  /**
73
78
  * Creates a new BronSigner connected to a different provider
@@ -77,7 +82,9 @@ var BronSigner = class _BronSigner extends ethers.AbstractSigner {
77
82
  provider,
78
83
  apiKey: this.apiKey,
79
84
  workspaceId: this.workspaceId,
80
- accountId: this.accountId
85
+ accountId: this.accountId,
86
+ bronApiUrl: this.bronApiUrl,
87
+ fetchFn: this.fetchFn
81
88
  });
82
89
  }
83
90
  /**
@@ -110,9 +117,9 @@ var BronSigner = class _BronSigner extends ethers.AbstractSigner {
110
117
  transactionType: "raw-transaction",
111
118
  params: {
112
119
  assetId: await this.getBronGasTokenId(),
113
- toAddress: tx.to || "0x",
114
- amount: tx.value ? tx.value.toString() : "0",
115
- data: tx.data ? tx.data.toString() : "0x"
120
+ toAddress: tx.to,
121
+ amount: tx.value,
122
+ data: tx.data
116
123
  }
117
124
  });
118
125
  const completedTx = await this.pollTransaction(result.transactionId);
@@ -277,9 +284,7 @@ var BronSigner = class _BronSigner extends ethers.AbstractSigner {
277
284
  // src/hardhat.ts
278
285
  function extendHardhatWithBronSigner(config = {}) {
279
286
  const { extendEnvironment } = __require("hardhat/config");
280
- const apiKey = config.apiKey;
281
- const workspaceId = config.workspaceId;
282
- const accountId = config.accountId;
287
+ const { apiKey, workspaceId, accountId, fetchFn } = config;
283
288
  const excludeNetworks = config.excludeNetworks ?? ["hardhat", "localhost"];
284
289
  const useBronSigner = apiKey && workspaceId && accountId;
285
290
  if (!useBronSigner) {
@@ -297,7 +302,8 @@ function extendHardhatWithBronSigner(config = {}) {
297
302
  provider,
298
303
  apiKey,
299
304
  workspaceId,
300
- accountId
305
+ accountId,
306
+ fetchFn
301
307
  });
302
308
  return [bronSigner];
303
309
  }
@@ -312,7 +318,8 @@ function extendHardhatWithBronSigner(config = {}) {
312
318
  provider,
313
319
  apiKey,
314
320
  workspaceId,
315
- accountId
321
+ accountId,
322
+ fetchFn
316
323
  });
317
324
  }
318
325
  return originalGetSigner(_address);
@@ -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 { getNetworkId, getGasTokenId } from './networks.js';\nimport type { BronSignerOptions, EIP712TypedData, TransactionStatus } from './types.js';\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\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 });\n\n this.apiKey = options.apiKey;\n this.workspaceId = options.workspaceId;\n this.accountId = options.accountId;\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 });\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 || '0x',\n amount: tx.value ? tx.value.toString() : '0',\n data: tx.data ? tx.data.toString() : '0x',\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 { 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}\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 = config.apiKey;\n const workspaceId = config.workspaceId;\n const accountId = config.accountId;\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 });\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 });\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, 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,4 +1,5 @@
1
- export { B as BronSigner } from './BronSigner-CTiRcVYb.cjs';
1
+ import { FetchFunction } from '@bronlabs/bron-sdk/utils';
2
+ export { B as BronSigner } from './BronSigner-CkNm6ZoM.cjs';
2
3
  import 'ethers';
3
4
 
4
5
  /**
@@ -28,6 +29,8 @@ interface BronHardhatConfig {
28
29
  accountId?: string;
29
30
  /** Networks to exclude from BronSigner (default: ['hardhat', 'localhost']) */
30
31
  excludeNetworks?: string[];
32
+ /** Custom fetch function for HTTP requests (e.g. with proxy support) */
33
+ fetchFn?: FetchFunction;
31
34
  }
32
35
  /**
33
36
  * Extends Hardhat environment to use BronSigner for getSigners() and getSigner()
package/dist/hardhat.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- export { B as BronSigner } from './BronSigner-CTiRcVYb.js';
1
+ import { FetchFunction } from '@bronlabs/bron-sdk/utils';
2
+ export { B as BronSigner } from './BronSigner-CkNm6ZoM.js';
2
3
  import 'ethers';
3
4
 
4
5
  /**
@@ -28,6 +29,8 @@ interface BronHardhatConfig {
28
29
  accountId?: string;
29
30
  /** Networks to exclude from BronSigner (default: ['hardhat', 'localhost']) */
30
31
  excludeNetworks?: string[];
32
+ /** Custom fetch function for HTTP requests (e.g. with proxy support) */
33
+ fetchFn?: FetchFunction;
31
34
  }
32
35
  /**
33
36
  * Extends Hardhat environment to use BronSigner for getSigners() and getSigner()
package/dist/hardhat.js CHANGED
@@ -52,16 +52,21 @@ var BronSigner = class _BronSigner extends AbstractSigner {
52
52
  apiKey;
53
53
  workspaceId;
54
54
  accountId;
55
+ bronApiUrl;
56
+ fetchFn;
55
57
  constructor(options) {
56
58
  super(options.provider);
57
59
  this.bronApi = new BronClient({
58
60
  baseUrl: options.bronApiUrl,
59
61
  apiKey: options.apiKey,
60
- workspaceId: options.workspaceId
62
+ workspaceId: options.workspaceId,
63
+ fetchFn: options.fetchFn
61
64
  });
62
65
  this.apiKey = options.apiKey;
63
66
  this.workspaceId = options.workspaceId;
64
67
  this.accountId = options.accountId;
68
+ this.bronApiUrl = options.bronApiUrl;
69
+ this.fetchFn = options.fetchFn;
65
70
  }
66
71
  /**
67
72
  * Creates a new BronSigner connected to a different provider
@@ -71,7 +76,9 @@ var BronSigner = class _BronSigner extends AbstractSigner {
71
76
  provider,
72
77
  apiKey: this.apiKey,
73
78
  workspaceId: this.workspaceId,
74
- accountId: this.accountId
79
+ accountId: this.accountId,
80
+ bronApiUrl: this.bronApiUrl,
81
+ fetchFn: this.fetchFn
75
82
  });
76
83
  }
77
84
  /**
@@ -104,9 +111,9 @@ var BronSigner = class _BronSigner extends AbstractSigner {
104
111
  transactionType: "raw-transaction",
105
112
  params: {
106
113
  assetId: await this.getBronGasTokenId(),
107
- toAddress: tx.to || "0x",
108
- amount: tx.value ? tx.value.toString() : "0",
109
- data: tx.data ? tx.data.toString() : "0x"
114
+ toAddress: tx.to,
115
+ amount: tx.value,
116
+ data: tx.data
110
117
  }
111
118
  });
112
119
  const completedTx = await this.pollTransaction(result.transactionId);
@@ -271,9 +278,7 @@ var BronSigner = class _BronSigner extends AbstractSigner {
271
278
  // src/hardhat.ts
272
279
  function extendHardhatWithBronSigner(config = {}) {
273
280
  const { extendEnvironment } = __require("hardhat/config");
274
- const apiKey = config.apiKey;
275
- const workspaceId = config.workspaceId;
276
- const accountId = config.accountId;
281
+ const { apiKey, workspaceId, accountId, fetchFn } = config;
277
282
  const excludeNetworks = config.excludeNetworks ?? ["hardhat", "localhost"];
278
283
  const useBronSigner = apiKey && workspaceId && accountId;
279
284
  if (!useBronSigner) {
@@ -291,7 +296,8 @@ function extendHardhatWithBronSigner(config = {}) {
291
296
  provider,
292
297
  apiKey,
293
298
  workspaceId,
294
- accountId
299
+ accountId,
300
+ fetchFn
295
301
  });
296
302
  return [bronSigner];
297
303
  }
@@ -306,7 +312,8 @@ function extendHardhatWithBronSigner(config = {}) {
306
312
  provider,
307
313
  apiKey,
308
314
  workspaceId,
309
- accountId
315
+ accountId,
316
+ fetchFn
310
317
  });
311
318
  }
312
319
  return originalGetSigner(_address);
@@ -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 { getNetworkId, getGasTokenId } from './networks.js';\nimport type { BronSignerOptions, EIP712TypedData, TransactionStatus } from './types.js';\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\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 });\n\n this.apiKey = options.apiKey;\n this.workspaceId = options.workspaceId;\n this.accountId = options.accountId;\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 });\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 || '0x',\n amount: tx.value ? tx.value.toString() : '0',\n data: tx.data ? tx.data.toString() : '0x',\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 { 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}\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 = config.apiKey;\n const workspaceId = config.workspaceId;\n const accountId = config.accountId;\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 });\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 });\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, 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"]}
package/dist/index.cjs CHANGED
@@ -59,16 +59,21 @@ var BronSigner = class _BronSigner extends ethers.AbstractSigner {
59
59
  apiKey;
60
60
  workspaceId;
61
61
  accountId;
62
+ bronApiUrl;
63
+ fetchFn;
62
64
  constructor(options) {
63
65
  super(options.provider);
64
66
  this.bronApi = new BronClient__default.default({
65
67
  baseUrl: options.bronApiUrl,
66
68
  apiKey: options.apiKey,
67
- workspaceId: options.workspaceId
69
+ workspaceId: options.workspaceId,
70
+ fetchFn: options.fetchFn
68
71
  });
69
72
  this.apiKey = options.apiKey;
70
73
  this.workspaceId = options.workspaceId;
71
74
  this.accountId = options.accountId;
75
+ this.bronApiUrl = options.bronApiUrl;
76
+ this.fetchFn = options.fetchFn;
72
77
  }
73
78
  /**
74
79
  * Creates a new BronSigner connected to a different provider
@@ -78,7 +83,9 @@ var BronSigner = class _BronSigner extends ethers.AbstractSigner {
78
83
  provider,
79
84
  apiKey: this.apiKey,
80
85
  workspaceId: this.workspaceId,
81
- accountId: this.accountId
86
+ accountId: this.accountId,
87
+ bronApiUrl: this.bronApiUrl,
88
+ fetchFn: this.fetchFn
82
89
  });
83
90
  }
84
91
  /**
@@ -111,9 +118,9 @@ var BronSigner = class _BronSigner extends ethers.AbstractSigner {
111
118
  transactionType: "raw-transaction",
112
119
  params: {
113
120
  assetId: await this.getBronGasTokenId(),
114
- toAddress: tx.to || "0x",
115
- amount: tx.value ? tx.value.toString() : "0",
116
- data: tx.data ? tx.data.toString() : "0x"
121
+ toAddress: tx.to,
122
+ amount: tx.value,
123
+ data: tx.data
117
124
  }
118
125
  });
119
126
  const completedTx = await this.pollTransaction(result.transactionId);
@@ -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 { getNetworkId, getGasTokenId } from './networks.js';\nimport type { BronSignerOptions, EIP712TypedData, TransactionStatus } from './types.js';\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\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 });\n\n this.apiKey = options.apiKey;\n this.workspaceId = options.workspaceId;\n this.accountId = options.accountId;\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 });\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 || '0x',\n amount: tx.value ? tx.value.toString() : '0',\n data: tx.data ? tx.data.toString() : '0x',\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, 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"]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,6 @@
1
- import { N as NetworkMapping } from './BronSigner-CTiRcVYb.cjs';
2
- export { B as BronSigner, a as BronSignerOptions, E as EIP712TypedData, T as TransactionStatus } from './BronSigner-CTiRcVYb.cjs';
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';
3
+ export { FetchFunction } from '@bronlabs/bron-sdk/utils';
3
4
  import 'ethers';
4
5
 
5
6
  /**
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
- import { N as NetworkMapping } from './BronSigner-CTiRcVYb.js';
2
- export { B as BronSigner, a as BronSignerOptions, E as EIP712TypedData, T as TransactionStatus } from './BronSigner-CTiRcVYb.js';
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';
3
+ export { FetchFunction } from '@bronlabs/bron-sdk/utils';
3
4
  import 'ethers';
4
5
 
5
6
  /**
package/dist/index.js CHANGED
@@ -53,16 +53,21 @@ var BronSigner = class _BronSigner extends AbstractSigner {
53
53
  apiKey;
54
54
  workspaceId;
55
55
  accountId;
56
+ bronApiUrl;
57
+ fetchFn;
56
58
  constructor(options) {
57
59
  super(options.provider);
58
60
  this.bronApi = new BronClient({
59
61
  baseUrl: options.bronApiUrl,
60
62
  apiKey: options.apiKey,
61
- workspaceId: options.workspaceId
63
+ workspaceId: options.workspaceId,
64
+ fetchFn: options.fetchFn
62
65
  });
63
66
  this.apiKey = options.apiKey;
64
67
  this.workspaceId = options.workspaceId;
65
68
  this.accountId = options.accountId;
69
+ this.bronApiUrl = options.bronApiUrl;
70
+ this.fetchFn = options.fetchFn;
66
71
  }
67
72
  /**
68
73
  * Creates a new BronSigner connected to a different provider
@@ -72,7 +77,9 @@ var BronSigner = class _BronSigner extends AbstractSigner {
72
77
  provider,
73
78
  apiKey: this.apiKey,
74
79
  workspaceId: this.workspaceId,
75
- accountId: this.accountId
80
+ accountId: this.accountId,
81
+ bronApiUrl: this.bronApiUrl,
82
+ fetchFn: this.fetchFn
76
83
  });
77
84
  }
78
85
  /**
@@ -105,9 +112,9 @@ var BronSigner = class _BronSigner extends AbstractSigner {
105
112
  transactionType: "raw-transaction",
106
113
  params: {
107
114
  assetId: await this.getBronGasTokenId(),
108
- toAddress: tx.to || "0x",
109
- amount: tx.value ? tx.value.toString() : "0",
110
- data: tx.data ? tx.data.toString() : "0x"
115
+ toAddress: tx.to,
116
+ amount: tx.value,
117
+ data: tx.data
111
118
  }
112
119
  });
113
120
  const completedTx = await this.pollTransaction(result.transactionId);
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 { getNetworkId, getGasTokenId } from './networks.js';\nimport type { BronSignerOptions, EIP712TypedData, TransactionStatus } from './types.js';\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\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 });\n\n this.apiKey = options.apiKey;\n this.workspaceId = options.workspaceId;\n this.accountId = options.accountId;\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 });\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 || '0x',\n amount: tx.value ? tx.value.toString() : '0',\n data: tx.data ? tx.data.toString() : '0x',\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, 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bronlabs/bron-ethers-signer",
3
- "version": "1.0.7",
3
+ "version": "1.0.10",
4
4
  "description": "Ethers.js compatible signer for Bron Wallet platform",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -48,7 +48,7 @@
48
48
  "url": "https://github.com/bronlabs/bron-ethers-signer/issues"
49
49
  },
50
50
  "dependencies": {
51
- "@bronlabs/bron-sdk": "^0.1.30"
51
+ "@bronlabs/bron-sdk": "^1.0.36"
52
52
  },
53
53
  "peerDependencies": {
54
54
  "ethers": "^6.0.0"