Skip to content

Commit 074f97e

Browse files
committed
feat(web-extension): wip signer manager
1 parent 325f97c commit 074f97e

File tree

7 files changed

+142
-0
lines changed

7 files changed

+142
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { Bip32WalletAccount, WalletType } from '../types';
2+
import { InMemoryKeyAgent, KeyAgentDependencies } from '@cardano-sdk/key-management';
3+
import { NotImplementedError } from '@cardano-sdk/core';
4+
import { RequestContext } from './types';
5+
6+
/** Create and initialize key agent. Connects to hardware device. */
7+
export const createKeyAgent = <Metadata extends {}>(
8+
{ chainId, wallet }: Omit<RequestContext<Metadata>, 'origin'>,
9+
{ accountIndex }: Pick<Bip32WalletAccount<Metadata>, 'accountIndex'>,
10+
dependencies: KeyAgentDependencies
11+
) => {
12+
// TODO
13+
// eslint-disable-next-line sonarjs/no-small-switch
14+
switch (wallet.type) {
15+
case WalletType.InMemory:
16+
return new InMemoryKeyAgent(
17+
{
18+
accountIndex,
19+
chainId,
20+
encryptedRootPrivateKeyBytes: [...Buffer.from(wallet.encryptedSecrets.rootPrivateKeyBytes, 'hex')],
21+
extendedAccountPublicKey: wallet.extendedAccountPublicKey,
22+
getPassphrase: async () => new Uint8Array()
23+
},
24+
dependencies
25+
);
26+
default:
27+
throw new NotImplementedError(`Unknown wallet type: ${wallet.type}`);
28+
}
29+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/* eslint-disable brace-style */
2+
import { Cardano, TxCBOR } from '@cardano-sdk/core';
3+
import { Cip30DataSignature } from '@cardano-sdk/dapp-connector';
4+
import { Observable } from 'rxjs';
5+
import {
6+
RequestContext,
7+
SignDataProps,
8+
SignDataRequest,
9+
SignerManagerConfirmationApi,
10+
SignerManagerSignApi,
11+
TransactionWitnessRequest
12+
} from './types';
13+
import { SignTransactionOptions } from '@cardano-sdk/key-management';
14+
15+
export class SignerManager<WalletMetadata extends {}>
16+
implements SignerManagerConfirmationApi<WalletMetadata>, SignerManagerSignApi<WalletMetadata>
17+
{
18+
transactionWitnessRequest$: Observable<TransactionWitnessRequest<WalletMetadata>>;
19+
signDataRequest$: Observable<SignDataRequest<WalletMetadata>>;
20+
21+
signTransaction(
22+
tx: TxCBOR,
23+
options: SignTransactionOptions,
24+
context: RequestContext<WalletMetadata>
25+
): Promise<Cardano.Signatures> {
26+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
27+
tx;
28+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
29+
options;
30+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
31+
context;
32+
throw new Error('Method not implemented.');
33+
}
34+
signData(props: SignDataProps, context: RequestContext<WalletMetadata>): Promise<Cip30DataSignature> {
35+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
36+
props;
37+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
38+
context;
39+
throw new Error('Method not implemented.');
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './types';
2+
export * from './SignerManager';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { AccountId, AnyBip32Wallet, WalletType } from '../types';
2+
import { Cardano, Serialization, TxCBOR } from '@cardano-sdk/core';
3+
import { Cip30DataSignature, Origin } from '@cardano-sdk/dapp-connector';
4+
import { Observable } from 'rxjs';
5+
import { SignTransactionOptions, cip8 } from '@cardano-sdk/key-management';
6+
7+
type RequestBase<WalletMetadata extends {}> = {
8+
origin: Origin;
9+
wallet: AnyBip32Wallet<WalletMetadata>;
10+
reject(reason: string): Promise<void>;
11+
};
12+
13+
type SignRequestInMemory = {
14+
walletType: WalletType.InMemory;
15+
sign(passphrase: Uint8Array): Promise<void>;
16+
};
17+
18+
type SignRequestHardware = {
19+
walletType: WalletType.Trezor | WalletType.Ledger;
20+
/** Must be called from user gesture when running in web environments */
21+
sign(): Promise<void>;
22+
};
23+
24+
export type TransactionWitnessRequest<WalletMetadata extends {}> = RequestBase<WalletMetadata> & {
25+
transaction: Serialization.Transaction;
26+
} & (SignRequestHardware | SignRequestInMemory);
27+
28+
export type SignDataProps = Omit<cip8.Cip30SignDataRequest, 'witnesser' | 'addressManager'>;
29+
30+
export type SignDataRequest<WalletMetadata extends {}> = RequestBase<WalletMetadata> &
31+
SignDataProps &
32+
(SignRequestHardware | SignRequestInMemory);
33+
34+
export type RequestContext<WalletMetadata extends {}> = {
35+
origin: Origin;
36+
wallet: AnyBip32Wallet<WalletMetadata>;
37+
accountId: AccountId;
38+
chainId: Cardano.ChainId;
39+
};
40+
41+
export interface SignerManagerConfirmationApi<WalletMetadata extends {}> {
42+
transactionWitnessRequest$: Observable<TransactionWitnessRequest<WalletMetadata>>;
43+
signDataRequest$: Observable<SignDataRequest<WalletMetadata>>;
44+
}
45+
46+
export interface SignerManagerSignApi<WalletMetadata extends {}> {
47+
signTransaction(
48+
tx: TxCBOR,
49+
options: SignTransactionOptions,
50+
context: RequestContext<WalletMetadata>
51+
): Promise<Cardano.Signatures>;
52+
signData(props: SignDataProps, context: RequestContext<WalletMetadata>): Promise<Cip30DataSignature>;
53+
}

packages/web-extension/src/walletManager/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ export * from './util';
33
export * from './walletManagerUi';
44
export * from './walletManagerWorker';
55
export * from './WalletRepository';
6+
export * from './SignerManager';
67
export * from './errors';
78
export * from './types';

packages/web-extension/src/walletManager/types.ts

+2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ export type InMemoryWallet<Metadata extends {}> = Bip32Wallet<Metadata> & {
4141
};
4242
};
4343

44+
export type AnyBip32Wallet<WalletMetadata extends {}> = HardwareWallet<WalletMetadata> | InMemoryWallet<WalletMetadata>;
45+
4446
export type OwnSignerAccount = {
4547
walletId: WalletId;
4648
accountId: AccountId;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { SignerManager } from '../../src';
2+
3+
describe('SignerManager', () => {
4+
let signerManager: SignerManager<{}>;
5+
6+
beforeEach(() => {
7+
signerManager = new SignerManager();
8+
// TODO
9+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
10+
signerManager;
11+
});
12+
13+
it.todo('todo');
14+
});

0 commit comments

Comments
 (0)