@solana/signers 2.0.0-rc.0 → 2.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,15 +6,15 @@
6
6
 
7
7
  [code-style-prettier-image]: https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square
8
8
  [code-style-prettier-url]: https://github.com/prettier/prettier
9
- [npm-downloads-image]: https://img.shields.io/npm/dm/@solana/signers/experimental.svg?style=flat
10
- [npm-image]: https://img.shields.io/npm/v/@solana/signers/experimental.svg?style=flat
11
- [npm-url]: https://www.npmjs.com/package/@solana/signers/v/experimental
9
+ [npm-downloads-image]: https://img.shields.io/npm/dm/@solana/signers/rc.svg?style=flat
10
+ [npm-image]: https://img.shields.io/npm/v/@solana/signers/rc.svg?style=flat
11
+ [npm-url]: https://www.npmjs.com/package/@solana/signers/v/rc
12
12
  [semantic-release-image]: https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg
13
13
  [semantic-release-url]: https://github.com/semantic-release/semantic-release
14
14
 
15
15
  # @solana/signers
16
16
 
17
- This package provides an abstraction layer over signing messages and transactions in Solana. It can be used standalone, but it is also exported as part of the Solana JavaScript SDK [`@solana/web3.js@experimental`](https://github.com/solana-labs/solana-web3.js/tree/master/packages/library).
17
+ This package provides an abstraction layer over signing messages and transactions in Solana. It can be used standalone, but it is also exported as part of the Solana JavaScript SDK [`@solana/web3.js@rc`](https://github.com/solana-labs/solana-web3.js/tree/master/packages/library).
18
18
 
19
19
  You can think of signers as an abstract way to sign messages and transactions. This could be using a Crypto KeyPair, a wallet adapter in the browser, a Noop signer for testing purposes, or anything you want. Here's an example using a `CryptoKeyPair` signer:
20
20
 
@@ -316,6 +316,36 @@ import { generateKeyPairSigner } from '@solana/signers';
316
316
  const myKeyPairSigner = await generateKeyPairSigner();
317
317
  ```
318
318
 
319
+ #### `createKeyPairSignerFromBytes()`
320
+
321
+ A convenience function that creates a new KeyPair from a 64-bytes `Uint8Array` secret key and immediately creates a `KeyPairSigner` from it.
322
+
323
+ ```ts
324
+ import fs from 'fs';
325
+ import { createKeyPairFromBytes } from '@solana/keys';
326
+
327
+ // Get bytes from local keypair file.
328
+ const keypairFile = fs.readFileSync('~/.config/solana/id.json');
329
+ const keypairBytes = new Uint8Array(JSON.parse(keypairFile.toString()));
330
+
331
+ // Create a KeyPairSigner from the bytes.
332
+ const { privateKey, publicKey } = await createKeyPairSignerFromBytes(keypairBytes);
333
+ ```
334
+
335
+ #### `createKeyPairSignerFromPrivateKeyBytes()`
336
+
337
+ A convenience function that creates a new KeyPair from a 32-bytes `Uint8Array` private key and immediately creates a `KeyPairSigner` from it.
338
+
339
+ ```ts
340
+ import { getUtf8Encoder } from '@solana/codecs-strings';
341
+ import { createKeyPairFromPrivateKeyBytes } from '@solana/keys';
342
+
343
+ const message = getUtf8Encoder().encode('Hello, World!');
344
+ const seed = new Uint8Array(await crypto.subtle.digest('SHA-256', message));
345
+
346
+ const derivedSigner = await createKeyPairSignerFromPrivateKeyBytes(seed);
347
+ ```
348
+
319
349
  #### `isKeyPairSigner()`
320
350
 
321
351
  A type guard that returns `true` if the provided value is a `KeyPairSigner`.
@@ -20,6 +20,48 @@ function deduplicateSigners(signers) {
20
20
  });
21
21
  return Object.values(deduplicated);
22
22
  }
23
+ function isTransactionModifyingSigner(value) {
24
+ return "modifyAndSignTransactions" in value && typeof value.modifyAndSignTransactions === "function";
25
+ }
26
+ function assertIsTransactionModifyingSigner(value) {
27
+ if (!isTransactionModifyingSigner(value)) {
28
+ throw new errors.SolanaError(errors.SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER, {
29
+ address: value.address
30
+ });
31
+ }
32
+ }
33
+ function isTransactionPartialSigner(value) {
34
+ return "signTransactions" in value && typeof value.signTransactions === "function";
35
+ }
36
+ function assertIsTransactionPartialSigner(value) {
37
+ if (!isTransactionPartialSigner(value)) {
38
+ throw new errors.SolanaError(errors.SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER, {
39
+ address: value.address
40
+ });
41
+ }
42
+ }
43
+ function isTransactionSendingSigner(value) {
44
+ return "signAndSendTransactions" in value && typeof value.signAndSendTransactions === "function";
45
+ }
46
+ function assertIsTransactionSendingSigner(value) {
47
+ if (!isTransactionSendingSigner(value)) {
48
+ throw new errors.SolanaError(errors.SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER, {
49
+ address: value.address
50
+ });
51
+ }
52
+ }
53
+
54
+ // src/transaction-signer.ts
55
+ function isTransactionSigner(value) {
56
+ return isTransactionPartialSigner(value) || isTransactionModifyingSigner(value) || isTransactionSendingSigner(value);
57
+ }
58
+ function assertIsTransactionSigner(value) {
59
+ if (!isTransactionSigner(value)) {
60
+ throw new errors.SolanaError(errors.SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER, {
61
+ address: value.address
62
+ });
63
+ }
64
+ }
23
65
 
24
66
  // src/account-signer-meta.ts
25
67
  function getSignersFromInstruction(instruction) {
@@ -29,7 +71,7 @@ function getSignersFromInstruction(instruction) {
29
71
  }
30
72
  function getSignersFromTransactionMessage(transaction) {
31
73
  return deduplicateSigners([
32
- ...transaction.feePayerSigner ? [transaction.feePayerSigner] : [],
74
+ ...transaction.feePayer && isTransactionSigner(transaction.feePayer) ? [transaction.feePayer] : [],
33
75
  ...transaction.instructions.flatMap(getSignersFromInstruction)
34
76
  ]);
35
77
  }
@@ -60,19 +102,9 @@ function addSignersToTransactionMessage(signers, transactionMessage) {
60
102
  }
61
103
 
62
104
  // src/fee-payer-signer.ts
63
- function setTransactionMessageFeePayerSigner(feePayerSigner, transactionMessage) {
64
- if ("feePayer" in transactionMessage && feePayerSigner.address === transactionMessage.feePayer) {
65
- if ("feePayerSigner" in transactionMessage)
66
- return transactionMessage;
67
- const out2 = { ...transactionMessage, feePayerSigner };
68
- Object.freeze(out2);
69
- return out2;
70
- }
71
- const out = {
72
- ...transactionMessage,
73
- feePayer: feePayerSigner.address,
74
- feePayerSigner
75
- };
105
+ function setTransactionMessageFeePayerSigner(feePayer, transactionMessage) {
106
+ Object.freeze(feePayer);
107
+ const out = { ...transactionMessage, feePayer };
76
108
  Object.freeze(out);
77
109
  return out;
78
110
  }
@@ -86,16 +118,6 @@ function assertIsMessagePartialSigner(value) {
86
118
  });
87
119
  }
88
120
  }
89
- function isTransactionPartialSigner(value) {
90
- return "signTransactions" in value && typeof value.signTransactions === "function";
91
- }
92
- function assertIsTransactionPartialSigner(value) {
93
- if (!isTransactionPartialSigner(value)) {
94
- throw new errors.SolanaError(errors.SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER, {
95
- address: value.address
96
- });
97
- }
98
- }
99
121
 
100
122
  // src/keypair-signer.ts
101
123
  function isKeyPairSigner(value) {
@@ -133,6 +155,9 @@ async function generateKeyPairSigner() {
133
155
  async function createKeyPairSignerFromBytes(bytes, extractable) {
134
156
  return await createSignerFromKeyPair(await keys.createKeyPairFromBytes(bytes, extractable));
135
157
  }
158
+ async function createKeyPairSignerFromPrivateKeyBytes(bytes, extractable) {
159
+ return await createSignerFromKeyPair(await keys.createKeyPairFromPrivateKeyBytes(bytes, extractable));
160
+ }
136
161
  function isMessageModifyingSigner(value) {
137
162
  return addresses.isAddress(value.address) && "modifyAndSignMessages" in value && typeof value.modifyAndSignMessages === "function";
138
163
  }
@@ -163,36 +188,6 @@ function createNoopSigner(address) {
163
188
  };
164
189
  return Object.freeze(out);
165
190
  }
166
- function isTransactionModifyingSigner(value) {
167
- return "modifyAndSignTransactions" in value && typeof value.modifyAndSignTransactions === "function";
168
- }
169
- function assertIsTransactionModifyingSigner(value) {
170
- if (!isTransactionModifyingSigner(value)) {
171
- throw new errors.SolanaError(errors.SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER, {
172
- address: value.address
173
- });
174
- }
175
- }
176
- function isTransactionSendingSigner(value) {
177
- return "signAndSendTransactions" in value && typeof value.signAndSendTransactions === "function";
178
- }
179
- function assertIsTransactionSendingSigner(value) {
180
- if (!isTransactionSendingSigner(value)) {
181
- throw new errors.SolanaError(errors.SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER, {
182
- address: value.address
183
- });
184
- }
185
- }
186
- function isTransactionSigner(value) {
187
- return isTransactionPartialSigner(value) || isTransactionModifyingSigner(value) || isTransactionSendingSigner(value);
188
- }
189
- function assertIsTransactionSigner(value) {
190
- if (!isTransactionSigner(value)) {
191
- throw new errors.SolanaError(errors.SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER, {
192
- address: value.address
193
- });
194
- }
195
- }
196
191
  function isTransactionMessageWithSingleSendingSigner(transaction) {
197
192
  try {
198
193
  assertIsTransactionMessageWithSingleSendingSigner(transaction);
@@ -331,6 +326,7 @@ exports.assertIsTransactionPartialSigner = assertIsTransactionPartialSigner;
331
326
  exports.assertIsTransactionSendingSigner = assertIsTransactionSendingSigner;
332
327
  exports.assertIsTransactionSigner = assertIsTransactionSigner;
333
328
  exports.createKeyPairSignerFromBytes = createKeyPairSignerFromBytes;
329
+ exports.createKeyPairSignerFromPrivateKeyBytes = createKeyPairSignerFromPrivateKeyBytes;
334
330
  exports.createNoopSigner = createNoopSigner;
335
331
  exports.createSignableMessage = createSignableMessage;
336
332
  exports.createSignerFromKeyPair = createSignerFromKeyPair;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/deduplicate-signers.ts","../src/account-signer-meta.ts","../src/add-signers.ts","../src/fee-payer-signer.ts","../src/message-partial-signer.ts","../src/transaction-partial-signer.ts","../src/keypair-signer.ts","../src/message-modifying-signer.ts","../src/message-signer.ts","../src/noop-signer.ts","../src/transaction-modifying-signer.ts","../src/transaction-sending-signer.ts","../src/transaction-signer.ts","../src/transaction-with-single-sending-signer.ts","../src/sign-transaction.ts","../../text-encoding-impl/src/index.browser.ts","../src/signable-message.ts"],"names":["SolanaError","SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS","isSignerRole","out","SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER","SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER","SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER","getAddressFromPublicKey","signBytes","transactions","partiallySignTransaction","generateKeyPair","createKeyPairFromBytes","isAddress","SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER","SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER","SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER","SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER","SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER","SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING","SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS","assertTransactionIsFullySigned","compileTransaction","transaction","TextEncoder"],"mappings":"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","file":"index.browser.cjs","sourcesContent":["import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS, SolanaError } from '@solana/errors';\n\nimport { MessageSigner } from './message-signer';\nimport { TransactionSigner } from './transaction-signer';\n\n/** Removes all duplicated signers from a provided array by comparing their addresses. */\nexport function deduplicateSigners<TSigner extends MessageSigner | TransactionSigner>(\n signers: readonly TSigner[],\n): readonly TSigner[] {\n const deduplicated: Record<Address, TSigner> = {};\n signers.forEach(signer => {\n if (!deduplicated[signer.address]) {\n deduplicated[signer.address] = signer;\n } else if (deduplicated[signer.address] !== signer) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS, {\n address: signer.address,\n });\n }\n });\n return Object.values(deduplicated);\n}\n","import { AccountRole, IAccountLookupMeta, IAccountMeta, IInstruction } from '@solana/instructions';\nimport { BaseTransactionMessage, TransactionVersion } from '@solana/transaction-messages';\n\nimport { deduplicateSigners } from './deduplicate-signers';\nimport { TransactionSigner } from './transaction-signer';\n\n/** An extension of the IAccountMeta type that keeps track of its transaction signer. */\nexport interface IAccountSignerMeta<\n TAddress extends string = string,\n TSigner extends TransactionSigner<TAddress> = TransactionSigner<TAddress>,\n> extends IAccountMeta<TAddress> {\n readonly role: AccountRole.READONLY_SIGNER | AccountRole.WRITABLE_SIGNER;\n readonly signer: TSigner;\n}\n\ntype IAccountMetaWithSigner<TSigner extends TransactionSigner = TransactionSigner> =\n | IAccountLookupMeta\n | IAccountMeta\n | IAccountSignerMeta<string, TSigner>;\n\n/** A variation of the instruction type that allows IAccountSignerMeta in its account metas. */\nexport type IInstructionWithSigners<\n TSigner extends TransactionSigner = TransactionSigner,\n TAccounts extends readonly IAccountMetaWithSigner<TSigner>[] = readonly IAccountMetaWithSigner<TSigner>[],\n> = Pick<IInstruction<string, TAccounts>, 'accounts'>;\n\n/** A variation of the transaction message type that allows IAccountSignerMeta in its account metas. */\nexport type ITransactionMessageWithSigners<\n TSigner extends TransactionSigner = TransactionSigner,\n TAccounts extends readonly IAccountMetaWithSigner<TSigner>[] = readonly IAccountMetaWithSigner<TSigner>[],\n> = Pick<\n BaseTransactionMessage<TransactionVersion, IInstruction & IInstructionWithSigners<TSigner, TAccounts>>,\n 'instructions'\n> & { feePayerSigner?: TSigner };\n\n/** Extract all signers from an instruction that may contain IAccountSignerMeta accounts. */\nexport function getSignersFromInstruction<TSigner extends TransactionSigner = TransactionSigner>(\n instruction: IInstructionWithSigners<TSigner>,\n): readonly TSigner[] {\n return deduplicateSigners(\n (instruction.accounts ?? []).flatMap(account => ('signer' in account ? account.signer : [])),\n );\n}\n\n/** Extract all signers from a transaction message that may contain IAccountSignerMeta accounts. */\nexport function getSignersFromTransactionMessage<\n TSigner extends TransactionSigner = TransactionSigner,\n TTransactionMessage extends ITransactionMessageWithSigners<TSigner> = ITransactionMessageWithSigners<TSigner>,\n>(transaction: TTransactionMessage): readonly TSigner[] {\n return deduplicateSigners([\n ...(transaction.feePayerSigner ? [transaction.feePayerSigner] : []),\n ...transaction.instructions.flatMap(getSignersFromInstruction),\n ]);\n}\n","import { IInstruction, isSignerRole } from '@solana/instructions';\nimport { BaseTransactionMessage } from '@solana/transaction-messages';\n\nimport { IAccountSignerMeta, IInstructionWithSigners, ITransactionMessageWithSigners } from './account-signer-meta';\nimport { deduplicateSigners } from './deduplicate-signers';\nimport { TransactionSigner } from './transaction-signer';\n\n/** Attaches the provided signers to the account metas of an instruction when applicable. */\nexport function addSignersToInstruction<TInstruction extends IInstruction>(\n signers: TransactionSigner[],\n instruction: TInstruction | (IInstructionWithSigners & TInstruction),\n): IInstructionWithSigners & TInstruction {\n if (!instruction.accounts || instruction.accounts.length === 0) {\n return instruction as IInstructionWithSigners & TInstruction;\n }\n\n const signerByAddress = new Map(deduplicateSigners(signers).map(signer => [signer.address, signer]));\n return Object.freeze({\n ...instruction,\n accounts: instruction.accounts.map(account => {\n const signer = signerByAddress.get(account.address);\n if (!isSignerRole(account.role) || 'signer' in account || !signer) {\n return account;\n }\n return Object.freeze({ ...account, signer } as IAccountSignerMeta);\n }),\n });\n}\n\n/** Attaches the provided signers to the account metas of a transaction message when applicable. */\nexport function addSignersToTransactionMessage<TTransactionMessage extends BaseTransactionMessage>(\n signers: TransactionSigner[],\n transactionMessage: TTransactionMessage | (ITransactionMessageWithSigners & TTransactionMessage),\n): ITransactionMessageWithSigners & TTransactionMessage {\n if (transactionMessage.instructions.length === 0) {\n return transactionMessage as ITransactionMessageWithSigners & TTransactionMessage;\n }\n\n return Object.freeze({\n ...transactionMessage,\n instructions: transactionMessage.instructions.map(instruction => addSignersToInstruction(signers, instruction)),\n });\n}\n","import { Address } from '@solana/addresses';\nimport { BaseTransactionMessage } from '@solana/transaction-messages';\n\nimport { TransactionSigner } from './transaction-signer';\n\nexport interface ITransactionMessageWithFeePayerSigner<\n TAddress extends string = string,\n TSigner extends TransactionSigner<TAddress> = TransactionSigner<TAddress>,\n> {\n readonly feePayer: Address<TAddress>;\n readonly feePayerSigner: TSigner;\n}\n\nexport function setTransactionMessageFeePayerSigner<\n TFeePayerAddress extends string,\n TTransactionMessage extends BaseTransactionMessage,\n>(\n feePayerSigner: TransactionSigner<TFeePayerAddress>,\n transactionMessage: TTransactionMessage,\n): ITransactionMessageWithFeePayerSigner<TFeePayerAddress> & Omit<TTransactionMessage, 'feePayer' | 'feePayerSigner'> {\n if ('feePayer' in transactionMessage && feePayerSigner.address === transactionMessage.feePayer) {\n if ('feePayerSigner' in transactionMessage)\n return transactionMessage as ITransactionMessageWithFeePayerSigner<TFeePayerAddress> &\n Omit<TTransactionMessage, 'feePayer' | 'feePayerSigner'>;\n const out = { ...transactionMessage, feePayerSigner };\n Object.freeze(out);\n return out as ITransactionMessageWithFeePayerSigner<TFeePayerAddress> &\n Omit<TTransactionMessage, 'feePayer' | 'feePayerSigner'>;\n }\n const out = {\n ...transactionMessage,\n feePayer: feePayerSigner.address,\n feePayerSigner,\n };\n Object.freeze(out);\n return out;\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER, SolanaError } from '@solana/errors';\n\nimport { SignableMessage } from './signable-message';\nimport { BaseSignerConfig, SignatureDictionary } from './types';\n\nexport type MessagePartialSignerConfig = BaseSignerConfig;\n\n/** Defines a signer capable of signing messages. */\nexport type MessagePartialSigner<TAddress extends string = string> = Readonly<{\n address: Address<TAddress>;\n signMessages(\n messages: readonly SignableMessage[],\n config?: MessagePartialSignerConfig,\n ): Promise<readonly SignatureDictionary[]>;\n}>;\n\n/** Checks whether the provided value implements the {@link MessagePartialSigner} interface. */\nexport function isMessagePartialSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): value is MessagePartialSigner<TAddress> {\n return 'signMessages' in value && typeof value.signMessages === 'function';\n}\n\n/** Asserts that the provided value implements the {@link MessagePartialSigner} interface. */\nexport function assertIsMessagePartialSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): asserts value is MessagePartialSigner<TAddress> {\n if (!isMessagePartialSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER, SolanaError } from '@solana/errors';\nimport { Transaction } from '@solana/transactions';\n\nimport { BaseTransactionSignerConfig, SignatureDictionary } from './types';\n\nexport type TransactionPartialSignerConfig = BaseTransactionSignerConfig;\n\n/** Defines a signer capable of signing transactions. */\nexport type TransactionPartialSigner<TAddress extends string = string> = Readonly<{\n address: Address<TAddress>;\n signTransactions(\n transactions: readonly Transaction[],\n config?: TransactionPartialSignerConfig,\n ): Promise<readonly SignatureDictionary[]>;\n}>;\n\n/** Checks whether the provided value implements the {@link TransactionPartialSigner} interface. */\nexport function isTransactionPartialSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): value is TransactionPartialSigner<TAddress> {\n return 'signTransactions' in value && typeof value.signTransactions === 'function';\n}\n\n/** Asserts that the provided value implements the {@link TransactionPartialSigner} interface. */\nexport function assertIsTransactionPartialSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): asserts value is TransactionPartialSigner<TAddress> {\n if (!isTransactionPartialSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address, getAddressFromPublicKey } from '@solana/addresses';\nimport { ReadonlyUint8Array } from '@solana/codecs-core';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER, SolanaError } from '@solana/errors';\nimport { createKeyPairFromBytes, generateKeyPair, signBytes } from '@solana/keys';\nimport { partiallySignTransaction } from '@solana/transactions';\n\nimport { isMessagePartialSigner, MessagePartialSigner } from './message-partial-signer';\nimport { isTransactionPartialSigner, TransactionPartialSigner } from './transaction-partial-signer';\n\n/** Defines a signer capable of signing messages and transactions using a CryptoKeyPair. */\nexport type KeyPairSigner<TAddress extends string = string> = MessagePartialSigner<TAddress> &\n TransactionPartialSigner<TAddress> & { keyPair: CryptoKeyPair };\n\n/** Checks whether the provided value implements the {@link KeyPairSigner} interface. */\nexport function isKeyPairSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): value is KeyPairSigner<TAddress> {\n return (\n 'keyPair' in value &&\n typeof value.keyPair === 'object' &&\n isMessagePartialSigner(value) &&\n isTransactionPartialSigner(value)\n );\n}\n\n/** Asserts that the provided value implements the {@link KeyPairSigner} interface. */\nexport function assertIsKeyPairSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): asserts value is KeyPairSigner<TAddress> {\n if (!isKeyPairSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER, {\n address: value.address,\n });\n }\n}\n\n/** Creates a KeyPairSigner from the provided Crypto KeyPair. */\nexport async function createSignerFromKeyPair(keyPair: CryptoKeyPair): Promise<KeyPairSigner> {\n const address = await getAddressFromPublicKey(keyPair.publicKey);\n const out: KeyPairSigner = {\n address,\n keyPair,\n signMessages: messages =>\n Promise.all(\n messages.map(async message =>\n Object.freeze({ [address]: await signBytes(keyPair.privateKey, message.content) }),\n ),\n ),\n signTransactions: transactions =>\n Promise.all(\n transactions.map(async transaction => {\n const signedTransaction = await partiallySignTransaction([keyPair], transaction);\n // we know that the address has signed `signedTransaction` because it comes from the keypair\n return Object.freeze({ [address]: signedTransaction.signatures[address]! });\n }),\n ),\n };\n\n return Object.freeze(out);\n}\n\n/** Securely generates a signer capable of signing messages and transactions using a Crypto KeyPair. */\nexport async function generateKeyPairSigner(): Promise<KeyPairSigner> {\n return await createSignerFromKeyPair(await generateKeyPair());\n}\n\n/** Creates a signer capable of signing messages and transactions using the 64 bytes of a KeyPair. */\nexport async function createKeyPairSignerFromBytes(\n bytes: ReadonlyUint8Array,\n extractable?: boolean,\n): Promise<KeyPairSigner> {\n return await createSignerFromKeyPair(await createKeyPairFromBytes(bytes, extractable));\n}\n","import { Address, isAddress } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER, SolanaError } from '@solana/errors';\n\nimport { SignableMessage } from './signable-message';\nimport { BaseSignerConfig } from './types';\n\nexport type MessageModifyingSignerConfig = BaseSignerConfig;\n\n/** Defines a signer capable of signing messages. */\nexport type MessageModifyingSigner<TAddress extends string = string> = Readonly<{\n address: Address<TAddress>;\n modifyAndSignMessages(\n messages: readonly SignableMessage[],\n config?: MessageModifyingSignerConfig,\n ): Promise<readonly SignableMessage[]>;\n}>;\n\n/** Checks whether the provided value implements the {@link MessageModifyingSigner} interface. */\nexport function isMessageModifyingSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): value is MessageModifyingSigner<TAddress> {\n return (\n isAddress(value.address) &&\n 'modifyAndSignMessages' in value &&\n typeof value.modifyAndSignMessages === 'function'\n );\n}\n\n/** Asserts that the provided value implements the {@link MessageModifyingSigner} interface. */\nexport function assertIsMessageModifyingSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): asserts value is MessageModifyingSigner<TAddress> {\n if (!isMessageModifyingSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER, SolanaError } from '@solana/errors';\n\nimport { isMessageModifyingSigner, MessageModifyingSigner } from './message-modifying-signer';\nimport { isMessagePartialSigner, MessagePartialSigner } from './message-partial-signer';\n\n/** Defines a signer capable of signing messages. */\nexport type MessageSigner<TAddress extends string = string> =\n | MessageModifyingSigner<TAddress>\n | MessagePartialSigner<TAddress>;\n\n/** Checks whether the provided value implements the {@link MessageSigner} interface. */\nexport function isMessageSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): value is MessageSigner<TAddress> {\n return isMessagePartialSigner(value) || isMessageModifyingSigner(value);\n}\n\n/** Asserts that the provided value implements the {@link MessageSigner} interface. */\nexport function assertIsMessageSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): asserts value is MessageSigner<TAddress> {\n if (!isMessageSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address } from '@solana/addresses';\n\nimport { MessagePartialSigner } from './message-partial-signer';\nimport { TransactionPartialSigner } from './transaction-partial-signer';\n\n/** Defines a no-operation signer that pretends to partially sign messages and transactions. */\nexport type NoopSigner<TAddress extends string = string> = MessagePartialSigner<TAddress> &\n TransactionPartialSigner<TAddress>;\n\n/** Creates a NoopSigner from the provided Address. */\nexport function createNoopSigner(address: Address): NoopSigner {\n const out: NoopSigner = {\n address,\n signMessages: messages => Promise.resolve(messages.map(() => Object.freeze({}))),\n signTransactions: transactions => Promise.resolve(transactions.map(() => Object.freeze({}))),\n };\n\n return Object.freeze(out);\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER, SolanaError } from '@solana/errors';\nimport { Transaction } from '@solana/transactions';\n\nimport { BaseTransactionSignerConfig } from './types';\n\nexport type TransactionModifyingSignerConfig = BaseTransactionSignerConfig;\n\n/** Defines a signer capable of signing transactions. */\nexport type TransactionModifyingSigner<TAddress extends string = string> = Readonly<{\n address: Address<TAddress>;\n modifyAndSignTransactions<T extends Transaction>(\n transactions: readonly T[],\n config?: TransactionModifyingSignerConfig,\n ): Promise<readonly T[]>;\n}>;\n\n/** Checks whether the provided value implements the {@link TransactionModifyingSigner} interface. */\nexport function isTransactionModifyingSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): value is TransactionModifyingSigner<TAddress> {\n return 'modifyAndSignTransactions' in value && typeof value.modifyAndSignTransactions === 'function';\n}\n\n/** Asserts that the provided value implements the {@link TransactionModifyingSigner} interface. */\nexport function assertIsTransactionModifyingSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): asserts value is TransactionModifyingSigner<TAddress> {\n if (!isTransactionModifyingSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\nimport { Transaction } from '@solana/transactions';\n\nimport { BaseTransactionSignerConfig } from './types';\n\nexport type TransactionSendingSignerConfig = BaseTransactionSignerConfig;\n\n/** Defines a signer capable of signing and sending transactions simultaneously. */\nexport type TransactionSendingSigner<TAddress extends string = string> = Readonly<{\n address: Address<TAddress>;\n signAndSendTransactions(\n transactions: readonly Transaction[],\n config?: TransactionSendingSignerConfig,\n ): Promise<readonly SignatureBytes[]>;\n}>;\n\n/** Checks whether the provided value implements the {@link TransactionSendingSigner} interface. */\nexport function isTransactionSendingSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): value is TransactionSendingSigner<TAddress> {\n return 'signAndSendTransactions' in value && typeof value.signAndSendTransactions === 'function';\n}\n\n/** Asserts that the provided value implements the {@link TransactionSendingSigner} interface. */\nexport function assertIsTransactionSendingSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): asserts value is TransactionSendingSigner<TAddress> {\n if (!isTransactionSendingSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER, SolanaError } from '@solana/errors';\n\nimport { isTransactionModifyingSigner, TransactionModifyingSigner } from './transaction-modifying-signer';\nimport { isTransactionPartialSigner, TransactionPartialSigner } from './transaction-partial-signer';\nimport { isTransactionSendingSigner, TransactionSendingSigner } from './transaction-sending-signer';\n\n/** Defines a signer capable of signing transactions. */\nexport type TransactionSigner<TAddress extends string = string> =\n | TransactionModifyingSigner<TAddress>\n | TransactionPartialSigner<TAddress>\n | TransactionSendingSigner<TAddress>;\n\n/** Checks whether the provided value implements the {@link TransactionSigner} interface. */\nexport function isTransactionSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): value is TransactionSigner<TAddress> {\n return (\n isTransactionPartialSigner(value) || isTransactionModifyingSigner(value) || isTransactionSendingSigner(value)\n );\n}\n\n/** Asserts that the provided value implements the {@link TransactionSigner} interface. */\nexport function assertIsTransactionSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): asserts value is TransactionSigner<TAddress> {\n if (!isTransactionSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER, {\n address: value.address,\n });\n }\n}\n","import {\n SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS,\n SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING,\n SolanaError,\n} from '@solana/errors';\nimport { CompilableTransactionMessage } from '@solana/transaction-messages';\n\nimport { getSignersFromTransactionMessage, ITransactionMessageWithSigners } from './account-signer-meta';\nimport { isTransactionModifyingSigner } from './transaction-modifying-signer';\nimport { isTransactionPartialSigner } from './transaction-partial-signer';\nimport { isTransactionSendingSigner } from './transaction-sending-signer';\n\n/** Defines a transaction message with exactly one {@link TransactionSendingSigner}. */\nexport type ITransactionMessageWithSingleSendingSigner = ITransactionMessageWithSigners & {\n readonly __transactionWithSingleSendingSigner: unique symbol;\n};\n\n/** Checks whether the provided transaction has exactly one {@link TransactionSendingSigner}. */\nexport function isTransactionMessageWithSingleSendingSigner<TTransactionMessage extends CompilableTransactionMessage>(\n transaction: TTransactionMessage,\n): transaction is ITransactionMessageWithSingleSendingSigner & TTransactionMessage {\n try {\n assertIsTransactionMessageWithSingleSendingSigner(transaction);\n return true;\n } catch {\n return false;\n }\n}\n\n/** Asserts that the provided transaction has exactly one {@link TransactionSendingSigner}. */\nexport function assertIsTransactionMessageWithSingleSendingSigner<\n TTransactionMessage extends CompilableTransactionMessage,\n>(\n transaction: TTransactionMessage,\n): asserts transaction is ITransactionMessageWithSingleSendingSigner & TTransactionMessage {\n const signers = getSignersFromTransactionMessage(transaction);\n const sendingSigners = signers.filter(isTransactionSendingSigner);\n\n if (sendingSigners.length === 0) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING);\n }\n\n // When identifying if there are multiple sending signers, we only need to check for\n // sending signers that do not implement other transaction signer interfaces as\n // they will be used as these other signer interfaces in case of a conflict.\n const sendingOnlySigners = sendingSigners.filter(\n signer => !isTransactionPartialSigner(signer) && !isTransactionModifyingSigner(signer),\n );\n\n if (sendingOnlySigners.length > 1) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS);\n }\n}\n","import { SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\nimport {\n CompilableTransactionMessage,\n TransactionMessageWithBlockhashLifetime,\n TransactionMessageWithDurableNonceLifetime,\n} from '@solana/transaction-messages';\nimport {\n assertTransactionIsFullySigned,\n compileTransaction,\n FullySignedTransaction,\n Transaction,\n TransactionWithBlockhashLifetime,\n TransactionWithDurableNonceLifetime,\n TransactionWithLifetime,\n} from '@solana/transactions';\n\nimport { getSignersFromTransactionMessage, ITransactionMessageWithSigners } from './account-signer-meta';\nimport { deduplicateSigners } from './deduplicate-signers';\nimport {\n isTransactionModifyingSigner,\n TransactionModifyingSigner,\n TransactionModifyingSignerConfig,\n} from './transaction-modifying-signer';\nimport {\n isTransactionPartialSigner,\n TransactionPartialSigner,\n TransactionPartialSignerConfig,\n} from './transaction-partial-signer';\nimport {\n isTransactionSendingSigner,\n TransactionSendingSigner,\n TransactionSendingSignerConfig,\n} from './transaction-sending-signer';\nimport { isTransactionSigner, TransactionSigner } from './transaction-signer';\nimport { assertIsTransactionMessageWithSingleSendingSigner } from './transaction-with-single-sending-signer';\n\ntype CompilableTransactionMessageWithSigners = CompilableTransactionMessage & ITransactionMessageWithSigners;\n\n/**\n * Signs a transaction using any signers that may be stored in IAccountSignerMeta instruction accounts\n * as well as any signers provided explicitly to this function.\n * It will ignore TransactionSendingSigners since this function does not send the transaction.\n */\nexport async function partiallySignTransactionMessageWithSigners<\n TTransactionMessage extends CompilableTransactionMessageWithSigners &\n TransactionMessageWithBlockhashLifetime = CompilableTransactionMessageWithSigners &\n TransactionMessageWithBlockhashLifetime,\n>(\n transactionMessage: TTransactionMessage,\n config?: TransactionPartialSignerConfig,\n): Promise<Transaction & TransactionWithBlockhashLifetime>;\n\nexport async function partiallySignTransactionMessageWithSigners<\n TTransactionMessage extends CompilableTransactionMessageWithSigners &\n TransactionMessageWithDurableNonceLifetime = CompilableTransactionMessageWithSigners &\n TransactionMessageWithDurableNonceLifetime,\n>(\n transactionMessage: TTransactionMessage,\n config?: TransactionPartialSignerConfig,\n): Promise<Readonly<Transaction & TransactionWithDurableNonceLifetime>>;\n\nexport async function partiallySignTransactionMessageWithSigners<\n TTransactionMessage extends CompilableTransactionMessageWithSigners = CompilableTransactionMessageWithSigners,\n>(\n transactionMessage: TTransactionMessage,\n config?: TransactionPartialSignerConfig,\n): Promise<Readonly<Transaction & TransactionWithLifetime>>;\n\nexport async function partiallySignTransactionMessageWithSigners<\n TTransactionMessage extends CompilableTransactionMessageWithSigners = CompilableTransactionMessageWithSigners,\n>(\n transactionMessage: TTransactionMessage,\n config?: TransactionPartialSignerConfig,\n): Promise<Readonly<Transaction & TransactionWithLifetime>> {\n const { partialSigners, modifyingSigners } = categorizeTransactionSigners(\n deduplicateSigners(getSignersFromTransactionMessage(transactionMessage).filter(isTransactionSigner)),\n { identifySendingSigner: false },\n );\n\n return await signModifyingAndPartialTransactionSigners(\n transactionMessage,\n modifyingSigners,\n partialSigners,\n config,\n );\n}\n\n/**\n * Signs a transaction using any signers that may be stored in IAccountSignerMeta instruction accounts\n * as well as any signers provided explicitly to this function.\n * It will assert that the transaction is fully signed before returning.\n * It will ignore TransactionSendingSigners since this function does not send the transaction.\n */\nexport async function signTransactionMessageWithSigners<\n TTransactionMessage extends CompilableTransactionMessageWithSigners &\n TransactionMessageWithBlockhashLifetime = CompilableTransactionMessageWithSigners &\n TransactionMessageWithBlockhashLifetime,\n>(\n transactionMessage: TTransactionMessage,\n config?: TransactionPartialSignerConfig,\n): Promise<Readonly<FullySignedTransaction & TransactionWithBlockhashLifetime>>;\n\nexport async function signTransactionMessageWithSigners<\n TTransactionMessage extends CompilableTransactionMessageWithSigners &\n TransactionMessageWithDurableNonceLifetime = CompilableTransactionMessageWithSigners &\n TransactionMessageWithDurableNonceLifetime,\n>(\n transactionMessage: TTransactionMessage,\n config?: TransactionPartialSignerConfig,\n): Promise<Readonly<FullySignedTransaction & TransactionWithDurableNonceLifetime>>;\n\nexport async function signTransactionMessageWithSigners<\n TTransactionMessage extends CompilableTransactionMessageWithSigners = CompilableTransactionMessageWithSigners,\n>(\n transactionMessage: TTransactionMessage,\n config?: TransactionPartialSignerConfig,\n): Promise<Readonly<FullySignedTransaction & TransactionWithLifetime>>;\n\nexport async function signTransactionMessageWithSigners<\n TTransactionMessage extends CompilableTransactionMessageWithSigners = CompilableTransactionMessageWithSigners,\n>(\n transactionMessage: TTransactionMessage,\n config?: TransactionPartialSignerConfig,\n): Promise<Readonly<FullySignedTransaction & TransactionWithLifetime>> {\n const signedTransaction = await partiallySignTransactionMessageWithSigners(transactionMessage, config);\n assertTransactionIsFullySigned(signedTransaction);\n return signedTransaction;\n}\n\n/**\n * Signs and sends a transaction using any signers that may be stored in IAccountSignerMeta\n * instruction accounts as well as any signers provided explicitly to this function.\n * It will identify a single TransactionSendingSigners to use for sending the transaction, if any.\n * Otherwise, it will send the transaction using the provided fallbackSender.\n */\nexport async function signAndSendTransactionMessageWithSigners<\n TTransactionMessage extends CompilableTransactionMessageWithSigners = CompilableTransactionMessageWithSigners,\n>(transaction: TTransactionMessage, config?: TransactionSendingSignerConfig): Promise<SignatureBytes> {\n assertIsTransactionMessageWithSingleSendingSigner(transaction);\n\n const abortSignal = config?.abortSignal;\n const { partialSigners, modifyingSigners, sendingSigner } = categorizeTransactionSigners(\n deduplicateSigners(getSignersFromTransactionMessage(transaction).filter(isTransactionSigner)),\n );\n\n abortSignal?.throwIfAborted();\n const signedTransaction = await signModifyingAndPartialTransactionSigners(\n transaction,\n modifyingSigners,\n partialSigners,\n config,\n );\n\n if (!sendingSigner) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING);\n }\n\n abortSignal?.throwIfAborted();\n const [signature] = await sendingSigner.signAndSendTransactions([signedTransaction], config);\n abortSignal?.throwIfAborted();\n\n return signature;\n}\n\n/**\n * Identifies each provided TransactionSigner and categorizes them into their respective types.\n * When a signer implements multiple interface, it will try to used to most powerful interface\n * but fallback to the least powerful interface when necessary.\n * For instance, if a signer implements TransactionSendingSigner and TransactionModifyingSigner,\n * it will be categorized as a TransactionSendingSigner if and only if no other signers implement\n * the TransactionSendingSigner interface.\n */\nfunction categorizeTransactionSigners(\n signers: readonly TransactionSigner[],\n config: { identifySendingSigner?: boolean } = {},\n): Readonly<{\n modifyingSigners: readonly TransactionModifyingSigner[];\n partialSigners: readonly TransactionPartialSigner[];\n sendingSigner: TransactionSendingSigner | null;\n}> {\n // Identify the unique sending signer that should be used.\n const identifySendingSigner = config.identifySendingSigner ?? true;\n const sendingSigner = identifySendingSigner ? identifyTransactionSendingSigner(signers) : null;\n\n // Now, focus on the other signers.\n // I.e. the modifying or partial signers that are not the identified sending signer.\n // Note that any other sending only signers will be discarded.\n const otherSigners = signers.filter(\n (signer): signer is TransactionModifyingSigner | TransactionPartialSigner =>\n signer !== sendingSigner && (isTransactionModifyingSigner(signer) || isTransactionPartialSigner(signer)),\n );\n\n // Identify the modifying signers from the other signers.\n const modifyingSigners = identifyTransactionModifyingSigners(otherSigners);\n\n // Use any remaining signers as partial signers.\n const partialSigners = otherSigners\n .filter(isTransactionPartialSigner)\n .filter(signer => !(modifyingSigners as typeof otherSigners).includes(signer));\n\n return Object.freeze({ modifyingSigners, partialSigners, sendingSigner });\n}\n\n/** Identifies the best signer to use as a TransactionSendingSigner, if any */\nfunction identifyTransactionSendingSigner(signers: readonly TransactionSigner[]): TransactionSendingSigner | null {\n // Ensure there are any TransactionSendingSigners in the first place.\n const sendingSigners = signers.filter(isTransactionSendingSigner);\n if (sendingSigners.length === 0) return null;\n\n // Prefer sending signers that do not offer other interfaces.\n const sendingOnlySigners = sendingSigners.filter(\n signer => !isTransactionModifyingSigner(signer) && !isTransactionPartialSigner(signer),\n );\n if (sendingOnlySigners.length > 0) {\n return sendingOnlySigners[0];\n }\n\n // Otherwise, choose any sending signer.\n return sendingSigners[0];\n}\n\n/** Identifies the best signers to use as TransactionModifyingSigners, if any */\nfunction identifyTransactionModifyingSigners(\n signers: readonly (TransactionModifyingSigner | TransactionPartialSigner)[],\n): readonly TransactionModifyingSigner[] {\n // Ensure there are any TransactionModifyingSigner in the first place.\n const modifyingSigners = signers.filter(isTransactionModifyingSigner);\n if (modifyingSigners.length === 0) return [];\n\n // Prefer modifying signers that do not offer partial signing.\n const nonPartialSigners = modifyingSigners.filter(signer => !isTransactionPartialSigner(signer));\n if (nonPartialSigners.length > 0) return nonPartialSigners;\n\n // Otherwise, choose only one modifying signer (whichever).\n return [modifyingSigners[0]];\n}\n\n/**\n * Signs a transaction using the provided TransactionModifyingSigners\n * sequentially followed by the TransactionPartialSigners in parallel.\n */\nasync function signModifyingAndPartialTransactionSigners<\n TTransactionMessage extends CompilableTransactionMessageWithSigners = CompilableTransactionMessageWithSigners,\n>(\n transactionMessage: TTransactionMessage,\n modifyingSigners: readonly TransactionModifyingSigner[] = [],\n partialSigners: readonly TransactionPartialSigner[] = [],\n config?: TransactionModifyingSignerConfig,\n): Promise<Readonly<Transaction & TransactionWithLifetime>> {\n // serialize the transaction\n const transaction = compileTransaction(transactionMessage);\n\n // Handle modifying signers sequentially.\n const modifiedTransaction = await modifyingSigners.reduce(\n async (transaction, modifyingSigner) => {\n config?.abortSignal?.throwIfAborted();\n const [tx] = await modifyingSigner.modifyAndSignTransactions([await transaction], config);\n return Object.freeze(tx);\n },\n Promise.resolve(transaction) as Promise<Readonly<Transaction & TransactionWithLifetime>>,\n );\n\n // Handle partial signers in parallel.\n config?.abortSignal?.throwIfAborted();\n const signatureDictionaries = await Promise.all(\n partialSigners.map(async partialSigner => {\n const [signatures] = await partialSigner.signTransactions([modifiedTransaction], config);\n return signatures;\n }),\n );\n const signedTransaction: Readonly<Transaction & TransactionWithLifetime> = {\n ...modifiedTransaction,\n signatures: Object.freeze(\n signatureDictionaries.reduce((signatures, signatureDictionary) => {\n return { ...signatures, ...signatureDictionary };\n }, modifiedTransaction.signatures ?? {}),\n ),\n };\n\n return Object.freeze(signedTransaction);\n}\n","export const TextDecoder = globalThis.TextDecoder;\nexport const TextEncoder = globalThis.TextEncoder;\n","import { TextEncoder } from '@solana/text-encoding-impl';\n\nimport { SignatureDictionary } from './types';\n\n/** Defines a message that needs signing and its current set of signatures if any. */\nexport type SignableMessage = Readonly<{\n content: Uint8Array;\n signatures: SignatureDictionary;\n}>;\n\n/**\n * Creates a signable message from a provided content.\n * If a string is provided, it will be UTF-8 encoded.\n */\nexport function createSignableMessage(\n content: Uint8Array | string,\n signatures: SignatureDictionary = {},\n): SignableMessage {\n return Object.freeze({\n content: typeof content === 'string' ? new TextEncoder().encode(content) : content,\n signatures: Object.freeze({ ...signatures }),\n });\n}\n"]}
1
+ {"version":3,"sources":["../src/deduplicate-signers.ts","../src/transaction-modifying-signer.ts","../src/transaction-partial-signer.ts","../src/transaction-sending-signer.ts","../src/transaction-signer.ts","../src/account-signer-meta.ts","../src/add-signers.ts","../src/fee-payer-signer.ts","../src/message-partial-signer.ts","../src/keypair-signer.ts","../src/message-modifying-signer.ts","../src/message-signer.ts","../src/noop-signer.ts","../src/transaction-with-single-sending-signer.ts","../src/sign-transaction.ts","../../text-encoding-impl/src/index.browser.ts","../src/signable-message.ts"],"names":["SolanaError","SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS","SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER","SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER","SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER","SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER","isSignerRole","SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER","SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER","getAddressFromPublicKey","signBytes","transactions","partiallySignTransaction","generateKeyPair","createKeyPairFromBytes","createKeyPairFromPrivateKeyBytes","isAddress","SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER","SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER","SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING","SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS","assertTransactionIsFullySigned","compileTransaction","transaction","TextEncoder"],"mappings":"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","file":"index.browser.cjs","sourcesContent":["import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS, SolanaError } from '@solana/errors';\n\nimport { MessageSigner } from './message-signer';\nimport { TransactionSigner } from './transaction-signer';\n\n/** Removes all duplicated signers from a provided array by comparing their addresses. */\nexport function deduplicateSigners<TSigner extends MessageSigner | TransactionSigner>(\n signers: readonly TSigner[],\n): readonly TSigner[] {\n const deduplicated: Record<Address, TSigner> = {};\n signers.forEach(signer => {\n if (!deduplicated[signer.address]) {\n deduplicated[signer.address] = signer;\n } else if (deduplicated[signer.address] !== signer) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS, {\n address: signer.address,\n });\n }\n });\n return Object.values(deduplicated);\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER, SolanaError } from '@solana/errors';\nimport { Transaction } from '@solana/transactions';\n\nimport { BaseTransactionSignerConfig } from './types';\n\nexport type TransactionModifyingSignerConfig = BaseTransactionSignerConfig;\n\n/** Defines a signer capable of signing transactions. */\nexport type TransactionModifyingSigner<TAddress extends string = string> = Readonly<{\n address: Address<TAddress>;\n modifyAndSignTransactions<T extends Transaction>(\n transactions: readonly T[],\n config?: TransactionModifyingSignerConfig,\n ): Promise<readonly T[]>;\n}>;\n\n/** Checks whether the provided value implements the {@link TransactionModifyingSigner} interface. */\nexport function isTransactionModifyingSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): value is TransactionModifyingSigner<TAddress> {\n return 'modifyAndSignTransactions' in value && typeof value.modifyAndSignTransactions === 'function';\n}\n\n/** Asserts that the provided value implements the {@link TransactionModifyingSigner} interface. */\nexport function assertIsTransactionModifyingSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): asserts value is TransactionModifyingSigner<TAddress> {\n if (!isTransactionModifyingSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER, SolanaError } from '@solana/errors';\nimport { Transaction } from '@solana/transactions';\n\nimport { BaseTransactionSignerConfig, SignatureDictionary } from './types';\n\nexport type TransactionPartialSignerConfig = BaseTransactionSignerConfig;\n\n/** Defines a signer capable of signing transactions. */\nexport type TransactionPartialSigner<TAddress extends string = string> = Readonly<{\n address: Address<TAddress>;\n signTransactions(\n transactions: readonly Transaction[],\n config?: TransactionPartialSignerConfig,\n ): Promise<readonly SignatureDictionary[]>;\n}>;\n\n/** Checks whether the provided value implements the {@link TransactionPartialSigner} interface. */\nexport function isTransactionPartialSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): value is TransactionPartialSigner<TAddress> {\n return 'signTransactions' in value && typeof value.signTransactions === 'function';\n}\n\n/** Asserts that the provided value implements the {@link TransactionPartialSigner} interface. */\nexport function assertIsTransactionPartialSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): asserts value is TransactionPartialSigner<TAddress> {\n if (!isTransactionPartialSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\nimport { Transaction } from '@solana/transactions';\n\nimport { BaseTransactionSignerConfig } from './types';\n\nexport type TransactionSendingSignerConfig = BaseTransactionSignerConfig;\n\n/** Defines a signer capable of signing and sending transactions simultaneously. */\nexport type TransactionSendingSigner<TAddress extends string = string> = Readonly<{\n address: Address<TAddress>;\n signAndSendTransactions(\n transactions: readonly Transaction[],\n config?: TransactionSendingSignerConfig,\n ): Promise<readonly SignatureBytes[]>;\n}>;\n\n/** Checks whether the provided value implements the {@link TransactionSendingSigner} interface. */\nexport function isTransactionSendingSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): value is TransactionSendingSigner<TAddress> {\n return 'signAndSendTransactions' in value && typeof value.signAndSendTransactions === 'function';\n}\n\n/** Asserts that the provided value implements the {@link TransactionSendingSigner} interface. */\nexport function assertIsTransactionSendingSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): asserts value is TransactionSendingSigner<TAddress> {\n if (!isTransactionSendingSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER, SolanaError } from '@solana/errors';\n\nimport { isTransactionModifyingSigner, TransactionModifyingSigner } from './transaction-modifying-signer';\nimport { isTransactionPartialSigner, TransactionPartialSigner } from './transaction-partial-signer';\nimport { isTransactionSendingSigner, TransactionSendingSigner } from './transaction-sending-signer';\n\n/** Defines a signer capable of signing transactions. */\nexport type TransactionSigner<TAddress extends string = string> =\n | TransactionModifyingSigner<TAddress>\n | TransactionPartialSigner<TAddress>\n | TransactionSendingSigner<TAddress>;\n\n/** Checks whether the provided value implements the {@link TransactionSigner} interface. */\nexport function isTransactionSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): value is TransactionSigner<TAddress> {\n return (\n isTransactionPartialSigner(value) || isTransactionModifyingSigner(value) || isTransactionSendingSigner(value)\n );\n}\n\n/** Asserts that the provided value implements the {@link TransactionSigner} interface. */\nexport function assertIsTransactionSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): asserts value is TransactionSigner<TAddress> {\n if (!isTransactionSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { AccountRole, IAccountLookupMeta, IAccountMeta, IInstruction } from '@solana/instructions';\nimport {\n BaseTransactionMessage,\n ITransactionMessageWithFeePayer,\n TransactionVersion,\n} from '@solana/transaction-messages';\n\nimport { deduplicateSigners } from './deduplicate-signers';\nimport { ITransactionMessageWithFeePayerSigner } from './fee-payer-signer';\nimport { isTransactionSigner, TransactionSigner } from './transaction-signer';\n\n/** An extension of the IAccountMeta type that keeps track of its transaction signer. */\nexport interface IAccountSignerMeta<\n TAddress extends string = string,\n TSigner extends TransactionSigner<TAddress> = TransactionSigner<TAddress>,\n> extends IAccountMeta<TAddress> {\n readonly role: AccountRole.READONLY_SIGNER | AccountRole.WRITABLE_SIGNER;\n readonly signer: TSigner;\n}\n\ntype IAccountMetaWithSigner<TSigner extends TransactionSigner = TransactionSigner> =\n | IAccountLookupMeta\n | IAccountMeta\n | IAccountSignerMeta<string, TSigner>;\n\n/** A variation of the instruction type that allows IAccountSignerMeta in its account metas. */\nexport type IInstructionWithSigners<\n TSigner extends TransactionSigner = TransactionSigner,\n TAccounts extends readonly IAccountMetaWithSigner<TSigner>[] = readonly IAccountMetaWithSigner<TSigner>[],\n> = Pick<IInstruction<string, TAccounts>, 'accounts'>;\n\n/** A variation of the transaction message type that allows IAccountSignerMeta in its account metas. */\nexport type ITransactionMessageWithSigners<\n TAddress extends string = string,\n TSigner extends TransactionSigner<TAddress> = TransactionSigner<TAddress>,\n TAccounts extends readonly IAccountMetaWithSigner<TSigner>[] = readonly IAccountMetaWithSigner<TSigner>[],\n> = Partial<ITransactionMessageWithFeePayer<TAddress> | ITransactionMessageWithFeePayerSigner<TAddress, TSigner>> &\n Pick<\n BaseTransactionMessage<TransactionVersion, IInstruction & IInstructionWithSigners<TSigner, TAccounts>>,\n 'instructions'\n >;\n\n/** Extract all signers from an instruction that may contain IAccountSignerMeta accounts. */\nexport function getSignersFromInstruction<TSigner extends TransactionSigner = TransactionSigner>(\n instruction: IInstructionWithSigners<TSigner>,\n): readonly TSigner[] {\n return deduplicateSigners(\n (instruction.accounts ?? []).flatMap(account => ('signer' in account ? account.signer : [])),\n );\n}\n\n/** Extract all signers from a transaction message that may contain IAccountSignerMeta accounts. */\nexport function getSignersFromTransactionMessage<\n TAddress extends string = string,\n TSigner extends TransactionSigner<TAddress> = TransactionSigner<TAddress>,\n TTransactionMessage extends ITransactionMessageWithSigners<TAddress, TSigner> = ITransactionMessageWithSigners<\n TAddress,\n TSigner\n >,\n>(transaction: TTransactionMessage): readonly TSigner[] {\n return deduplicateSigners([\n ...(transaction.feePayer && isTransactionSigner(transaction.feePayer) ? [transaction.feePayer as TSigner] : []),\n ...transaction.instructions.flatMap(getSignersFromInstruction),\n ]);\n}\n","import { IInstruction, isSignerRole } from '@solana/instructions';\nimport { BaseTransactionMessage } from '@solana/transaction-messages';\n\nimport { IAccountSignerMeta, IInstructionWithSigners, ITransactionMessageWithSigners } from './account-signer-meta';\nimport { deduplicateSigners } from './deduplicate-signers';\nimport { TransactionSigner } from './transaction-signer';\n\n/** Attaches the provided signers to the account metas of an instruction when applicable. */\nexport function addSignersToInstruction<TInstruction extends IInstruction>(\n signers: TransactionSigner[],\n instruction: TInstruction | (IInstructionWithSigners & TInstruction),\n): IInstructionWithSigners & TInstruction {\n if (!instruction.accounts || instruction.accounts.length === 0) {\n return instruction as IInstructionWithSigners & TInstruction;\n }\n\n const signerByAddress = new Map(deduplicateSigners(signers).map(signer => [signer.address, signer]));\n return Object.freeze({\n ...instruction,\n accounts: instruction.accounts.map(account => {\n const signer = signerByAddress.get(account.address);\n if (!isSignerRole(account.role) || 'signer' in account || !signer) {\n return account;\n }\n return Object.freeze({ ...account, signer } as IAccountSignerMeta);\n }),\n });\n}\n\n/** Attaches the provided signers to the account metas of a transaction message when applicable. */\nexport function addSignersToTransactionMessage<TTransactionMessage extends BaseTransactionMessage>(\n signers: TransactionSigner[],\n transactionMessage: TTransactionMessage | (ITransactionMessageWithSigners & TTransactionMessage),\n): ITransactionMessageWithSigners & TTransactionMessage {\n if (transactionMessage.instructions.length === 0) {\n return transactionMessage as ITransactionMessageWithSigners & TTransactionMessage;\n }\n\n return Object.freeze({\n ...transactionMessage,\n instructions: transactionMessage.instructions.map(instruction => addSignersToInstruction(signers, instruction)),\n });\n}\n","import { BaseTransactionMessage, ITransactionMessageWithFeePayer } from '@solana/transaction-messages';\n\nimport { TransactionSigner } from './transaction-signer';\n\nexport interface ITransactionMessageWithFeePayerSigner<\n TAddress extends string = string,\n TSigner extends TransactionSigner<TAddress> = TransactionSigner<TAddress>,\n> {\n readonly feePayer: TSigner;\n}\n\nexport function setTransactionMessageFeePayerSigner<\n TFeePayerAddress extends string,\n TTransactionMessage extends BaseTransactionMessage &\n Partial<ITransactionMessageWithFeePayer | ITransactionMessageWithFeePayerSigner>,\n>(\n feePayer: TransactionSigner<TFeePayerAddress>,\n transactionMessage: TTransactionMessage,\n): ITransactionMessageWithFeePayerSigner<TFeePayerAddress> & Omit<TTransactionMessage, 'feePayer'> {\n Object.freeze(feePayer);\n const out = { ...transactionMessage, feePayer };\n Object.freeze(out);\n return out;\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER, SolanaError } from '@solana/errors';\n\nimport { SignableMessage } from './signable-message';\nimport { BaseSignerConfig, SignatureDictionary } from './types';\n\nexport type MessagePartialSignerConfig = BaseSignerConfig;\n\n/** Defines a signer capable of signing messages. */\nexport type MessagePartialSigner<TAddress extends string = string> = Readonly<{\n address: Address<TAddress>;\n signMessages(\n messages: readonly SignableMessage[],\n config?: MessagePartialSignerConfig,\n ): Promise<readonly SignatureDictionary[]>;\n}>;\n\n/** Checks whether the provided value implements the {@link MessagePartialSigner} interface. */\nexport function isMessagePartialSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): value is MessagePartialSigner<TAddress> {\n return 'signMessages' in value && typeof value.signMessages === 'function';\n}\n\n/** Asserts that the provided value implements the {@link MessagePartialSigner} interface. */\nexport function assertIsMessagePartialSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): asserts value is MessagePartialSigner<TAddress> {\n if (!isMessagePartialSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address, getAddressFromPublicKey } from '@solana/addresses';\nimport { ReadonlyUint8Array } from '@solana/codecs-core';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER, SolanaError } from '@solana/errors';\nimport { createKeyPairFromBytes, createKeyPairFromPrivateKeyBytes, generateKeyPair, signBytes } from '@solana/keys';\nimport { partiallySignTransaction } from '@solana/transactions';\n\nimport { isMessagePartialSigner, MessagePartialSigner } from './message-partial-signer';\nimport { isTransactionPartialSigner, TransactionPartialSigner } from './transaction-partial-signer';\n\n/** Defines a signer capable of signing messages and transactions using a CryptoKeyPair. */\nexport type KeyPairSigner<TAddress extends string = string> = MessagePartialSigner<TAddress> &\n TransactionPartialSigner<TAddress> & { keyPair: CryptoKeyPair };\n\n/** Checks whether the provided value implements the {@link KeyPairSigner} interface. */\nexport function isKeyPairSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): value is KeyPairSigner<TAddress> {\n return (\n 'keyPair' in value &&\n typeof value.keyPair === 'object' &&\n isMessagePartialSigner(value) &&\n isTransactionPartialSigner(value)\n );\n}\n\n/** Asserts that the provided value implements the {@link KeyPairSigner} interface. */\nexport function assertIsKeyPairSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): asserts value is KeyPairSigner<TAddress> {\n if (!isKeyPairSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER, {\n address: value.address,\n });\n }\n}\n\n/** Creates a KeyPairSigner from the provided Crypto KeyPair. */\nexport async function createSignerFromKeyPair(keyPair: CryptoKeyPair): Promise<KeyPairSigner> {\n const address = await getAddressFromPublicKey(keyPair.publicKey);\n const out: KeyPairSigner = {\n address,\n keyPair,\n signMessages: messages =>\n Promise.all(\n messages.map(async message =>\n Object.freeze({ [address]: await signBytes(keyPair.privateKey, message.content) }),\n ),\n ),\n signTransactions: transactions =>\n Promise.all(\n transactions.map(async transaction => {\n const signedTransaction = await partiallySignTransaction([keyPair], transaction);\n // we know that the address has signed `signedTransaction` because it comes from the keypair\n return Object.freeze({ [address]: signedTransaction.signatures[address]! });\n }),\n ),\n };\n\n return Object.freeze(out);\n}\n\n/** Securely generates a signer capable of signing messages and transactions using a Crypto KeyPair. */\nexport async function generateKeyPairSigner(): Promise<KeyPairSigner> {\n return await createSignerFromKeyPair(await generateKeyPair());\n}\n\n/** Creates a signer capable of signing messages and transactions using the 64 bytes of a KeyPair. */\nexport async function createKeyPairSignerFromBytes(\n bytes: ReadonlyUint8Array,\n extractable?: boolean,\n): Promise<KeyPairSigner> {\n return await createSignerFromKeyPair(await createKeyPairFromBytes(bytes, extractable));\n}\n\n/** Creates a signer capable of signing messages and transactions using the 32 bytes of a private key. */\nexport async function createKeyPairSignerFromPrivateKeyBytes(\n bytes: ReadonlyUint8Array,\n extractable?: boolean,\n): Promise<KeyPairSigner> {\n return await createSignerFromKeyPair(await createKeyPairFromPrivateKeyBytes(bytes, extractable));\n}\n","import { Address, isAddress } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER, SolanaError } from '@solana/errors';\n\nimport { SignableMessage } from './signable-message';\nimport { BaseSignerConfig } from './types';\n\nexport type MessageModifyingSignerConfig = BaseSignerConfig;\n\n/** Defines a signer capable of signing messages. */\nexport type MessageModifyingSigner<TAddress extends string = string> = Readonly<{\n address: Address<TAddress>;\n modifyAndSignMessages(\n messages: readonly SignableMessage[],\n config?: MessageModifyingSignerConfig,\n ): Promise<readonly SignableMessage[]>;\n}>;\n\n/** Checks whether the provided value implements the {@link MessageModifyingSigner} interface. */\nexport function isMessageModifyingSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): value is MessageModifyingSigner<TAddress> {\n return (\n isAddress(value.address) &&\n 'modifyAndSignMessages' in value &&\n typeof value.modifyAndSignMessages === 'function'\n );\n}\n\n/** Asserts that the provided value implements the {@link MessageModifyingSigner} interface. */\nexport function assertIsMessageModifyingSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): asserts value is MessageModifyingSigner<TAddress> {\n if (!isMessageModifyingSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER, SolanaError } from '@solana/errors';\n\nimport { isMessageModifyingSigner, MessageModifyingSigner } from './message-modifying-signer';\nimport { isMessagePartialSigner, MessagePartialSigner } from './message-partial-signer';\n\n/** Defines a signer capable of signing messages. */\nexport type MessageSigner<TAddress extends string = string> =\n | MessageModifyingSigner<TAddress>\n | MessagePartialSigner<TAddress>;\n\n/** Checks whether the provided value implements the {@link MessageSigner} interface. */\nexport function isMessageSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): value is MessageSigner<TAddress> {\n return isMessagePartialSigner(value) || isMessageModifyingSigner(value);\n}\n\n/** Asserts that the provided value implements the {@link MessageSigner} interface. */\nexport function assertIsMessageSigner<TAddress extends string>(value: {\n [key: string]: unknown;\n address: Address<TAddress>;\n}): asserts value is MessageSigner<TAddress> {\n if (!isMessageSigner(value)) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER, {\n address: value.address,\n });\n }\n}\n","import { Address } from '@solana/addresses';\n\nimport { MessagePartialSigner } from './message-partial-signer';\nimport { TransactionPartialSigner } from './transaction-partial-signer';\n\n/** Defines a no-operation signer that pretends to partially sign messages and transactions. */\nexport type NoopSigner<TAddress extends string = string> = MessagePartialSigner<TAddress> &\n TransactionPartialSigner<TAddress>;\n\n/** Creates a NoopSigner from the provided Address. */\nexport function createNoopSigner(address: Address): NoopSigner {\n const out: NoopSigner = {\n address,\n signMessages: messages => Promise.resolve(messages.map(() => Object.freeze({}))),\n signTransactions: transactions => Promise.resolve(transactions.map(() => Object.freeze({}))),\n };\n\n return Object.freeze(out);\n}\n","import {\n SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS,\n SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING,\n SolanaError,\n} from '@solana/errors';\nimport { CompilableTransactionMessage } from '@solana/transaction-messages';\n\nimport { getSignersFromTransactionMessage, ITransactionMessageWithSigners } from './account-signer-meta';\nimport { isTransactionModifyingSigner } from './transaction-modifying-signer';\nimport { isTransactionPartialSigner } from './transaction-partial-signer';\nimport { isTransactionSendingSigner } from './transaction-sending-signer';\n\n/** Defines a transaction message with exactly one {@link TransactionSendingSigner}. */\nexport type ITransactionMessageWithSingleSendingSigner = ITransactionMessageWithSigners & {\n readonly __transactionWithSingleSendingSigner: unique symbol;\n};\n\n/** Checks whether the provided transaction has exactly one {@link TransactionSendingSigner}. */\nexport function isTransactionMessageWithSingleSendingSigner<TTransactionMessage extends CompilableTransactionMessage>(\n transaction: TTransactionMessage,\n): transaction is ITransactionMessageWithSingleSendingSigner & TTransactionMessage {\n try {\n assertIsTransactionMessageWithSingleSendingSigner(transaction);\n return true;\n } catch {\n return false;\n }\n}\n\n/** Asserts that the provided transaction has exactly one {@link TransactionSendingSigner}. */\nexport function assertIsTransactionMessageWithSingleSendingSigner<\n TTransactionMessage extends CompilableTransactionMessage,\n>(\n transaction: TTransactionMessage,\n): asserts transaction is ITransactionMessageWithSingleSendingSigner & TTransactionMessage {\n const signers = getSignersFromTransactionMessage(transaction);\n const sendingSigners = signers.filter(isTransactionSendingSigner);\n\n if (sendingSigners.length === 0) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING);\n }\n\n // When identifying if there are multiple sending signers, we only need to check for\n // sending signers that do not implement other transaction signer interfaces as\n // they will be used as these other signer interfaces in case of a conflict.\n const sendingOnlySigners = sendingSigners.filter(\n signer => !isTransactionPartialSigner(signer) && !isTransactionModifyingSigner(signer),\n );\n\n if (sendingOnlySigners.length > 1) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS);\n }\n}\n","import { SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\nimport {\n CompilableTransactionMessage,\n TransactionMessageWithBlockhashLifetime,\n TransactionMessageWithDurableNonceLifetime,\n} from '@solana/transaction-messages';\nimport {\n assertTransactionIsFullySigned,\n compileTransaction,\n FullySignedTransaction,\n Transaction,\n TransactionWithBlockhashLifetime,\n TransactionWithDurableNonceLifetime,\n TransactionWithLifetime,\n} from '@solana/transactions';\n\nimport { getSignersFromTransactionMessage, ITransactionMessageWithSigners } from './account-signer-meta';\nimport { deduplicateSigners } from './deduplicate-signers';\nimport {\n isTransactionModifyingSigner,\n TransactionModifyingSigner,\n TransactionModifyingSignerConfig,\n} from './transaction-modifying-signer';\nimport {\n isTransactionPartialSigner,\n TransactionPartialSigner,\n TransactionPartialSignerConfig,\n} from './transaction-partial-signer';\nimport {\n isTransactionSendingSigner,\n TransactionSendingSigner,\n TransactionSendingSignerConfig,\n} from './transaction-sending-signer';\nimport { isTransactionSigner, TransactionSigner } from './transaction-signer';\nimport { assertIsTransactionMessageWithSingleSendingSigner } from './transaction-with-single-sending-signer';\n\ntype CompilableTransactionMessageWithSigners = CompilableTransactionMessage & ITransactionMessageWithSigners;\n\n/**\n * Signs a transaction using any signers that may be stored in IAccountSignerMeta instruction accounts\n * as well as any signers provided explicitly to this function.\n * It will ignore TransactionSendingSigners since this function does not send the transaction.\n */\nexport async function partiallySignTransactionMessageWithSigners<\n TTransactionMessage extends CompilableTransactionMessageWithSigners &\n TransactionMessageWithBlockhashLifetime = CompilableTransactionMessageWithSigners &\n TransactionMessageWithBlockhashLifetime,\n>(\n transactionMessage: TTransactionMessage,\n config?: TransactionPartialSignerConfig,\n): Promise<Transaction & TransactionWithBlockhashLifetime>;\n\nexport async function partiallySignTransactionMessageWithSigners<\n TTransactionMessage extends CompilableTransactionMessageWithSigners &\n TransactionMessageWithDurableNonceLifetime = CompilableTransactionMessageWithSigners &\n TransactionMessageWithDurableNonceLifetime,\n>(\n transactionMessage: TTransactionMessage,\n config?: TransactionPartialSignerConfig,\n): Promise<Readonly<Transaction & TransactionWithDurableNonceLifetime>>;\n\nexport async function partiallySignTransactionMessageWithSigners<\n TTransactionMessage extends CompilableTransactionMessageWithSigners = CompilableTransactionMessageWithSigners,\n>(\n transactionMessage: TTransactionMessage,\n config?: TransactionPartialSignerConfig,\n): Promise<Readonly<Transaction & TransactionWithLifetime>>;\n\nexport async function partiallySignTransactionMessageWithSigners<\n TTransactionMessage extends CompilableTransactionMessageWithSigners = CompilableTransactionMessageWithSigners,\n>(\n transactionMessage: TTransactionMessage,\n config?: TransactionPartialSignerConfig,\n): Promise<Readonly<Transaction & TransactionWithLifetime>> {\n const { partialSigners, modifyingSigners } = categorizeTransactionSigners(\n deduplicateSigners(getSignersFromTransactionMessage(transactionMessage).filter(isTransactionSigner)),\n { identifySendingSigner: false },\n );\n\n return await signModifyingAndPartialTransactionSigners(\n transactionMessage,\n modifyingSigners,\n partialSigners,\n config,\n );\n}\n\n/**\n * Signs a transaction using any signers that may be stored in IAccountSignerMeta instruction accounts\n * as well as any signers provided explicitly to this function.\n * It will assert that the transaction is fully signed before returning.\n * It will ignore TransactionSendingSigners since this function does not send the transaction.\n */\nexport async function signTransactionMessageWithSigners<\n TTransactionMessage extends CompilableTransactionMessageWithSigners &\n TransactionMessageWithBlockhashLifetime = CompilableTransactionMessageWithSigners &\n TransactionMessageWithBlockhashLifetime,\n>(\n transactionMessage: TTransactionMessage,\n config?: TransactionPartialSignerConfig,\n): Promise<Readonly<FullySignedTransaction & TransactionWithBlockhashLifetime>>;\n\nexport async function signTransactionMessageWithSigners<\n TTransactionMessage extends CompilableTransactionMessageWithSigners &\n TransactionMessageWithDurableNonceLifetime = CompilableTransactionMessageWithSigners &\n TransactionMessageWithDurableNonceLifetime,\n>(\n transactionMessage: TTransactionMessage,\n config?: TransactionPartialSignerConfig,\n): Promise<Readonly<FullySignedTransaction & TransactionWithDurableNonceLifetime>>;\n\nexport async function signTransactionMessageWithSigners<\n TTransactionMessage extends CompilableTransactionMessageWithSigners = CompilableTransactionMessageWithSigners,\n>(\n transactionMessage: TTransactionMessage,\n config?: TransactionPartialSignerConfig,\n): Promise<Readonly<FullySignedTransaction & TransactionWithLifetime>>;\n\nexport async function signTransactionMessageWithSigners<\n TTransactionMessage extends CompilableTransactionMessageWithSigners = CompilableTransactionMessageWithSigners,\n>(\n transactionMessage: TTransactionMessage,\n config?: TransactionPartialSignerConfig,\n): Promise<Readonly<FullySignedTransaction & TransactionWithLifetime>> {\n const signedTransaction = await partiallySignTransactionMessageWithSigners(transactionMessage, config);\n assertTransactionIsFullySigned(signedTransaction);\n return signedTransaction;\n}\n\n/**\n * Signs and sends a transaction using any signers that may be stored in IAccountSignerMeta\n * instruction accounts as well as any signers provided explicitly to this function.\n * It will identify a single TransactionSendingSigners to use for sending the transaction, if any.\n * Otherwise, it will send the transaction using the provided fallbackSender.\n */\nexport async function signAndSendTransactionMessageWithSigners<\n TTransactionMessage extends CompilableTransactionMessageWithSigners = CompilableTransactionMessageWithSigners,\n>(transaction: TTransactionMessage, config?: TransactionSendingSignerConfig): Promise<SignatureBytes> {\n assertIsTransactionMessageWithSingleSendingSigner(transaction);\n\n const abortSignal = config?.abortSignal;\n const { partialSigners, modifyingSigners, sendingSigner } = categorizeTransactionSigners(\n deduplicateSigners(getSignersFromTransactionMessage(transaction).filter(isTransactionSigner)),\n );\n\n abortSignal?.throwIfAborted();\n const signedTransaction = await signModifyingAndPartialTransactionSigners(\n transaction,\n modifyingSigners,\n partialSigners,\n config,\n );\n\n if (!sendingSigner) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING);\n }\n\n abortSignal?.throwIfAborted();\n const [signature] = await sendingSigner.signAndSendTransactions([signedTransaction], config);\n abortSignal?.throwIfAborted();\n\n return signature;\n}\n\n/**\n * Identifies each provided TransactionSigner and categorizes them into their respective types.\n * When a signer implements multiple interface, it will try to used to most powerful interface\n * but fallback to the least powerful interface when necessary.\n * For instance, if a signer implements TransactionSendingSigner and TransactionModifyingSigner,\n * it will be categorized as a TransactionSendingSigner if and only if no other signers implement\n * the TransactionSendingSigner interface.\n */\nfunction categorizeTransactionSigners(\n signers: readonly TransactionSigner[],\n config: { identifySendingSigner?: boolean } = {},\n): Readonly<{\n modifyingSigners: readonly TransactionModifyingSigner[];\n partialSigners: readonly TransactionPartialSigner[];\n sendingSigner: TransactionSendingSigner | null;\n}> {\n // Identify the unique sending signer that should be used.\n const identifySendingSigner = config.identifySendingSigner ?? true;\n const sendingSigner = identifySendingSigner ? identifyTransactionSendingSigner(signers) : null;\n\n // Now, focus on the other signers.\n // I.e. the modifying or partial signers that are not the identified sending signer.\n // Note that any other sending only signers will be discarded.\n const otherSigners = signers.filter(\n (signer): signer is TransactionModifyingSigner | TransactionPartialSigner =>\n signer !== sendingSigner && (isTransactionModifyingSigner(signer) || isTransactionPartialSigner(signer)),\n );\n\n // Identify the modifying signers from the other signers.\n const modifyingSigners = identifyTransactionModifyingSigners(otherSigners);\n\n // Use any remaining signers as partial signers.\n const partialSigners = otherSigners\n .filter(isTransactionPartialSigner)\n .filter(signer => !(modifyingSigners as typeof otherSigners).includes(signer));\n\n return Object.freeze({ modifyingSigners, partialSigners, sendingSigner });\n}\n\n/** Identifies the best signer to use as a TransactionSendingSigner, if any */\nfunction identifyTransactionSendingSigner(signers: readonly TransactionSigner[]): TransactionSendingSigner | null {\n // Ensure there are any TransactionSendingSigners in the first place.\n const sendingSigners = signers.filter(isTransactionSendingSigner);\n if (sendingSigners.length === 0) return null;\n\n // Prefer sending signers that do not offer other interfaces.\n const sendingOnlySigners = sendingSigners.filter(\n signer => !isTransactionModifyingSigner(signer) && !isTransactionPartialSigner(signer),\n );\n if (sendingOnlySigners.length > 0) {\n return sendingOnlySigners[0];\n }\n\n // Otherwise, choose any sending signer.\n return sendingSigners[0];\n}\n\n/** Identifies the best signers to use as TransactionModifyingSigners, if any */\nfunction identifyTransactionModifyingSigners(\n signers: readonly (TransactionModifyingSigner | TransactionPartialSigner)[],\n): readonly TransactionModifyingSigner[] {\n // Ensure there are any TransactionModifyingSigner in the first place.\n const modifyingSigners = signers.filter(isTransactionModifyingSigner);\n if (modifyingSigners.length === 0) return [];\n\n // Prefer modifying signers that do not offer partial signing.\n const nonPartialSigners = modifyingSigners.filter(signer => !isTransactionPartialSigner(signer));\n if (nonPartialSigners.length > 0) return nonPartialSigners;\n\n // Otherwise, choose only one modifying signer (whichever).\n return [modifyingSigners[0]];\n}\n\n/**\n * Signs a transaction using the provided TransactionModifyingSigners\n * sequentially followed by the TransactionPartialSigners in parallel.\n */\nasync function signModifyingAndPartialTransactionSigners<\n TTransactionMessage extends CompilableTransactionMessageWithSigners = CompilableTransactionMessageWithSigners,\n>(\n transactionMessage: TTransactionMessage,\n modifyingSigners: readonly TransactionModifyingSigner[] = [],\n partialSigners: readonly TransactionPartialSigner[] = [],\n config?: TransactionModifyingSignerConfig,\n): Promise<Readonly<Transaction & TransactionWithLifetime>> {\n // serialize the transaction\n const transaction = compileTransaction(transactionMessage);\n\n // Handle modifying signers sequentially.\n const modifiedTransaction = await modifyingSigners.reduce(\n async (transaction, modifyingSigner) => {\n config?.abortSignal?.throwIfAborted();\n const [tx] = await modifyingSigner.modifyAndSignTransactions([await transaction], config);\n return Object.freeze(tx);\n },\n Promise.resolve(transaction) as Promise<Readonly<Transaction & TransactionWithLifetime>>,\n );\n\n // Handle partial signers in parallel.\n config?.abortSignal?.throwIfAborted();\n const signatureDictionaries = await Promise.all(\n partialSigners.map(async partialSigner => {\n const [signatures] = await partialSigner.signTransactions([modifiedTransaction], config);\n return signatures;\n }),\n );\n const signedTransaction: Readonly<Transaction & TransactionWithLifetime> = {\n ...modifiedTransaction,\n signatures: Object.freeze(\n signatureDictionaries.reduce((signatures, signatureDictionary) => {\n return { ...signatures, ...signatureDictionary };\n }, modifiedTransaction.signatures ?? {}),\n ),\n };\n\n return Object.freeze(signedTransaction);\n}\n","export const TextDecoder = globalThis.TextDecoder;\nexport const TextEncoder = globalThis.TextEncoder;\n","import { TextEncoder } from '@solana/text-encoding-impl';\n\nimport { SignatureDictionary } from './types';\n\n/** Defines a message that needs signing and its current set of signatures if any. */\nexport type SignableMessage = Readonly<{\n content: Uint8Array;\n signatures: SignatureDictionary;\n}>;\n\n/**\n * Creates a signable message from a provided content.\n * If a string is provided, it will be UTF-8 encoded.\n */\nexport function createSignableMessage(\n content: Uint8Array | string,\n signatures: SignatureDictionary = {},\n): SignableMessage {\n return Object.freeze({\n content: typeof content === 'string' ? new TextEncoder().encode(content) : content,\n signatures: Object.freeze({ ...signatures }),\n });\n}\n"]}
@@ -1,7 +1,7 @@
1
- import { SolanaError, SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER, SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING, SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS, SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS } from '@solana/errors';
1
+ import { SolanaError, SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER, SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER, SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING, SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS, SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS } from '@solana/errors';
2
2
  import { isSignerRole } from '@solana/instructions';
3
3
  import { getAddressFromPublicKey, isAddress } from '@solana/addresses';
4
- import { generateKeyPair, createKeyPairFromBytes, signBytes } from '@solana/keys';
4
+ import { generateKeyPair, createKeyPairFromBytes, createKeyPairFromPrivateKeyBytes, signBytes } from '@solana/keys';
5
5
  import { assertTransactionIsFullySigned, compileTransaction, partiallySignTransaction } from '@solana/transactions';
6
6
 
7
7
  // src/deduplicate-signers.ts
@@ -18,6 +18,48 @@ function deduplicateSigners(signers) {
18
18
  });
19
19
  return Object.values(deduplicated);
20
20
  }
21
+ function isTransactionModifyingSigner(value) {
22
+ return "modifyAndSignTransactions" in value && typeof value.modifyAndSignTransactions === "function";
23
+ }
24
+ function assertIsTransactionModifyingSigner(value) {
25
+ if (!isTransactionModifyingSigner(value)) {
26
+ throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER, {
27
+ address: value.address
28
+ });
29
+ }
30
+ }
31
+ function isTransactionPartialSigner(value) {
32
+ return "signTransactions" in value && typeof value.signTransactions === "function";
33
+ }
34
+ function assertIsTransactionPartialSigner(value) {
35
+ if (!isTransactionPartialSigner(value)) {
36
+ throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER, {
37
+ address: value.address
38
+ });
39
+ }
40
+ }
41
+ function isTransactionSendingSigner(value) {
42
+ return "signAndSendTransactions" in value && typeof value.signAndSendTransactions === "function";
43
+ }
44
+ function assertIsTransactionSendingSigner(value) {
45
+ if (!isTransactionSendingSigner(value)) {
46
+ throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER, {
47
+ address: value.address
48
+ });
49
+ }
50
+ }
51
+
52
+ // src/transaction-signer.ts
53
+ function isTransactionSigner(value) {
54
+ return isTransactionPartialSigner(value) || isTransactionModifyingSigner(value) || isTransactionSendingSigner(value);
55
+ }
56
+ function assertIsTransactionSigner(value) {
57
+ if (!isTransactionSigner(value)) {
58
+ throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER, {
59
+ address: value.address
60
+ });
61
+ }
62
+ }
21
63
 
22
64
  // src/account-signer-meta.ts
23
65
  function getSignersFromInstruction(instruction) {
@@ -27,7 +69,7 @@ function getSignersFromInstruction(instruction) {
27
69
  }
28
70
  function getSignersFromTransactionMessage(transaction) {
29
71
  return deduplicateSigners([
30
- ...transaction.feePayerSigner ? [transaction.feePayerSigner] : [],
72
+ ...transaction.feePayer && isTransactionSigner(transaction.feePayer) ? [transaction.feePayer] : [],
31
73
  ...transaction.instructions.flatMap(getSignersFromInstruction)
32
74
  ]);
33
75
  }
@@ -58,19 +100,9 @@ function addSignersToTransactionMessage(signers, transactionMessage) {
58
100
  }
59
101
 
60
102
  // src/fee-payer-signer.ts
61
- function setTransactionMessageFeePayerSigner(feePayerSigner, transactionMessage) {
62
- if ("feePayer" in transactionMessage && feePayerSigner.address === transactionMessage.feePayer) {
63
- if ("feePayerSigner" in transactionMessage)
64
- return transactionMessage;
65
- const out2 = { ...transactionMessage, feePayerSigner };
66
- Object.freeze(out2);
67
- return out2;
68
- }
69
- const out = {
70
- ...transactionMessage,
71
- feePayer: feePayerSigner.address,
72
- feePayerSigner
73
- };
103
+ function setTransactionMessageFeePayerSigner(feePayer, transactionMessage) {
104
+ Object.freeze(feePayer);
105
+ const out = { ...transactionMessage, feePayer };
74
106
  Object.freeze(out);
75
107
  return out;
76
108
  }
@@ -84,16 +116,6 @@ function assertIsMessagePartialSigner(value) {
84
116
  });
85
117
  }
86
118
  }
87
- function isTransactionPartialSigner(value) {
88
- return "signTransactions" in value && typeof value.signTransactions === "function";
89
- }
90
- function assertIsTransactionPartialSigner(value) {
91
- if (!isTransactionPartialSigner(value)) {
92
- throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER, {
93
- address: value.address
94
- });
95
- }
96
- }
97
119
 
98
120
  // src/keypair-signer.ts
99
121
  function isKeyPairSigner(value) {
@@ -131,6 +153,9 @@ async function generateKeyPairSigner() {
131
153
  async function createKeyPairSignerFromBytes(bytes, extractable) {
132
154
  return await createSignerFromKeyPair(await createKeyPairFromBytes(bytes, extractable));
133
155
  }
156
+ async function createKeyPairSignerFromPrivateKeyBytes(bytes, extractable) {
157
+ return await createSignerFromKeyPair(await createKeyPairFromPrivateKeyBytes(bytes, extractable));
158
+ }
134
159
  function isMessageModifyingSigner(value) {
135
160
  return isAddress(value.address) && "modifyAndSignMessages" in value && typeof value.modifyAndSignMessages === "function";
136
161
  }
@@ -161,36 +186,6 @@ function createNoopSigner(address) {
161
186
  };
162
187
  return Object.freeze(out);
163
188
  }
164
- function isTransactionModifyingSigner(value) {
165
- return "modifyAndSignTransactions" in value && typeof value.modifyAndSignTransactions === "function";
166
- }
167
- function assertIsTransactionModifyingSigner(value) {
168
- if (!isTransactionModifyingSigner(value)) {
169
- throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER, {
170
- address: value.address
171
- });
172
- }
173
- }
174
- function isTransactionSendingSigner(value) {
175
- return "signAndSendTransactions" in value && typeof value.signAndSendTransactions === "function";
176
- }
177
- function assertIsTransactionSendingSigner(value) {
178
- if (!isTransactionSendingSigner(value)) {
179
- throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER, {
180
- address: value.address
181
- });
182
- }
183
- }
184
- function isTransactionSigner(value) {
185
- return isTransactionPartialSigner(value) || isTransactionModifyingSigner(value) || isTransactionSendingSigner(value);
186
- }
187
- function assertIsTransactionSigner(value) {
188
- if (!isTransactionSigner(value)) {
189
- throw new SolanaError(SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER, {
190
- address: value.address
191
- });
192
- }
193
- }
194
189
  function isTransactionMessageWithSingleSendingSigner(transaction) {
195
190
  try {
196
191
  assertIsTransactionMessageWithSingleSendingSigner(transaction);
@@ -317,6 +312,6 @@ function createSignableMessage(content, signatures = {}) {
317
312
  });
318
313
  }
319
314
 
320
- export { addSignersToInstruction, addSignersToTransactionMessage, assertIsKeyPairSigner, assertIsMessageModifyingSigner, assertIsMessagePartialSigner, assertIsMessageSigner, assertIsTransactionMessageWithSingleSendingSigner, assertIsTransactionModifyingSigner, assertIsTransactionPartialSigner, assertIsTransactionSendingSigner, assertIsTransactionSigner, createKeyPairSignerFromBytes, createNoopSigner, createSignableMessage, createSignerFromKeyPair, generateKeyPairSigner, getSignersFromInstruction, getSignersFromTransactionMessage, isKeyPairSigner, isMessageModifyingSigner, isMessagePartialSigner, isMessageSigner, isTransactionMessageWithSingleSendingSigner, isTransactionModifyingSigner, isTransactionPartialSigner, isTransactionSendingSigner, isTransactionSigner, partiallySignTransactionMessageWithSigners, setTransactionMessageFeePayerSigner, signAndSendTransactionMessageWithSigners, signTransactionMessageWithSigners };
315
+ export { addSignersToInstruction, addSignersToTransactionMessage, assertIsKeyPairSigner, assertIsMessageModifyingSigner, assertIsMessagePartialSigner, assertIsMessageSigner, assertIsTransactionMessageWithSingleSendingSigner, assertIsTransactionModifyingSigner, assertIsTransactionPartialSigner, assertIsTransactionSendingSigner, assertIsTransactionSigner, createKeyPairSignerFromBytes, createKeyPairSignerFromPrivateKeyBytes, createNoopSigner, createSignableMessage, createSignerFromKeyPair, generateKeyPairSigner, getSignersFromInstruction, getSignersFromTransactionMessage, isKeyPairSigner, isMessageModifyingSigner, isMessagePartialSigner, isMessageSigner, isTransactionMessageWithSingleSendingSigner, isTransactionModifyingSigner, isTransactionPartialSigner, isTransactionSendingSigner, isTransactionSigner, partiallySignTransactionMessageWithSigners, setTransactionMessageFeePayerSigner, signAndSendTransactionMessageWithSigners, signTransactionMessageWithSigners };
321
316
  //# sourceMappingURL=index.browser.mjs.map
322
317
  //# sourceMappingURL=index.browser.mjs.map