Skip to content

Commit d57fb5c

Browse files
feat: share lightning wallet
This may not work because we are deriving a new userAuthKey BTC-1926 TICKET: BTC-1926
1 parent 3356783 commit d57fb5c

File tree

3 files changed

+64
-14
lines changed

3 files changed

+64
-14
lines changed

modules/abstract-lightning/src/wallet/lightning.ts

+26
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
commonTssMethods,
99
TxRequestState,
1010
decodeOrElse,
11+
ShareWalletOptions,
1112
} from '@bitgo/sdk-core';
1213
import * as t from 'io-ts';
1314
import { createMessageSignature, unwrapLightningCoinSpecific } from '../lightning';
@@ -190,6 +191,15 @@ export interface ILightningWallet {
190191
* @returns {Promise<Transaction[]>} List of transactions
191192
*/
192193
listTransactions(params: TransactionQuery): Promise<Transaction[]>;
194+
195+
/**
196+
* Shares the wallet with another user. Since we are sharing different keys in
197+
* different places, it needs to be done through here. For custody wallets,
198+
* we only need to share the userAuthKey. For self custody wallets, we need to
199+
* share more keys depending on the sharing permissions
200+
* @param params {ShareWalletOptions}
201+
*/
202+
shareWallet(params?: ShareWalletOptions): Promise<any>;
193203
}
194204

195205
export class LightningWallet implements ILightningWallet {
@@ -334,4 +344,20 @@ export class LightningWallet implements ILightningWallet {
334344
throw new Error(`Invalid transaction list response: ${error}`);
335345
});
336346
}
347+
348+
async shareWallet(params: ShareWalletOptions = {}): Promise<any> {
349+
const { needsKeychain, sharing } = await this.wallet.validateShareWalletOptions(params);
350+
let sharedKeychain;
351+
if (needsKeychain) {
352+
const { userAuthKey } = await getLightningAuthKeychains(this.wallet);
353+
sharedKeychain = await this.wallet.prepareSharedKeychain(
354+
params.walletPassphrase,
355+
sharing.pubkey,
356+
sharing.path,
357+
userAuthKey as any
358+
);
359+
}
360+
console.log(sharedKeychain);
361+
return await this.wallet.createShare(this.wallet.prepareCreateShareOptions(params, sharing, sharedKeychain));
362+
}
337363
}

modules/sdk-core/src/bitgo/wallet/iWallet.ts

+12
Original file line numberDiff line numberDiff line change
@@ -854,7 +854,19 @@ export interface IWallet {
854854
removeWebhook(params?: ModifyWebhookOptions): Promise<any>;
855855
getEncryptedUserKeychain(): Promise<KeychainWithEncryptedPrv>;
856856
getPrv(params?: GetPrvOptions): Promise<any>;
857+
prepareSharedKeychain(
858+
walletPassphrase: string | undefined,
859+
pubkey: string,
860+
path: string,
861+
keychain?: KeychainWithEncryptedPrv
862+
): Promise<SharedKeyChain>;
863+
prepareCreateShareOptions(
864+
params: ShareWalletOptions,
865+
sharing: { userId: string },
866+
sharedKeychain: KeychainWithEncryptedPrv | undefined
867+
): CreateShareOptions;
857868
createShare(params?: CreateShareOptions): Promise<any>;
869+
validateShareWalletOptions(params: ShareWalletOptions): Promise<{ needsKeychain: boolean; sharing: any }>;
858870
shareWallet(params?: ShareWalletOptions): Promise<any>;
859871
createBulkKeyShares(params?: BulkCreateShareOption[]): Promise<CreateBulkWalletShareListResponse>;
860872
createBulkWalletShare(params?: BulkWalletShareOptions): Promise<CreateBulkWalletShareListResponse>;

modules/sdk-core/src/bitgo/wallet/wallet.ts

+26-14
Original file line numberDiff line numberDiff line change
@@ -1612,12 +1612,13 @@ export class Wallet implements IWallet {
16121612
async prepareSharedKeychain(
16131613
walletPassphrase: string | undefined,
16141614
pubkey: string,
1615-
path: string
1615+
path: string,
1616+
keychain?: KeychainWithEncryptedPrv
16161617
): Promise<SharedKeyChain> {
16171618
let sharedKeychain: SharedKeyChain = {};
16181619

16191620
try {
1620-
const keychain = await this.getEncryptedUserKeychain();
1621+
keychain = keychain ?? (await this.getEncryptedUserKeychain());
16211622

16221623
// Decrypt the user key with a passphrase
16231624
if (keychain.encryptedPrv) {
@@ -1664,12 +1665,7 @@ export class Wallet implements IWallet {
16641665
return sharedKeychain;
16651666
}
16661667

1667-
/**
1668-
* Share this wallet with another BitGo user.
1669-
* @param params
1670-
* @returns {*}
1671-
*/
1672-
async shareWallet(params: ShareWalletOptions = {}): Promise<any> {
1668+
async validateShareWalletOptions(params: ShareWalletOptions): Promise<{ needsKeychain: boolean; sharing: any }> {
16731669
common.validateParams(params, ['email', 'permissions'], ['walletPassphrase', 'message']);
16741670
if (params.reshare !== undefined && !_.isBoolean(params.reshare)) {
16751671
throw new Error('Expected reshare to be a boolean.');
@@ -1689,12 +1685,15 @@ export class Wallet implements IWallet {
16891685
}
16901686

16911687
const sharing = (await this.bitgo.getSharingKey({ email: params.email.toLowerCase() })) as any;
1692-
let sharedKeychain;
1693-
if (needsKeychain) {
1694-
sharedKeychain = await this.prepareSharedKeychain(params.walletPassphrase, sharing.pubkey, sharing.path);
1695-
}
1688+
return { needsKeychain: !!needsKeychain, sharing };
1689+
}
16961690

1697-
const options: CreateShareOptions = {
1691+
prepareCreateShareOptions(
1692+
params: ShareWalletOptions,
1693+
sharing: { userId: string },
1694+
sharedKeychain: KeychainWithEncryptedPrv | undefined
1695+
): CreateShareOptions {
1696+
return {
16981697
user: sharing.userId,
16991698
permissions: params.permissions,
17001699
reshare: params.reshare,
@@ -1703,8 +1702,21 @@ export class Wallet implements IWallet {
17031702
skipKeychain: Object.keys(sharedKeychain ?? {}).length === 0,
17041703
keychain: Object.keys(sharedKeychain ?? {}).length === 0 ? undefined : sharedKeychain,
17051704
};
1705+
}
1706+
1707+
/**
1708+
* Share this wallet with another BitGo user.
1709+
* @param params
1710+
* @returns {*}
1711+
*/
1712+
async shareWallet(params: ShareWalletOptions = {}): Promise<any> {
1713+
const { needsKeychain, sharing } = await this.validateShareWalletOptions(params);
1714+
let sharedKeychain;
1715+
if (needsKeychain) {
1716+
sharedKeychain = await this.prepareSharedKeychain(params.walletPassphrase, sharing.pubkey, sharing.path);
1717+
}
17061718

1707-
return await this.createShare(options);
1719+
return await this.createShare(this.prepareCreateShareOptions(params, sharing, sharedKeychain));
17081720
}
17091721

17101722
/**

0 commit comments

Comments
 (0)