@solana/signers 2.0.0-experimental.0eb69ae

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.
Files changed (46) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +515 -0
  3. package/dist/index.browser.cjs +266 -0
  4. package/dist/index.browser.cjs.map +1 -0
  5. package/dist/index.browser.js +240 -0
  6. package/dist/index.browser.js.map +1 -0
  7. package/dist/index.development.js +1363 -0
  8. package/dist/index.development.js.map +1 -0
  9. package/dist/index.native.js +240 -0
  10. package/dist/index.native.js.map +1 -0
  11. package/dist/index.node.cjs +266 -0
  12. package/dist/index.node.cjs.map +1 -0
  13. package/dist/index.node.js +240 -0
  14. package/dist/index.node.js.map +1 -0
  15. package/dist/index.production.min.js +39 -0
  16. package/dist/types/account-signer-meta.d.ts +17 -0
  17. package/dist/types/account-signer-meta.d.ts.map +1 -0
  18. package/dist/types/deduplicate-signers.d.ts +5 -0
  19. package/dist/types/deduplicate-signers.d.ts.map +1 -0
  20. package/dist/types/index.d.ts +14 -0
  21. package/dist/types/index.d.ts.map +1 -0
  22. package/dist/types/keypair-signer.d.ts +22 -0
  23. package/dist/types/keypair-signer.d.ts.map +1 -0
  24. package/dist/types/message-modifying-signer.d.ts +20 -0
  25. package/dist/types/message-modifying-signer.d.ts.map +1 -0
  26. package/dist/types/message-partial-signer.d.ts +20 -0
  27. package/dist/types/message-partial-signer.d.ts.map +1 -0
  28. package/dist/types/message-signer.d.ts +16 -0
  29. package/dist/types/message-signer.d.ts.map +1 -0
  30. package/dist/types/noop-signer.d.ts +8 -0
  31. package/dist/types/noop-signer.d.ts.map +1 -0
  32. package/dist/types/sign-transaction.d.ts +37 -0
  33. package/dist/types/sign-transaction.d.ts.map +1 -0
  34. package/dist/types/signable-message.d.ts +12 -0
  35. package/dist/types/signable-message.d.ts.map +1 -0
  36. package/dist/types/transaction-modifying-signer.d.ts +20 -0
  37. package/dist/types/transaction-modifying-signer.d.ts.map +1 -0
  38. package/dist/types/transaction-partial-signer.d.ts +20 -0
  39. package/dist/types/transaction-partial-signer.d.ts.map +1 -0
  40. package/dist/types/transaction-sending-signer.d.ts +21 -0
  41. package/dist/types/transaction-sending-signer.d.ts.map +1 -0
  42. package/dist/types/transaction-signer.d.ts +17 -0
  43. package/dist/types/transaction-signer.d.ts.map +1 -0
  44. package/dist/types/types.d.ts +7 -0
  45. package/dist/types/types.d.ts.map +1 -0
  46. package/package.json +104 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/deduplicate-signers.ts","../src/account-signer-meta.ts","../src/keypair-signer.ts","../src/message-partial-signer.ts","../src/transaction-partial-signer.ts","../src/message-modifying-signer.ts","../src/message-signer.ts","../src/noop-signer.ts","../src/sign-transaction.ts","../src/transaction-modifying-signer.ts","../src/transaction-sending-signer.ts","../src/transaction-signer.ts","../../text-encoding-impl/src/index.node.ts","../src/signable-message.ts"],"names":["transaction","TextDecoder","TextEncoder"],"mappings":"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","sourcesContent":["import { Address } from '@solana/addresses';\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 }\n });\n return Object.values(deduplicated);\n}\n","import { AccountRole, IAccountLookupMeta, IAccountMeta, IInstruction } from '@solana/instructions';\nimport { BaseTransaction, TransactionVersion } from '@solana/transactions';\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 = TransactionSigner\n> extends IAccountMeta<TAddress> {\n readonly role: AccountRole.READONLY_SIGNER | AccountRole.WRITABLE_SIGNER;\n readonly signer: TSigner;\n}\n\n/** A variation of the IInstruction type that allows IAccountSignerMeta in its accounts array. */\ntype IAccountMetaWithWithSigner<TSigner extends TransactionSigner = TransactionSigner> =\n | IAccountMeta\n | IAccountLookupMeta\n | IAccountSignerMeta<string, TSigner>;\nexport type IInstructionWithSigners<\n TProgramAddress extends string = string,\n TSigner extends TransactionSigner = TransactionSigner,\n TAccounts extends readonly IAccountMetaWithWithSigner<TSigner>[] = readonly IAccountMetaWithWithSigner<TSigner>[]\n> = IInstruction<TProgramAddress, TAccounts>;\n\n/** Extract all signers from an instruction that may contain IAccountSignerMeta accounts. */\nexport function getSignersFromInstruction<TSigner extends TransactionSigner = TransactionSigner>(\n instruction: IInstructionWithSigners<string, 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 that may contain IAccountSignerMeta accounts. */\nexport function getSignersFromTransaction<\n TSigner extends TransactionSigner = TransactionSigner,\n TInstruction extends IInstructionWithSigners<string, TSigner> = IInstructionWithSigners<string, TSigner>\n>(transaction: BaseTransaction<TransactionVersion, TInstruction>): readonly TSigner[] {\n return deduplicateSigners(transaction.instructions.flatMap(getSignersFromInstruction));\n}\n","import { Address, getAddressFromPublicKey } from '@solana/addresses';\nimport { 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 address: Address<TAddress>;\n [key: string]: unknown;\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 address: Address<TAddress>;\n [key: string]: unknown;\n}): asserts value is KeyPairSigner<TAddress> {\n if (!isKeyPairSigner(value)) {\n // TODO: Coded error.\n throw new Error('The provided value does not implement the KeyPairSigner interface');\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 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 createSignerFromKeyPair(await generateKeyPair());\n}\n","import { Address } from '@solana/addresses';\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 address: Address<TAddress>;\n [key: string]: unknown;\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 address: Address<TAddress>;\n [key: string]: unknown;\n}): asserts value is MessagePartialSigner<TAddress> {\n if (!isMessagePartialSigner(value)) {\n // TODO: Coded error.\n throw new Error('The provided value does not implement the MessagePartialSigner interface');\n }\n}\n","import { Address } from '@solana/addresses';\nimport { CompilableTransaction } from '@solana/transactions';\n\nimport { BaseSignerConfig, SignatureDictionary } from './types';\n\nexport type TransactionPartialSignerConfig = BaseSignerConfig;\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 CompilableTransaction[],\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 address: Address<TAddress>;\n [key: string]: unknown;\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 address: Address<TAddress>;\n [key: string]: unknown;\n}): asserts value is TransactionPartialSigner<TAddress> {\n if (!isTransactionPartialSigner(value)) {\n // TODO: Coded error.\n throw new Error('The provided value does not implement the TransactionPartialSigner interface');\n }\n}\n","import { Address, isAddress } from '@solana/addresses';\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 address: Address<TAddress>;\n [key: string]: unknown;\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 address: Address<TAddress>;\n [key: string]: unknown;\n}): asserts value is MessageModifyingSigner<TAddress> {\n if (!isMessageModifyingSigner(value)) {\n // TODO: Coded error.\n throw new Error('The provided value does not implement the MessageModifyingSigner interface');\n }\n}\n","import { Address } from '@solana/addresses';\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 | MessagePartialSigner<TAddress>\n | MessageModifyingSigner<TAddress>;\n\n/** Checks whether the provided value implements the {@link MessageSigner} interface. */\nexport function isMessageSigner<TAddress extends string>(value: {\n address: Address<TAddress>;\n [key: string]: unknown;\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 address: Address<TAddress>;\n [key: string]: unknown;\n}): asserts value is MessageSigner<TAddress> {\n if (!isMessageSigner(value)) {\n // TODO: Coded error.\n throw new Error('The provided value does not implement any of the MessageSigner interfaces');\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: async messages => messages.map(() => Object.freeze({})),\n signTransactions: async transactions => transactions.map(() => Object.freeze({})),\n };\n\n return Object.freeze(out);\n}\n","import { SignatureBytes } from '@solana/keys';\nimport {\n assertTransactionIsFullySigned,\n CompilableTransaction,\n IFullySignedTransaction,\n ITransactionWithSignatures,\n TransactionVersion,\n} from '@solana/transactions';\n\nimport { getSignersFromTransaction, IInstructionWithSigners } from './account-signer-meta';\nimport { deduplicateSigners } from './deduplicate-signers';\nimport { isTransactionModifyingSigner, TransactionModifyingSigner } from './transaction-modifying-signer';\nimport { isTransactionPartialSigner, TransactionPartialSigner } from './transaction-partial-signer';\nimport { isTransactionSendingSigner, TransactionSendingSigner } from './transaction-sending-signer';\nimport { isTransactionSigner, TransactionSigner } from './transaction-signer';\n\ntype CompilableTransactionWithSigners = CompilableTransaction<\n TransactionVersion,\n IInstructionWithSigners<string, TransactionSigner>\n> &\n Partial<ITransactionWithSignatures>;\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 partiallySignTransactionWithSigners<\n TTransaction extends CompilableTransactionWithSigners = CompilableTransactionWithSigners\n>(\n transaction: TTransaction,\n config: {\n abortSignal?: AbortSignal;\n signers?: readonly TransactionSigner[];\n } = {}\n): Promise<TTransaction & ITransactionWithSignatures> {\n const signers = config.signers ?? [];\n const { partialSigners, modifyingSigners } = categorizeTransactionSigners(\n deduplicateSigners([...getSignersFromTransaction(transaction).filter(isTransactionSigner), ...signers]),\n { identifySendingSigner: false }\n );\n\n return signModifyingAndPartialTransactionSigners(transaction, modifyingSigners, partialSigners, config.abortSignal);\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 signTransactionWithSigners<\n TTransaction extends CompilableTransactionWithSigners = CompilableTransactionWithSigners\n>(\n transaction: TTransaction,\n config: {\n abortSignal?: AbortSignal;\n signers?: readonly TransactionSigner[];\n } = {}\n): Promise<TTransaction & IFullySignedTransaction> {\n const signedTransaction = await partiallySignTransactionWithSigners(transaction, 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 signAndSendTransactionWithSigners<\n TTransaction extends CompilableTransactionWithSigners = CompilableTransactionWithSigners\n>(\n transaction: TTransaction,\n config: {\n abortSignal?: AbortSignal;\n fallbackSender?: (transaction: TTransaction & IFullySignedTransaction) => Promise<SignatureBytes>;\n signers?: readonly TransactionSigner[];\n } = {}\n): Promise<SignatureBytes> {\n const signers = config.signers ?? [];\n const abortSignal = config.abortSignal;\n const { partialSigners, modifyingSigners, sendingSigner } = categorizeTransactionSigners(\n deduplicateSigners([...getSignersFromTransaction(transaction).filter(isTransactionSigner), ...signers])\n );\n\n abortSignal?.throwIfAborted();\n const signedTransaction = await signModifyingAndPartialTransactionSigners(\n transaction,\n modifyingSigners,\n partialSigners,\n abortSignal\n );\n\n if (sendingSigner) {\n abortSignal?.throwIfAborted();\n const [signature] = await sendingSigner.signAndSendTransactions([signedTransaction], { abortSignal });\n return signature;\n }\n\n if (config.fallbackSender) {\n assertTransactionIsFullySigned(signedTransaction);\n return config.fallbackSender(signedTransaction);\n }\n\n // TODO: Coded error.\n throw new Error('No TransactionSendingSigner was identified and no fallback sender was provided.');\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 TTransaction extends CompilableTransactionWithSigners = CompilableTransactionWithSigners\n>(\n transaction: TTransaction,\n modifyingSigners: readonly TransactionModifyingSigner[] = [],\n partialSigners: readonly TransactionPartialSigner[] = [],\n abortSignal?: AbortSignal\n): Promise<TTransaction & ITransactionWithSignatures> {\n // Handle modifying signers sequentially.\n const modifiedTransaction = await modifyingSigners.reduce(async (transaction, modifyingSigner) => {\n abortSignal?.throwIfAborted();\n const [tx] = await modifyingSigner.modifyAndSignTransactions([await transaction], { abortSignal });\n return Object.freeze(tx);\n }, Promise.resolve(transaction) as Promise<TTransaction>);\n\n // Handle partial signers in parallel.\n abortSignal?.throwIfAborted();\n const signatureDictionaries = await Promise.all(\n partialSigners.map(async partialSigner => {\n const [signatures] = await partialSigner.signTransactions([modifiedTransaction], { abortSignal });\n return signatures;\n })\n );\n const signedTransaction: TTransaction & ITransactionWithSignatures = {\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","import { Address } from '@solana/addresses';\nimport { CompilableTransaction } from '@solana/transactions';\n\nimport { BaseSignerConfig } from './types';\n\nexport type TransactionModifyingSignerConfig = BaseSignerConfig;\n\n/** Defines a signer capable of signing transactions. */\nexport type TransactionModifyingSigner<TAddress extends string = string> = Readonly<{\n address: Address<TAddress>;\n modifyAndSignTransactions<TTransaction extends CompilableTransaction>(\n transactions: readonly TTransaction[],\n config?: TransactionModifyingSignerConfig\n ): Promise<readonly TTransaction[]>;\n}>;\n\n/** Checks whether the provided value implements the {@link TransactionModifyingSigner} interface. */\nexport function isTransactionModifyingSigner<TAddress extends string>(value: {\n address: Address<TAddress>;\n [key: string]: unknown;\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 address: Address<TAddress>;\n [key: string]: unknown;\n}): asserts value is TransactionModifyingSigner<TAddress> {\n if (!isTransactionModifyingSigner(value)) {\n // TODO: Coded error.\n throw new Error('The provided value does not implement the TransactionModifyingSigner interface');\n }\n}\n","import { Address } from '@solana/addresses';\nimport { SignatureBytes } from '@solana/keys';\nimport { CompilableTransaction } from '@solana/transactions';\n\nimport { BaseSignerConfig } from './types';\n\nexport type TransactionSendingSignerConfig = BaseSignerConfig;\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 CompilableTransaction[],\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 address: Address<TAddress>;\n [key: string]: unknown;\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 address: Address<TAddress>;\n [key: string]: unknown;\n}): asserts value is TransactionSendingSigner<TAddress> {\n if (!isTransactionSendingSigner(value)) {\n // TODO: Coded error.\n throw new Error('The provided value does not implement the TransactionSendingSigner interface');\n }\n}\n","import { Address } from '@solana/addresses';\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 | TransactionPartialSigner<TAddress>\n | TransactionModifyingSigner<TAddress>\n | TransactionSendingSigner<TAddress>;\n\n/** Checks whether the provided value implements the {@link TransactionSigner} interface. */\nexport function isTransactionSigner<TAddress extends string>(value: {\n address: Address<TAddress>;\n [key: string]: unknown;\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 address: Address<TAddress>;\n [key: string]: unknown;\n}): asserts value is TransactionSigner<TAddress> {\n if (!isTransactionSigner(value)) {\n // TODO: Coded error.\n throw new Error('The provided value does not implement any of the TransactionSigner interfaces');\n }\n}\n","export const TextDecoder = globalThis.TextDecoder;\nexport const TextEncoder = globalThis.TextEncoder;\n","import { TextEncoder } from '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: string | Uint8Array,\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"]}
@@ -0,0 +1,240 @@
1
+ import { getAddressFromPublicKey, isAddress } from '@solana/addresses';
2
+ import { generateKeyPair, signBytes } from '@solana/keys';
3
+ import { assertTransactionIsFullySigned, partiallySignTransaction } from '@solana/transactions';
4
+
5
+ // src/deduplicate-signers.ts
6
+ function deduplicateSigners(signers) {
7
+ const deduplicated = {};
8
+ signers.forEach((signer) => {
9
+ if (!deduplicated[signer.address]) {
10
+ deduplicated[signer.address] = signer;
11
+ }
12
+ });
13
+ return Object.values(deduplicated);
14
+ }
15
+
16
+ // src/account-signer-meta.ts
17
+ function getSignersFromInstruction(instruction) {
18
+ return deduplicateSigners(
19
+ (instruction.accounts ?? []).flatMap((account) => "signer" in account ? account.signer : [])
20
+ );
21
+ }
22
+ function getSignersFromTransaction(transaction) {
23
+ return deduplicateSigners(transaction.instructions.flatMap(getSignersFromInstruction));
24
+ }
25
+
26
+ // src/message-partial-signer.ts
27
+ function isMessagePartialSigner(value) {
28
+ return "signMessages" in value && typeof value.signMessages === "function";
29
+ }
30
+ function assertIsMessagePartialSigner(value) {
31
+ if (!isMessagePartialSigner(value)) {
32
+ throw new Error("The provided value does not implement the MessagePartialSigner interface");
33
+ }
34
+ }
35
+
36
+ // src/transaction-partial-signer.ts
37
+ function isTransactionPartialSigner(value) {
38
+ return "signTransactions" in value && typeof value.signTransactions === "function";
39
+ }
40
+ function assertIsTransactionPartialSigner(value) {
41
+ if (!isTransactionPartialSigner(value)) {
42
+ throw new Error("The provided value does not implement the TransactionPartialSigner interface");
43
+ }
44
+ }
45
+
46
+ // src/keypair-signer.ts
47
+ function isKeyPairSigner(value) {
48
+ return "keyPair" in value && typeof value.keyPair === "object" && isMessagePartialSigner(value) && isTransactionPartialSigner(value);
49
+ }
50
+ function assertIsKeyPairSigner(value) {
51
+ if (!isKeyPairSigner(value)) {
52
+ throw new Error("The provided value does not implement the KeyPairSigner interface");
53
+ }
54
+ }
55
+ async function createSignerFromKeyPair(keyPair) {
56
+ const address = await getAddressFromPublicKey(keyPair.publicKey);
57
+ const out = {
58
+ address,
59
+ keyPair,
60
+ signMessages: (messages) => Promise.all(
61
+ messages.map(
62
+ async (message) => Object.freeze({ [address]: await signBytes(keyPair.privateKey, message.content) })
63
+ )
64
+ ),
65
+ signTransactions: (transactions) => Promise.all(
66
+ transactions.map(async (transaction) => {
67
+ const signedTransaction = await partiallySignTransaction([keyPair], transaction);
68
+ return Object.freeze({ [address]: signedTransaction.signatures[address] });
69
+ })
70
+ )
71
+ };
72
+ return Object.freeze(out);
73
+ }
74
+ async function generateKeyPairSigner() {
75
+ return createSignerFromKeyPair(await generateKeyPair());
76
+ }
77
+ function isMessageModifyingSigner(value) {
78
+ return isAddress(value.address) && "modifyAndSignMessages" in value && typeof value.modifyAndSignMessages === "function";
79
+ }
80
+ function assertIsMessageModifyingSigner(value) {
81
+ if (!isMessageModifyingSigner(value)) {
82
+ throw new Error("The provided value does not implement the MessageModifyingSigner interface");
83
+ }
84
+ }
85
+
86
+ // src/message-signer.ts
87
+ function isMessageSigner(value) {
88
+ return isMessagePartialSigner(value) || isMessageModifyingSigner(value);
89
+ }
90
+ function assertIsMessageSigner(value) {
91
+ if (!isMessageSigner(value)) {
92
+ throw new Error("The provided value does not implement any of the MessageSigner interfaces");
93
+ }
94
+ }
95
+
96
+ // src/noop-signer.ts
97
+ function createNoopSigner(address) {
98
+ const out = {
99
+ address,
100
+ signMessages: async (messages) => messages.map(() => Object.freeze({})),
101
+ signTransactions: async (transactions) => transactions.map(() => Object.freeze({}))
102
+ };
103
+ return Object.freeze(out);
104
+ }
105
+
106
+ // src/transaction-modifying-signer.ts
107
+ function isTransactionModifyingSigner(value) {
108
+ return "modifyAndSignTransactions" in value && typeof value.modifyAndSignTransactions === "function";
109
+ }
110
+ function assertIsTransactionModifyingSigner(value) {
111
+ if (!isTransactionModifyingSigner(value)) {
112
+ throw new Error("The provided value does not implement the TransactionModifyingSigner interface");
113
+ }
114
+ }
115
+
116
+ // src/transaction-sending-signer.ts
117
+ function isTransactionSendingSigner(value) {
118
+ return "signAndSendTransactions" in value && typeof value.signAndSendTransactions === "function";
119
+ }
120
+ function assertIsTransactionSendingSigner(value) {
121
+ if (!isTransactionSendingSigner(value)) {
122
+ throw new Error("The provided value does not implement the TransactionSendingSigner interface");
123
+ }
124
+ }
125
+
126
+ // src/transaction-signer.ts
127
+ function isTransactionSigner(value) {
128
+ return isTransactionPartialSigner(value) || isTransactionModifyingSigner(value) || isTransactionSendingSigner(value);
129
+ }
130
+ function assertIsTransactionSigner(value) {
131
+ if (!isTransactionSigner(value)) {
132
+ throw new Error("The provided value does not implement any of the TransactionSigner interfaces");
133
+ }
134
+ }
135
+
136
+ // src/sign-transaction.ts
137
+ async function partiallySignTransactionWithSigners(transaction, config = {}) {
138
+ const signers = config.signers ?? [];
139
+ const { partialSigners, modifyingSigners } = categorizeTransactionSigners(
140
+ deduplicateSigners([...getSignersFromTransaction(transaction).filter(isTransactionSigner), ...signers]),
141
+ { identifySendingSigner: false }
142
+ );
143
+ return signModifyingAndPartialTransactionSigners(transaction, modifyingSigners, partialSigners, config.abortSignal);
144
+ }
145
+ async function signTransactionWithSigners(transaction, config = {}) {
146
+ const signedTransaction = await partiallySignTransactionWithSigners(transaction, config);
147
+ assertTransactionIsFullySigned(signedTransaction);
148
+ return signedTransaction;
149
+ }
150
+ async function signAndSendTransactionWithSigners(transaction, config = {}) {
151
+ const signers = config.signers ?? [];
152
+ const abortSignal = config.abortSignal;
153
+ const { partialSigners, modifyingSigners, sendingSigner } = categorizeTransactionSigners(
154
+ deduplicateSigners([...getSignersFromTransaction(transaction).filter(isTransactionSigner), ...signers])
155
+ );
156
+ abortSignal?.throwIfAborted();
157
+ const signedTransaction = await signModifyingAndPartialTransactionSigners(
158
+ transaction,
159
+ modifyingSigners,
160
+ partialSigners,
161
+ abortSignal
162
+ );
163
+ if (sendingSigner) {
164
+ abortSignal?.throwIfAborted();
165
+ const [signature] = await sendingSigner.signAndSendTransactions([signedTransaction], { abortSignal });
166
+ return signature;
167
+ }
168
+ if (config.fallbackSender) {
169
+ assertTransactionIsFullySigned(signedTransaction);
170
+ return config.fallbackSender(signedTransaction);
171
+ }
172
+ throw new Error("No TransactionSendingSigner was identified and no fallback sender was provided.");
173
+ }
174
+ function categorizeTransactionSigners(signers, config = {}) {
175
+ const identifySendingSigner = config.identifySendingSigner ?? true;
176
+ const sendingSigner = identifySendingSigner ? identifyTransactionSendingSigner(signers) : null;
177
+ const otherSigners = signers.filter(
178
+ (signer) => signer !== sendingSigner && (isTransactionModifyingSigner(signer) || isTransactionPartialSigner(signer))
179
+ );
180
+ const modifyingSigners = identifyTransactionModifyingSigners(otherSigners);
181
+ const partialSigners = otherSigners.filter(isTransactionPartialSigner).filter((signer) => !modifyingSigners.includes(signer));
182
+ return Object.freeze({ modifyingSigners, partialSigners, sendingSigner });
183
+ }
184
+ function identifyTransactionSendingSigner(signers) {
185
+ const sendingSigners = signers.filter(isTransactionSendingSigner);
186
+ if (sendingSigners.length === 0)
187
+ return null;
188
+ const sendingOnlySigners = sendingSigners.filter(
189
+ (signer) => !isTransactionModifyingSigner(signer) && !isTransactionPartialSigner(signer)
190
+ );
191
+ if (sendingOnlySigners.length > 0) {
192
+ return sendingOnlySigners[0];
193
+ }
194
+ return sendingSigners[0];
195
+ }
196
+ function identifyTransactionModifyingSigners(signers) {
197
+ const modifyingSigners = signers.filter(isTransactionModifyingSigner);
198
+ if (modifyingSigners.length === 0)
199
+ return [];
200
+ const nonPartialSigners = modifyingSigners.filter((signer) => !isTransactionPartialSigner(signer));
201
+ if (nonPartialSigners.length > 0)
202
+ return nonPartialSigners;
203
+ return [modifyingSigners[0]];
204
+ }
205
+ async function signModifyingAndPartialTransactionSigners(transaction, modifyingSigners = [], partialSigners = [], abortSignal) {
206
+ const modifiedTransaction = await modifyingSigners.reduce(async (transaction2, modifyingSigner) => {
207
+ abortSignal?.throwIfAborted();
208
+ const [tx] = await modifyingSigner.modifyAndSignTransactions([await transaction2], { abortSignal });
209
+ return Object.freeze(tx);
210
+ }, Promise.resolve(transaction));
211
+ abortSignal?.throwIfAborted();
212
+ const signatureDictionaries = await Promise.all(
213
+ partialSigners.map(async (partialSigner) => {
214
+ const [signatures] = await partialSigner.signTransactions([modifiedTransaction], { abortSignal });
215
+ return signatures;
216
+ })
217
+ );
218
+ const signedTransaction = {
219
+ ...modifiedTransaction,
220
+ signatures: Object.freeze(
221
+ signatureDictionaries.reduce((signatures, signatureDictionary) => {
222
+ return { ...signatures, ...signatureDictionary };
223
+ }, modifiedTransaction.signatures ?? {})
224
+ )
225
+ };
226
+ return Object.freeze(signedTransaction);
227
+ }
228
+ var o = globalThis.TextEncoder;
229
+
230
+ // src/signable-message.ts
231
+ function createSignableMessage(content, signatures = {}) {
232
+ return Object.freeze({
233
+ content: typeof content === "string" ? new o().encode(content) : content,
234
+ signatures: Object.freeze({ ...signatures })
235
+ });
236
+ }
237
+
238
+ export { assertIsKeyPairSigner, assertIsMessageModifyingSigner, assertIsMessagePartialSigner, assertIsMessageSigner, assertIsTransactionModifyingSigner, assertIsTransactionPartialSigner, assertIsTransactionSendingSigner, assertIsTransactionSigner, createNoopSigner, createSignableMessage, createSignerFromKeyPair, generateKeyPairSigner, getSignersFromInstruction, getSignersFromTransaction, isKeyPairSigner, isMessageModifyingSigner, isMessagePartialSigner, isMessageSigner, isTransactionModifyingSigner, isTransactionPartialSigner, isTransactionSendingSigner, isTransactionSigner, partiallySignTransactionWithSigners, signAndSendTransactionWithSigners, signTransactionWithSigners };
239
+ //# sourceMappingURL=out.js.map
240
+ //# sourceMappingURL=index.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/deduplicate-signers.ts","../src/account-signer-meta.ts","../src/keypair-signer.ts","../src/message-partial-signer.ts","../src/transaction-partial-signer.ts","../src/message-modifying-signer.ts","../src/message-signer.ts","../src/noop-signer.ts","../src/sign-transaction.ts","../src/transaction-modifying-signer.ts","../src/transaction-sending-signer.ts","../src/transaction-signer.ts","../../text-encoding-impl/src/index.node.ts","../src/signable-message.ts"],"names":["transaction","TextDecoder","TextEncoder"],"mappings":"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","sourcesContent":["import { Address } from '@solana/addresses';\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 }\n });\n return Object.values(deduplicated);\n}\n","import { AccountRole, IAccountLookupMeta, IAccountMeta, IInstruction } from '@solana/instructions';\nimport { BaseTransaction, TransactionVersion } from '@solana/transactions';\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 = TransactionSigner\n> extends IAccountMeta<TAddress> {\n readonly role: AccountRole.READONLY_SIGNER | AccountRole.WRITABLE_SIGNER;\n readonly signer: TSigner;\n}\n\n/** A variation of the IInstruction type that allows IAccountSignerMeta in its accounts array. */\ntype IAccountMetaWithWithSigner<TSigner extends TransactionSigner = TransactionSigner> =\n | IAccountMeta\n | IAccountLookupMeta\n | IAccountSignerMeta<string, TSigner>;\nexport type IInstructionWithSigners<\n TProgramAddress extends string = string,\n TSigner extends TransactionSigner = TransactionSigner,\n TAccounts extends readonly IAccountMetaWithWithSigner<TSigner>[] = readonly IAccountMetaWithWithSigner<TSigner>[]\n> = IInstruction<TProgramAddress, TAccounts>;\n\n/** Extract all signers from an instruction that may contain IAccountSignerMeta accounts. */\nexport function getSignersFromInstruction<TSigner extends TransactionSigner = TransactionSigner>(\n instruction: IInstructionWithSigners<string, 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 that may contain IAccountSignerMeta accounts. */\nexport function getSignersFromTransaction<\n TSigner extends TransactionSigner = TransactionSigner,\n TInstruction extends IInstructionWithSigners<string, TSigner> = IInstructionWithSigners<string, TSigner>\n>(transaction: BaseTransaction<TransactionVersion, TInstruction>): readonly TSigner[] {\n return deduplicateSigners(transaction.instructions.flatMap(getSignersFromInstruction));\n}\n","import { Address, getAddressFromPublicKey } from '@solana/addresses';\nimport { 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 address: Address<TAddress>;\n [key: string]: unknown;\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 address: Address<TAddress>;\n [key: string]: unknown;\n}): asserts value is KeyPairSigner<TAddress> {\n if (!isKeyPairSigner(value)) {\n // TODO: Coded error.\n throw new Error('The provided value does not implement the KeyPairSigner interface');\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 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 createSignerFromKeyPair(await generateKeyPair());\n}\n","import { Address } from '@solana/addresses';\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 address: Address<TAddress>;\n [key: string]: unknown;\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 address: Address<TAddress>;\n [key: string]: unknown;\n}): asserts value is MessagePartialSigner<TAddress> {\n if (!isMessagePartialSigner(value)) {\n // TODO: Coded error.\n throw new Error('The provided value does not implement the MessagePartialSigner interface');\n }\n}\n","import { Address } from '@solana/addresses';\nimport { CompilableTransaction } from '@solana/transactions';\n\nimport { BaseSignerConfig, SignatureDictionary } from './types';\n\nexport type TransactionPartialSignerConfig = BaseSignerConfig;\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 CompilableTransaction[],\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 address: Address<TAddress>;\n [key: string]: unknown;\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 address: Address<TAddress>;\n [key: string]: unknown;\n}): asserts value is TransactionPartialSigner<TAddress> {\n if (!isTransactionPartialSigner(value)) {\n // TODO: Coded error.\n throw new Error('The provided value does not implement the TransactionPartialSigner interface');\n }\n}\n","import { Address, isAddress } from '@solana/addresses';\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 address: Address<TAddress>;\n [key: string]: unknown;\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 address: Address<TAddress>;\n [key: string]: unknown;\n}): asserts value is MessageModifyingSigner<TAddress> {\n if (!isMessageModifyingSigner(value)) {\n // TODO: Coded error.\n throw new Error('The provided value does not implement the MessageModifyingSigner interface');\n }\n}\n","import { Address } from '@solana/addresses';\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 | MessagePartialSigner<TAddress>\n | MessageModifyingSigner<TAddress>;\n\n/** Checks whether the provided value implements the {@link MessageSigner} interface. */\nexport function isMessageSigner<TAddress extends string>(value: {\n address: Address<TAddress>;\n [key: string]: unknown;\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 address: Address<TAddress>;\n [key: string]: unknown;\n}): asserts value is MessageSigner<TAddress> {\n if (!isMessageSigner(value)) {\n // TODO: Coded error.\n throw new Error('The provided value does not implement any of the MessageSigner interfaces');\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: async messages => messages.map(() => Object.freeze({})),\n signTransactions: async transactions => transactions.map(() => Object.freeze({})),\n };\n\n return Object.freeze(out);\n}\n","import { SignatureBytes } from '@solana/keys';\nimport {\n assertTransactionIsFullySigned,\n CompilableTransaction,\n IFullySignedTransaction,\n ITransactionWithSignatures,\n TransactionVersion,\n} from '@solana/transactions';\n\nimport { getSignersFromTransaction, IInstructionWithSigners } from './account-signer-meta';\nimport { deduplicateSigners } from './deduplicate-signers';\nimport { isTransactionModifyingSigner, TransactionModifyingSigner } from './transaction-modifying-signer';\nimport { isTransactionPartialSigner, TransactionPartialSigner } from './transaction-partial-signer';\nimport { isTransactionSendingSigner, TransactionSendingSigner } from './transaction-sending-signer';\nimport { isTransactionSigner, TransactionSigner } from './transaction-signer';\n\ntype CompilableTransactionWithSigners = CompilableTransaction<\n TransactionVersion,\n IInstructionWithSigners<string, TransactionSigner>\n> &\n Partial<ITransactionWithSignatures>;\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 partiallySignTransactionWithSigners<\n TTransaction extends CompilableTransactionWithSigners = CompilableTransactionWithSigners\n>(\n transaction: TTransaction,\n config: {\n abortSignal?: AbortSignal;\n signers?: readonly TransactionSigner[];\n } = {}\n): Promise<TTransaction & ITransactionWithSignatures> {\n const signers = config.signers ?? [];\n const { partialSigners, modifyingSigners } = categorizeTransactionSigners(\n deduplicateSigners([...getSignersFromTransaction(transaction).filter(isTransactionSigner), ...signers]),\n { identifySendingSigner: false }\n );\n\n return signModifyingAndPartialTransactionSigners(transaction, modifyingSigners, partialSigners, config.abortSignal);\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 signTransactionWithSigners<\n TTransaction extends CompilableTransactionWithSigners = CompilableTransactionWithSigners\n>(\n transaction: TTransaction,\n config: {\n abortSignal?: AbortSignal;\n signers?: readonly TransactionSigner[];\n } = {}\n): Promise<TTransaction & IFullySignedTransaction> {\n const signedTransaction = await partiallySignTransactionWithSigners(transaction, 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 signAndSendTransactionWithSigners<\n TTransaction extends CompilableTransactionWithSigners = CompilableTransactionWithSigners\n>(\n transaction: TTransaction,\n config: {\n abortSignal?: AbortSignal;\n fallbackSender?: (transaction: TTransaction & IFullySignedTransaction) => Promise<SignatureBytes>;\n signers?: readonly TransactionSigner[];\n } = {}\n): Promise<SignatureBytes> {\n const signers = config.signers ?? [];\n const abortSignal = config.abortSignal;\n const { partialSigners, modifyingSigners, sendingSigner } = categorizeTransactionSigners(\n deduplicateSigners([...getSignersFromTransaction(transaction).filter(isTransactionSigner), ...signers])\n );\n\n abortSignal?.throwIfAborted();\n const signedTransaction = await signModifyingAndPartialTransactionSigners(\n transaction,\n modifyingSigners,\n partialSigners,\n abortSignal\n );\n\n if (sendingSigner) {\n abortSignal?.throwIfAborted();\n const [signature] = await sendingSigner.signAndSendTransactions([signedTransaction], { abortSignal });\n return signature;\n }\n\n if (config.fallbackSender) {\n assertTransactionIsFullySigned(signedTransaction);\n return config.fallbackSender(signedTransaction);\n }\n\n // TODO: Coded error.\n throw new Error('No TransactionSendingSigner was identified and no fallback sender was provided.');\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 TTransaction extends CompilableTransactionWithSigners = CompilableTransactionWithSigners\n>(\n transaction: TTransaction,\n modifyingSigners: readonly TransactionModifyingSigner[] = [],\n partialSigners: readonly TransactionPartialSigner[] = [],\n abortSignal?: AbortSignal\n): Promise<TTransaction & ITransactionWithSignatures> {\n // Handle modifying signers sequentially.\n const modifiedTransaction = await modifyingSigners.reduce(async (transaction, modifyingSigner) => {\n abortSignal?.throwIfAborted();\n const [tx] = await modifyingSigner.modifyAndSignTransactions([await transaction], { abortSignal });\n return Object.freeze(tx);\n }, Promise.resolve(transaction) as Promise<TTransaction>);\n\n // Handle partial signers in parallel.\n abortSignal?.throwIfAborted();\n const signatureDictionaries = await Promise.all(\n partialSigners.map(async partialSigner => {\n const [signatures] = await partialSigner.signTransactions([modifiedTransaction], { abortSignal });\n return signatures;\n })\n );\n const signedTransaction: TTransaction & ITransactionWithSignatures = {\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","import { Address } from '@solana/addresses';\nimport { CompilableTransaction } from '@solana/transactions';\n\nimport { BaseSignerConfig } from './types';\n\nexport type TransactionModifyingSignerConfig = BaseSignerConfig;\n\n/** Defines a signer capable of signing transactions. */\nexport type TransactionModifyingSigner<TAddress extends string = string> = Readonly<{\n address: Address<TAddress>;\n modifyAndSignTransactions<TTransaction extends CompilableTransaction>(\n transactions: readonly TTransaction[],\n config?: TransactionModifyingSignerConfig\n ): Promise<readonly TTransaction[]>;\n}>;\n\n/** Checks whether the provided value implements the {@link TransactionModifyingSigner} interface. */\nexport function isTransactionModifyingSigner<TAddress extends string>(value: {\n address: Address<TAddress>;\n [key: string]: unknown;\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 address: Address<TAddress>;\n [key: string]: unknown;\n}): asserts value is TransactionModifyingSigner<TAddress> {\n if (!isTransactionModifyingSigner(value)) {\n // TODO: Coded error.\n throw new Error('The provided value does not implement the TransactionModifyingSigner interface');\n }\n}\n","import { Address } from '@solana/addresses';\nimport { SignatureBytes } from '@solana/keys';\nimport { CompilableTransaction } from '@solana/transactions';\n\nimport { BaseSignerConfig } from './types';\n\nexport type TransactionSendingSignerConfig = BaseSignerConfig;\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 CompilableTransaction[],\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 address: Address<TAddress>;\n [key: string]: unknown;\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 address: Address<TAddress>;\n [key: string]: unknown;\n}): asserts value is TransactionSendingSigner<TAddress> {\n if (!isTransactionSendingSigner(value)) {\n // TODO: Coded error.\n throw new Error('The provided value does not implement the TransactionSendingSigner interface');\n }\n}\n","import { Address } from '@solana/addresses';\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 | TransactionPartialSigner<TAddress>\n | TransactionModifyingSigner<TAddress>\n | TransactionSendingSigner<TAddress>;\n\n/** Checks whether the provided value implements the {@link TransactionSigner} interface. */\nexport function isTransactionSigner<TAddress extends string>(value: {\n address: Address<TAddress>;\n [key: string]: unknown;\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 address: Address<TAddress>;\n [key: string]: unknown;\n}): asserts value is TransactionSigner<TAddress> {\n if (!isTransactionSigner(value)) {\n // TODO: Coded error.\n throw new Error('The provided value does not implement any of the TransactionSigner interfaces');\n }\n}\n","export const TextDecoder = globalThis.TextDecoder;\nexport const TextEncoder = globalThis.TextEncoder;\n","import { TextEncoder } from '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: string | Uint8Array,\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"]}
@@ -0,0 +1,39 @@
1
+ this.globalThis = this.globalThis || {};
2
+ this.globalThis.solanaWeb3 = (function (exports) {
3
+ 'use strict';
4
+
5
+ function A(e){let n={};return e.forEach(r=>{n[r.address]||(n[r.address]=r);}),Object.values(n)}function De(e){var n;return A(((n=e.accounts)!=null?n:[]).flatMap(r=>"signer"in r?r.signer:[]))}function _(e){return A(e.instructions.flatMap(De))}function I(e,n,r=0){if(n.length-r<=0)throw new Error(`Codec [${e}] cannot decode empty byte arrays.`)}function b(e,n,r,t=0){let i=r.length-t;if(i<n)throw new Error(`Codec [${e}] expected ${n} bytes, got ${i}.`)}var w=e=>{let n=e.filter(o=>o.length);if(n.length===0)return e.length?e[0]:new Uint8Array;if(n.length===1)return n[0];let r=n.reduce((o,s)=>o+s.length,0),t=new Uint8Array(r),i=0;return n.forEach(o=>{t.set(o,i),i+=o.length;}),t},Me=(e,n)=>{if(e.length>=n)return e;let r=new Uint8Array(n).fill(0);return r.set(e),r},W=(e,n)=>Me(e.length<=n?e:e.slice(0,n),n);function se(e,n,r){return {description:r!=null?r:`fixed(${n}, ${e.description})`,fixedSize:n,maxSize:n}}function k(e,n,r){return {...se(e,n,r),encode:t=>W(e.encode(t),n)}}function j(e,n,r){return {...se(e,n,r),decode:(t,i=0)=>{b("fixCodec",n,t,i),(i>0||t.length>n)&&(t=t.slice(i,i+n)),e.fixedSize!==null&&(t=W(t,e.fixedSize));let[o]=e.decode(t,0);return [o,i+n]}}}function v(e,n){return {description:e.description,encode:r=>e.encode(n(r)),fixedSize:e.fixedSize,maxSize:e.maxSize}}function ae(e,n,r,t){if(t<n||t>r)throw new Error(`Codec [${e}] expected number to be in the range [${n}, ${r}], got ${t}.`)}function ce(e){var t;let n,r=e.name;return e.size>1&&(n=!("endian"in e.config)||e.config.endian===0,r+=n?"(le)":"(be)"),{description:(t=e.config.description)!=null?t:r,fixedSize:e.size,littleEndian:n,maxSize:e.size}}function de(e){let n=ce(e);return {description:n.description,encode(r){e.range&&ae(e.name,e.range[0],e.range[1],r);let t=new ArrayBuffer(e.size);return e.set(new DataView(t),r,n.littleEndian),new Uint8Array(t)},fixedSize:n.fixedSize,maxSize:n.maxSize}}function ke(e){let n=ce(e);return {decode(r,t=0){I(n.description,r,t),b(n.description,e.size,r,t);let i=new DataView(Pe(r,t,e.size));return [e.get(i,n.littleEndian),t+e.size]},description:n.description,fixedSize:n.fixedSize,maxSize:n.maxSize}}function Pe(e,n,r){let t=e.byteOffset+(n!=null?n:0),i=r!=null?r:e.byteLength;return e.buffer.slice(t,t+i)}var S=(e={})=>{var n;return {description:(n=e.description)!=null?n:"shortU16",encode:r=>{ae("shortU16",0,65535,r);let t=[0];for(let i=0;;i+=1){let o=r>>i*7;if(o===0)break;let s=127&o;t[i]=s,i>0&&(t[i-1]|=128);}return new Uint8Array(t)},fixedSize:null,maxSize:3}};var $=(e={})=>de({config:e,name:"u32",range:[0,+"0xffffffff"],set:(n,r,t)=>n.setUint32(0,r,t),size:4}),K=(e={})=>ke({config:e,get:(n,r)=>n.getUint32(0,r),name:"u32",size:4});var y=(e={})=>de({config:e,name:"u8",range:[0,+"0xff"],set:(n,r)=>n.setUint8(0,r),size:1});function $e(e,n,r=n){if(!n.match(new RegExp(`^[${e}]*$`)))throw new Error(`Expected a string of base ${e.length}, got [${r}].`)}var Ue=e=>{let n=e.length,r=BigInt(n);return {description:`base${n}`,encode(t){if($e(e,t),t==="")return new Uint8Array;let i=[...t],o=i.findIndex(m=>m!==e[0]);o=o===-1?i.length:o;let s=Array(o).fill(0);if(o===i.length)return Uint8Array.from(s);let a=i.slice(o),c=0n,d=1n;for(let m=a.length-1;m>=0;m-=1)c+=d*BigInt(e.indexOf(a[m])),d*=r;let u=[];for(;c>0n;)u.unshift(Number(c%256n)),c/=256n;return Uint8Array.from(s.concat(u))},fixedSize:null,maxSize:null}},Ne=e=>{let n=e.length,r=BigInt(n);return {decode(t,i=0){let o=i===0?t:t.slice(i);if(o.length===0)return ["",0];let s=o.findIndex(u=>u!==0);s=s===-1?o.length:s;let a=e[0].repeat(s);if(s===o.length)return [a,t.length];let c=o.slice(s).reduce((u,m)=>u*256n+BigInt(m),0n),d=[];for(;c>0n;)d.unshift(e[Number(c%r)]),c/=r;return [a+d.join(""),t.length]},description:`base${n}`,fixedSize:null,maxSize:null}};var ue="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",U=()=>Ue(ue),V=()=>Ne(ue);var Oe=e=>e.replace(/\u0000/g,"");var Re=globalThis.TextDecoder,Le=globalThis.TextEncoder,Fe=()=>{let e;return {description:"utf8",encode:n=>new Uint8Array((e||(e=new Le)).encode(n)),fixedSize:null,maxSize:null}},_e=()=>{let e;return {decode(n,r=0){let t=(e||(e=new Re)).decode(n.slice(r));return [Oe(t),n.length]},description:"utf8",fixedSize:null,maxSize:null}};var N=(e={})=>{var i,o,s;let n=(i=e.size)!=null?i:$(),r=(o=e.encoding)!=null?o:Fe(),t=(s=e.description)!=null?s:`string(${r.description}; ${ge(n)})`;return n==="variable"?{...r,description:t}:typeof n=="number"?k(r,n,t):{description:t,encode:a=>{let c=r.encode(a),d=n.encode(c.length);return w([d,c])},fixedSize:null,maxSize:null}},H=(e={})=>{var i,o,s;let n=(i=e.size)!=null?i:K(),r=(o=e.encoding)!=null?o:_e(),t=(s=e.description)!=null?s:`string(${r.description}; ${ge(n)})`;return n==="variable"?{...r,description:t}:typeof n=="number"?j(r,n,t):{decode:(a,c=0)=>{I("string",a,c);let[d,u]=n.decode(a,c),m=Number(d);c=u;let oe=a.slice(c,c+m);b("string",m,oe);let[Ce,Be]=r.decode(oe);return c+=Be,[Ce,c]},description:t,fixedSize:null,maxSize:null}};function ge(e){return typeof e=="object"?e.description:`${e}`}function G(){if(!globalThis.isSecureContext)throw new Error("Cryptographic operations are only allowed in secure browser contexts. Read more here: https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts")}var h;async function We(e){return h===void 0&&(h=new Promise(n=>{e.generateKey("Ed25519",!1,["sign","verify"]).catch(()=>{n(h=!1);}).then(()=>{n(h=!0);});})),typeof h=="boolean"?h:await h}async function fe(){var e;if(G(),typeof globalThis.crypto>"u"||typeof((e=globalThis.crypto.subtle)==null?void 0:e.generateKey)!="function")throw new Error("No key generation implementation could be found");if(!await We(globalThis.crypto.subtle))throw new Error(`This runtime does not support the generation of Ed25519 key pairs.
6
+
7
+ Install and import \`@solana/webcrypto-ed25519-polyfill\` before generating keys in environments that do not support Ed25519.
8
+
9
+ For a list of runtimes that currently support Ed25519 operations, visit https://github.com/WICG/webcrypto-secure-curves/issues/20`)}async function le(){var e;if(G(),typeof globalThis.crypto>"u"||typeof((e=globalThis.crypto.subtle)==null?void 0:e.exportKey)!="function")throw new Error("No key export implementation could be found")}async function me(){var e;if(G(),typeof globalThis.crypto>"u"||typeof((e=globalThis.crypto.subtle)==null?void 0:e.sign)!="function")throw new Error("No signing implementation could be found")}var Y,X;function q(){return Y||(Y=U()),Y}function je(){return X||(X=V()),X}function pe(e){return !(e.length<32||e.length>44||q().encode(e).byteLength!==32)}function Se(e){try{if(e.length<32||e.length>44)throw new Error("Expected input string to decode to a byte array of length 32.");let t=q().encode(e).byteLength;if(t!==32)throw new Error(`Expected input string to decode to a byte array of length 32. Actual length: ${t}`)}catch(n){throw new Error(`\`${e}\` is not a base-58 encoded address`,{cause:n})}}function Ke(e){return Se(e),e}function Z(e){var n;return v(N({description:(n=e==null?void 0:e.description)!=null?n:"Address",encoding:q(),size:32}),r=>Ke(r))}function ye(e){var n;return H({description:(n=e==null?void 0:e.description)!=null?n:"Address",encoding:je(),size:32})}function O(){return new Intl.Collator("en",{caseFirst:"lower",ignorePunctuation:!1,localeMatcher:"best fit",numeric:!1,sensitivity:"variant",usage:"sort"}).compare}async function R(e){if(await le(),e.type!=="public"||e.algorithm.name!=="Ed25519")throw new Error("The `CryptoKey` must be an `Ed25519` public key");let n=await crypto.subtle.exportKey("raw",e),[r]=ye().decode(new Uint8Array(n));return r}async function he(){return await fe(),await crypto.subtle.generateKey("Ed25519",!1,["sign","verify"])}async function L(e,n){await me();let r=await crypto.subtle.sign("Ed25519",e,n);return new Uint8Array(r)}function J(e){return e.reduce((n,r)=>n===null||r===null?null:n+r,0)}function He(e){return typeof e=="object"?e.description:`${e}`}function Te(e,n){if(typeof e!="number")return null;if(e===0)return 0;let r=J(n);return r===null?null:r*e}function Ge(e,n){return typeof e=="object"?e.encode(n):new Uint8Array}function Ye(e,n,r){if(n!==r)throw new Error(`Expected [${e}] to have ${n} items, got ${r}.`)}function Xe(e,n,r){if(n==="remainder"&&e.fixedSize===null)throw new Error('Codecs of "remainder" size must have fixed-size items.');return {description:r!=null?r:`array(${e.description}; ${He(n)})`,fixedSize:Te(n,[e.fixedSize]),maxSize:Te(n,[e.maxSize])}}function T(e,n={}){var t;let r=(t=n.size)!=null?t:$();return {...Xe(e,r,n.description),encode:i=>(typeof r=="number"&&Ye("array",r,i.length),w([Ge(r,i.length),...i.map(o=>e.encode(o))]))}}function xe(e={}){var o,s;let n=(o=e.size)!=null?o:"variable",r=typeof n=="object"?n.description:`${n}`,t=(s=e.description)!=null?s:`bytes(${r})`,i={description:t,encode:a=>a,fixedSize:null,maxSize:null};return n==="variable"?i:typeof n=="number"?k(i,n,t):{...i,encode:a=>{let c=i.encode(a),d=n.encode(c.length);return w([d,c])}}}function qe(e,n){let r=e.map(([t,i])=>`${String(t)}: ${i.description}`).join(", ");return {description:n!=null?n:`struct(${r})`,fixedSize:J(e.map(([,t])=>t.fixedSize)),maxSize:J(e.map(([,t])=>t.maxSize))}}function z(e,n={}){return {...qe(e,n.description),encode:r=>{let t=e.map(([i,o])=>o.encode(r[i]));return w(t)}}}var C=(e=>(e[e.WRITABLE_SIGNER=3]="WRITABLE_SIGNER",e[e.READONLY_SIGNER=2]="READONLY_SIGNER",e[e.WRITABLE=1]="WRITABLE",e[e.READONLY=0]="READONLY",e))(C||{}),Ze=1;function E(e){return e>=2}function B(e){return (e&Ze)!==0}function Ae(e,n){return e|n}function be(e,n,r){var t;e[n]=r((t=e[n])!=null?t:{role:C.READONLY});}var f=Symbol("AddressMapTypeProperty");function Je(e,n){let r={[e]:{[f]:0,role:C.WRITABLE_SIGNER}},t=new Set;for(let i of n){be(r,i.programAddress,s=>{if(t.add(i.programAddress),f in s){if(B(s.role))switch(s[f]){case 0:throw new Error(`This transaction includes an address (\`${i.programAddress}\`) which is both invoked and set as the fee payer. Program addresses may not pay fees.`);default:throw new Error(`This transaction includes an address (\`${i.programAddress}\`) which is both invoked and marked writable. Program addresses may not be writable.`)}if(s[f]===2)return s}return {[f]:2,role:C.READONLY}});let o;if(i.accounts)for(let s of i.accounts)be(r,s.address,a=>{let{address:c,...d}=s;if(f in a)switch(a[f]){case 0:return a;case 1:{let u=Ae(a.role,d.role);if("lookupTableAddress"in d){if(a.lookupTableAddress!==d.lookupTableAddress&&(o||(o=O()))(d.lookupTableAddress,a.lookupTableAddress)<0)return {[f]:1,...d,role:u}}else if(E(d.role))return {[f]:2,role:u};return a.role!==u?{...a,role:u}:a}case 2:{let u=Ae(a.role,d.role);if(t.has(s.address)){if(B(d.role))throw new Error(`This transaction includes an address (\`${s.address}\`) which is both invoked and marked writable. Program addresses may not be writable.`);return a.role!==u?{...a,role:u}:a}else return "lookupTableAddress"in d&&!E(a.role)?{...d,[f]:1,role:u}:a.role!==u?{...a,role:u}:a}}return "lookupTableAddress"in d?{...d,[f]:1}:{...d,[f]:2}});}return r}function Qe(e){let n;return Object.entries(e).sort(([t,i],[o,s])=>{if(i[f]!==s[f]){if(i[f]===0)return -1;if(s[f]===0)return 1;if(i[f]===2)return -1;if(s[f]===2)return 1}let a=E(i.role);if(a!==E(s.role))return a?-1:1;let c=B(i.role);return c!==B(s.role)?c?-1:1:(n||(n=O()),i[f]===1&&s[f]===1&&i.lookupTableAddress!==s.lookupTableAddress?n(i.lookupTableAddress,s.lookupTableAddress):n(t,o))}).map(([t,i])=>({address:t,...i}))}function en(e){var r;let n={};for(let t of e){if(!("lookupTableAddress"in t))continue;let i=n[r=t.lookupTableAddress]||(n[r]={readableIndices:[],writableIndices:[]});t.role===C.WRITABLE?i.writableIndices.push(t.addressIndex):i.readableIndices.push(t.addressIndex);}return Object.keys(n).sort(O()).map(t=>({lookupTableAddress:t,...n[t]}))}function nn(e){let n=0,r=0,t=0;for(let i of e){if("lookupTableAddress"in i)break;let o=B(i.role);E(i.role)?(t++,o||r++):o||n++;}return {numReadonlyNonSignerAccounts:n,numReadonlySignerAccounts:r,numSignerAccounts:t}}function rn(e){let n={};for(let[r,t]of e.entries())n[t.address]=r;return n}function tn(e,n){let r=rn(n);return e.map(({accounts:t,data:i,programAddress:o})=>({programAddressIndex:r[o],...t?{accountIndices:t.map(({address:s})=>r[s])}:null,...i?{data:i}:null}))}function on(e){return "nonce"in e?e.nonce:e.blockhash}function sn(e){let n=e.findIndex(t=>"lookupTableAddress"in t);return (n===-1?e:e.slice(0,n)).map(({address:t})=>t)}function an(e){let n=Je(e.feePayer,e.instructions),r=Qe(n);return {...e.version!=="legacy"?{addressTableLookups:en(r)}:null,header:nn(r),instructions:tn(e.instructions,r),lifetimeToken:on(e.lifetimeConstraint),staticAccounts:sn(r),version:e.version}}var cn="lookupTableAddress",dn="writableIndices",un="readableIndices",gn="addressTableLookup",Q;function fn(){return Q||(Q=z([["lookupTableAddress",Z({description:cn})],["writableIndices",T(y(),{description:dn,size:S()})],["readableIndices",T(y(),{description:un,size:S()})]],{description:gn})),Q}var ee;function ln(){return ee||(ee=y()),ee}function ne(e){let n=ln();return {...n,description:e!=null?e:n.description}}var mn=void 0,pn=void 0,Sn=void 0,yn=void 0;function hn(){return z([["numSignerAccounts",ne(mn)],["numReadonlySignerAccounts",ne(pn)],["numReadonlyNonSignerAccounts",ne(Sn)]],{description:yn})}var Tn="programAddressIndex",xn=void 0,An="accountIndices",bn="data",re;function wn(){return re||(re=v(z([["programAddressIndex",y({description:Tn})],["accountIndices",T(y({description:xn}),{description:An,size:S()})],["data",xe({description:bn,size:S()})]]),e=>{var n,r;return e.accountIndices!==void 0&&e.data!==void 0?e:{...e,accountIndices:(n=e.accountIndices)!=null?n:[],data:(r=e.data)!=null?r:new Uint8Array(0)}})),re}var zn=128,En={description:"",fixedSize:null,maxSize:1};function In(e){if(e==="legacy")return new Uint8Array;if(e<0||e>127)throw new Error(`Transaction version must be in the range [0, 127]. \`${e}\` given.`);return new Uint8Array([e|zn])}function vn(){return {...En,encode:In}}var Cn="staticAccounts",Bn="lifetimeToken",Dn="instructions",Mn="addressTableLookups";function kn(){return z(we())}function Pn(){return v(z([...we(),["addressTableLookups",$n()]]),e=>{var n;return e.version==="legacy"?e:{...e,addressTableLookups:(n=e.addressTableLookups)!=null?n:[]}})}function we(){return [["version",vn()],["header",hn()],["staticAccounts",T(Z(),{description:Cn,size:S()})],["lifetimeToken",N({description:Bn,encoding:U(),size:32})],["instructions",T(wn(),{description:Dn,size:S()})]]}function $n(){return T(fn(),{description:Mn,size:S()})}var Un="message";function Nn(){return {description:Un,encode:e=>e.version==="legacy"?kn().encode(e):Pn().encode(e),fixedSize:null,maxSize:null}}async function ze(e,n){let r=an(n),t="signatures"in n?{...n.signatures}:{},i=Nn().encode(r),o=await Promise.all(e.map(a=>Promise.all([R(a.publicKey),L(a.privateKey,i)])));for(let[a,c]of o)t[a]=c;let s={...n,signatures:t};return Object.freeze(s),s}function te(e){let n=e.instructions.flatMap(t=>{var i,o;return (o=(i=t.accounts)==null?void 0:i.filter(s=>E(s.role)))!=null?o:[]}).map(t=>t.address);new Set([e.feePayer,...n]).forEach(t=>{if(!e.signatures[t])throw new Error(`Transaction is missing signature for address \`${t}\``)});}function D(e){return "signMessages"in e&&typeof e.signMessages=="function"}function Ur(e){if(!D(e))throw new Error("The provided value does not implement the MessagePartialSigner interface")}function p(e){return "signTransactions"in e&&typeof e.signTransactions=="function"}function Rr(e){if(!p(e))throw new Error("The provided value does not implement the TransactionPartialSigner interface")}function On(e){return "keyPair"in e&&typeof e.keyPair=="object"&&D(e)&&p(e)}function Xr(e){if(!On(e))throw new Error("The provided value does not implement the KeyPairSigner interface")}async function Rn(e){let n=await R(e.publicKey);return Object.freeze({address:n,keyPair:e,signMessages:t=>Promise.all(t.map(async i=>Object.freeze({[n]:await L(e.privateKey,i.content)}))),signTransactions:t=>Promise.all(t.map(async i=>{let o=await ze([e],i);return Object.freeze({[n]:o.signatures[n]})}))})}async function qr(){return Rn(await he())}function ie(e){return pe(e.address)&&"modifyAndSignMessages"in e&&typeof e.modifyAndSignMessages=="function"}function nt(e){if(!ie(e))throw new Error("The provided value does not implement the MessageModifyingSigner interface")}function Ln(e){return D(e)||ie(e)}function ct(e){if(!Ln(e))throw new Error("The provided value does not implement any of the MessageSigner interfaces")}function gt(e){return Object.freeze({address:e,signMessages:async r=>r.map(()=>Object.freeze({})),signTransactions:async r=>r.map(()=>Object.freeze({}))})}function x(e){return "modifyAndSignTransactions"in e&&typeof e.modifyAndSignTransactions=="function"}function mt(e){if(!x(e))throw new Error("The provided value does not implement the TransactionModifyingSigner interface")}function M(e){return "signAndSendTransactions"in e&&typeof e.signAndSendTransactions=="function"}function yt(e){if(!M(e))throw new Error("The provided value does not implement the TransactionSendingSigner interface")}function F(e){return p(e)||x(e)||M(e)}function It(e){if(!F(e))throw new Error("The provided value does not implement any of the TransactionSigner interfaces")}async function Fn(e,n={}){var o;let r=(o=n.signers)!=null?o:[],{partialSigners:t,modifyingSigners:i}=Ee(A([..._(e).filter(F),...r]),{identifySendingSigner:!1});return Ie(e,i,t,n.abortSignal)}async function Vt(e,n={}){let r=await Fn(e,n);return te(r),r}async function Ht(e,n={}){var c;let r=(c=n.signers)!=null?c:[],t=n.abortSignal,{partialSigners:i,modifyingSigners:o,sendingSigner:s}=Ee(A([..._(e).filter(F),...r]));t==null||t.throwIfAborted();let a=await Ie(e,o,i,t);if(s){t==null||t.throwIfAborted();let[d]=await s.signAndSendTransactions([a],{abortSignal:t});return d}if(n.fallbackSender)return te(a),n.fallbackSender(a);throw new Error("No TransactionSendingSigner was identified and no fallback sender was provided.")}function Ee(e,n={}){var a;let t=((a=n.identifySendingSigner)!=null?a:!0)?_n(e):null,i=e.filter(c=>c!==t&&(x(c)||p(c))),o=Wn(i),s=i.filter(p).filter(c=>!o.includes(c));return Object.freeze({modifyingSigners:o,partialSigners:s,sendingSigner:t})}function _n(e){let n=e.filter(M);if(n.length===0)return null;let r=n.filter(t=>!x(t)&&!p(t));return r.length>0?r[0]:n[0]}function Wn(e){let n=e.filter(x);if(n.length===0)return [];let r=n.filter(t=>!p(t));return r.length>0?r:[n[0]]}async function Ie(e,n=[],r=[],t){var a;let i=await n.reduce(async(c,d)=>{t==null||t.throwIfAborted();let[u]=await d.modifyAndSignTransactions([await c],{abortSignal:t});return Object.freeze(u)},Promise.resolve(e));t==null||t.throwIfAborted();let o=await Promise.all(r.map(async c=>{let[d]=await c.signTransactions([i],{abortSignal:t});return d})),s={...i,signatures:Object.freeze(o.reduce((c,d)=>({...c,...d}),(a=i.signatures)!=null?a:{}))};return Object.freeze(s)}var ve=globalThis.TextEncoder;function Qt(e,n={}){return Object.freeze({content:typeof e=="string"?new ve().encode(e):e,signatures:Object.freeze({...n})})}
10
+
11
+ exports.assertIsKeyPairSigner = Xr;
12
+ exports.assertIsMessageModifyingSigner = nt;
13
+ exports.assertIsMessagePartialSigner = Ur;
14
+ exports.assertIsMessageSigner = ct;
15
+ exports.assertIsTransactionModifyingSigner = mt;
16
+ exports.assertIsTransactionPartialSigner = Rr;
17
+ exports.assertIsTransactionSendingSigner = yt;
18
+ exports.assertIsTransactionSigner = It;
19
+ exports.createNoopSigner = gt;
20
+ exports.createSignableMessage = Qt;
21
+ exports.createSignerFromKeyPair = Rn;
22
+ exports.generateKeyPairSigner = qr;
23
+ exports.getSignersFromInstruction = De;
24
+ exports.getSignersFromTransaction = _;
25
+ exports.isKeyPairSigner = On;
26
+ exports.isMessageModifyingSigner = ie;
27
+ exports.isMessagePartialSigner = D;
28
+ exports.isMessageSigner = Ln;
29
+ exports.isTransactionModifyingSigner = x;
30
+ exports.isTransactionPartialSigner = p;
31
+ exports.isTransactionSendingSigner = M;
32
+ exports.isTransactionSigner = F;
33
+ exports.partiallySignTransactionWithSigners = Fn;
34
+ exports.signAndSendTransactionWithSigners = Ht;
35
+ exports.signTransactionWithSigners = Vt;
36
+
37
+ return exports;
38
+
39
+ })({});
@@ -0,0 +1,17 @@
1
+ import { AccountRole, IAccountLookupMeta, IAccountMeta, IInstruction } from '@solana/instructions';
2
+ import { BaseTransaction, TransactionVersion } from '@solana/transactions';
3
+ import { TransactionSigner } from './transaction-signer';
4
+ /** An extension of the IAccountMeta type that keeps track of its transaction signer. */
5
+ export interface IAccountSignerMeta<TAddress extends string = string, TSigner extends TransactionSigner = TransactionSigner> extends IAccountMeta<TAddress> {
6
+ readonly role: AccountRole.READONLY_SIGNER | AccountRole.WRITABLE_SIGNER;
7
+ readonly signer: TSigner;
8
+ }
9
+ /** A variation of the IInstruction type that allows IAccountSignerMeta in its accounts array. */
10
+ type IAccountMetaWithWithSigner<TSigner extends TransactionSigner = TransactionSigner> = IAccountMeta | IAccountLookupMeta | IAccountSignerMeta<string, TSigner>;
11
+ export type IInstructionWithSigners<TProgramAddress extends string = string, TSigner extends TransactionSigner = TransactionSigner, TAccounts extends readonly IAccountMetaWithWithSigner<TSigner>[] = readonly IAccountMetaWithWithSigner<TSigner>[]> = IInstruction<TProgramAddress, TAccounts>;
12
+ /** Extract all signers from an instruction that may contain IAccountSignerMeta accounts. */
13
+ export declare function getSignersFromInstruction<TSigner extends TransactionSigner = TransactionSigner>(instruction: IInstructionWithSigners<string, TSigner>): readonly TSigner[];
14
+ /** Extract all signers from a transaction that may contain IAccountSignerMeta accounts. */
15
+ export declare function getSignersFromTransaction<TSigner extends TransactionSigner = TransactionSigner, TInstruction extends IInstructionWithSigners<string, TSigner> = IInstructionWithSigners<string, TSigner>>(transaction: BaseTransaction<TransactionVersion, TInstruction>): readonly TSigner[];
16
+ export {};
17
+ //# sourceMappingURL=account-signer-meta.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-signer-meta.d.ts","sourceRoot":"","sources":["../../src/account-signer-meta.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACnG,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,wFAAwF;AACxF,MAAM,WAAW,kBAAkB,CAC/B,QAAQ,SAAS,MAAM,GAAG,MAAM,EAChC,OAAO,SAAS,iBAAiB,GAAG,iBAAiB,CACvD,SAAQ,YAAY,CAAC,QAAQ,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,eAAe,GAAG,WAAW,CAAC,eAAe,CAAC;IACzE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC5B;AAED,iGAAiG;AACjG,KAAK,0BAA0B,CAAC,OAAO,SAAS,iBAAiB,GAAG,iBAAiB,IAC/E,YAAY,GACZ,kBAAkB,GAClB,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC1C,MAAM,MAAM,uBAAuB,CAC/B,eAAe,SAAS,MAAM,GAAG,MAAM,EACvC,OAAO,SAAS,iBAAiB,GAAG,iBAAiB,EACrD,SAAS,SAAS,SAAS,0BAA0B,CAAC,OAAO,CAAC,EAAE,GAAG,SAAS,0BAA0B,CAAC,OAAO,CAAC,EAAE,IACjH,YAAY,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;AAE7C,4FAA4F;AAC5F,wBAAgB,yBAAyB,CAAC,OAAO,SAAS,iBAAiB,GAAG,iBAAiB,EAC3F,WAAW,EAAE,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,GACtD,SAAS,OAAO,EAAE,CAIpB;AAED,2FAA2F;AAC3F,wBAAgB,yBAAyB,CACrC,OAAO,SAAS,iBAAiB,GAAG,iBAAiB,EACrD,YAAY,SAAS,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1G,WAAW,EAAE,eAAe,CAAC,kBAAkB,EAAE,YAAY,CAAC,GAAG,SAAS,OAAO,EAAE,CAEpF"}
@@ -0,0 +1,5 @@
1
+ import { MessageSigner } from './message-signer';
2
+ import { TransactionSigner } from './transaction-signer';
3
+ /** Removes all duplicated signers from a provided array by comparing their addresses. */
4
+ export declare function deduplicateSigners<TSigner extends MessageSigner | TransactionSigner>(signers: readonly TSigner[]): readonly TSigner[];
5
+ //# sourceMappingURL=deduplicate-signers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deduplicate-signers.d.ts","sourceRoot":"","sources":["../../src/deduplicate-signers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,yFAAyF;AACzF,wBAAgB,kBAAkB,CAAC,OAAO,SAAS,aAAa,GAAG,iBAAiB,EAChF,OAAO,EAAE,SAAS,OAAO,EAAE,GAC5B,SAAS,OAAO,EAAE,CAQpB"}
@@ -0,0 +1,14 @@
1
+ export * from './account-signer-meta';
2
+ export * from './keypair-signer';
3
+ export * from './message-modifying-signer';
4
+ export * from './message-partial-signer';
5
+ export * from './message-signer';
6
+ export * from './noop-signer';
7
+ export * from './sign-transaction';
8
+ export * from './signable-message';
9
+ export * from './transaction-modifying-signer';
10
+ export * from './transaction-partial-signer';
11
+ export * from './transaction-sending-signer';
12
+ export * from './transaction-signer';
13
+ export * from './types';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,sBAAsB,CAAC;AACrC,cAAc,SAAS,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { Address } from '@solana/addresses';
2
+ import { MessagePartialSigner } from './message-partial-signer';
3
+ import { TransactionPartialSigner } from './transaction-partial-signer';
4
+ /** Defines a signer capable of signing messages and transactions using a CryptoKeyPair. */
5
+ export type KeyPairSigner<TAddress extends string = string> = MessagePartialSigner<TAddress> & TransactionPartialSigner<TAddress> & {
6
+ keyPair: CryptoKeyPair;
7
+ };
8
+ /** Checks whether the provided value implements the {@link KeyPairSigner} interface. */
9
+ export declare function isKeyPairSigner<TAddress extends string>(value: {
10
+ address: Address<TAddress>;
11
+ [key: string]: unknown;
12
+ }): value is KeyPairSigner<TAddress>;
13
+ /** Asserts that the provided value implements the {@link KeyPairSigner} interface. */
14
+ export declare function assertIsKeyPairSigner<TAddress extends string>(value: {
15
+ address: Address<TAddress>;
16
+ [key: string]: unknown;
17
+ }): asserts value is KeyPairSigner<TAddress>;
18
+ /** Creates a KeyPairSigner from the provided Crypto KeyPair. */
19
+ export declare function createSignerFromKeyPair(keyPair: CryptoKeyPair): Promise<KeyPairSigner>;
20
+ /** Securely generates a signer capable of signing messages and transactions using a Crypto KeyPair. */
21
+ export declare function generateKeyPairSigner(): Promise<KeyPairSigner>;
22
+ //# sourceMappingURL=keypair-signer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keypair-signer.d.ts","sourceRoot":"","sources":["../../src/keypair-signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA2B,MAAM,mBAAmB,CAAC;AAIrE,OAAO,EAA0B,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAA8B,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAEpG,2FAA2F;AAC3F,MAAM,MAAM,aAAa,CAAC,QAAQ,SAAS,MAAM,GAAG,MAAM,IAAI,oBAAoB,CAAC,QAAQ,CAAC,GACxF,wBAAwB,CAAC,QAAQ,CAAC,GAAG;IAAE,OAAO,EAAE,aAAa,CAAA;CAAE,CAAC;AAEpE,wFAAwF;AACxF,wBAAgB,eAAe,CAAC,QAAQ,SAAS,MAAM,EAAE,KAAK,EAAE;IAC5D,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B,GAAG,KAAK,IAAI,aAAa,CAAC,QAAQ,CAAC,CAOnC;AAED,sFAAsF;AACtF,wBAAgB,qBAAqB,CAAC,QAAQ,SAAS,MAAM,EAAE,KAAK,EAAE;IAClE,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,KAAK,IAAI,aAAa,CAAC,QAAQ,CAAC,CAK3C;AAED,gEAAgE;AAChE,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAqB5F;AAED,uGAAuG;AACvG,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,aAAa,CAAC,CAEpE"}
@@ -0,0 +1,20 @@
1
+ import { Address } from '@solana/addresses';
2
+ import { SignableMessage } from './signable-message';
3
+ import { BaseSignerConfig } from './types';
4
+ export type MessageModifyingSignerConfig = BaseSignerConfig;
5
+ /** Defines a signer capable of signing messages. */
6
+ export type MessageModifyingSigner<TAddress extends string = string> = Readonly<{
7
+ address: Address<TAddress>;
8
+ modifyAndSignMessages(messages: readonly SignableMessage[], config?: MessageModifyingSignerConfig): Promise<readonly SignableMessage[]>;
9
+ }>;
10
+ /** Checks whether the provided value implements the {@link MessageModifyingSigner} interface. */
11
+ export declare function isMessageModifyingSigner<TAddress extends string>(value: {
12
+ address: Address<TAddress>;
13
+ [key: string]: unknown;
14
+ }): value is MessageModifyingSigner<TAddress>;
15
+ /** Asserts that the provided value implements the {@link MessageModifyingSigner} interface. */
16
+ export declare function assertIsMessageModifyingSigner<TAddress extends string>(value: {
17
+ address: Address<TAddress>;
18
+ [key: string]: unknown;
19
+ }): asserts value is MessageModifyingSigner<TAddress>;
20
+ //# sourceMappingURL=message-modifying-signer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-modifying-signer.d.ts","sourceRoot":"","sources":["../../src/message-modifying-signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAa,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C,MAAM,MAAM,4BAA4B,GAAG,gBAAgB,CAAC;AAE5D,oDAAoD;AACpD,MAAM,MAAM,sBAAsB,CAAC,QAAQ,SAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC;IAC5E,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3B,qBAAqB,CACjB,QAAQ,EAAE,SAAS,eAAe,EAAE,EACpC,MAAM,CAAC,EAAE,4BAA4B,GACtC,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC,CAAC;CAC1C,CAAC,CAAC;AAEH,iGAAiG;AACjG,wBAAgB,wBAAwB,CAAC,QAAQ,SAAS,MAAM,EAAE,KAAK,EAAE;IACrE,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B,GAAG,KAAK,IAAI,sBAAsB,CAAC,QAAQ,CAAC,CAM5C;AAED,+FAA+F;AAC/F,wBAAgB,8BAA8B,CAAC,QAAQ,SAAS,MAAM,EAAE,KAAK,EAAE;IAC3E,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,KAAK,IAAI,sBAAsB,CAAC,QAAQ,CAAC,CAKpD"}
@@ -0,0 +1,20 @@
1
+ import { Address } from '@solana/addresses';
2
+ import { SignableMessage } from './signable-message';
3
+ import { BaseSignerConfig, SignatureDictionary } from './types';
4
+ export type MessagePartialSignerConfig = BaseSignerConfig;
5
+ /** Defines a signer capable of signing messages. */
6
+ export type MessagePartialSigner<TAddress extends string = string> = Readonly<{
7
+ address: Address<TAddress>;
8
+ signMessages(messages: readonly SignableMessage[], config?: MessagePartialSignerConfig): Promise<readonly SignatureDictionary[]>;
9
+ }>;
10
+ /** Checks whether the provided value implements the {@link MessagePartialSigner} interface. */
11
+ export declare function isMessagePartialSigner<TAddress extends string>(value: {
12
+ address: Address<TAddress>;
13
+ [key: string]: unknown;
14
+ }): value is MessagePartialSigner<TAddress>;
15
+ /** Asserts that the provided value implements the {@link MessagePartialSigner} interface. */
16
+ export declare function assertIsMessagePartialSigner<TAddress extends string>(value: {
17
+ address: Address<TAddress>;
18
+ [key: string]: unknown;
19
+ }): asserts value is MessagePartialSigner<TAddress>;
20
+ //# sourceMappingURL=message-partial-signer.d.ts.map