Skip to content

Commit a85dc2a

Browse files
committed
feat: add Bip and update Signer interface
Signed-off-by: Luca Vaccaro <me@lvaccaro.com>
1 parent 36ed17a commit a85dc2a

File tree

6 files changed

+252
-0
lines changed

6 files changed

+252
-0
lines changed

android/src/main/java/io/lwkrn/LwkRnModule.kt

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class LwkRnModule(reactContext: ReactApplicationContext) :
3737
private var _signers = mutableMapOf<String, Signer>()
3838
private var _txBuilders = mutableMapOf<String, TxBuilder>()
3939
private var _contracts = mutableMapOf<String, Contract>()
40+
private var _bips = mutableMapOf<String, Bip>()
4041

4142
/* Descriptor */
4243

@@ -61,6 +62,47 @@ class LwkRnModule(reactContext: ReactApplicationContext) :
6162
result.resolve(_descriptors[keyId]!!.toString())
6263
}
6364

65+
/* Bip */
66+
67+
@ReactMethod
68+
fun newBip49(
69+
result: Promise
70+
) {
71+
try {
72+
val id = randomId()
73+
_bips[id] = Bip.newBip49()
74+
result.resolve(id)
75+
} catch (error: Throwable) {
76+
result.reject("Bip newBip49 error", error.localizedMessage, error)
77+
}
78+
}
79+
80+
@ReactMethod
81+
fun newBip84(
82+
result: Promise
83+
) {
84+
try {
85+
val id = randomId()
86+
_bips[id] = Bip.newBip84()
87+
result.resolve(id)
88+
} catch (error: Throwable) {
89+
result.reject("Bip newBip84 error", error.localizedMessage, error)
90+
}
91+
}
92+
93+
@ReactMethod
94+
fun newBip87(
95+
result: Promise
96+
) {
97+
try {
98+
val id = randomId()
99+
_bips[id] = Bip.newBip87()
100+
result.resolve(id)
101+
} catch (error: Throwable) {
102+
result.reject("Bip newBip87 error", error.localizedMessage, error)
103+
}
104+
}
105+
64106
/* Signer */
65107

66108
@ReactMethod
@@ -112,6 +154,53 @@ class LwkRnModule(reactContext: ReactApplicationContext) :
112154
}
113155
}
114156

157+
@ReactMethod
158+
fun keyoriginXpub(
159+
signerId: String,
160+
bipId: String,
161+
result: Promise
162+
) {
163+
try {
164+
val id = randomId()
165+
val signer = _signers[signerId]
166+
val bip = _bips[bipId]
167+
val res = signer!!.keyoriginXpub(bip!!)
168+
result.resolve(res)
169+
} catch (error: Throwable) {
170+
result.reject("Signer keyoriginXpub error", error.localizedMessage, error)
171+
}
172+
}
173+
174+
@ReactMethod
175+
fun mnemonic(
176+
signerId: String,
177+
result: Promise
178+
) {
179+
try {
180+
val id = randomId()
181+
val signer = _signers[signerId]
182+
val res = signer!!.mnemonic()
183+
result.resolve(res)
184+
} catch (error: Throwable) {
185+
result.reject("Signer mnemonic error", error.localizedMessage, error)
186+
}
187+
}
188+
189+
@ReactMethod
190+
fun createRandomSigner(
191+
network: String,
192+
result: Promise
193+
) {
194+
try {
195+
val id = randomId()
196+
val networkObj = setNetwork(network)
197+
_signers[id] = Signer.random(networkObj)
198+
result.resolve(id)
199+
} catch (error: Throwable) {
200+
result.reject("Signer createRandomSigner error", error.localizedMessage, error)
201+
}
202+
}
203+
115204
/* Electrum client */
116205

117206
@ReactMethod

ios/LwkRnModule.mm

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,20 @@
33

44
@interface RCT_EXTERN_MODULE(LwkRnModule, NSObject)
55

