@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.
- package/dist/{BronSigner-CTiRcVYb.d.cts → BronSigner-CkNm6ZoM.d.cts} +5 -0
- package/dist/{BronSigner-CTiRcVYb.d.ts → BronSigner-CkNm6ZoM.d.ts} +5 -0
- package/dist/hardhat.cjs +17 -10
- package/dist/hardhat.cjs.map +1 -1
- package/dist/hardhat.d.cts +4 -1
- package/dist/hardhat.d.ts +4 -1
- package/dist/hardhat.js +17 -10
- package/dist/hardhat.js.map +1 -1
- package/dist/index.cjs +12 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +12 -5
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -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
|
|
114
|
-
amount: tx.value
|
|
115
|
-
data: tx.data
|
|
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
|
|
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);
|
package/dist/hardhat.cjs.map
CHANGED
|
@@ -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"]}
|
package/dist/hardhat.d.cts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
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
|
|
108
|
-
amount: tx.value
|
|
109
|
-
data: tx.data
|
|
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
|
|
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);
|
package/dist/hardhat.js.map
CHANGED
|
@@ -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
|
|
115
|
-
amount: tx.value
|
|
116
|
-
data: tx.data
|
|
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);
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/networks.ts","../src/BronSigner.ts"],"names":["AbstractSigner","BronClient","randomUUID"],"mappings":";;;;;;;;;;;;;AAKO,IAAM,gBAAA,GAAmD;AAAA;AAAA,EAE9D,CAAA,EAAG,EAAE,SAAA,EAAW,KAAA,EAAO,YAAY,CAAA,EAAE;AAAA;AAAA,EACrC,KAAA,EAAO,EAAE,SAAA,EAAW,KAAA,EAAO,YAAY,CAAA,EAAE;AAAA;AAAA,EACzC,IAAA,EAAM,EAAE,SAAA,EAAW,MAAA,EAAQ,YAAY,CAAA,EAAE;AAAA;AAAA,EACzC,EAAA,EAAI,EAAE,SAAA,EAAW,IAAA,EAAM,YAAY,CAAA,EAAE;AAAA;AAAA,EACrC,EAAA,EAAI,EAAE,SAAA,EAAW,KAAA,EAAO,YAAY,CAAA,EAAE;AAAA;AAAA;AAAA,EAGtC,KAAA,EAAO,EAAE,SAAA,EAAW,OAAA,EAAS,YAAY,KAAA,EAAM;AAAA;AAAA,EAC/C,QAAA,EAAU,EAAE,SAAA,EAAW,OAAA,EAAS,YAAY,KAAA;AAAM;AACpD;AAQO,SAAS,aAAa,OAAA,EAAkC;AAC7D,EAAA,MAAM,EAAA,GAAK,OAAO,OAAO,CAAA;AACzB,EAAA,MAAM,OAAA,GAAU,iBAAiB,EAAE,CAAA;AACnC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,EAAE,CAAA,oBAAA,EAAuB,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACjH;AACA,EAAA,OAAO,OAAA,CAAQ,SAAA;AACjB;AAQO,SAAS,cAAc,OAAA,EAAkC;AAC9D,EAAA,MAAM,EAAA,GAAK,OAAO,OAAO,CAAA;AACzB,EAAA,MAAM,OAAA,GAAU,iBAAiB,EAAE,CAAA;AACnC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,EAAE,CAAA,oBAAA,EAAuB,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACjH;AACA,EAAA,OAAO,OAAA,CAAQ,UAAA;AACjB;AAOO,SAAS,iBAAiB,OAAA,EAAmC;AAClE,EAAA,OAAO,MAAA,CAAO,OAAO,CAAA,IAAK,gBAAA;AAC5B;AAMO,SAAS,oBAAA,GAAiC;AAC/C,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA,CAAE,IAAI,MAAM,CAAA;AACjD;;;ACzDA,IAAM,gBAAA,GAAmB,GAAA;AA6BlB,IAAM,UAAA,GAAN,MAAM,WAAA,SAAmBA,qBAAA,CAAe;AAAA,EAC5B,OAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EAEjB,YAAY,OAAA,EAA4B;AACtC,IAAA,KAAA,CAAM,QAAQ,QAAQ,CAAA;AAEtB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAIC,2BAAA,CAAW;AAAA,MAC5B,SAAS,OAAA,CAAQ,UAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,aAAa,OAAA,CAAQ;AAAA,KACtB,CAAA;AAED,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,QAAA,EAAgC;AACtC,IAAA,OAAO,IAAI,WAAA,CAAW;AAAA,MACpB,QAAA;AAAA,MACA,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,WAAW,IAAA,CAAK;AAAA,KACjB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA8B;AAClC,IAAA,IAAA,CAAK,cAAA,EAAe;AAEpB,IAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,UAAU,mBAAA,CAAoB;AAAA,MACrE,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,SAAA,EAAW,MAAM,IAAA,CAAK,gBAAA;AAAiB,KACxC,CAAA;AAED,IAAA,IAAI,CAAC,WAAW,MAAA,EAAQ;AACtB,MAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,IAC1D;AAEA,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,CAAC,CAAA,CAAE,OAAA;AAC7B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAChD;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,gBAAgB,EAAA,EAAsD;AAC1E,IAAA,IAAA,CAAK,cAAA,EAAe;AAEpB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAa,iBAAA,CAAkB;AAAA,MAC/D,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,YAAYC,iBAAA,EAAW;AAAA,MACvB,eAAA,EAAiB,iBAAA;AAAA,MACjB,MAAA,EAAQ;AAAA,QACN,OAAA,EAAS,MAAM,IAAA,CAAK,iBAAA,EAAkB;AAAA,QACtC,SAAA,EAAW,GAAG,EAAA,IAAM,IAAA;AAAA,QACpB,QAAQ,EAAA,CAAG,KAAA,GAAQ,EAAA,CAAG,KAAA,CAAM,UAAS,GAAI,GAAA;AAAA,QACzC,MAAM,EAAA,CAAG,IAAA,GAAO,EAAA,CAAG,IAAA,CAAK,UAAS,GAAI;AAAA;AACvC,KACD,CAAA;AAED,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAO,aAAa,CAAA;AACnE,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,QAAQ,YAAA,CAAa,oBAAA,CAAqB,YAAY,aAAa,CAAA;AAC/F,IAAA,MAAM,cAAA,GAAiB,QAAA,EAAU,MAAA,GAAS,CAAC,CAAA,EAAG,cAAA;AAE9C,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,IACvD;AAEA,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,QAAA,CAAU,eAAe,cAAc,CAAA;AACrE,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,cAAc,CAAA,mBAAA,CAAqB,CAAA;AAAA,IACpE;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAgB,GAAA,EAA0C;AAC9D,IAAA,MAAM,IAAI,MAAM,8EAA8E,CAAA;AAAA,EAChG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAY,OAAA,EAA+C;AAC/D,IAAA,IAAA,CAAK,cAAA,EAAe;AAEpB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,OAAO,CAAA;AAE5C,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAa,iBAAA,CAAkB;AAAA,MAC/D,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,YAAYA,iBAAA,EAAW;AAAA,MACvB,eAAA,EAAiB,aAAA;AAAA,MACjB,MAAA,EAAQ;AAAA,QACN,SAAA,EAAW,MAAM,IAAA,CAAK,gBAAA,EAAiB;AAAA,QACvC,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS,UAAA;AAAA,QACT,iBAAA,EAAmB;AAAA;AACrB,KACD,CAAA;AAED,IAAA,MAAM,cAAc,MAAM,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,eAAe,iBAAiB,CAAA;AACtF,IAAA,MAAM,SAAA,GAAa,WAAA,CAAoB,SAAA,EAAW,qBAAA,EAAuB,MAAA,EAAQ,SAAA;AAEjF,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,IAClD;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,aAAA,CACJ,MAAA,EACA,KAAA,EACA,KAAA,EACiB;AACjB,IAAA,IAAA,CAAK,cAAA,EAAe;AAEpB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,OAAO,KAAK,CAAA;AAE1D,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAa,iBAAA,CAAkB;AAAA,MAC/D,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,YAAYA,iBAAA,EAAW;AAAA,MACvB,eAAA,EAAiB,aAAA;AAAA,MACjB,MAAA,EAAQ;AAAA,QACN,SAAA,EAAW,MAAM,IAAA,CAAK,gBAAA,EAAiB;AAAA,QACvC,MAAA,EAAQ,sBAAA;AAAA,QACR,OAAA,EAAS,IAAA;AAAA;AAAA,QACT,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAAA,QACjC,iBAAA,EAAmB;AAAA;AACrB,KACD,CAAA;AAED,IAAA,MAAM,cAAc,MAAM,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,eAAe,iBAAiB,CAAA;AACtF,IAAA,MAAM,SAAA,GAAa,WAAA,CAAoB,SAAA,EAAW,qBAAA,EAAuB,MAAA,EAAQ,SAAA;AAEjF,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,IACjE;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAA,GAAyD;AAC/D,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,MAAc,gBAAA,GAAoC;AAChD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAU,UAAA,EAAW;AAChD,IAAA,OAAO,YAAA,CAAa,QAAQ,OAAO,CAAA;AAAA,EACrC;AAAA,EAEA,MAAc,iBAAA,GAAqC;AACjD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAU,UAAA,EAAW;AAChD,IAAA,OAAO,aAAA,CAAc,QAAQ,OAAO,CAAA;AAAA,EACtC;AAAA,EAEQ,aAAa,OAAA,EAAsC;AACzD,IAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,MAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA,EAAG;AAC5B,QAAA,OAAO,OAAA;AAAA,MACT;AACA,MAAA,OAAO,OAAO,MAAA,CAAO,IAAA,CAAK,SAAS,MAAM,CAAA,CAAE,SAAS,KAAK,CAAA;AAAA,IAC3D;AAEA,IAAA,IAAI,mBAAmB,UAAA,EAAY;AACjC,MAAA,OAAO,OAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,SAAS,KAAK,CAAA;AAAA,IACnD;AAEA,IAAA,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAAA,EACxD;AAAA,EAEQ,cAAA,CACN,MAAA,EACA,KAAA,EACA,KAAA,EACiB;AAEjB,IAAA,MAAM,eAAiC,EAAC;AACxC,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,EAAW,YAAA,CAAa,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,CAAA;AACjF,IAAA,IAAI,MAAA,CAAO,OAAA,KAAY,MAAA,EAAW,YAAA,CAAa,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,QAAA,EAAU,CAAA;AACvF,IAAA,IAAI,MAAA,CAAO,OAAA,KAAY,MAAA,EAAW,YAAA,CAAa,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,CAAA;AACxF,IAAA,IAAI,MAAA,CAAO,iBAAA,KAAsB,MAAA,EAAW,YAAA,CAAa,IAAA,CAAK,EAAE,IAAA,EAAM,mBAAA,EAAqB,IAAA,EAAM,SAAA,EAAW,CAAA;AAC5G,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,EAAW,YAAA,CAAa,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,SAAA,EAAW,CAAA;AAElF,IAAA,OAAO;AAAA,MACL,KAAA,EAAO;AAAA,QACL,YAAA,EAAc,YAAA;AAAA,QACd,GAAG;AAAA,OACL;AAAA,MACA,WAAA,EAAa,MAAA,CAAO,IAAA,CAAK,KAAK,EAAE,CAAC,CAAA;AAAA,MACjC,MAAA,EAAQ,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAAA,MACnC,OAAA,EAAS,IAAA,CAAK,eAAA,CAAgB,KAAK;AAAA,KACrC;AAAA,EACF;AAAA,EAEQ,gBAAgB,GAAA,EAAuB;AAC7C,IAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,MAAA,EAAW,OAAO,GAAA;AAC9C,IAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,IAAI,QAAA,EAAS;AACjD,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAO,GAAA,CAAI,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAC,CAAA;AAC3E,IAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC5C,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA,CAAK,eAAA,CAAgB,GAAG,CAAA;AAAA,MACxC;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAc,eAAA,CAAgB,aAAA,EAAuB,SAAA,GAAY,aAAA,EAAiC;AAChG,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,gBAAgB,CAAC,CAAA;AAEpE,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAa,eAAA,CAAgB;AAAA,QAC/D,cAAA,EAAgB,CAAC,aAAa,CAAA;AAAA,QAC9B,4BAAA,EAA8B;AAAA,OAC/B,CAAA;AAED,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,YAAA,GAAe,CAAC,CAAA;AAEpC,MAAA,IAAI,CAAC,EAAA,EAAI;AACP,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,aAAa,CAAA,UAAA,CAAY,CAAA;AAAA,MAC3D;AAEA,MAAA,MAAM,SAAS,EAAA,CAAG,MAAA;AAElB,MAAA,IAAI,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,UAAA,IAAc,WAAW,UAAA,EAAY;AACzE,QAAA,MAAM,IAAI,MAAM,CAAA,EAAG,SAAS,IAAI,aAAa,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAAA,MAC3D;AAEA,MAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,QAAA,OAAO,EAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF","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-
|
|
2
|
-
export { B as BronSigner, a as BronSignerOptions, E as EIP712TypedData, T as TransactionStatus } from './BronSigner-
|
|
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-
|
|
2
|
-
export { B as BronSigner, a as BronSignerOptions, E as EIP712TypedData, T as TransactionStatus } from './BronSigner-
|
|
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
|
|
109
|
-
amount: tx.value
|
|
110
|
-
data: tx.data
|
|
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.
|
|
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.
|
|
51
|
+
"@bronlabs/bron-sdk": "^1.0.36"
|
|
52
52
|
},
|
|
53
53
|
"peerDependencies": {
|
|
54
54
|
"ethers": "^6.0.0"
|