diff --git a/src/address/index.ts b/src/address/index.ts index b27ab5a..120f400 100644 --- a/src/address/index.ts +++ b/src/address/index.ts @@ -1,13 +1,15 @@ import { createUnsecuredToken, Json } from 'jsontokens'; +import { getDefaultProvider } from '../provider'; import { GetAddressOptions } from './types'; export const getAddress = async (options: GetAddressOptions) => { - const { message, network, purposes } = options.payload; - const provider = window.BitcoinProvider; + const { getProvider = getDefaultProvider } = options; + const provider = await getProvider(); if (!provider) { throw new Error('No Bitcoin Wallet installed'); } - if(!purposes) { + const { message, network, purposes } = options.payload; + if (!purposes) { throw new Error('Address purposes are required'); } try { diff --git a/src/address/types.ts b/src/address/types.ts index 6d8f29e..5b04b44 100644 --- a/src/address/types.ts +++ b/src/address/types.ts @@ -1,4 +1,4 @@ -import { BitcoinNetwork } from '../provider'; +import { BitcoinNetwork, GetBitcoinProviderFunc } from '../provider'; export enum AddressPurposes { PAYMENT = 'payment', @@ -23,10 +23,11 @@ export interface Address { } export interface GetAddressResponse { - addresses: Array
+ addresses: Array
; } export interface GetAddressOptions { + getProvider?: GetBitcoinProviderFunc; onFinish: (response: GetAddressResponse) => void; onCancel: () => void; payload: GetAddressPayload; diff --git a/src/call/index.ts b/src/call/index.ts index 7eccca2..1000381 100644 --- a/src/call/index.ts +++ b/src/call/index.ts @@ -1,5 +1,5 @@ import { createUnsecuredToken, Json } from 'jsontokens'; -import { BitcoinNetwork } from '../provider'; +import { BitcoinNetwork, GetBitcoinProviderFunc, getDefaultProvider } from '../provider'; export interface CallWalletPayload { method: string; @@ -8,6 +8,7 @@ export interface CallWalletPayload { } export interface CallWalletOptions { + getProvider?: GetBitcoinProviderFunc; onFinish: (response: Record) => void; onCancel: () => void; payload: CallWalletPayload; @@ -19,12 +20,13 @@ export enum CallMethod { } export const callWalletPopup = async (options: CallWalletOptions) => { - const provider = window.BitcoinProvider; - const { method } = options.payload; + const { getProvider = getDefaultProvider } = options; + const provider = await getProvider(); if (!provider) { throw new Error('No Bitcoin Wallet installed'); } - if(!method) { + const { method } = options.payload; + if (!method) { throw new Error('A wallet method is required'); } const request = createUnsecuredToken(options.payload as unknown as Json); diff --git a/src/provider/index.ts b/src/provider/index.ts index 4767531..a141054 100644 --- a/src/provider/index.ts +++ b/src/provider/index.ts @@ -19,3 +19,9 @@ declare global { BitcoinProvider?: BitcoinProvider; } } + +export type GetBitcoinProviderFunc = () => Promise; + +export async function getDefaultProvider(): Promise { + return window.BitcoinProvider; +} diff --git a/src/signatures/index.ts b/src/signatures/index.ts index df7b221..cba4c7a 100644 --- a/src/signatures/index.ts +++ b/src/signatures/index.ts @@ -1,21 +1,23 @@ import { createUnsecuredToken, Json } from 'jsontokens'; +import { getDefaultProvider } from '../provider'; import { SignMessageOptions } from './types'; export const signMessage = async (options: SignMessageOptions) => { - const {address, message} = options.payload; - const provider = window.BitcoinProvider; + const { getProvider = getDefaultProvider } = options; + const provider = await getProvider(); if (!provider) { throw new Error('No Bitcoin Wallet installed'); } - if(!address) { - throw new Error("An Address is required to sign a message"); + const { address, message } = options.payload; + if (!address) { + throw new Error('An Address is required to sign a message'); } if (!message) { throw new Error('you need to provide a message to be signed'); } try { const request = createUnsecuredToken(options.payload as unknown as Json); - const response = await provider.signMessage(request); + const response = await provider.signMessage(request); options.onFinish?.(response); } catch (error) { console.error('[Connect] Error during Signing request', error); diff --git a/src/signatures/types.ts b/src/signatures/types.ts index d992197..67d1424 100644 --- a/src/signatures/types.ts +++ b/src/signatures/types.ts @@ -1,4 +1,4 @@ -import { BitcoinNetwork } from '../provider'; +import { BitcoinNetwork, GetBitcoinProviderFunc } from '../provider'; export interface SignMessagePayload { address: string; @@ -7,6 +7,7 @@ export interface SignMessagePayload { } export interface SignMessageOptions { + getProvider?: GetBitcoinProviderFunc; onFinish: (response: string) => void; onCancel: () => void; payload: SignMessagePayload; diff --git a/src/transactions/sendBtcTransaction.ts b/src/transactions/sendBtcTransaction.ts index cf90c8a..ad5fa98 100644 --- a/src/transactions/sendBtcTransaction.ts +++ b/src/transactions/sendBtcTransaction.ts @@ -1,40 +1,39 @@ import { createUnsecuredToken, Json } from 'jsontokens'; -import { BitcoinNetwork } from '../provider'; +import { BitcoinNetwork, GetBitcoinProviderFunc, getDefaultProvider } from '../provider'; export interface SendBtcTransactionPayload { network: BitcoinNetwork; amountSats: string; - recipientAddress: string + recipientAddress: string; message?: string; } export interface SendBtcTransactionOptions { - payload: SendBtcTransactionPayload; + getProvider?: GetBitcoinProviderFunc; onFinish: (response: string) => void; onCancel: () => void; + payload: SendBtcTransactionPayload; } - export const sendBtcTransaction = async (options: SendBtcTransactionOptions) => { - const { amountSats, recipientAddress } = options.payload; - const provider = window.BitcoinProvider; - + const { getProvider = getDefaultProvider } = options; + const provider = await getProvider(); if (!provider) { throw new Error('No Bitcoin Wallet installed'); } + const { amountSats, recipientAddress } = options.payload; if (!amountSats) { throw new Error('a value for amount to be transferred is required'); } if (!recipientAddress) { throw new Error('the recipient address is required'); } - try { - const request = createUnsecuredToken(options.payload as unknown as Json); - const addressResponse = await provider.sendBtcTransaction(request); - options.onFinish?.(addressResponse); - } catch (error) { - console.error('[Connect] Error during send btc request', error); - options.onCancel?.(); - } + try { + const request = createUnsecuredToken(options.payload as unknown as Json); + const addressResponse = await provider.sendBtcTransaction(request); + options.onFinish?.(addressResponse); + } catch (error) { + console.error('[Connect] Error during send btc request', error); + options.onCancel?.(); + } }; - diff --git a/src/transactions/signTransaction.ts b/src/transactions/signTransaction.ts index 3606985..7f47f91 100644 --- a/src/transactions/signTransaction.ts +++ b/src/transactions/signTransaction.ts @@ -1,14 +1,12 @@ import { createUnsecuredToken, Json } from 'jsontokens'; -import { BitcoinNetwork } from '../provider'; - +import { BitcoinNetwork, GetBitcoinProviderFunc, getDefaultProvider } from '../provider'; export interface InputToSign { - address: string, - signingIndexes: Array, - sigHash?: number, + address: string; + signingIndexes: Array; + sigHash?: number; } - export interface SignTransactionPayload { network: BitcoinNetwork; message: string; @@ -18,9 +16,10 @@ export interface SignTransactionPayload { } export interface SignTransactionOptions { - payload: SignTransactionPayload; + getProvider?: GetBitcoinProviderFunc; onFinish: (response: any) => void; onCancel: () => void; + payload: SignTransactionPayload; } export interface SignTransactionResponse { @@ -28,26 +27,25 @@ export interface SignTransactionResponse { txId?: string; } - export const signTransaction = async (options: SignTransactionOptions) => { - const { psbtBase64, inputsToSign } = options.payload; - const provider = window.BitcoinProvider; + const { getProvider = getDefaultProvider } = options; + const provider = await getProvider(); if (!provider) { throw new Error('No Bitcoin Wallet installed'); } + const { psbtBase64, inputsToSign } = options.payload; if (!psbtBase64) { throw new Error('a value for psbtBase64 representing the tx hash is required'); } if (!inputsToSign) { throw new Error('an array specifying the inputs to be signed by the wallet is required'); } - try { - const request = createUnsecuredToken(options.payload as unknown as Json); - const addressResponse = await provider.signTransaction(request); - options.onFinish?.(addressResponse); - } catch (error) { - console.error('[Connect] Error during signPsbt request', error); - options.onCancel?.(); - } + try { + const request = createUnsecuredToken(options.payload as unknown as Json); + const addressResponse = await provider.signTransaction(request); + options.onFinish?.(addressResponse); + } catch (error) { + console.error('[Connect] Error during signPsbt request', error); + options.onCancel?.(); + } }; -