Skip to content

Commit

Permalink
added abilities for provider
Browse files Browse the repository at this point in the history
  • Loading branch information
cf committed Jun 25, 2024
1 parent fb32988 commit 117e46c
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 12 deletions.
28 changes: 17 additions & 11 deletions docs/ThirdPartyWallets.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,29 @@ Implementing hardware wallet support for doge-sdk is easy, just implement the in

```typescript

interface ISignatureResult {
publicKey: string;
signature: string;
}

interface IDogeSignatureRequest {
transaction: Transaction;
sigHashType: number;
inputIndex: number;
}

interface IDogeTransactionSigner {
getCompressedPublicKey(): Promise<string>;
canSignHash(): boolean;
signHash(hashHex: string): Promise<ISignatureResult>;
signTransaction(signatureRequest: IDogeSignatureRequest): Promise<ISignatureResult>;
getPrivateKeyWIF?(): Promise<string>;
}

interface IWalletProviderAbilities {
addWalletRandom?: boolean;
addWalletFromWIF?: boolean;
addWalletFromSeed?: boolean;
addWalletFromMnemonic?: boolean;
}

interface IDogeWalletProvider {
getSigners(): Promise<IDogeTransactionSigner[]>;
addWalletRandom?(networkId: DogeNetworkId): Promise<IDogeTransactionSigner>;
addWalletBIP39?(networkId: DogeNetworkId, seedPhrase: string, password?: string): Promise<IDogeTransactionSigner>;
addWalletBIP44?(networkId: DogeNetworkId, fullDerivationPath: string): Promise<IDogeTransactionSigner>;
addWalletBIP178?(networkId: DogeNetworkId, wif: string): Promise<IDogeTransactionSigner>;
getAbilities(): IWalletProviderAbilities;
}

```
Expand Down Expand Up @@ -206,7 +209,7 @@ class LedgerHardwareWalletProvider implements IDogeWalletProvider {
for (let i = 0; i < numberOfWallets; i++) {
this.signers.push(
new LedgerHardwareWalletSigner(
"44'/0'/" + i + "'/0/0",
"44'/3'/" + i + "'/0/0",
rpc,
ledgerInstance
)
Expand All @@ -218,6 +221,9 @@ class LedgerHardwareWalletProvider implements IDogeWalletProvider {
getSigners(): Promise<IDogeTransactionSigner[]> {
return Promise.resolve(this.signers);
}
getAbilities(): IWalletProviderAbilities {
return {};
}
}
export { LedgerHardwareWalletProvider, LedgerHardwareWalletSigner };
```
Expand Down
1 change: 1 addition & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ export type {
IDogeWalletSerialized,
IFullDogeWalletProvider,
IDogeSignatureRequest,
IWalletProviderAbilities,
} from './wallet/types';
export * from './wallet';

Expand Down
20 changes: 19 additions & 1 deletion src/wallet/memory/provider.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,30 @@
import { DogeNetworkId } from "../../networks/types";
import { IDogeTransactionSigner, IDogeWalletProvider, IDogeWalletSerialized } from "../types";
import { IDogeTransactionSigner, IDogeWalletProvider, IDogeWalletSerialized, IWalletProviderAbilities } from "../types";
import { DogeMemoryWallet } from "./wallet";

class DogeMemoryWalletProvider implements IDogeWalletProvider {
wallets: DogeMemoryWallet[];
constructor(wallets: DogeMemoryWallet[] = []) {
this.wallets = wallets;
}
async addWalletRandom(networkId: DogeNetworkId): Promise<IDogeTransactionSigner> {
return this.addRandomWallet(networkId);
}
addWalletBIP39(networkId: DogeNetworkId, seedPhrase: string, password?: string | undefined): Promise<IDogeTransactionSigner> {
throw new Error("addWalletBIP39 not supported for this provider.");
}
addWalletBIP44(networkId: DogeNetworkId, fullDerivationPath: string): Promise<IDogeTransactionSigner> {
throw new Error("addWalletBIP44 not supported for this provider.");
}
async addWalletBIP178(networkId: DogeNetworkId, wif: string): Promise<IDogeTransactionSigner> {
return this.addWalletFromWIF(wif, networkId);
}
getAbilities(): IWalletProviderAbilities {
return {
addWalletRandom: true,
addWalletFromWIF: true,
}
}
getSigners(): Promise<IDogeTransactionSigner[]> {
return Promise.resolve(this.wallets);
}
Expand Down
32 changes: 32 additions & 0 deletions src/wallet/provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
IDogeTransactionSigner,
IDogeWalletProvider,
IFullDogeWalletProvider,
IWalletProviderAbilities,
} from "./types";

class FullDogeWalletProvider<T extends IDogeWalletProvider> implements IFullDogeWalletProvider<T> {
Expand All @@ -20,6 +21,37 @@ class FullDogeWalletProvider<T extends IDogeWalletProvider> implements IFullDoge
this.base = base;
this.useCacheByDefault = useCacheByDefault;
}
addWalletRandom(networkId: DogeNetworkId): Promise<IDogeTransactionSigner> {
if(this.base.addWalletRandom){
return this.base.addWalletRandom(networkId);
}else{
throw new Error("addWalletRandom not supported for this provider.");
}
}
addWalletBIP39(networkId: DogeNetworkId, seedPhrase: string, password?: string | undefined): Promise<IDogeTransactionSigner> {
if(this.base.addWalletBIP39){
return this.base.addWalletBIP39(networkId, seedPhrase, password);
}else{
throw new Error("addWalletBIP39 not supported for this provider.");
}
}
addWalletBIP44(networkId: DogeNetworkId, fullDerivationPath: string): Promise<IDogeTransactionSigner> {
if(this.base.addWalletBIP44){
return this.base.addWalletBIP44(networkId, fullDerivationPath);
}else{
throw new Error("addWalletBIP44 not supported for this provider.");
}
}
addWalletBIP178(networkId: DogeNetworkId, wif: string): Promise<IDogeTransactionSigner> {
if(this.base.addWalletBIP44){
return this.base.addWalletBIP44(networkId, wif);
}else{
throw new Error("addWalletBIP44 not supported for this provider.");
}
}
getAbilities(): IWalletProviderAbilities {
return this.base.getAbilities();
}
getBaseProvider(): T {
return this.base;
}
Expand Down
15 changes: 15 additions & 0 deletions src/wallet/types.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { DogeNetworkId } from "../networks/types";
import { Transaction } from "../transaction";

interface ISignatureResult {
Expand All @@ -16,10 +17,23 @@ interface IDogeTransactionSigner {
canSignHash(): boolean;
signHash(hashHex: string): Promise<ISignatureResult>;
signTransaction(signatureRequest: IDogeSignatureRequest): Promise<ISignatureResult>;
getPrivateKeyWIF?(): Promise<string>;
}

interface IWalletProviderAbilities {
addWalletRandom?: boolean;
addWalletFromWIF?: boolean;
addWalletFromSeed?: boolean;
addWalletFromMnemonic?: boolean;
}

interface IDogeWalletProvider {
getSigners(): Promise<IDogeTransactionSigner[]>;
addWalletRandom?(networkId: DogeNetworkId): Promise<IDogeTransactionSigner>;
addWalletBIP39?(networkId: DogeNetworkId, seedPhrase: string, password?: string): Promise<IDogeTransactionSigner>;
addWalletBIP44?(networkId: DogeNetworkId, fullDerivationPath: string): Promise<IDogeTransactionSigner>;
addWalletBIP178?(networkId: DogeNetworkId, wif: string): Promise<IDogeTransactionSigner>;
getAbilities(): IWalletProviderAbilities;
}

interface IFullDogeWalletProvider<T extends IDogeWalletProvider> extends IDogeWalletProvider {
Expand All @@ -43,4 +57,5 @@ export type {
IDogeWalletSerialized,
IFullDogeWalletProvider,
IDogeSignatureRequest,
IWalletProviderAbilities,
}

0 comments on commit 117e46c

Please sign in to comment.