Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow to pass a custom Bitcoin provider #14

Merged
merged 2 commits into from
Jul 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions src/address/index.ts
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down
5 changes: 3 additions & 2 deletions src/address/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { BitcoinNetwork } from '../provider';
import { BitcoinNetwork, GetBitcoinProviderFunc } from '../provider';

export enum AddressPurposes {
PAYMENT = 'payment',
Expand All @@ -23,10 +23,11 @@ export interface Address {
}

export interface GetAddressResponse {
addresses: Array<Address>
addresses: Array<Address>;
}

export interface GetAddressOptions {
getProvider?: GetBitcoinProviderFunc;
onFinish: (response: GetAddressResponse) => void;
onCancel: () => void;
payload: GetAddressPayload;
Expand Down
10 changes: 6 additions & 4 deletions src/call/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { createUnsecuredToken, Json } from 'jsontokens';
import { BitcoinNetwork } from '../provider';
import { BitcoinNetwork, GetBitcoinProviderFunc, getDefaultProvider } from '../provider';

export interface CallWalletPayload {
method: string;
Expand All @@ -8,6 +8,7 @@ export interface CallWalletPayload {
}

export interface CallWalletOptions {
getProvider?: GetBitcoinProviderFunc;
onFinish: (response: Record<string, any>) => void;
onCancel: () => void;
payload: CallWalletPayload;
Expand All @@ -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);
Expand Down
6 changes: 6 additions & 0 deletions src/provider/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,9 @@ declare global {
BitcoinProvider?: BitcoinProvider;
}
}

export type GetBitcoinProviderFunc = () => Promise<BitcoinProvider | undefined>;

export async function getDefaultProvider(): Promise<BitcoinProvider | undefined> {
return window.BitcoinProvider;
}
12 changes: 7 additions & 5 deletions src/signatures/index.ts
Original file line number Diff line number Diff line change
@@ -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);
Expand Down
3 changes: 2 additions & 1 deletion src/signatures/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { BitcoinNetwork } from '../provider';
import { BitcoinNetwork, GetBitcoinProviderFunc } from '../provider';

export interface SignMessagePayload {
address: string;
Expand All @@ -7,6 +7,7 @@ export interface SignMessagePayload {
}

export interface SignMessageOptions {
getProvider?: GetBitcoinProviderFunc;
onFinish: (response: string) => void;
onCancel: () => void;
payload: SignMessagePayload;
Expand Down
31 changes: 15 additions & 16 deletions src/transactions/sendBtcTransaction.ts
Original file line number Diff line number Diff line change
@@ -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?.();
}
};

36 changes: 17 additions & 19 deletions src/transactions/signTransaction.ts
Original file line number Diff line number Diff line change
@@ -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<number>,
sigHash?: number,
address: string;
signingIndexes: Array<number>;
sigHash?: number;
}


export interface SignTransactionPayload {
network: BitcoinNetwork;
message: string;
Expand All @@ -18,36 +16,36 @@ export interface SignTransactionPayload {
}

export interface SignTransactionOptions {
payload: SignTransactionPayload;
getProvider?: GetBitcoinProviderFunc;
onFinish: (response: any) => void;
onCancel: () => void;
payload: SignTransactionPayload;
}

export interface SignTransactionResponse {
psbtBase64: string;
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?.();
}
};