All files / src/signer WalletSigner.ts

91.04% Statements 61/67
0% Branches 0/2
90.47% Functions 19/21
92.42% Lines 61/66

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 14957x 57x   57x 57x 57x 57x 57x   57x                   67x 67x 67x 67x 67x   67x     1x     67x 67x     8x   8x       8x 8x       80x       80x       1x       64x 64x 64x       11x 11x 11x     20x 20x 19x     8x 8x 8x       3x 3x 1x     8x 8x 8x       2x 2x 2x     8x 8x 8x     1x 1x 1x     1x 1x 1x     1x 1x 1x 1x     1x 1x 1x                                                          
import { AbortActionArgs, AbortActionResult, AcquireCertificateArgs, AcquireCertificateResult, Transaction as BsvTransaction, CreateActionArgs, CreateActionResult, DiscoverByAttributesArgs, DiscoverByIdentityKeyArgs, DiscoverCertificatesResult, InternalizeActionArgs, InternalizeActionResult, KeyDeriver, KeyDeriverApi, ListActionsArgs, ListActionsResult, ListCertificatesArgs, ListCertificatesResult, ListOutputsArgs, ListOutputsResult, ProtoWallet, ProveCertificateArgs, ProveCertificateResult, RelinquishCertificateArgs, RelinquishCertificateResult, RelinquishOutputArgs, RelinquishOutputResult, SignActionArgs, SignActionResult } from '@bsv/sdk';
import { sdk } from "../index.client";
import { WalletStorageManager } from "../storage/WalletStorageManager";
import { acquireDirectCertificate } from "./methods/acquireDirectCertificate";
import { createAction } from "./methods/createAction";
import { internalizeAction } from "./methods/internalizeAction";
import { proveCertificate } from "./methods/proveCertificate";
import { signAction } from "./methods/signAction";
 
export class WalletSigner implements sdk.WalletSigner {
    chain: sdk.Chain
    keyDeriver: KeyDeriverApi
    storage: WalletStorageManager
    _services?: sdk.WalletServices
    identityKey: string
 
    pendingSignActions: Record<string, PendingSignAction>
 
    constructor(chain: sdk.Chain, keyDeriver: KeyDeriver, storage: WalletStorageManager) {
        Iif (storage._authId.identityKey != keyDeriver.identityKey) throw new sdk.WERR_INVALID_PARAMETER('storage', `authenticated as the same identityKey (${storage._authId.identityKey}) as the keyDeriver (${keyDeriver.identityKey}).`);
        this.chain = chain
        this.keyDeriver = keyDeriver
        this.storage = storage
        this.identityKey = this.keyDeriver.identityKey
 
        this.pendingSignActions = {}
    }
 
    getProtoWallet() : ProtoWallet { return new ProtoWallet(this.keyDeriver) }
 
    setServices(v: sdk.WalletServices) {
        this._services = v
        this.storage.setServices(v)
    }
    getServices(): sdk.WalletServices {
        Iif (!this._services)
            throw new sdk.WERR_INVALID_OPERATION('Must set WalletSigner services first.')
        return this._services
    }
 
    getStorageIdentity(): sdk.StorageIdentity {
        const s = this.storage.getSettings()
        return { storageIdentityKey: s.storageIdentityKey, storageName: s.storageName }
    }
 
    getClientChangeKeyPair(): sdk.KeyPair {
        const kp: sdk.KeyPair = {
            privateKey: this.keyDeriver.rootKey.toString(),
            publicKey: this.keyDeriver.rootKey.toPublicKey().toString()
        }
        return kp
    }
 
    async getChain(): Promise<sdk.Chain> {
        return this.chain
    }
 
    private validateAuthAndArgs<A, T extends sdk.ValidWalletSignerArgs>(args: A, validate: (args: A) => T): { vargs: T, auth: sdk.AuthId } {
        const vargs = validate(args)
        const auth: sdk.AuthId = { identityKey: this.identityKey }
        return { vargs, auth }
    }
 
