UNPKG

@bsv/sdk

Version:

BSV Blockchain Software Development Kit

594 lines (563 loc) 18.1 kB
import { Base64String, BasketStringUnder300Bytes, BEEF, BooleanDefaultFalse, BooleanDefaultTrue, Byte, CertificateFieldNameUnder50Bytes, DescriptionString5to50Bytes, EntityIconURLStringMax500Bytes, EntityNameStringMax100Bytes, HexString, ISOTimestampString, KeyIDStringUnder800Bytes, LabelStringUnder300Bytes, OriginatorDomainNameStringUnder250Bytes, OutpointString, OutputTagStringUnder300Bytes, PositiveInteger, PositiveIntegerDefault10Max10000, PositiveIntegerMax10, PositiveIntegerOrZero, ProtocolString5To400Bytes, PubKeyHex, SatoshiValue, SecurityLevel, TXIDHexString, VersionString7To30Bytes, WalletInterface } from '../Wallet.interfaces.js' declare const window: { CWI?: WalletInterface } & Window /** * Facilitates wallet operations over the window.CWI interface. */ export default class WindowCWISubstrate implements WalletInterface { private readonly CWI: WalletInterface constructor() { if (typeof window !== 'object') { throw new Error( 'The window.CWI substrate requires a global window object.' ) } if (typeof window.CWI !== 'object') { throw new Error( 'The window.CWI interface does not appear to be bound to the window object.' ) } this.CWI = window.CWI // Binding CWI to prevent changes } async createAction( args: { description: DescriptionString5to50Bytes inputs?: Array<{ tx?: BEEF outpoint: OutpointString unlockingScript?: HexString unlockingScriptLength?: PositiveInteger inputDescription: DescriptionString5to50Bytes sequenceNumber?: PositiveIntegerOrZero }> outputs?: Array<{ lockingScript: HexString satoshis: SatoshiValue outputDescription: DescriptionString5to50Bytes basket?: BasketStringUnder300Bytes customInstructions?: string tags?: OutputTagStringUnder300Bytes[] }> lockTime?: PositiveIntegerOrZero version?: PositiveIntegerOrZero labels?: LabelStringUnder300Bytes[] options?: { signAndProcess?: BooleanDefaultTrue acceptDelayedBroadcast?: BooleanDefaultTrue trustSelf?: 'known' knownTxids?: TXIDHexString[] returnTXIDOnly?: BooleanDefaultFalse noSend?: BooleanDefaultFalse noSendChange?: OutpointString[] sendWith?: TXIDHexString[] } }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ txid?: TXIDHexString tx?: BEEF noSendChange?: OutpointString[] sendWithResults?: Array<{ txid: TXIDHexString status: 'unproven' | 'sending' | 'failed' }> signableTransaction?: { tx: BEEF, reference: Base64String } }> { return await this.CWI.createAction(args, originator) } async signAction( args: { spends: Record< PositiveIntegerOrZero, { unlockingScript: HexString, sequenceNumber?: PositiveIntegerOrZero } > reference: Base64String options?: { acceptDelayedBroadcast?: BooleanDefaultTrue returnTXIDOnly?: BooleanDefaultFalse noSend?: BooleanDefaultFalse noSendChange?: OutpointString[] sendWith: TXIDHexString[] } }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ txid?: TXIDHexString tx?: BEEF noSendChange?: OutpointString[] sendWithResults?: Array<{ txid: TXIDHexString status: 'unproven' | 'sending' | 'failed' }> }> { return await this.CWI.signAction(args, originator) } async abortAction( args: { reference: Base64String }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ aborted: true }> { return await this.CWI.abortAction(args, originator) } async listActions( args: { labels: LabelStringUnder300Bytes[] labelQueryMode?: 'any' | 'all' includeLabels?: BooleanDefaultFalse includeInputs?: BooleanDefaultFalse includeInputSourceLockingScripts?: BooleanDefaultFalse includeInputUnlockingScripts?: BooleanDefaultFalse includeOutputs?: BooleanDefaultFalse includeOutputLockingScripts?: BooleanDefaultFalse limit?: PositiveIntegerDefault10Max10000 offset?: PositiveIntegerOrZero }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ totalActions: PositiveIntegerOrZero actions: Array<{ txid: TXIDHexString satoshis: SatoshiValue status: | 'completed' | 'unprocessed' | 'sending' | 'unproven' | 'unsigned' | 'nosend' | 'nonfinal' | 'failed' isOutgoing: boolean description: DescriptionString5to50Bytes labels?: LabelStringUnder300Bytes[] version: PositiveIntegerOrZero lockTime: PositiveIntegerOrZero inputs?: Array<{ sourceOutpoint: OutpointString sourceSatoshis: SatoshiValue sourceLockingScript?: HexString unlockingScript?: HexString inputDescription: DescriptionString5to50Bytes sequenceNumber: PositiveIntegerOrZero }> outputs?: Array<{ outputIndex: PositiveIntegerOrZero satoshis: SatoshiValue lockingScript?: HexString spendable: boolean outputDescription: DescriptionString5to50Bytes basket: BasketStringUnder300Bytes tags: OutputTagStringUnder300Bytes[] customInstructions?: string }> }> }> { return await this.CWI.listActions(args, originator) } async internalizeAction( args: { tx: BEEF outputs: Array<{ outputIndex: PositiveIntegerOrZero protocol: 'wallet payment' | 'basket insertion' paymentRemittance?: { derivationPrefix: Base64String derivationSuffix: Base64String senderIdentityKey: PubKeyHex } insertionRemittance?: { basket: BasketStringUnder300Bytes customInstructions?: string tags?: OutputTagStringUnder300Bytes[] } }> description: DescriptionString5to50Bytes labels?: LabelStringUnder300Bytes[] }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ accepted: true }> { return await this.CWI.internalizeAction(args, originator) } async listOutputs( args: { basket: BasketStringUnder300Bytes tags?: OutputTagStringUnder300Bytes[] tagQueryMode?: 'all' | 'any' include?: 'locking scripts' | 'entire transactions' includeCustomInstructions?: BooleanDefaultFalse includeTags?: BooleanDefaultFalse includeLabels?: BooleanDefaultFalse limit?: PositiveIntegerDefault10Max10000 offset?: PositiveIntegerOrZero }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ totalOutputs: PositiveIntegerOrZero outputs: Array<{ outpoint: OutpointString satoshis: SatoshiValue lockingScript?: HexString tx?: BEEF spendable: boolean customInstructions?: string tags?: OutputTagStringUnder300Bytes[] labels?: LabelStringUnder300Bytes[] }> }> { return await this.CWI.listOutputs(args, originator) } async relinquishOutput( args: { basket: BasketStringUnder300Bytes, output: OutpointString }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ relinquished: true }> { return await this.CWI.relinquishOutput(args, originator) } async getPublicKey( args: { identityKey?: true protocolID?: [SecurityLevel, ProtocolString5To400Bytes] keyID?: KeyIDStringUnder800Bytes privileged?: BooleanDefaultFalse privilegedReason?: DescriptionString5to50Bytes counterparty?: PubKeyHex | 'self' | 'anyone' forSelf?: BooleanDefaultFalse }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ publicKey: PubKeyHex }> { return await this.CWI.getPublicKey(args, originator) } async revealCounterpartyKeyLinkage( args: { counterparty: PubKeyHex verifier: PubKeyHex privilegedReason?: DescriptionString5to50Bytes privileged?: BooleanDefaultFalse }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ prover: PubKeyHex verifier: PubKeyHex counterparty: PubKeyHex revelationTime: ISOTimestampString encryptedLinkage: Byte[] encryptedLinkageProof: Byte[] }> { return await this.CWI.revealCounterpartyKeyLinkage(args, originator) } async revealSpecificKeyLinkage( args: { counterparty: PubKeyHex verifier: PubKeyHex protocolID: [SecurityLevel, ProtocolString5To400Bytes] keyID: KeyIDStringUnder800Bytes privilegedReason?: DescriptionString5to50Bytes privileged?: BooleanDefaultFalse }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ prover: PubKeyHex verifier: PubKeyHex counterparty: PubKeyHex protocolID: [SecurityLevel, ProtocolString5To400Bytes] keyID: KeyIDStringUnder800Bytes encryptedLinkage: Byte[] encryptedLinkageProof: Byte[] proofType: Byte }> { return await this.CWI.revealSpecificKeyLinkage(args, originator) } async encrypt( args: { plaintext: Byte[] protocolID: [SecurityLevel, ProtocolString5To400Bytes] keyID: KeyIDStringUnder800Bytes privilegedReason?: DescriptionString5to50Bytes counterparty?: PubKeyHex | 'self' | 'anyone' privileged?: BooleanDefaultFalse }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ ciphertext: Byte[] }> { return await this.CWI.encrypt(args, originator) } async decrypt( args: { ciphertext: Byte[] protocolID: [SecurityLevel, ProtocolString5To400Bytes] keyID: KeyIDStringUnder800Bytes privilegedReason?: DescriptionString5to50Bytes counterparty?: PubKeyHex | 'self' | 'anyone' privileged?: BooleanDefaultFalse }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ plaintext: Byte[] }> { return await this.CWI.decrypt(args, originator) } async createHmac( args: { data: Byte[] protocolID: [SecurityLevel, ProtocolString5To400Bytes] keyID: KeyIDStringUnder800Bytes privilegedReason?: DescriptionString5to50Bytes counterparty?: PubKeyHex | 'self' | 'anyone' privileged?: BooleanDefaultFalse }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ hmac: Byte[] }> { return await this.CWI.createHmac(args, originator) } async verifyHmac( args: { data: Byte[] hmac: Byte[] protocolID: [SecurityLevel, ProtocolString5To400Bytes] keyID: KeyIDStringUnder800Bytes privilegedReason?: DescriptionString5to50Bytes counterparty?: PubKeyHex | 'self' | 'anyone' privileged?: BooleanDefaultFalse }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ valid: true }> { return await this.CWI.verifyHmac(args, originator) } async createSignature( args: { data?: Byte[] hashToDirectlySign?: Byte[] protocolID: [SecurityLevel, ProtocolString5To400Bytes] keyID: KeyIDStringUnder800Bytes privilegedReason?: DescriptionString5to50Bytes counterparty?: PubKeyHex | 'self' | 'anyone' privileged?: BooleanDefaultFalse }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ signature: Byte[] }> { return await this.CWI.createSignature(args, originator) } async verifySignature( args: { data?: Byte[] hashToDirectlyVerify?: Byte[] signature: Byte[] protocolID: [SecurityLevel, ProtocolString5To400Bytes] keyID: KeyIDStringUnder800Bytes privilegedReason?: DescriptionString5to50Bytes counterparty?: PubKeyHex | 'self' | 'anyone' forSelf?: BooleanDefaultFalse privileged?: BooleanDefaultFalse }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ valid: true }> { return await this.CWI.verifySignature(args, originator) } async acquireCertificate( args: { type: Base64String subject: PubKeyHex serialNumber: Base64String revocationOutpoint: OutpointString signature: HexString fields: Record<CertificateFieldNameUnder50Bytes, string> certifier: PubKeyHex keyringRevealer: PubKeyHex | 'certifier' keyringForSubject: Record<CertificateFieldNameUnder50Bytes, Base64String> acquisitionProtocol: 'direct' | 'issuance' certifierUrl?: string }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ type: Base64String subject: PubKeyHex serialNumber: Base64String certifier: PubKeyHex revocationOutpoint: OutpointString signature: HexString fields: Record<CertificateFieldNameUnder50Bytes, string> }> { return await this.CWI.acquireCertificate(args, originator) } async listCertificates( args: { certifiers: PubKeyHex[] types: Base64String[] limit?: PositiveIntegerDefault10Max10000 offset?: PositiveIntegerOrZero privileged?: BooleanDefaultFalse privilegedReason?: DescriptionString5to50Bytes }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ totalCertificates: PositiveIntegerOrZero certificates: Array<{ type: Base64String subject: PubKeyHex serialNumber: Base64String certifier: PubKeyHex revocationOutpoint: OutpointString signature: HexString fields: Record<CertificateFieldNameUnder50Bytes, string> }> }> { return await this.CWI.listCertificates(args, originator) } async proveCertificate( args: { certificate: { type: Base64String subject: PubKeyHex serialNumber: Base64String certifier: PubKeyHex revocationOutpoint: OutpointString signature: HexString fields: Record<CertificateFieldNameUnder50Bytes, string> } fieldsToReveal: CertificateFieldNameUnder50Bytes[] verifier: PubKeyHex privileged?: BooleanDefaultFalse privilegedReason?: DescriptionString5to50Bytes }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ keyringForVerifier: Record<CertificateFieldNameUnder50Bytes, Base64String> }> { return await this.CWI.proveCertificate(args, originator) } async relinquishCertificate( args: { type: Base64String serialNumber: Base64String certifier: PubKeyHex }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ relinquished: true }> { return await this.CWI.relinquishCertificate(args, originator) } async discoverByIdentityKey( args: { identityKey: PubKeyHex limit?: PositiveIntegerDefault10Max10000 offset?: PositiveIntegerOrZero }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ totalCertificates: PositiveIntegerOrZero certificates: Array<{ type: Base64String subject: PubKeyHex serialNumber: Base64String certifier: PubKeyHex revocationOutpoint: OutpointString signature: HexString fields: Record<CertificateFieldNameUnder50Bytes, Base64String> certifierInfo: { name: EntityNameStringMax100Bytes iconUrl: EntityIconURLStringMax500Bytes description: DescriptionString5to50Bytes trust: PositiveIntegerMax10 } publiclyRevealedKeyring: Record< CertificateFieldNameUnder50Bytes, Base64String > decryptedFields: Record<CertificateFieldNameUnder50Bytes, string> }> }> { return await this.CWI.discoverByIdentityKey(args, originator) } async discoverByAttributes( args: { attributes: Record<CertificateFieldNameUnder50Bytes, string> limit?: PositiveIntegerDefault10Max10000 offset?: PositiveIntegerOrZero }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ totalCertificates: PositiveIntegerOrZero certificates: Array<{ type: Base64String subject: PubKeyHex serialNumber: Base64String certifier: PubKeyHex revocationOutpoint: OutpointString signature: HexString fields: Record<CertificateFieldNameUnder50Bytes, Base64String> certifierInfo: { name: EntityNameStringMax100Bytes iconUrl: EntityIconURLStringMax500Bytes description: DescriptionString5to50Bytes trust: PositiveIntegerMax10 } publiclyRevealedKeyring: Record< CertificateFieldNameUnder50Bytes, Base64String > decryptedFields: Record<CertificateFieldNameUnder50Bytes, string> }> }> { return await this.CWI.discoverByAttributes(args, originator) } async isAuthenticated( args: object, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ authenticated: true }> { return await this.CWI.isAuthenticated(args, originator) } async waitForAuthentication( args: object, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ authenticated: true }> { return await this.CWI.waitForAuthentication(args, originator) } async getHeight( args: object, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ height: PositiveInteger }> { return await this.CWI.getHeight(args, originator) } async getHeaderForHeight( args: { height: PositiveInteger }, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ header: HexString }> { return await this.CWI.getHeaderForHeight(args, originator) } async getNetwork( args: object, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ network: 'mainnet' | 'testnet' }> { return await this.CWI.getNetwork(args, originator) } async getVersion( args: object, originator?: OriginatorDomainNameStringUnder250Bytes ): Promise<{ version: VersionString7To30Bytes }> { return await this.CWI.getVersion(args, originator) } }