From a85dc2a74c51167c037d11d382a2f1c7ad7fb0e1 Mon Sep 17 00:00:00 2001 From: Luca Vaccaro Date: Fri, 20 Dec 2024 01:27:05 +0100 Subject: [PATCH] feat: add Bip and update Signer interface Signed-off-by: Luca Vaccaro --- android/src/main/java/io/lwkrn/LwkRnModule.kt | 89 ++++++++++++++++++ ios/LwkRnModule.mm | 30 +++++++ ios/LwkRnModule.swift | 90 +++++++++++++++++++ src/classes/Bip.ts | 18 ++++ src/classes/NativeLoader.ts | 8 ++ src/classes/Signer.ts | 17 ++++ 6 files changed, 252 insertions(+) create mode 100644 src/classes/Bip.ts diff --git a/android/src/main/java/io/lwkrn/LwkRnModule.kt b/android/src/main/java/io/lwkrn/LwkRnModule.kt index 2776be6..e12c7fc 100644 --- a/android/src/main/java/io/lwkrn/LwkRnModule.kt +++ b/android/src/main/java/io/lwkrn/LwkRnModule.kt @@ -37,6 +37,7 @@ class LwkRnModule(reactContext: ReactApplicationContext) : private var _signers = mutableMapOf() private var _txBuilders = mutableMapOf() private var _contracts = mutableMapOf() + private var _bips = mutableMapOf() /* Descriptor */ @@ -61,6 +62,47 @@ class LwkRnModule(reactContext: ReactApplicationContext) : result.resolve(_descriptors[keyId]!!.toString()) } + /* Bip */ + + @ReactMethod + fun newBip49( + result: Promise + ) { + try { + val id = randomId() + _bips[id] = Bip.newBip49() + result.resolve(id) + } catch (error: Throwable) { + result.reject("Bip newBip49 error", error.localizedMessage, error) + } + } + + @ReactMethod + fun newBip84( + result: Promise + ) { + try { + val id = randomId() + _bips[id] = Bip.newBip84() + result.resolve(id) + } catch (error: Throwable) { + result.reject("Bip newBip84 error", error.localizedMessage, error) + } + } + + @ReactMethod + fun newBip87( + result: Promise + ) { + try { + val id = randomId() + _bips[id] = Bip.newBip87() + result.resolve(id) + } catch (error: Throwable) { + result.reject("Bip newBip87 error", error.localizedMessage, error) + } + } + /* Signer */ @ReactMethod @@ -112,6 +154,53 @@ class LwkRnModule(reactContext: ReactApplicationContext) : } } + @ReactMethod + fun keyoriginXpub( + signerId: String, + bipId: String, + result: Promise + ) { + try { + val id = randomId() + val signer = _signers[signerId] + val bip = _bips[bipId] + val res = signer!!.keyoriginXpub(bip!!) + result.resolve(res) + } catch (error: Throwable) { + result.reject("Signer keyoriginXpub error", error.localizedMessage, error) + } + } + + @ReactMethod + fun mnemonic( + signerId: String, + result: Promise + ) { + try { + val id = randomId() + val signer = _signers[signerId] + val res = signer!!.mnemonic() + result.resolve(res) + } catch (error: Throwable) { + result.reject("Signer mnemonic error", error.localizedMessage, error) + } + } + + @ReactMethod + fun createRandomSigner( + network: String, + result: Promise + ) { + try { + val id = randomId() + val networkObj = setNetwork(network) + _signers[id] = Signer.random(networkObj) + result.resolve(id) + } catch (error: Throwable) { + result.reject("Signer createRandomSigner error", error.localizedMessage, error) + } + } + /* Electrum client */ @ReactMethod diff --git a/ios/LwkRnModule.mm b/ios/LwkRnModule.mm index 584b09a..dc2e306 100644 --- a/ios/LwkRnModule.mm +++ b/ios/LwkRnModule.mm @@ -3,6 +3,20 @@ @interface RCT_EXTERN_MODULE(LwkRnModule, NSObject) + /** Bip Methods */ + RCT_EXTERN_METHOD( + newBip49: (RCTPromiseResolveBlock)resolve + reject: (RCTPromiseRejectBlock)reject + ) + RCT_EXTERN_METHOD( + newBip84: (RCTPromiseResolveBlock)resolve + reject: (RCTPromiseRejectBlock)reject + ) + RCT_EXTERN_METHOD( + newBip87: (RCTPromiseResolveBlock)resolve + reject: (RCTPromiseRejectBlock)reject + ) + /** Signers Methods */ RCT_EXTERN_METHOD( createSigner: (nonnull NSString)mnemonic @@ -21,6 +35,22 @@ @interface RCT_EXTERN_MODULE(LwkRnModule, NSObject) resolve: (RCTPromiseResolveBlock)resolve reject: (RCTPromiseRejectBlock)reject ) + RCT_EXTERN_METHOD( + keyoriginXpub: (nonnull NSString)signerId + bipId: (nonnull NSString)bipId + resolve: (RCTPromiseResolveBlock)resolve + reject: (RCTPromiseRejectBlock)reject + ) + RCT_EXTERN_METHOD( + mnemonic: (nonnull NSString)signerId + resolve: (RCTPromiseResolveBlock)resolve + reject: (RCTPromiseRejectBlock)reject + ) + RCT_EXTERN_METHOD( + createRandomSigner: (nonnull NSString)network + resolve: (RCTPromiseResolveBlock)resolve + reject: (RCTPromiseRejectBlock)reject + ) /** Descriptors Methods */ diff --git a/ios/LwkRnModule.swift b/ios/LwkRnModule.swift index ce18585..4771018 100644 --- a/ios/LwkRnModule.swift +++ b/ios/LwkRnModule.swift @@ -15,6 +15,7 @@ class LwkRnModule: NSObject { var _psets: [String: Pset] = [:] var _txBuilders: [String: TxBuilder] = [:] var _contracts: [String: Contract] = [:] + var _bips: [String: Bip] = [:] /* WolletDescriptor */ @objc @@ -40,7 +41,48 @@ class LwkRnModule: NSObject { resolve(_descriptors[keyId]!.description) } + /* Bip */ + @objc + func newBip49( + resolve: RCTPromiseResolveBlock, + reject: RCTPromiseRejectBlock + ) -> Void { + do { + let id = randomId() + _bips[id] = try Bip.newBip49() + resolve(id) + } catch { + reject("Bip newBip49 error", error.localizedDescription, error) + } + } + @objc + func newBip84( + resolve: RCTPromiseResolveBlock, + reject: RCTPromiseRejectBlock + ) -> Void { + do { + let id = randomId() + _bips[id] = try Bip.newBip84() + resolve(id) + } catch { + reject("Bip newBip84 error", error.localizedDescription, error) + } + } + + @objc + func newBip87( + resolve: RCTPromiseResolveBlock, + reject: RCTPromiseRejectBlock + ) -> Void { + do { + let id = randomId() + _bips[id] = try Bip.newBip87() + resolve(id) + } catch { + reject("Bip newBip87 error", error.localizedDescription, error) + } + } /* Signer */ @objc @@ -94,6 +136,54 @@ class LwkRnModule: NSObject { reject("Signer wpkhSlip77Descriptor error", error.localizedDescription, error) } } + + @objc + func keyoriginXpub( + _ signerId: String, + _ bipId: String, + resolve: RCTPromiseResolveBlock, + reject: RCTPromiseRejectBlock + ) -> Void { + do { + let signer = _signers[signerId] + let bip = _bips[bipId] + let res = try signer?.keyoriginXpub(bip) + resolve(res) + } catch { + reject("Signer keyoriginXpub error", error.localizedDescription, error) + } + } + + @objc + func mnemonic( + _ signerId: String, + resolve: RCTPromiseResolveBlock, + reject: RCTPromiseRejectBlock + ) -> Void { + do { + let signer = _signers[signerId] + let res = try signer?.mnemonic() + resolve(res) + } catch { + reject("Signer mnemonic error", error.localizedDescription, error) + } + } + + @objc + func createRandomSigner( + _ network: String, + resolve: RCTPromiseResolveBlock, + reject: RCTPromiseRejectBlock + ) -> Void { + do { + let id = randomId() + let network = setNetwork(networkStr: network) + _signers[id] = try Signer.random(network: network) + resolve(id) + } catch { + reject("Signer createRandomSigner error", error.localizedDescription, error) + } + } /* Electrum client */ diff --git a/src/classes/Bip.ts b/src/classes/Bip.ts new file mode 100644 index 0000000..8a4f64c --- /dev/null +++ b/src/classes/Bip.ts @@ -0,0 +1,18 @@ +import { NativeLoader } from './NativeLoader'; + +export class Bip extends NativeLoader { + id: string = ''; + + async newBip49(): Promise { + this.id = await this._lwk.newBip49(); + return this; + } + async newBip84(): Promise { + this.id = await this._lwk.newBip84(); + return this; + } + async newBip87(): Promise { + this.id = await this._lwk.newBip87(); + return this; + } +} diff --git a/src/classes/NativeLoader.ts b/src/classes/NativeLoader.ts index 6d37cea..940df89 100644 --- a/src/classes/NativeLoader.ts +++ b/src/classes/NativeLoader.ts @@ -26,6 +26,9 @@ export interface NativeLwk { createSigner(mnemonic: string, network: Network): string; sign(signerId: string, psetId: string): string; wpkhSlip77Descriptor(signerId: string): string; + keyoriginXpub(signerId: string, bipId: string): string; + createRandomSigner(network: Network): string; + mnemonic(signerId: string): string; // Wollet createWollet( @@ -94,6 +97,11 @@ export interface NativeLwk { version: number ): string; contractAsString(id: string): string; + + // Bip + newBip49(): string; + newBip84(): string; + newBip87(): string; } export class NativeLoader { diff --git a/src/classes/Signer.ts b/src/classes/Signer.ts index 024c465..858ee53 100644 --- a/src/classes/Signer.ts +++ b/src/classes/Signer.ts @@ -2,6 +2,7 @@ import { NativeLoader } from './NativeLoader'; import { Pset } from './Pset'; import { Network } from '../lib/enums'; import { Descriptor } from './Descriptor'; +import { Bip } from './Bip'; export class Signer extends NativeLoader { id: string = ''; @@ -23,4 +24,20 @@ export class Signer extends NativeLoader { let newId = await this._lwk.wpkhSlip77Descriptor(this.id); return new Descriptor().from(newId); } + + async createRandomSigner(network: Network): Promise { + if (!Object.values(Network).includes(network)) { + throw `Invalid network passed. Allowed values are ${Object.values(Network)}`; + } + this.id = await this._lwk.createRandomSigner(network); + return this; + } + + async keyoriginXpub(bip: Bip): Promise { + return await this._lwk.keyoriginXpub(this.id, bip.id); + } + + async mnemonic(): Promise { + return await this._lwk.mnemonic(this.id); + } }