6+
/** Bip Methods */
7+
RCT_EXTERN_METHOD(
8+
newBip49: (RCTPromiseResolveBlock)resolve
9+
reject: (RCTPromiseRejectBlock)reject
10+
)
11+
RCT_EXTERN_METHOD(
12+
newBip84: (RCTPromiseResolveBlock)resolve
13+
reject: (RCTPromiseRejectBlock)reject
14+
)
15+
RCT_EXTERN_METHOD(
16+
newBip87: (RCTPromiseResolveBlock)resolve
17+
reject: (RCTPromiseRejectBlock)reject
18+
)
19+
620
/** Signers Methods */
721
RCT_EXTERN_METHOD(
822
createSigner: (nonnull NSString)mnemonic
@@ -21,6 +35,22 @@ @interface RCT_EXTERN_MODULE(LwkRnModule, NSObject)
2135
resolve: (RCTPromiseResolveBlock)resolve
2236
reject: (RCTPromiseRejectBlock)reject
2337
)
38+
RCT_EXTERN_METHOD(
39+
keyoriginXpub: (nonnull NSString)signerId
40+
bipId: (nonnull NSString)bipId
41+
resolve: (RCTPromiseResolveBlock)resolve
42+
reject: (RCTPromiseRejectBlock)reject
43+
)
44+
RCT_EXTERN_METHOD(
45+
mnemonic: (nonnull NSString)signerId
46+
resolve: (RCTPromiseResolveBlock)resolve
47+
reject: (RCTPromiseRejectBlock)reject
48+
)
49+
RCT_EXTERN_METHOD(
50+
createRandomSigner: (nonnull NSString)network
51+
resolve: (RCTPromiseResolveBlock)resolve
52+
reject: (RCTPromiseRejectBlock)reject
53+
)
2454

2555
/** Descriptors Methods */
2656

ios/LwkRnModule.swift

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class LwkRnModule: NSObject {
1515
var _psets: [String: Pset] = [:]
1616
var _txBuilders: [String: TxBuilder] = [:]
1717
var _contracts: [String: Contract] = [:]
18+
var _bips: [String: Bip] = [:]
1819

1920
/* WolletDescriptor */
2021
@objc
@@ -40,7 +41,48 @@ class LwkRnModule: NSObject {
4041
resolve(_descriptors[keyId]!.description)
4142
}
4243

44+
/* Bip */
45+
@objc
46+
func newBip49(
47+
resolve: RCTPromiseResolveBlock,
48+
reject: RCTPromiseRejectBlock
49+
) -> Void {
50+
do {
51+
let id = randomId()
52+
_bips[id] = try Bip.newBip49()
53+
resolve(id)
54+
} catch {
55+
reject("Bip newBip49 error", error.localizedDescription, error)
56+
}
57+
}
4358

59+
@objc
60+
func newBip84(
61+
resolve: RCTPromiseResolveBlock,
62+
reject: RCTPromiseRejectBlock
63+
) -> Void {
64+
do {
65+
let id = randomId()
66+
_bips[id] = try Bip.newBip84()
67+
resolve(id)
68+
} catch {
69+
reject("Bip newBip84 error", error.localizedDescription, error)
70+
}
71+
}
72+
73+
@objc
74+
func newBip87(
75+
resolve: RCTPromiseResolveBlock,
76+
reject: RCTPromiseRejectBlock
77+
) -> Void {
78+
do {
79+
let id = randomId()
80+
_bips[id] = try Bip.newBip87()
81+
resolve(id)
82+
} catch {
83+
reject("Bip newBip87 error", error.localizedDescription, error)
84+
}
85+
}
4486

4587
/* Signer */
4688
@objc
@@ -94,6 +136,54 @@ class LwkRnModule: NSObject {
94136
reject("Signer wpkhSlip77Descriptor error", error.localizedDescription, error)
95137
}
96138
}
139+
140+
@objc
141+
func keyoriginXpub(
142+
_ signerId: String,
143+
_ bipId: String,
144+
resolve: RCTPromiseResolveBlock,
145+
reject: RCTPromiseRejectBlock
146+
) -> Void {
147+
do {
148+
let signer = _signers[signerId]
149+
let bip = _bips[bipId]
150+
let res = try signer?.keyoriginXpub(bip)
151+
resolve(res)
152+
} catch {
153+
reject("Signer keyoriginXpub error", error.localizedDescription, error)
154+
}
155+
}
156+
157+
@objc
158+
func mnemonic(
159+
_ signerId: String,
160+
resolve: RCTPromiseResolveBlock,
161+
reject: RCTPromiseRejectBlock
162+
) -> Void {
163+
do {
164+
let signer = _signers[signerId]
165+
let res = try signer?.mnemonic()
166+
resolve(res)
167+
} catch {
168+
reject("Signer mnemonic error", error.localizedDescription, error)
169+
}
170+
}
171+
172+
@objc
173+
func createRandomSigner(
174+
_ network: String,
175+
resolve: RCTPromiseResolveBlock,
176+
reject: RCTPromiseRejectBlock
177+
) -> Void {
178+
do {
179+
let id = randomId()
180+
let network = setNetwork(networkStr: network)
181+
_signers[id] = try Signer.random(network: network)
182+
resolve(id)
183+
} catch {
184+
reject("Signer createRandomSigner error", error.localizedDescription, error)
185+
}
186+
}
97187