    async listActions(args: ListActionsArgs): Promise<ListActionsResult> {
        this.validateAuthAndArgs(args, sdk.validateListActionsArgs)
        const r = await this.storage.listActions(args)
        return r
    }
    async listOutputs(args: ListOutputsArgs): Promise<ListOutputsResult> {
        this.validateAuthAndArgs(args, sdk.validateListOutputsArgs)
        const r = await this.storage.listOutputs(args)
        return r
    }
    async listCertificates(args: ListCertificatesArgs): Promise<ListCertificatesResult> {
        const { vargs } = this.validateAuthAndArgs(args, sdk.validateListCertificatesArgs)
        const r = await this.storage.listCertificates(vargs)
        return r
    }
 
    async abortAction(args: AbortActionArgs): Promise<AbortActionResult> {
        const { auth } = this.validateAuthAndArgs(args, sdk.validateAbortActionArgs)
        const r = await this.storage.abortAction(args)
        return r
    }
    async createAction(args: CreateActionArgs): Promise<CreateActionResult> {
        const { auth, vargs } = this.validateAuthAndArgs(args, sdk.validateCreateActionArgs)
        const r = await createAction(this, auth, vargs)
        return r
    }
 
    async signAction(args: SignActionArgs): Promise<SignActionResult> {
        const { auth, vargs } = this.validateAuthAndArgs(args, sdk.validateSignActionArgs)
        const r = await signAction(this, auth, vargs)
        return r
    }
    async internalizeAction(args: InternalizeActionArgs): Promise<InternalizeActionResult> {
        const { auth, vargs } = this.validateAuthAndArgs(args, sdk.validateInternalizeActionArgs)
        const r = await internalizeAction(this, auth, args)
        return r
    }
    async relinquishOutput(args: RelinquishOutputArgs): Promise<RelinquishOutputResult> {
        const { vargs } = this.validateAuthAndArgs(args, sdk.validateRelinquishOutputArgs)
        const r = await this.storage.relinquishOutput(args)
        return { relinquished: true }
    }
    async relinquishCertificate(args: RelinquishCertificateArgs): Promise<RelinquishCertificateResult> {
        this.validateAuthAndArgs(args, sdk.validateRelinquishCertificateArgs)
        const r = await this.storage.relinquishCertificate(args)
        return { relinquished: true }
    }
    async acquireDirectCertificate(args: AcquireCertificateArgs): Promise<AcquireCertificateResult> {
        const { auth, vargs } = this.validateAuthAndArgs(args, sdk.validateAcquireDirectCertificateArgs)
        vargs.subject = (await this.getProtoWallet().getPublicKey({ identityKey: true, privileged: args.privileged, privilegedReason: args.privilegedReason })).publicKey
        const r = await acquireDirectCertificate(this, auth, vargs)
        return r
    }
    async proveCertificate(args: ProveCertificateArgs): Promise<ProveCertificateResult> {
        const { auth, vargs } = this.validateAuthAndArgs(args, sdk.validateProveCertificateArgs)
        const r = await proveCertificate(this, auth, vargs)
        return r
    }
 
    async discoverByIdentityKey(args: DiscoverByIdentityKeyArgs): Promise<DiscoverCertificatesResult> {
        this.validateAuthAndArgs(args, sdk.validateDiscoverByIdentityKeyArgs)
        throw new Error("Method not implemented.");
    }
    async discoverByAttributes(args: DiscoverByAttributesArgs): Promise<DiscoverCertificatesResult> {
        this.validateAuthAndArgs(args, sdk.validateDiscoverByAttributesArgs)
        throw new Error("Method not implemented.");
    }
}
 
export interface PendingStorageInput {
    vin: number,
    derivationPrefix: string,
    derivationSuffix: string,
    unlockerPubKey?: string,
    sourceSatoshis: number,
    lockingScript: string
}
 
export interface PendingSignAction {
    reference: string
    dcr: sdk.StorageCreateActionResult
    args: sdk.ValidCreateActionArgs
    tx: BsvTransaction
    amount: number
    pdi: PendingStorageInput[]
}