feat: allow external signatures on `Transactions`

Adds a helper for adding externally created signature/pubkey pairs
to `Transactions`
This commit is contained in:
Trent Nelson 2020-04-23 15:44:19 -06:00 committed by Michael Vines
parent 7d3781e19f
commit 8142aa6c1d
3 changed files with 17 additions and 7 deletions

1
web3.js/module.d.ts vendored
View File

@ -406,6 +406,7 @@ declare module '@solana/web3.js' {
signData: Buffer; signData: Buffer;
sign(...signers: Array<Account>): void; sign(...signers: Array<Account>): void;
signPartial(...partialSigners: Array<PublicKey | Account>): void; signPartial(...partialSigners: Array<PublicKey | Account>): void;
addSignature(pubkey: PublicKey, signature: Buffer): void;
addSigner(signer: Account): void; addSigner(signer: Account): void;
verifySignatures(): boolean; verifySignatures(): boolean;
serialize(): Buffer; serialize(): Buffer;

View File

@ -415,6 +415,7 @@ declare module '@solana/web3.js' {
sign(...signers: Array<Account>): void; sign(...signers: Array<Account>): void;
signPartial(...partialSigners: Array<PublicKey | Account>): void; signPartial(...partialSigners: Array<PublicKey | Account>): void;
addSigner(signer: Account): void; addSigner(signer: Account): void;
addSignature(pubkey: PublicKey, signature: Buffer): void;
verifySignatures(): boolean; verifySignatures(): boolean;
serialize(): Buffer; serialize(): Buffer;
} }

View File

@ -398,16 +398,24 @@ export class Transaction {
* `signPartial` * `signPartial`
*/ */
addSigner(signer: Account) { addSigner(signer: Account) {
const index = this.signatures.findIndex(sigpair =>
signer.publicKey.equals(sigpair.publicKey),
);
if (index < 0) {
throw new Error(`Unknown signer: ${signer.publicKey.toString()}`);
}
const signData = this.signData; const signData = this.signData;
const signature = nacl.sign.detached(signData, signer.secretKey); const signature = nacl.sign.detached(signData, signer.secretKey);
this.addSignature(signer.publicKey, signature);
}
/**
* Add an externally created signature to a transaction
*/
addSignature(pubkey: PublicKey, signature: Buffer) {
invariant(signature.length === 64); invariant(signature.length === 64);
const index = this.signatures.findIndex(sigpair =>
pubkey.equals(sigpair.publicKey),
);
if (index < 0) {
throw new Error(`Unknown signer: ${pubkey.toString()}`);
}
this.signatures[index].signature = Buffer.from(signature); this.signatures[index].signature = Buffer.from(signature);
} }