98188
/* Electrum client */
99189

src/classes/Bip.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { NativeLoader } from './NativeLoader';
2+
3+
export class Bip extends NativeLoader {
4+
id: string = '';
5+
6+
async newBip49(): Promise<Bip> {
7+
this.id = await this._lwk.newBip49();
8+
return this;
9+
}
10+
async newBip84(): Promise<Bip> {
11+
this.id = await this._lwk.newBip84();
12+
return this;
13+
}
14+
async newBip87(): Promise<Bip> {
15+
this.id = await this._lwk.newBip87();
16+
return this;
17+
}
18+
}

src/classes/NativeLoader.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ export interface NativeLwk {
2626
createSigner(mnemonic: string, network: Network): string;
2727
sign(signerId: string, psetId: string): string;
2828
wpkhSlip77Descriptor(signerId: string): string;
29+
keyoriginXpub(signerId: string, bipId: string): string;
30+
createRandomSigner(network: Network): string;
31+
mnemonic(signerId: string): string;
2932

3033
// Wollet
3134
createWollet(
@@ -94,6 +97,11 @@ export interface NativeLwk {
9497
version: number
9598
): string;
9699
contractAsString(id: string): string;
100+
101+
// Bip
102+
newBip49(): string;
103+
newBip84(): string;
104+
newBip87(): string;
97105
}
98106

99107
export class NativeLoader {

src/classes/Signer.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { NativeLoader } from './NativeLoader';
22
import { Pset } from './Pset';
33
import { Network } from '../lib/enums';
44
import { Descriptor } from './Descriptor';
5+
import { Bip } from './Bip';
56

67
export class Signer extends NativeLoader {
78
id: string = '';
@@ -23,4 +24,20 @@ export class Signer extends NativeLoader {
2324
let newId = await this._lwk.wpkhSlip77Descriptor(this.id);
2425
return new Descriptor().from(newId);
2526
}
27+
28+
async createRandomSigner(network: Network): Promise<Signer> {
29+
if (!Object.values(Network).includes(network)) {
30+
throw `Invalid network passed. Allowed values are ${Object.values(Network)}`;
31+
}
32+
this.id = await this._lwk.createRandomSigner(network);
33+
return this;
34+
}
35+
36+
async keyoriginXpub(bip: Bip): Promise<string> {
37+
return await this._lwk.keyoriginXpub(this.id, bip.id);
38+
}
39+
40+
async mnemonic(): Promise<string> {
41+
return await this._lwk.mnemonic(this.id);
42+
}
2643
}

0 commit comments

Comments
 (0)