@solana/react 5.0.1-canary-20251119225544 → 5.1.0-canary-20251203213248
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.browser.cjs +5 -5
- package/dist/index.browser.cjs.map +1 -1
- package/dist/index.browser.mjs +5 -5
- package/dist/index.browser.mjs.map +1 -1
- package/dist/index.native.mjs +5 -5
- package/dist/index.native.mjs.map +1 -1
- package/dist/index.node.cjs +5 -5
- package/dist/index.node.cjs.map +1 -1
- package/dist/index.node.mjs +5 -5
- package/dist/index.node.mjs.map +1 -1
- package/dist/types/useWalletAccountMessageSigner.d.ts.map +1 -1
- package/package.json +8 -8
package/dist/index.browser.cjs
CHANGED
|
@@ -185,6 +185,9 @@ function useSignTransactions(uiWalletAccount, chain) {
|
|
|
185
185
|
[signTransactionFeature, account, chain]
|
|
186
186
|
);
|
|
187
187
|
}
|
|
188
|
+
function bytesEqual(bytes1, bytes2) {
|
|
189
|
+
return bytes1.length === bytes2.length && bytes1.every((value, index) => value === bytes2[index]);
|
|
190
|
+
}
|
|
188
191
|
function useWalletAccountMessageSigner(uiWalletAccount) {
|
|
189
192
|
const signMessage = useSignMessage(uiWalletAccount);
|
|
190
193
|
return react.useMemo(
|
|
@@ -205,7 +208,7 @@ function useWalletAccountMessageSigner(uiWalletAccount) {
|
|
|
205
208
|
const { signedMessage, signature } = await promises.getAbortablePromise(signMessage(input), config?.abortSignal);
|
|
206
209
|
const messageWasModified = originalMessage.length !== signedMessage.length || originalMessage.some((originalByte, ii) => originalByte !== signedMessage[ii]);
|
|
207
210
|
const originalSignature = originalSignatureMap[uiWalletAccount.address];
|
|
208
|
-
const signatureIsNew =
|
|
211
|
+
const signatureIsNew = originalSignature === void 0 || !bytesEqual(originalSignature, signature);
|
|
209
212
|
if (!signatureIsNew && !messageWasModified) {
|
|
210
213
|
return messages;
|
|
211
214
|
}
|
|
@@ -251,7 +254,7 @@ function useWalletAccountTransactionSigner(uiWalletAccount, chain) {
|
|
|
251
254
|
transactions.assertIsTransactionWithinSizeLimit(decodedSignedTransaction);
|
|
252
255
|
const existingLifetime = "lifetimeConstraint" in transaction ? transaction.lifetimeConstraint : void 0;
|
|
253
256
|
if (existingLifetime) {
|
|
254
|
-
if (
|
|
257
|
+
if (bytesEqual(decodedSignedTransaction.messageBytes, transaction.messageBytes)) {
|
|
255
258
|
return Object.freeze([
|
|
256
259
|
{
|
|
257
260
|
...decodedSignedTransaction,
|
|
@@ -287,9 +290,6 @@ function useWalletAccountTransactionSigner(uiWalletAccount, chain) {
|
|
|
287
290
|
[uiWalletAccount.address, signTransaction]
|
|
288
291
|
);
|
|
289
292
|
}
|
|
290
|
-
function uint8ArraysEqual(arr1, arr2) {
|
|
291
|
-
return arr1.length === arr2.length && arr1.every((value, index) => value === arr2[index]);
|
|
292
|
-
}
|
|
293
293
|
function useWalletAccountTransactionSendingSigner(uiWalletAccount, chain) {
|
|
294
294
|
const encoderRef = react.useRef(null);
|
|
295
295
|
const signAndSendTransaction = useSignAndSendTransaction(uiWalletAccount, chain);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/useSignAndSendTransaction.ts","../src/useSignIn.ts","../src/useSignMessage.ts","../src/useSignTransaction.ts","../src/useWalletAccountMessageSigner.ts","../src/useWalletAccountTransactionSigner.ts","../src/useWalletAccountTransactionSendingSigner.ts"],"names":["useCallback","WalletStandardError","WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED","SolanaSignAndSendTransaction","getWalletAccountFeature","getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","SolanaSignIn","getWalletFeature","getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","SolanaSignMessage","SolanaSignTransaction","useMemo","address","SolanaError","SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED","getAbortablePromise","useRef","transactions","getTransactionCodec","assertIsTransactionWithinSizeLimit","compiledTransactionMessage","getCompiledTransactionMessageDecoder","getTransactionLifetimeConstraintFromCompiledTransactionMessage","getTransactionEncoder"],"mappings":"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","file":"index.browser.cjs","sourcesContent":["import {\n SolanaSignAndSendTransaction,\n SolanaSignAndSendTransactionFeature,\n SolanaSignAndSendTransactionInput,\n SolanaSignAndSendTransactionOutput,\n} from '@solana/wallet-standard-features';\nimport {\n WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED,\n WalletStandardError,\n} from '@wallet-standard/errors';\nimport { getWalletAccountFeature, type UiWalletAccount } from '@wallet-standard/ui';\nimport { getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED } from '@wallet-standard/ui-registry';\nimport { useCallback } from 'react';\n\nimport { OnlySolanaChains } from './chain';\n\ntype Input = Readonly<\n Omit<SolanaSignAndSendTransactionInput, 'account' | 'chain' | 'options'> & {\n options?: Readonly<{\n minContextSlot?: bigint;\n }>;\n }\n>;\ntype Output = SolanaSignAndSendTransactionOutput;\n\n/**\n * Use this to get a function capable of signing a serialized transaction with the private key of a\n * {@link UiWalletAccount} and sending it to the network for processing.\n *\n * @param chain The identifier of the chain the transaction is destined for. Wallets may use this to\n * simulate the transaction for the user.\n *\n * @example\n * ```tsx\n * import { getBase58Decoder } from '@solana/codecs-strings';\n * import { useSignAndSendTransaction } from '@solana/react';\n *\n * function SignAndSendTransactionButton({ account, transactionBytes }) {\n * const signAndSendTransaction = useSignAndSendTransaction(account, 'solana:devnet');\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const { signature } = await signAndSendTransaction({\n * transaction: transactionBytes,\n * });\n * const base58TransactionSignature = getBase58Decoder().decode(signature);\n * window.alert(\n * `View transaction: https://explorer.solana.com/tx/${base58TransactionSignature}?cluster=devnet`,\n * );\n * } catch (e) {\n * console.error('Failed to send transaction', e);\n * }\n * }}\n * >\n * Sign and Send Transaction\n * </button>\n * );\n * }\n * ```\n */\nexport function useSignAndSendTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: OnlySolanaChains<TWalletAccount['chains']>,\n): (input: Input) => Promise<Output>;\nexport function useSignAndSendTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (input: Input) => Promise<Output>;\nexport function useSignAndSendTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (input: Input) => Promise<Output> {\n const signAndSendTransactions = useSignAndSendTransactions(uiWalletAccount, chain);\n return useCallback(\n async input => {\n const [result] = await signAndSendTransactions(input);\n return result;\n },\n [signAndSendTransactions],\n );\n}\n\nfunction useSignAndSendTransactions<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (...inputs: readonly Input[]) => Promise<readonly Output[]> {\n if (!uiWalletAccount.chains.includes(chain)) {\n throw new WalletStandardError(WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED, {\n address: uiWalletAccount.address,\n chain,\n featureName: SolanaSignAndSendTransaction,\n supportedChains: [...uiWalletAccount.chains],\n supportedFeatures: [...uiWalletAccount.features],\n });\n }\n const signAndSendTransactionFeature = getWalletAccountFeature(\n uiWalletAccount,\n SolanaSignAndSendTransaction,\n ) as SolanaSignAndSendTransactionFeature[typeof SolanaSignAndSendTransaction];\n const account = getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletAccount);\n return useCallback(\n async (...inputs) => {\n const inputsWithChainAndAccount = inputs.map(({ options, ...rest }) => {\n const minContextSlot = options?.minContextSlot;\n return {\n ...rest,\n account,\n chain,\n ...(minContextSlot != null\n ? {\n options: {\n minContextSlot: Number(minContextSlot),\n },\n }\n : null),\n };\n });\n const results = await signAndSendTransactionFeature.signAndSendTransaction(...inputsWithChainAndAccount);\n return results;\n },\n [account, chain, signAndSendTransactionFeature],\n );\n}\n","import { Address } from '@solana/addresses';\nimport {\n SolanaSignIn,\n SolanaSignInFeature,\n SolanaSignInInput,\n SolanaSignInOutput,\n} from '@solana/wallet-standard-features';\nimport {\n getWalletAccountFeature,\n getWalletFeature,\n UiWallet,\n UiWalletAccount,\n UiWalletHandle,\n} from '@wallet-standard/ui';\nimport {\n getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,\n getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,\n getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,\n} from '@wallet-standard/ui-registry';\nimport { useCallback } from 'react';\n\ntype Input = SolanaSignInInput;\ntype Output = Omit<SolanaSignInOutput, 'account' | 'signatureType'> &\n Readonly<{\n account: UiWalletAccount;\n }>;\n\n/**\n * Use the ['Sign In With Solana'](https://phantom.app/learn/developers/sign-in-with-solana) feature\n * of a {@link UiWallet} or {@link UiWalletAccount}.\n *\n * @returns A function that you can call to sign in with the particular wallet and address specified\n * by the supplied {@link UiWalletAccount}\n *\n * @example\n * ```tsx\n * import { useSignIn } from '@solana/react';\n *\n * function SignInButton({ wallet }) {\n * const csrfToken = useCsrfToken();\n * const signIn = useSignIn(wallet);\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const { account, signedMessage, signature } = await signIn({\n * requestId: csrfToken,\n * });\n * // Authenticate the user, typically on the server, by verifying that\n * // `signedMessage` was signed by the person who holds the private key for\n * // `account.publicKey`.\n * //\n * // Authorize the user, also on the server, by decoding `signedMessage` as the\n * // text of a Sign In With Solana message, verifying that it was not modified\n * // from the values your application expects, and that its content is sufficient\n * // to grant them access.\n * window.alert(`You are now signed in with the address ${account.address}`);\n * } catch (e) {\n * console.error('Failed to sign in', e);\n * }\n * }}\n * >\n * Sign In\n * </button>\n * );\n * }\n * ```\n */\nexport function useSignIn(uiWalletAccount: UiWalletAccount): (input?: Omit<Input, 'address'>) => Promise<Output>;\n/**\n * @returns A function that you can call to sign in with the supplied {@link UiWallet}\n */\nexport function useSignIn(uiWallet: UiWallet): (input?: Input) => Promise<Output>;\nexport function useSignIn(uiWalletHandle: UiWalletHandle): (input?: Input) => Promise<Output> {\n const signIns = useSignIns(uiWalletHandle);\n return useCallback(\n async input => {\n const [result] = await signIns(input);\n return result;\n },\n [signIns],\n );\n}\n\nfunction useSignIns(\n uiWalletHandle: UiWalletHandle,\n): (...inputs: readonly (Input | undefined)[]) => Promise<readonly Output[]> {\n let signMessageFeature: SolanaSignInFeature[typeof SolanaSignIn];\n if ('address' in uiWalletHandle && typeof uiWalletHandle.address === 'string') {\n getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletHandle as UiWalletAccount);\n signMessageFeature = getWalletAccountFeature(\n uiWalletHandle as UiWalletAccount,\n SolanaSignIn,\n ) as SolanaSignInFeature[typeof SolanaSignIn];\n } else {\n signMessageFeature = getWalletFeature(uiWalletHandle, SolanaSignIn) as SolanaSignInFeature[typeof SolanaSignIn];\n }\n const wallet = getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletHandle);\n return useCallback(\n async (...inputs) => {\n const inputsWithAddressAndChainId = inputs.map(input => ({\n ...input,\n // Prioritize the `UiWalletAccount` address if it exists.\n ...('address' in uiWalletHandle ? { address: uiWalletHandle.address as Address } : null),\n }));\n const results = await signMessageFeature.signIn(...inputsWithAddressAndChainId);\n const resultsWithoutSignatureType = results.map(\n ({\n account,\n signatureType: _, // Solana signatures are always of type `ed25519` so drop this property.\n ...rest\n }) => ({\n ...rest,\n account: getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(\n wallet,\n account,\n ),\n }),\n );\n return resultsWithoutSignatureType;\n },\n [signMessageFeature, uiWalletHandle, wallet],\n );\n}\n","import {\n SolanaSignMessage,\n SolanaSignMessageFeature,\n SolanaSignMessageInput,\n SolanaSignMessageOutput,\n} from '@solana/wallet-standard-features';\nimport { getWalletAccountFeature, UiWalletAccount } from '@wallet-standard/ui';\nimport { getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED } from '@wallet-standard/ui-registry';\nimport { useCallback } from 'react';\n\ntype Input = Omit<SolanaSignMessageInput, 'account'>;\ntype Output = Omit<SolanaSignMessageOutput, 'signatureType'>;\n\n/**\n * Use this to get a function capable of signing a message with the private key of a\n * {@link UiWalletAccount}\n *\n * @example\n * ```tsx\n * import { useSignMessage } from '@solana/react';\n *\n * function SignMessageButton({ account, messageBytes }) {\n * const signMessage = useSignMessage(account);\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const { signature } = await signMessage({\n * message: messageBytes,\n * });\n * window.alert(`Signature bytes: ${signature.toString()}`);\n * } catch (e) {\n * console.error('Failed to sign message', e);\n * }\n * }}\n * >\n * Sign Message\n * </button>\n * );\n * }\n * ```\n */\nexport function useSignMessage<TWalletAccount extends UiWalletAccount>(\n ...config: Parameters<typeof useSignMessages<TWalletAccount>>\n): (input: Input) => Promise<Output> {\n const signMessages = useSignMessages(...config);\n return useCallback(\n async input => {\n const [result] = await signMessages(input);\n return result;\n },\n [signMessages],\n );\n}\n\nfunction useSignMessages<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n): (...inputs: readonly Input[]) => Promise<readonly Output[]> {\n const signMessageFeature = getWalletAccountFeature(\n uiWalletAccount,\n SolanaSignMessage,\n ) as SolanaSignMessageFeature[typeof SolanaSignMessage];\n const account = getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletAccount);\n return useCallback(\n async (...inputs) => {\n const inputsWithAccount = inputs.map(input => ({ ...input, account }));\n const results = await signMessageFeature.signMessage(...inputsWithAccount);\n const resultsWithoutSignatureType = results.map(\n ({\n signatureType: _, // Solana signatures are always of type `ed25519` so drop this property.\n ...rest\n }) => rest,\n );\n return resultsWithoutSignatureType;\n },\n [signMessageFeature, account],\n );\n}\n","import {\n SolanaSignAndSendTransaction,\n SolanaSignTransaction,\n SolanaSignTransactionFeature,\n SolanaSignTransactionInput,\n SolanaSignTransactionOutput,\n} from '@solana/wallet-standard-features';\nimport {\n WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED,\n WalletStandardError,\n} from '@wallet-standard/errors';\nimport { getWalletAccountFeature, UiWalletAccount } from '@wallet-standard/ui';\nimport { getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED } from '@wallet-standard/ui-registry';\nimport { useCallback } from 'react';\n\nimport { OnlySolanaChains } from './chain';\n\ntype Input = Readonly<\n Omit<SolanaSignTransactionInput, 'account' | 'chain' | 'options'> & {\n options?: Readonly<{\n minContextSlot?: bigint;\n }>;\n }\n>;\ntype Output = SolanaSignTransactionOutput;\n\n/**\n * Use this to get a function capable of signing a serialized transaction with the private key of a\n * {@link UiWalletAccount}\n *\n * @param chain The identifier of the chain the transaction is destined for. Wallets may use this to\n * simulate the transaction for the user.\n *\n * @example\n * ```tsx\n * import { useSignTransaction } from '@solana/react';\n *\n * function SignTransactionButton({ account, transactionBytes }) {\n * const signTransaction = useSignTransaction(account, 'solana:devnet');\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const { signedTransaction } = await signTransaction({\n * transaction: transactionBytes,\n * });\n * window.alert(`Signed transaction bytes: ${signedTransaction.toString()}`);\n * } catch (e) {\n * console.error('Failed to sign transaction', e);\n * }\n * }}\n * >\n * Sign Transaction\n * </button>\n * );\n * }\n * ```\n */\nexport function useSignTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: OnlySolanaChains<TWalletAccount['chains']>,\n): (input: Input) => Promise<Output>;\nexport function useSignTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (input: Input) => Promise<Output>;\nexport function useSignTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (input: Input) => Promise<Output> {\n const signTransactions = useSignTransactions(uiWalletAccount, chain);\n return useCallback(\n async input => {\n const [result] = await signTransactions(input);\n return result;\n },\n [signTransactions],\n );\n}\n\nfunction useSignTransactions<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (...inputs: readonly Input[]) => Promise<readonly Output[]> {\n if (!uiWalletAccount.chains.includes(chain)) {\n throw new WalletStandardError(WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED, {\n address: uiWalletAccount.address,\n chain,\n featureName: SolanaSignAndSendTransaction,\n supportedChains: [...uiWalletAccount.chains],\n supportedFeatures: [...uiWalletAccount.features],\n });\n }\n const signTransactionFeature = getWalletAccountFeature(\n uiWalletAccount,\n SolanaSignTransaction,\n ) as SolanaSignTransactionFeature[typeof SolanaSignTransaction];\n const account = getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletAccount);\n return useCallback(\n async (...inputs) => {\n const inputsWithAccountAndChain = inputs.map(({ options, ...rest }) => {\n const minContextSlot = options?.minContextSlot;\n return {\n ...rest,\n account,\n chain,\n ...(minContextSlot != null\n ? {\n options: {\n minContextSlot: Number(minContextSlot),\n },\n }\n : null),\n };\n });\n const results = await signTransactionFeature.signTransaction(...inputsWithAccountAndChain);\n return results;\n },\n [signTransactionFeature, account, chain],\n );\n}\n","import { Address, address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\nimport { getAbortablePromise } from '@solana/promises';\nimport { MessageModifyingSigner, SignableMessage } from '@solana/signers';\nimport type { UiWalletAccount } from '@wallet-standard/ui';\nimport { useMemo } from 'react';\n\nimport { useSignMessage } from './useSignMessage';\n\n/**\n * Use this to get a {@link MessageSigner} capable of signing messages with the private key of a\n * {@link UiWalletAccount}\n *\n * @returns A {@link MessageModifyingSigner}. This is a conservative assumption based on the fact\n * that your application can not control whether or not the wallet will modify the message before\n * signing it. Otherwise this method could more specifically return a {@link MessageSigner} or a\n * {@link MessagePartialSigner}.\n *\n * @example\n * ```tsx\n * import { useWalletAccountMessageSigner } from '@solana/react';\n * import { createSignableMessage } from '@solana/signers';\n *\n * function SignMessageButton({ account, text }) {\n * const messageSigner = useWalletAccountMessageSigner(account);\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const signableMessage = createSignableMessage(text);\n * const [signedMessage] = await messageSigner.modifyAndSignMessages([signableMessage]);\n * const messageWasModified = signableMessage.content !== signedMessage.content;\n * const signatureBytes = signedMessage.signatures[messageSigner.address];\n * window.alert(\n * `Signature bytes: ${signatureBytes.toString()}${\n * messageWasModified ? ' (message was modified)' : ''\n * }`,\n * );\n * } catch (e) {\n * console.error('Failed to sign message', e);\n * }\n * }}\n * >\n * Sign Message: {text}\n * </button>\n * );\n * }\n * ```\n */\nexport function useWalletAccountMessageSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n): MessageModifyingSigner<TWalletAccount['address']> {\n const signMessage = useSignMessage(uiWalletAccount);\n return useMemo(\n () => ({\n address: address(uiWalletAccount.address),\n async modifyAndSignMessages(messages, config) {\n config?.abortSignal?.throwIfAborted();\n if (messages.length > 1) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED);\n }\n if (messages.length === 0) {\n return messages;\n }\n const { content: originalMessage, signatures: originalSignatureMap } = messages[0];\n const input = {\n message: originalMessage,\n };\n const { signedMessage, signature } = await getAbortablePromise(signMessage(input), config?.abortSignal);\n const messageWasModified =\n originalMessage.length !== signedMessage.length ||\n originalMessage.some((originalByte, ii) => originalByte !== signedMessage[ii]);\n const originalSignature = originalSignatureMap[uiWalletAccount.address as Address<string>] as\n | SignatureBytes\n | undefined;\n const signatureIsNew = !originalSignature?.every((originalByte, ii) => originalByte === signature[ii]);\n if (!signatureIsNew && !messageWasModified) {\n // We already had this exact signature, and the message wasn't modified.\n // Don't replace the existing message object.\n return messages;\n }\n const nextSignatureMap = messageWasModified\n ? { [uiWalletAccount.address]: signature }\n : { ...originalSignatureMap, [uiWalletAccount.address]: signature };\n const outputMessages = Object.freeze([\n Object.freeze({\n content: signedMessage,\n signatures: Object.freeze(nextSignatureMap),\n }) as SignableMessage,\n ]);\n return outputMessages;\n },\n }),\n [uiWalletAccount, signMessage],\n );\n}\n","import { address } from '@solana/addresses';\nimport { ReadonlyUint8Array } from '@solana/codecs-core';\nimport { SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED, SolanaError } from '@solana/errors';\nimport { getAbortablePromise } from '@solana/promises';\nimport { TransactionModifyingSigner } from '@solana/signers';\nimport { getCompiledTransactionMessageDecoder } from '@solana/transaction-messages';\nimport {\n assertIsTransactionWithinSizeLimit,\n getTransactionCodec,\n getTransactionLifetimeConstraintFromCompiledTransactionMessage,\n Transaction,\n TransactionWithinSizeLimit,\n TransactionWithLifetime,\n} from '@solana/transactions';\nimport { UiWalletAccount } from '@wallet-standard/ui';\nimport { useMemo, useRef } from 'react';\n\nimport { OnlySolanaChains } from './chain';\nimport { useSignTransaction } from './useSignTransaction';\n\n/**\n * Use this to get a {@link TransactionSigner} capable of signing serialized transactions with the\n * private key of a {@link UiWalletAccount}\n *\n * @returns A {@link TransactionModifyingSigner}. This is a conservative assumption based on the\n * fact that your application can not control whether or not the wallet will modify the transaction\n * before signing it (eg. to add guard instructions, or a priority fee budget). Otherwise this\n * method could more specifically return a {@link TransactionSigner} or a\n * {@link TransactionPartialSigner}.\n *\n * @example\n * ```tsx\n * import { useWalletAccountTransactionSigner } from '@solana/react';\n *\n * function SignTransactionButton({ account, transaction }) {\n * const transactionSigner = useWalletAccountTransactionSigner(account, 'solana:devnet');\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const [{ signatures }] = await transactionSigner.modifyAndSignTransactions([transaction]);\n * const signatureBytes = signatures[transactionSigner.address];\n * window.alert(`Signature bytes: ${signatureBytes.toString()}`);\n * } catch (e) {\n * console.error('Failed to sign transaction', e);\n * }\n * }}\n * >\n * Sign Transaction\n * </button>\n * );\n * }\n * ```\n */\nexport function useWalletAccountTransactionSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: OnlySolanaChains<TWalletAccount['chains']>,\n): TransactionModifyingSigner<TWalletAccount['address']>;\nexport function useWalletAccountTransactionSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): TransactionModifyingSigner<TWalletAccount['address']>;\nexport function useWalletAccountTransactionSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): TransactionModifyingSigner<TWalletAccount['address']> {\n const encoderRef = useRef<ReturnType<typeof getTransactionCodec> | null>(null);\n const signTransaction = useSignTransaction(uiWalletAccount, chain);\n return useMemo(\n () => ({\n address: address(uiWalletAccount.address),\n async modifyAndSignTransactions(transactions, config = {}) {\n const { abortSignal, ...options } = config;\n abortSignal?.throwIfAborted();\n const transactionCodec = (encoderRef.current ||= getTransactionCodec());\n if (transactions.length > 1) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED);\n }\n if (transactions.length === 0) {\n return transactions as readonly (Transaction &\n TransactionWithinSizeLimit &\n TransactionWithLifetime)[];\n }\n const [transaction] = transactions;\n const wireTransactionBytes = transactionCodec.encode(transaction);\n const inputWithOptions = {\n ...options,\n transaction: wireTransactionBytes as Uint8Array,\n };\n const { signedTransaction } = await getAbortablePromise(signTransaction(inputWithOptions), abortSignal);\n const decodedSignedTransaction = transactionCodec.decode(\n signedTransaction,\n ) as (typeof transactions)[number];\n\n assertIsTransactionWithinSizeLimit(decodedSignedTransaction);\n\n const existingLifetime =\n 'lifetimeConstraint' in transaction\n ? (transaction as TransactionWithLifetime).lifetimeConstraint\n : undefined;\n\n if (existingLifetime) {\n if (uint8ArraysEqual(decodedSignedTransaction.messageBytes, transaction.messageBytes)) {\n // If the transaction has identical bytes, the lifetime won't have changed\n return Object.freeze([\n {\n ...decodedSignedTransaction,\n lifetimeConstraint: existingLifetime,\n },\n ]);\n }\n\n // If the transaction has changed, check the lifetime constraint field\n const compiledTransactionMessage = getCompiledTransactionMessageDecoder().decode(\n decodedSignedTransaction.messageBytes,\n );\n const currentToken =\n 'blockhash' in existingLifetime ? existingLifetime.blockhash : existingLifetime.nonce;\n\n if (compiledTransactionMessage.lifetimeToken === currentToken) {\n return Object.freeze([\n {\n ...decodedSignedTransaction,\n lifetimeConstraint: existingLifetime,\n },\n ]);\n }\n }\n\n // If we get here then there is no existing lifetime, or the lifetime has changed. We need to attach a new lifetime\n const compiledTransactionMessage = getCompiledTransactionMessageDecoder().decode(\n decodedSignedTransaction.messageBytes,\n );\n const lifetimeConstraint =\n await getTransactionLifetimeConstraintFromCompiledTransactionMessage(compiledTransactionMessage);\n return Object.freeze([\n {\n ...decodedSignedTransaction,\n lifetimeConstraint,\n },\n ]);\n },\n }),\n [uiWalletAccount.address, signTransaction],\n );\n}\n\nfunction uint8ArraysEqual(arr1: ReadonlyUint8Array, arr2: ReadonlyUint8Array) {\n return arr1.length === arr2.length && arr1.every((value, index) => value === arr2[index]);\n}\n","import { address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\nimport { getAbortablePromise } from '@solana/promises';\nimport { TransactionSendingSigner } from '@solana/signers';\nimport { getTransactionEncoder } from '@solana/transactions';\nimport { UiWalletAccount } from '@wallet-standard/ui';\nimport { useMemo, useRef } from 'react';\n\nimport { OnlySolanaChains } from './chain';\nimport { useSignAndSendTransaction } from './useSignAndSendTransaction';\n\n/**\n * Use this to get a {@link TransactionSendingSigner} capable of signing a serialized transaction\n * with the private key of a {@link UiWalletAccount} and sending it to the network for processing.\n *\n * @param chain The identifier of the chain the transaction is destined for. Wallets may use this to\n * simulate the transaction for the user.\n *\n * @example\n * ```tsx\n * import { useWalletAccountTransactionSendingSigner } from '@solana/react';\n * import {\n * appendTransactionMessageInstruction,\n * createSolanaRpc,\n * getBase58Decoder,\n * pipe,\n * setTransactionMessageFeePayerSigner,\n * setTransactionMessageLifetimeUsingBlockhash,\n * signAndSendTransactionMessageWithSigners,\n * } from '@solana/kit';\n *\n * function RecordMemoButton({ account, rpc, text }) {\n * const signer = useWalletAccountTransactionSendingSigner(account, 'solana:devnet');\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const { value: latestBlockhash } = await createSolanaRpc('https://api.devnet.solana.com')\n * .getLatestBlockhash()\n * .send();\n * const message = pipe(\n * createTransactionMessage({ version: 'legacy' }),\n * m => setTransactionMessageFeePayerSigner(signer, m),\n * m => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m),\n * m => appendTransactionMessageInstruction(getAddMemoInstruction({ memo: text }), m),\n * );\n * const signatureBytes = await signAndSendTransactionMessageWithSigners(message);\n * const base58Signature = getBase58Decoder().decode(signature);\n * window.alert(`View transaction: https://explorer.solana.com/tx/${base58Signature}?cluster=devnet`);\n * } catch (e) {\n * console.error('Failed to record memo', e);\n * }\n * }}\n * >\n * Record Memo\n * </button>\n * );\n * }\n * ```\n */\nexport function useWalletAccountTransactionSendingSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: OnlySolanaChains<TWalletAccount['chains']>,\n): TransactionSendingSigner<TWalletAccount['address']>;\nexport function useWalletAccountTransactionSendingSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): TransactionSendingSigner<TWalletAccount['address']>;\nexport function useWalletAccountTransactionSendingSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): TransactionSendingSigner<TWalletAccount['address']> {\n const encoderRef = useRef<ReturnType<typeof getTransactionEncoder> | null>(null);\n const signAndSendTransaction = useSignAndSendTransaction(uiWalletAccount, chain);\n return useMemo(\n () => ({\n address: address(uiWalletAccount.address),\n async signAndSendTransactions(transactions, config = {}) {\n const { abortSignal, ...options } = config;\n abortSignal?.throwIfAborted();\n const transactionEncoder = (encoderRef.current ||= getTransactionEncoder());\n if (transactions.length > 1) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED);\n }\n if (transactions.length === 0) {\n return [];\n }\n const [transaction] = transactions;\n const wireTransactionBytes = transactionEncoder.encode(transaction);\n const inputWithOptions = {\n ...options,\n transaction: wireTransactionBytes as Uint8Array,\n };\n const { signature } = await getAbortablePromise(signAndSendTransaction(inputWithOptions), abortSignal);\n return Object.freeze([signature as SignatureBytes]);\n },\n }),\n [signAndSendTransaction, uiWalletAccount.address],\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/useSignAndSendTransaction.ts","../src/useSignIn.ts","../src/useSignMessage.ts","../src/useSignTransaction.ts","../../codecs-core/src/bytes.ts","../src/useWalletAccountMessageSigner.ts","../src/useWalletAccountTransactionSigner.ts","../src/useWalletAccountTransactionSendingSigner.ts"],"names":["useCallback","WalletStandardError","WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED","SolanaSignAndSendTransaction","getWalletAccountFeature","getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","SolanaSignIn","getWalletFeature","getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","SolanaSignMessage","SolanaSignTransaction","useMemo","address","SolanaError","SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED","getAbortablePromise","useRef","transactions","getTransactionCodec","assertIsTransactionWithinSizeLimit","compiledTransactionMessage","getCompiledTransactionMessageDecoder","getTransactionLifetimeConstraintFromCompiledTransactionMessage","getTransactionEncoder"],"mappings":"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","file":"index.browser.cjs","sourcesContent":["import {\n SolanaSignAndSendTransaction,\n SolanaSignAndSendTransactionFeature,\n SolanaSignAndSendTransactionInput,\n SolanaSignAndSendTransactionOutput,\n} from '@solana/wallet-standard-features';\nimport {\n WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED,\n WalletStandardError,\n} from '@wallet-standard/errors';\nimport { getWalletAccountFeature, type UiWalletAccount } from '@wallet-standard/ui';\nimport { getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED } from '@wallet-standard/ui-registry';\nimport { useCallback } from 'react';\n\nimport { OnlySolanaChains } from './chain';\n\ntype Input = Readonly<\n Omit<SolanaSignAndSendTransactionInput, 'account' | 'chain' | 'options'> & {\n options?: Readonly<{\n minContextSlot?: bigint;\n }>;\n }\n>;\ntype Output = SolanaSignAndSendTransactionOutput;\n\n/**\n * Use this to get a function capable of signing a serialized transaction with the private key of a\n * {@link UiWalletAccount} and sending it to the network for processing.\n *\n * @param chain The identifier of the chain the transaction is destined for. Wallets may use this to\n * simulate the transaction for the user.\n *\n * @example\n * ```tsx\n * import { getBase58Decoder } from '@solana/codecs-strings';\n * import { useSignAndSendTransaction } from '@solana/react';\n *\n * function SignAndSendTransactionButton({ account, transactionBytes }) {\n * const signAndSendTransaction = useSignAndSendTransaction(account, 'solana:devnet');\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const { signature } = await signAndSendTransaction({\n * transaction: transactionBytes,\n * });\n * const base58TransactionSignature = getBase58Decoder().decode(signature);\n * window.alert(\n * `View transaction: https://explorer.solana.com/tx/${base58TransactionSignature}?cluster=devnet`,\n * );\n * } catch (e) {\n * console.error('Failed to send transaction', e);\n * }\n * }}\n * >\n * Sign and Send Transaction\n * </button>\n * );\n * }\n * ```\n */\nexport function useSignAndSendTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: OnlySolanaChains<TWalletAccount['chains']>,\n): (input: Input) => Promise<Output>;\nexport function useSignAndSendTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (input: Input) => Promise<Output>;\nexport function useSignAndSendTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (input: Input) => Promise<Output> {\n const signAndSendTransactions = useSignAndSendTransactions(uiWalletAccount, chain);\n return useCallback(\n async input => {\n const [result] = await signAndSendTransactions(input);\n return result;\n },\n [signAndSendTransactions],\n );\n}\n\nfunction useSignAndSendTransactions<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (...inputs: readonly Input[]) => Promise<readonly Output[]> {\n if (!uiWalletAccount.chains.includes(chain)) {\n throw new WalletStandardError(WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED, {\n address: uiWalletAccount.address,\n chain,\n featureName: SolanaSignAndSendTransaction,\n supportedChains: [...uiWalletAccount.chains],\n supportedFeatures: [...uiWalletAccount.features],\n });\n }\n const signAndSendTransactionFeature = getWalletAccountFeature(\n uiWalletAccount,\n SolanaSignAndSendTransaction,\n ) as SolanaSignAndSendTransactionFeature[typeof SolanaSignAndSendTransaction];\n const account = getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletAccount);\n return useCallback(\n async (...inputs) => {\n const inputsWithChainAndAccount = inputs.map(({ options, ...rest }) => {\n const minContextSlot = options?.minContextSlot;\n return {\n ...rest,\n account,\n chain,\n ...(minContextSlot != null\n ? {\n options: {\n minContextSlot: Number(minContextSlot),\n },\n }\n : null),\n };\n });\n const results = await signAndSendTransactionFeature.signAndSendTransaction(...inputsWithChainAndAccount);\n return results;\n },\n [account, chain, signAndSendTransactionFeature],\n );\n}\n","import { Address } from '@solana/addresses';\nimport {\n SolanaSignIn,\n SolanaSignInFeature,\n SolanaSignInInput,\n SolanaSignInOutput,\n} from '@solana/wallet-standard-features';\nimport {\n getWalletAccountFeature,\n getWalletFeature,\n UiWallet,\n UiWalletAccount,\n UiWalletHandle,\n} from '@wallet-standard/ui';\nimport {\n getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,\n getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,\n getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,\n} from '@wallet-standard/ui-registry';\nimport { useCallback } from 'react';\n\ntype Input = SolanaSignInInput;\ntype Output = Omit<SolanaSignInOutput, 'account' | 'signatureType'> &\n Readonly<{\n account: UiWalletAccount;\n }>;\n\n/**\n * Use the ['Sign In With Solana'](https://phantom.app/learn/developers/sign-in-with-solana) feature\n * of a {@link UiWallet} or {@link UiWalletAccount}.\n *\n * @returns A function that you can call to sign in with the particular wallet and address specified\n * by the supplied {@link UiWalletAccount}\n *\n * @example\n * ```tsx\n * import { useSignIn } from '@solana/react';\n *\n * function SignInButton({ wallet }) {\n * const csrfToken = useCsrfToken();\n * const signIn = useSignIn(wallet);\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const { account, signedMessage, signature } = await signIn({\n * requestId: csrfToken,\n * });\n * // Authenticate the user, typically on the server, by verifying that\n * // `signedMessage` was signed by the person who holds the private key for\n * // `account.publicKey`.\n * //\n * // Authorize the user, also on the server, by decoding `signedMessage` as the\n * // text of a Sign In With Solana message, verifying that it was not modified\n * // from the values your application expects, and that its content is sufficient\n * // to grant them access.\n * window.alert(`You are now signed in with the address ${account.address}`);\n * } catch (e) {\n * console.error('Failed to sign in', e);\n * }\n * }}\n * >\n * Sign In\n * </button>\n * );\n * }\n * ```\n */\nexport function useSignIn(uiWalletAccount: UiWalletAccount): (input?: Omit<Input, 'address'>) => Promise<Output>;\n/**\n * @returns A function that you can call to sign in with the supplied {@link UiWallet}\n */\nexport function useSignIn(uiWallet: UiWallet): (input?: Input) => Promise<Output>;\nexport function useSignIn(uiWalletHandle: UiWalletHandle): (input?: Input) => Promise<Output> {\n const signIns = useSignIns(uiWalletHandle);\n return useCallback(\n async input => {\n const [result] = await signIns(input);\n return result;\n },\n [signIns],\n );\n}\n\nfunction useSignIns(\n uiWalletHandle: UiWalletHandle,\n): (...inputs: readonly (Input | undefined)[]) => Promise<readonly Output[]> {\n let signMessageFeature: SolanaSignInFeature[typeof SolanaSignIn];\n if ('address' in uiWalletHandle && typeof uiWalletHandle.address === 'string') {\n getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletHandle as UiWalletAccount);\n signMessageFeature = getWalletAccountFeature(\n uiWalletHandle as UiWalletAccount,\n SolanaSignIn,\n ) as SolanaSignInFeature[typeof SolanaSignIn];\n } else {\n signMessageFeature = getWalletFeature(uiWalletHandle, SolanaSignIn) as SolanaSignInFeature[typeof SolanaSignIn];\n }\n const wallet = getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletHandle);\n return useCallback(\n async (...inputs) => {\n const inputsWithAddressAndChainId = inputs.map(input => ({\n ...input,\n // Prioritize the `UiWalletAccount` address if it exists.\n ...('address' in uiWalletHandle ? { address: uiWalletHandle.address as Address } : null),\n }));\n const results = await signMessageFeature.signIn(...inputsWithAddressAndChainId);\n const resultsWithoutSignatureType = results.map(\n ({\n account,\n signatureType: _, // Solana signatures are always of type `ed25519` so drop this property.\n ...rest\n }) => ({\n ...rest,\n account: getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(\n wallet,\n account,\n ),\n }),\n );\n return resultsWithoutSignatureType;\n },\n [signMessageFeature, uiWalletHandle, wallet],\n );\n}\n","import {\n SolanaSignMessage,\n SolanaSignMessageFeature,\n SolanaSignMessageInput,\n SolanaSignMessageOutput,\n} from '@solana/wallet-standard-features';\nimport { getWalletAccountFeature, UiWalletAccount } from '@wallet-standard/ui';\nimport { getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED } from '@wallet-standard/ui-registry';\nimport { useCallback } from 'react';\n\ntype Input = Omit<SolanaSignMessageInput, 'account'>;\ntype Output = Omit<SolanaSignMessageOutput, 'signatureType'>;\n\n/**\n * Use this to get a function capable of signing a message with the private key of a\n * {@link UiWalletAccount}\n *\n * @example\n * ```tsx\n * import { useSignMessage } from '@solana/react';\n *\n * function SignMessageButton({ account, messageBytes }) {\n * const signMessage = useSignMessage(account);\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const { signature } = await signMessage({\n * message: messageBytes,\n * });\n * window.alert(`Signature bytes: ${signature.toString()}`);\n * } catch (e) {\n * console.error('Failed to sign message', e);\n * }\n * }}\n * >\n * Sign Message\n * </button>\n * );\n * }\n * ```\n */\nexport function useSignMessage<TWalletAccount extends UiWalletAccount>(\n ...config: Parameters<typeof useSignMessages<TWalletAccount>>\n): (input: Input) => Promise<Output> {\n const signMessages = useSignMessages(...config);\n return useCallback(\n async input => {\n const [result] = await signMessages(input);\n return result;\n },\n [signMessages],\n );\n}\n\nfunction useSignMessages<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n): (...inputs: readonly Input[]) => Promise<readonly Output[]> {\n const signMessageFeature = getWalletAccountFeature(\n uiWalletAccount,\n SolanaSignMessage,\n ) as SolanaSignMessageFeature[typeof SolanaSignMessage];\n const account = getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletAccount);\n return useCallback(\n async (...inputs) => {\n const inputsWithAccount = inputs.map(input => ({ ...input, account }));\n const results = await signMessageFeature.signMessage(...inputsWithAccount);\n const resultsWithoutSignatureType = results.map(\n ({\n signatureType: _, // Solana signatures are always of type `ed25519` so drop this property.\n ...rest\n }) => rest,\n );\n return resultsWithoutSignatureType;\n },\n [signMessageFeature, account],\n );\n}\n","import {\n SolanaSignAndSendTransaction,\n SolanaSignTransaction,\n SolanaSignTransactionFeature,\n SolanaSignTransactionInput,\n SolanaSignTransactionOutput,\n} from '@solana/wallet-standard-features';\nimport {\n WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED,\n WalletStandardError,\n} from '@wallet-standard/errors';\nimport { getWalletAccountFeature, UiWalletAccount } from '@wallet-standard/ui';\nimport { getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED } from '@wallet-standard/ui-registry';\nimport { useCallback } from 'react';\n\nimport { OnlySolanaChains } from './chain';\n\ntype Input = Readonly<\n Omit<SolanaSignTransactionInput, 'account' | 'chain' | 'options'> & {\n options?: Readonly<{\n minContextSlot?: bigint;\n }>;\n }\n>;\ntype Output = SolanaSignTransactionOutput;\n\n/**\n * Use this to get a function capable of signing a serialized transaction with the private key of a\n * {@link UiWalletAccount}\n *\n * @param chain The identifier of the chain the transaction is destined for. Wallets may use this to\n * simulate the transaction for the user.\n *\n * @example\n * ```tsx\n * import { useSignTransaction } from '@solana/react';\n *\n * function SignTransactionButton({ account, transactionBytes }) {\n * const signTransaction = useSignTransaction(account, 'solana:devnet');\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const { signedTransaction } = await signTransaction({\n * transaction: transactionBytes,\n * });\n * window.alert(`Signed transaction bytes: ${signedTransaction.toString()}`);\n * } catch (e) {\n * console.error('Failed to sign transaction', e);\n * }\n * }}\n * >\n * Sign Transaction\n * </button>\n * );\n * }\n * ```\n */\nexport function useSignTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: OnlySolanaChains<TWalletAccount['chains']>,\n): (input: Input) => Promise<Output>;\nexport function useSignTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (input: Input) => Promise<Output>;\nexport function useSignTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (input: Input) => Promise<Output> {\n const signTransactions = useSignTransactions(uiWalletAccount, chain);\n return useCallback(\n async input => {\n const [result] = await signTransactions(input);\n return result;\n },\n [signTransactions],\n );\n}\n\nfunction useSignTransactions<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (...inputs: readonly Input[]) => Promise<readonly Output[]> {\n if (!uiWalletAccount.chains.includes(chain)) {\n throw new WalletStandardError(WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED, {\n address: uiWalletAccount.address,\n chain,\n featureName: SolanaSignAndSendTransaction,\n supportedChains: [...uiWalletAccount.chains],\n supportedFeatures: [...uiWalletAccount.features],\n });\n }\n const signTransactionFeature = getWalletAccountFeature(\n uiWalletAccount,\n SolanaSignTransaction,\n ) as SolanaSignTransactionFeature[typeof SolanaSignTransaction];\n const account = getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletAccount);\n return useCallback(\n async (...inputs) => {\n const inputsWithAccountAndChain = inputs.map(({ options, ...rest }) => {\n const minContextSlot = options?.minContextSlot;\n return {\n ...rest,\n account,\n chain,\n ...(minContextSlot != null\n ? {\n options: {\n minContextSlot: Number(minContextSlot),\n },\n }\n : null),\n };\n });\n const results = await signTransactionFeature.signTransaction(...inputsWithAccountAndChain);\n return results;\n },\n [signTransactionFeature, account, chain],\n );\n}\n","import { ReadonlyUint8Array } from './readonly-uint8array';\n\n/**\n * Concatenates an array of `Uint8Array`s into a single `Uint8Array`.\n * Reuses the original byte array when applicable.\n *\n * @param byteArrays - The array of byte arrays to concatenate.\n *\n * @example\n * ```ts\n * const bytes1 = new Uint8Array([0x01, 0x02]);\n * const bytes2 = new Uint8Array([]);\n * const bytes3 = new Uint8Array([0x03, 0x04]);\n * const bytes = mergeBytes([bytes1, bytes2, bytes3]);\n * // ^ [0x01, 0x02, 0x03, 0x04]\n * ```\n */\nexport const mergeBytes = (byteArrays: Uint8Array[]): Uint8Array => {\n const nonEmptyByteArrays = byteArrays.filter(arr => arr.length);\n if (nonEmptyByteArrays.length === 0) {\n return byteArrays.length ? byteArrays[0] : new Uint8Array();\n }\n\n if (nonEmptyByteArrays.length === 1) {\n return nonEmptyByteArrays[0];\n }\n\n const totalLength = nonEmptyByteArrays.reduce((total, arr) => total + arr.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n nonEmptyByteArrays.forEach(arr => {\n result.set(arr, offset);\n offset += arr.length;\n });\n return result;\n};\n\n/**\n * Pads a `Uint8Array` with zeroes to the specified length.\n * If the array is longer than the specified length, it is returned as-is.\n *\n * @param bytes - The byte array to pad.\n * @param length - The desired length of the byte array.\n *\n * @example\n * Adds zeroes to the end of the byte array to reach the desired length.\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02]);\n * const paddedBytes = padBytes(bytes, 4);\n * // ^ [0x01, 0x02, 0x00, 0x00]\n * ```\n *\n * @example\n * Returns the original byte array if it is already at the desired length.\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02]);\n * const paddedBytes = padBytes(bytes, 2);\n * // bytes === paddedBytes\n * ```\n */\nexport function padBytes(bytes: Uint8Array, length: number): Uint8Array;\nexport function padBytes(bytes: ReadonlyUint8Array, length: number): ReadonlyUint8Array;\nexport function padBytes(bytes: ReadonlyUint8Array, length: number): ReadonlyUint8Array {\n if (bytes.length >= length) return bytes;\n const paddedBytes = new Uint8Array(length).fill(0);\n paddedBytes.set(bytes);\n return paddedBytes;\n}\n\n/**\n * Fixes a `Uint8Array` to the specified length.\n * If the array is longer than the specified length, it is truncated.\n * If the array is shorter than the specified length, it is padded with zeroes.\n *\n * @param bytes - The byte array to truncate or pad.\n * @param length - The desired length of the byte array.\n *\n * @example\n * Truncates the byte array to the desired length.\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n * const fixedBytes = fixBytes(bytes, 2);\n * // ^ [0x01, 0x02]\n * ```\n *\n * @example\n * Adds zeroes to the end of the byte array to reach the desired length.\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02]);\n * const fixedBytes = fixBytes(bytes, 4);\n * // ^ [0x01, 0x02, 0x00, 0x00]\n * ```\n *\n * @example\n * Returns the original byte array if it is already at the desired length.\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02]);\n * const fixedBytes = fixBytes(bytes, 2);\n * // bytes === fixedBytes\n * ```\n */\nexport const fixBytes = (bytes: ReadonlyUint8Array | Uint8Array, length: number): ReadonlyUint8Array | Uint8Array =>\n padBytes(bytes.length <= length ? bytes : bytes.slice(0, length), length);\n\n/**\n * Returns true if and only if the provided `data` byte array contains\n * the provided `bytes` byte array at the specified `offset`.\n *\n * @param data - The byte sequence to search for.\n * @param bytes - The byte array in which to search for `data`.\n * @param offset - The position in `bytes` where the search begins.\n *\n * @example\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n * const data = new Uint8Array([0x02, 0x03]);\n * containsBytes(bytes, data, 1); // true\n * containsBytes(bytes, data, 2); // false\n * ```\n */\nexport function containsBytes(\n data: ReadonlyUint8Array | Uint8Array,\n bytes: ReadonlyUint8Array | Uint8Array,\n offset: number,\n): boolean {\n const slice = offset === 0 && data.length === bytes.length ? data : data.slice(offset, offset + bytes.length);\n return bytesEqual(slice, bytes);\n}\n\n/**\n * Returns true if and only if the provided `bytes1` and `bytes2` byte arrays are equal.\n *\n * @param bytes1 - The first byte array to compare.\n * @param bytes2 - The second byte array to compare.\n *\n * @example\n * ```ts\n * const bytes1 = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n * const bytes2 = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n * bytesEqual(bytes1, bytes2); // true\n * ```\n */\nexport function bytesEqual(bytes1: ReadonlyUint8Array | Uint8Array, bytes2: ReadonlyUint8Array | Uint8Array): boolean {\n return bytes1.length === bytes2.length && bytes1.every((value, index) => value === bytes2[index]);\n}\n","import { Address, address } from '@solana/addresses';\nimport { bytesEqual } from '@solana/codecs-core';\nimport { SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\nimport { getAbortablePromise } from '@solana/promises';\nimport { MessageModifyingSigner, SignableMessage } from '@solana/signers';\nimport type { UiWalletAccount } from '@wallet-standard/ui';\nimport { useMemo } from 'react';\n\nimport { useSignMessage } from './useSignMessage';\n\n/**\n * Use this to get a {@link MessageSigner} capable of signing messages with the private key of a\n * {@link UiWalletAccount}\n *\n * @returns A {@link MessageModifyingSigner}. This is a conservative assumption based on the fact\n * that your application can not control whether or not the wallet will modify the message before\n * signing it. Otherwise this method could more specifically return a {@link MessageSigner} or a\n * {@link MessagePartialSigner}.\n *\n * @example\n * ```tsx\n * import { useWalletAccountMessageSigner } from '@solana/react';\n * import { createSignableMessage } from '@solana/signers';\n *\n * function SignMessageButton({ account, text }) {\n * const messageSigner = useWalletAccountMessageSigner(account);\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const signableMessage = createSignableMessage(text);\n * const [signedMessage] = await messageSigner.modifyAndSignMessages([signableMessage]);\n * const messageWasModified = signableMessage.content !== signedMessage.content;\n * const signatureBytes = signedMessage.signatures[messageSigner.address];\n * window.alert(\n * `Signature bytes: ${signatureBytes.toString()}${\n * messageWasModified ? ' (message was modified)' : ''\n * }`,\n * );\n * } catch (e) {\n * console.error('Failed to sign message', e);\n * }\n * }}\n * >\n * Sign Message: {text}\n * </button>\n * );\n * }\n * ```\n */\nexport function useWalletAccountMessageSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n): MessageModifyingSigner<TWalletAccount['address']> {\n const signMessage = useSignMessage(uiWalletAccount);\n return useMemo(\n () => ({\n address: address(uiWalletAccount.address),\n async modifyAndSignMessages(messages, config) {\n config?.abortSignal?.throwIfAborted();\n if (messages.length > 1) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED);\n }\n if (messages.length === 0) {\n return messages;\n }\n const { content: originalMessage, signatures: originalSignatureMap } = messages[0];\n const input = {\n message: originalMessage,\n };\n const { signedMessage, signature } = await getAbortablePromise(signMessage(input), config?.abortSignal);\n const messageWasModified =\n originalMessage.length !== signedMessage.length ||\n originalMessage.some((originalByte, ii) => originalByte !== signedMessage[ii]);\n const originalSignature = originalSignatureMap[uiWalletAccount.address as Address<string>] as\n | SignatureBytes\n | undefined;\n const signatureIsNew = originalSignature === undefined || !bytesEqual(originalSignature, signature);\n if (!signatureIsNew && !messageWasModified) {\n // We already had this exact signature, and the message wasn't modified.\n // Don't replace the existing message object.\n return messages;\n }\n const nextSignatureMap = messageWasModified\n ? { [uiWalletAccount.address]: signature }\n : { ...originalSignatureMap, [uiWalletAccount.address]: signature };\n const outputMessages = Object.freeze([\n Object.freeze({\n content: signedMessage,\n signatures: Object.freeze(nextSignatureMap),\n }) as SignableMessage,\n ]);\n return outputMessages;\n },\n }),\n [uiWalletAccount, signMessage],\n );\n}\n","import { address } from '@solana/addresses';\nimport { bytesEqual } from '@solana/codecs-core';\nimport { SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED, SolanaError } from '@solana/errors';\nimport { getAbortablePromise } from '@solana/promises';\nimport { TransactionModifyingSigner } from '@solana/signers';\nimport { getCompiledTransactionMessageDecoder } from '@solana/transaction-messages';\nimport {\n assertIsTransactionWithinSizeLimit,\n getTransactionCodec,\n getTransactionLifetimeConstraintFromCompiledTransactionMessage,\n Transaction,\n TransactionWithinSizeLimit,\n TransactionWithLifetime,\n} from '@solana/transactions';\nimport { UiWalletAccount } from '@wallet-standard/ui';\nimport { useMemo, useRef } from 'react';\n\nimport { OnlySolanaChains } from './chain';\nimport { useSignTransaction } from './useSignTransaction';\n\n/**\n * Use this to get a {@link TransactionSigner} capable of signing serialized transactions with the\n * private key of a {@link UiWalletAccount}\n *\n * @returns A {@link TransactionModifyingSigner}. This is a conservative assumption based on the\n * fact that your application can not control whether or not the wallet will modify the transaction\n * before signing it (eg. to add guard instructions, or a priority fee budget). Otherwise this\n * method could more specifically return a {@link TransactionSigner} or a\n * {@link TransactionPartialSigner}.\n *\n * @example\n * ```tsx\n * import { useWalletAccountTransactionSigner } from '@solana/react';\n *\n * function SignTransactionButton({ account, transaction }) {\n * const transactionSigner = useWalletAccountTransactionSigner(account, 'solana:devnet');\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const [{ signatures }] = await transactionSigner.modifyAndSignTransactions([transaction]);\n * const signatureBytes = signatures[transactionSigner.address];\n * window.alert(`Signature bytes: ${signatureBytes.toString()}`);\n * } catch (e) {\n * console.error('Failed to sign transaction', e);\n * }\n * }}\n * >\n * Sign Transaction\n * </button>\n * );\n * }\n * ```\n */\nexport function useWalletAccountTransactionSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: OnlySolanaChains<TWalletAccount['chains']>,\n): TransactionModifyingSigner<TWalletAccount['address']>;\nexport function useWalletAccountTransactionSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): TransactionModifyingSigner<TWalletAccount['address']>;\nexport function useWalletAccountTransactionSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): TransactionModifyingSigner<TWalletAccount['address']> {\n const encoderRef = useRef<ReturnType<typeof getTransactionCodec> | null>(null);\n const signTransaction = useSignTransaction(uiWalletAccount, chain);\n return useMemo(\n () => ({\n address: address(uiWalletAccount.address),\n async modifyAndSignTransactions(transactions, config = {}) {\n const { abortSignal, ...options } = config;\n abortSignal?.throwIfAborted();\n const transactionCodec = (encoderRef.current ||= getTransactionCodec());\n if (transactions.length > 1) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED);\n }\n if (transactions.length === 0) {\n return transactions as readonly (Transaction &\n TransactionWithinSizeLimit &\n TransactionWithLifetime)[];\n }\n const [transaction] = transactions;\n const wireTransactionBytes = transactionCodec.encode(transaction);\n const inputWithOptions = {\n ...options,\n transaction: wireTransactionBytes as Uint8Array,\n };\n const { signedTransaction } = await getAbortablePromise(signTransaction(inputWithOptions), abortSignal);\n const decodedSignedTransaction = transactionCodec.decode(\n signedTransaction,\n ) as (typeof transactions)[number];\n\n assertIsTransactionWithinSizeLimit(decodedSignedTransaction);\n\n const existingLifetime =\n 'lifetimeConstraint' in transaction\n ? (transaction as TransactionWithLifetime).lifetimeConstraint\n : undefined;\n\n if (existingLifetime) {\n if (bytesEqual(decodedSignedTransaction.messageBytes, transaction.messageBytes)) {\n // If the transaction has identical bytes, the lifetime won't have changed\n return Object.freeze([\n {\n ...decodedSignedTransaction,\n lifetimeConstraint: existingLifetime,\n },\n ]);\n }\n\n // If the transaction has changed, check the lifetime constraint field\n const compiledTransactionMessage = getCompiledTransactionMessageDecoder().decode(\n decodedSignedTransaction.messageBytes,\n );\n const currentToken =\n 'blockhash' in existingLifetime ? existingLifetime.blockhash : existingLifetime.nonce;\n\n if (compiledTransactionMessage.lifetimeToken === currentToken) {\n return Object.freeze([\n {\n ...decodedSignedTransaction,\n lifetimeConstraint: existingLifetime,\n },\n ]);\n }\n }\n\n // If we get here then there is no existing lifetime, or the lifetime has changed. We need to attach a new lifetime\n const compiledTransactionMessage = getCompiledTransactionMessageDecoder().decode(\n decodedSignedTransaction.messageBytes,\n );\n const lifetimeConstraint =\n await getTransactionLifetimeConstraintFromCompiledTransactionMessage(compiledTransactionMessage);\n return Object.freeze([\n {\n ...decodedSignedTransaction,\n lifetimeConstraint,\n },\n ]);\n },\n }),\n [uiWalletAccount.address, signTransaction],\n );\n}\n","import { address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\nimport { getAbortablePromise } from '@solana/promises';\nimport { TransactionSendingSigner } from '@solana/signers';\nimport { getTransactionEncoder } from '@solana/transactions';\nimport { UiWalletAccount } from '@wallet-standard/ui';\nimport { useMemo, useRef } from 'react';\n\nimport { OnlySolanaChains } from './chain';\nimport { useSignAndSendTransaction } from './useSignAndSendTransaction';\n\n/**\n * Use this to get a {@link TransactionSendingSigner} capable of signing a serialized transaction\n * with the private key of a {@link UiWalletAccount} and sending it to the network for processing.\n *\n * @param chain The identifier of the chain the transaction is destined for. Wallets may use this to\n * simulate the transaction for the user.\n *\n * @example\n * ```tsx\n * import { useWalletAccountTransactionSendingSigner } from '@solana/react';\n * import {\n * appendTransactionMessageInstruction,\n * createSolanaRpc,\n * getBase58Decoder,\n * pipe,\n * setTransactionMessageFeePayerSigner,\n * setTransactionMessageLifetimeUsingBlockhash,\n * signAndSendTransactionMessageWithSigners,\n * } from '@solana/kit';\n *\n * function RecordMemoButton({ account, rpc, text }) {\n * const signer = useWalletAccountTransactionSendingSigner(account, 'solana:devnet');\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const { value: latestBlockhash } = await createSolanaRpc('https://api.devnet.solana.com')\n * .getLatestBlockhash()\n * .send();\n * const message = pipe(\n * createTransactionMessage({ version: 'legacy' }),\n * m => setTransactionMessageFeePayerSigner(signer, m),\n * m => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m),\n * m => appendTransactionMessageInstruction(getAddMemoInstruction({ memo: text }), m),\n * );\n * const signatureBytes = await signAndSendTransactionMessageWithSigners(message);\n * const base58Signature = getBase58Decoder().decode(signature);\n * window.alert(`View transaction: https://explorer.solana.com/tx/${base58Signature}?cluster=devnet`);\n * } catch (e) {\n * console.error('Failed to record memo', e);\n * }\n * }}\n * >\n * Record Memo\n * </button>\n * );\n * }\n * ```\n */\nexport function useWalletAccountTransactionSendingSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: OnlySolanaChains<TWalletAccount['chains']>,\n): TransactionSendingSigner<TWalletAccount['address']>;\nexport function useWalletAccountTransactionSendingSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): TransactionSendingSigner<TWalletAccount['address']>;\nexport function useWalletAccountTransactionSendingSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): TransactionSendingSigner<TWalletAccount['address']> {\n const encoderRef = useRef<ReturnType<typeof getTransactionEncoder> | null>(null);\n const signAndSendTransaction = useSignAndSendTransaction(uiWalletAccount, chain);\n return useMemo(\n () => ({\n address: address(uiWalletAccount.address),\n async signAndSendTransactions(transactions, config = {}) {\n const { abortSignal, ...options } = config;\n abortSignal?.throwIfAborted();\n const transactionEncoder = (encoderRef.current ||= getTransactionEncoder());\n if (transactions.length > 1) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED);\n }\n if (transactions.length === 0) {\n return [];\n }\n const [transaction] = transactions;\n const wireTransactionBytes = transactionEncoder.encode(transaction);\n const inputWithOptions = {\n ...options,\n transaction: wireTransactionBytes as Uint8Array,\n };\n const { signature } = await getAbortablePromise(signAndSendTransaction(inputWithOptions), abortSignal);\n return Object.freeze([signature as SignatureBytes]);\n },\n }),\n [signAndSendTransaction, uiWalletAccount.address],\n );\n}\n"]}
|
package/dist/index.browser.mjs
CHANGED
|
@@ -183,6 +183,9 @@ function useSignTransactions(uiWalletAccount, chain) {
|
|
|
183
183
|
[signTransactionFeature, account, chain]
|
|
184
184
|
);
|
|
185
185
|
}
|
|
186
|
+
function bytesEqual(bytes1, bytes2) {
|
|
187
|
+
return bytes1.length === bytes2.length && bytes1.every((value, index) => value === bytes2[index]);
|
|
188
|
+
}
|
|
186
189
|
function useWalletAccountMessageSigner(uiWalletAccount) {
|
|
187
190
|
const signMessage = useSignMessage(uiWalletAccount);
|
|
188
191
|
return useMemo(
|
|
@@ -203,7 +206,7 @@ function useWalletAccountMessageSigner(uiWalletAccount) {
|
|
|
203
206
|
const { signedMessage, signature } = await getAbortablePromise(signMessage(input), config?.abortSignal);
|
|
204
207
|
const messageWasModified = originalMessage.length !== signedMessage.length || originalMessage.some((originalByte, ii) => originalByte !== signedMessage[ii]);
|
|
205
208
|
const originalSignature = originalSignatureMap[uiWalletAccount.address];
|
|
206
|
-
const signatureIsNew =
|
|
209
|
+
const signatureIsNew = originalSignature === void 0 || !bytesEqual(originalSignature, signature);
|
|
207
210
|
if (!signatureIsNew && !messageWasModified) {
|
|
208
211
|
return messages;
|
|
209
212
|
}
|
|
@@ -249,7 +252,7 @@ function useWalletAccountTransactionSigner(uiWalletAccount, chain) {
|
|
|
249
252
|
assertIsTransactionWithinSizeLimit(decodedSignedTransaction);
|
|
250
253
|
const existingLifetime = "lifetimeConstraint" in transaction ? transaction.lifetimeConstraint : void 0;
|
|
251
254
|
if (existingLifetime) {
|
|
252
|
-
if (
|
|
255
|
+
if (bytesEqual(decodedSignedTransaction.messageBytes, transaction.messageBytes)) {
|
|
253
256
|
return Object.freeze([
|
|
254
257
|
{
|
|
255
258
|
...decodedSignedTransaction,
|
|
@@ -285,9 +288,6 @@ function useWalletAccountTransactionSigner(uiWalletAccount, chain) {
|
|
|
285
288
|
[uiWalletAccount.address, signTransaction]
|
|
286
289
|
);
|
|
287
290
|
}
|
|
288
|
-
function uint8ArraysEqual(arr1, arr2) {
|
|
289
|
-
return arr1.length === arr2.length && arr1.every((value, index) => value === arr2[index]);
|
|
290
|
-
}
|
|
291
291
|
function useWalletAccountTransactionSendingSigner(uiWalletAccount, chain) {
|
|
292
292
|
const encoderRef = useRef(null);
|
|
293
293
|
const signAndSendTransaction = useSignAndSendTransaction(uiWalletAccount, chain);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/useSignAndSendTransaction.ts","../src/useSignIn.ts","../src/useSignMessage.ts","../src/useSignTransaction.ts","../src/useWalletAccountMessageSigner.ts","../src/useWalletAccountTransactionSigner.ts","../src/useWalletAccountTransactionSendingSigner.ts"],"names":["useCallback","getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","getWalletAccountFeature","WalletStandardError","WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED","SolanaSignAndSendTransaction","useMemo","address","SolanaError","SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED","getAbortablePromise","compiledTransactionMessage","useRef"],"mappings":"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","file":"index.browser.mjs","sourcesContent":["import {\n SolanaSignAndSendTransaction,\n SolanaSignAndSendTransactionFeature,\n SolanaSignAndSendTransactionInput,\n SolanaSignAndSendTransactionOutput,\n} from '@solana/wallet-standard-features';\nimport {\n WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED,\n WalletStandardError,\n} from '@wallet-standard/errors';\nimport { getWalletAccountFeature, type UiWalletAccount } from '@wallet-standard/ui';\nimport { getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED } from '@wallet-standard/ui-registry';\nimport { useCallback } from 'react';\n\nimport { OnlySolanaChains } from './chain';\n\ntype Input = Readonly<\n Omit<SolanaSignAndSendTransactionInput, 'account' | 'chain' | 'options'> & {\n options?: Readonly<{\n minContextSlot?: bigint;\n }>;\n }\n>;\ntype Output = SolanaSignAndSendTransactionOutput;\n\n/**\n * Use this to get a function capable of signing a serialized transaction with the private key of a\n * {@link UiWalletAccount} and sending it to the network for processing.\n *\n * @param chain The identifier of the chain the transaction is destined for. Wallets may use this to\n * simulate the transaction for the user.\n *\n * @example\n * ```tsx\n * import { getBase58Decoder } from '@solana/codecs-strings';\n * import { useSignAndSendTransaction } from '@solana/react';\n *\n * function SignAndSendTransactionButton({ account, transactionBytes }) {\n * const signAndSendTransaction = useSignAndSendTransaction(account, 'solana:devnet');\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const { signature } = await signAndSendTransaction({\n * transaction: transactionBytes,\n * });\n * const base58TransactionSignature = getBase58Decoder().decode(signature);\n * window.alert(\n * `View transaction: https://explorer.solana.com/tx/${base58TransactionSignature}?cluster=devnet`,\n * );\n * } catch (e) {\n * console.error('Failed to send transaction', e);\n * }\n * }}\n * >\n * Sign and Send Transaction\n * </button>\n * );\n * }\n * ```\n */\nexport function useSignAndSendTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: OnlySolanaChains<TWalletAccount['chains']>,\n): (input: Input) => Promise<Output>;\nexport function useSignAndSendTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (input: Input) => Promise<Output>;\nexport function useSignAndSendTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (input: Input) => Promise<Output> {\n const signAndSendTransactions = useSignAndSendTransactions(uiWalletAccount, chain);\n return useCallback(\n async input => {\n const [result] = await signAndSendTransactions(input);\n return result;\n },\n [signAndSendTransactions],\n );\n}\n\nfunction useSignAndSendTransactions<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (...inputs: readonly Input[]) => Promise<readonly Output[]> {\n if (!uiWalletAccount.chains.includes(chain)) {\n throw new WalletStandardError(WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED, {\n address: uiWalletAccount.address,\n chain,\n featureName: SolanaSignAndSendTransaction,\n supportedChains: [...uiWalletAccount.chains],\n supportedFeatures: [...uiWalletAccount.features],\n });\n }\n const signAndSendTransactionFeature = getWalletAccountFeature(\n uiWalletAccount,\n SolanaSignAndSendTransaction,\n ) as SolanaSignAndSendTransactionFeature[typeof SolanaSignAndSendTransaction];\n const account = getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletAccount);\n return useCallback(\n async (...inputs) => {\n const inputsWithChainAndAccount = inputs.map(({ options, ...rest }) => {\n const minContextSlot = options?.minContextSlot;\n return {\n ...rest,\n account,\n chain,\n ...(minContextSlot != null\n ? {\n options: {\n minContextSlot: Number(minContextSlot),\n },\n }\n : null),\n };\n });\n const results = await signAndSendTransactionFeature.signAndSendTransaction(...inputsWithChainAndAccount);\n return results;\n },\n [account, chain, signAndSendTransactionFeature],\n );\n}\n","import { Address } from '@solana/addresses';\nimport {\n SolanaSignIn,\n SolanaSignInFeature,\n SolanaSignInInput,\n SolanaSignInOutput,\n} from '@solana/wallet-standard-features';\nimport {\n getWalletAccountFeature,\n getWalletFeature,\n UiWallet,\n UiWalletAccount,\n UiWalletHandle,\n} from '@wallet-standard/ui';\nimport {\n getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,\n getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,\n getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,\n} from '@wallet-standard/ui-registry';\nimport { useCallback } from 'react';\n\ntype Input = SolanaSignInInput;\ntype Output = Omit<SolanaSignInOutput, 'account' | 'signatureType'> &\n Readonly<{\n account: UiWalletAccount;\n }>;\n\n/**\n * Use the ['Sign In With Solana'](https://phantom.app/learn/developers/sign-in-with-solana) feature\n * of a {@link UiWallet} or {@link UiWalletAccount}.\n *\n * @returns A function that you can call to sign in with the particular wallet and address specified\n * by the supplied {@link UiWalletAccount}\n *\n * @example\n * ```tsx\n * import { useSignIn } from '@solana/react';\n *\n * function SignInButton({ wallet }) {\n * const csrfToken = useCsrfToken();\n * const signIn = useSignIn(wallet);\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const { account, signedMessage, signature } = await signIn({\n * requestId: csrfToken,\n * });\n * // Authenticate the user, typically on the server, by verifying that\n * // `signedMessage` was signed by the person who holds the private key for\n * // `account.publicKey`.\n * //\n * // Authorize the user, also on the server, by decoding `signedMessage` as the\n * // text of a Sign In With Solana message, verifying that it was not modified\n * // from the values your application expects, and that its content is sufficient\n * // to grant them access.\n * window.alert(`You are now signed in with the address ${account.address}`);\n * } catch (e) {\n * console.error('Failed to sign in', e);\n * }\n * }}\n * >\n * Sign In\n * </button>\n * );\n * }\n * ```\n */\nexport function useSignIn(uiWalletAccount: UiWalletAccount): (input?: Omit<Input, 'address'>) => Promise<Output>;\n/**\n * @returns A function that you can call to sign in with the supplied {@link UiWallet}\n */\nexport function useSignIn(uiWallet: UiWallet): (input?: Input) => Promise<Output>;\nexport function useSignIn(uiWalletHandle: UiWalletHandle): (input?: Input) => Promise<Output> {\n const signIns = useSignIns(uiWalletHandle);\n return useCallback(\n async input => {\n const [result] = await signIns(input);\n return result;\n },\n [signIns],\n );\n}\n\nfunction useSignIns(\n uiWalletHandle: UiWalletHandle,\n): (...inputs: readonly (Input | undefined)[]) => Promise<readonly Output[]> {\n let signMessageFeature: SolanaSignInFeature[typeof SolanaSignIn];\n if ('address' in uiWalletHandle && typeof uiWalletHandle.address === 'string') {\n getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletHandle as UiWalletAccount);\n signMessageFeature = getWalletAccountFeature(\n uiWalletHandle as UiWalletAccount,\n SolanaSignIn,\n ) as SolanaSignInFeature[typeof SolanaSignIn];\n } else {\n signMessageFeature = getWalletFeature(uiWalletHandle, SolanaSignIn) as SolanaSignInFeature[typeof SolanaSignIn];\n }\n const wallet = getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletHandle);\n return useCallback(\n async (...inputs) => {\n const inputsWithAddressAndChainId = inputs.map(input => ({\n ...input,\n // Prioritize the `UiWalletAccount` address if it exists.\n ...('address' in uiWalletHandle ? { address: uiWalletHandle.address as Address } : null),\n }));\n const results = await signMessageFeature.signIn(...inputsWithAddressAndChainId);\n const resultsWithoutSignatureType = results.map(\n ({\n account,\n signatureType: _, // Solana signatures are always of type `ed25519` so drop this property.\n ...rest\n }) => ({\n ...rest,\n account: getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(\n wallet,\n account,\n ),\n }),\n );\n return resultsWithoutSignatureType;\n },\n [signMessageFeature, uiWalletHandle, wallet],\n );\n}\n","import {\n SolanaSignMessage,\n SolanaSignMessageFeature,\n SolanaSignMessageInput,\n SolanaSignMessageOutput,\n} from '@solana/wallet-standard-features';\nimport { getWalletAccountFeature, UiWalletAccount } from '@wallet-standard/ui';\nimport { getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED } from '@wallet-standard/ui-registry';\nimport { useCallback } from 'react';\n\ntype Input = Omit<SolanaSignMessageInput, 'account'>;\ntype Output = Omit<SolanaSignMessageOutput, 'signatureType'>;\n\n/**\n * Use this to get a function capable of signing a message with the private key of a\n * {@link UiWalletAccount}\n *\n * @example\n * ```tsx\n * import { useSignMessage } from '@solana/react';\n *\n * function SignMessageButton({ account, messageBytes }) {\n * const signMessage = useSignMessage(account);\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const { signature } = await signMessage({\n * message: messageBytes,\n * });\n * window.alert(`Signature bytes: ${signature.toString()}`);\n * } catch (e) {\n * console.error('Failed to sign message', e);\n * }\n * }}\n * >\n * Sign Message\n * </button>\n * );\n * }\n * ```\n */\nexport function useSignMessage<TWalletAccount extends UiWalletAccount>(\n ...config: Parameters<typeof useSignMessages<TWalletAccount>>\n): (input: Input) => Promise<Output> {\n const signMessages = useSignMessages(...config);\n return useCallback(\n async input => {\n const [result] = await signMessages(input);\n return result;\n },\n [signMessages],\n );\n}\n\nfunction useSignMessages<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n): (...inputs: readonly Input[]) => Promise<readonly Output[]> {\n const signMessageFeature = getWalletAccountFeature(\n uiWalletAccount,\n SolanaSignMessage,\n ) as SolanaSignMessageFeature[typeof SolanaSignMessage];\n const account = getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletAccount);\n return useCallback(\n async (...inputs) => {\n const inputsWithAccount = inputs.map(input => ({ ...input, account }));\n const results = await signMessageFeature.signMessage(...inputsWithAccount);\n const resultsWithoutSignatureType = results.map(\n ({\n signatureType: _, // Solana signatures are always of type `ed25519` so drop this property.\n ...rest\n }) => rest,\n );\n return resultsWithoutSignatureType;\n },\n [signMessageFeature, account],\n );\n}\n","import {\n SolanaSignAndSendTransaction,\n SolanaSignTransaction,\n SolanaSignTransactionFeature,\n SolanaSignTransactionInput,\n SolanaSignTransactionOutput,\n} from '@solana/wallet-standard-features';\nimport {\n WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED,\n WalletStandardError,\n} from '@wallet-standard/errors';\nimport { getWalletAccountFeature, UiWalletAccount } from '@wallet-standard/ui';\nimport { getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED } from '@wallet-standard/ui-registry';\nimport { useCallback } from 'react';\n\nimport { OnlySolanaChains } from './chain';\n\ntype Input = Readonly<\n Omit<SolanaSignTransactionInput, 'account' | 'chain' | 'options'> & {\n options?: Readonly<{\n minContextSlot?: bigint;\n }>;\n }\n>;\ntype Output = SolanaSignTransactionOutput;\n\n/**\n * Use this to get a function capable of signing a serialized transaction with the private key of a\n * {@link UiWalletAccount}\n *\n * @param chain The identifier of the chain the transaction is destined for. Wallets may use this to\n * simulate the transaction for the user.\n *\n * @example\n * ```tsx\n * import { useSignTransaction } from '@solana/react';\n *\n * function SignTransactionButton({ account, transactionBytes }) {\n * const signTransaction = useSignTransaction(account, 'solana:devnet');\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const { signedTransaction } = await signTransaction({\n * transaction: transactionBytes,\n * });\n * window.alert(`Signed transaction bytes: ${signedTransaction.toString()}`);\n * } catch (e) {\n * console.error('Failed to sign transaction', e);\n * }\n * }}\n * >\n * Sign Transaction\n * </button>\n * );\n * }\n * ```\n */\nexport function useSignTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: OnlySolanaChains<TWalletAccount['chains']>,\n): (input: Input) => Promise<Output>;\nexport function useSignTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (input: Input) => Promise<Output>;\nexport function useSignTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (input: Input) => Promise<Output> {\n const signTransactions = useSignTransactions(uiWalletAccount, chain);\n return useCallback(\n async input => {\n const [result] = await signTransactions(input);\n return result;\n },\n [signTransactions],\n );\n}\n\nfunction useSignTransactions<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (...inputs: readonly Input[]) => Promise<readonly Output[]> {\n if (!uiWalletAccount.chains.includes(chain)) {\n throw new WalletStandardError(WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED, {\n address: uiWalletAccount.address,\n chain,\n featureName: SolanaSignAndSendTransaction,\n supportedChains: [...uiWalletAccount.chains],\n supportedFeatures: [...uiWalletAccount.features],\n });\n }\n const signTransactionFeature = getWalletAccountFeature(\n uiWalletAccount,\n SolanaSignTransaction,\n ) as SolanaSignTransactionFeature[typeof SolanaSignTransaction];\n const account = getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletAccount);\n return useCallback(\n async (...inputs) => {\n const inputsWithAccountAndChain = inputs.map(({ options, ...rest }) => {\n const minContextSlot = options?.minContextSlot;\n return {\n ...rest,\n account,\n chain,\n ...(minContextSlot != null\n ? {\n options: {\n minContextSlot: Number(minContextSlot),\n },\n }\n : null),\n };\n });\n const results = await signTransactionFeature.signTransaction(...inputsWithAccountAndChain);\n return results;\n },\n [signTransactionFeature, account, chain],\n );\n}\n","import { Address, address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\nimport { getAbortablePromise } from '@solana/promises';\nimport { MessageModifyingSigner, SignableMessage } from '@solana/signers';\nimport type { UiWalletAccount } from '@wallet-standard/ui';\nimport { useMemo } from 'react';\n\nimport { useSignMessage } from './useSignMessage';\n\n/**\n * Use this to get a {@link MessageSigner} capable of signing messages with the private key of a\n * {@link UiWalletAccount}\n *\n * @returns A {@link MessageModifyingSigner}. This is a conservative assumption based on the fact\n * that your application can not control whether or not the wallet will modify the message before\n * signing it. Otherwise this method could more specifically return a {@link MessageSigner} or a\n * {@link MessagePartialSigner}.\n *\n * @example\n * ```tsx\n * import { useWalletAccountMessageSigner } from '@solana/react';\n * import { createSignableMessage } from '@solana/signers';\n *\n * function SignMessageButton({ account, text }) {\n * const messageSigner = useWalletAccountMessageSigner(account);\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const signableMessage = createSignableMessage(text);\n * const [signedMessage] = await messageSigner.modifyAndSignMessages([signableMessage]);\n * const messageWasModified = signableMessage.content !== signedMessage.content;\n * const signatureBytes = signedMessage.signatures[messageSigner.address];\n * window.alert(\n * `Signature bytes: ${signatureBytes.toString()}${\n * messageWasModified ? ' (message was modified)' : ''\n * }`,\n * );\n * } catch (e) {\n * console.error('Failed to sign message', e);\n * }\n * }}\n * >\n * Sign Message: {text}\n * </button>\n * );\n * }\n * ```\n */\nexport function useWalletAccountMessageSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n): MessageModifyingSigner<TWalletAccount['address']> {\n const signMessage = useSignMessage(uiWalletAccount);\n return useMemo(\n () => ({\n address: address(uiWalletAccount.address),\n async modifyAndSignMessages(messages, config) {\n config?.abortSignal?.throwIfAborted();\n if (messages.length > 1) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED);\n }\n if (messages.length === 0) {\n return messages;\n }\n const { content: originalMessage, signatures: originalSignatureMap } = messages[0];\n const input = {\n message: originalMessage,\n };\n const { signedMessage, signature } = await getAbortablePromise(signMessage(input), config?.abortSignal);\n const messageWasModified =\n originalMessage.length !== signedMessage.length ||\n originalMessage.some((originalByte, ii) => originalByte !== signedMessage[ii]);\n const originalSignature = originalSignatureMap[uiWalletAccount.address as Address<string>] as\n | SignatureBytes\n | undefined;\n const signatureIsNew = !originalSignature?.every((originalByte, ii) => originalByte === signature[ii]);\n if (!signatureIsNew && !messageWasModified) {\n // We already had this exact signature, and the message wasn't modified.\n // Don't replace the existing message object.\n return messages;\n }\n const nextSignatureMap = messageWasModified\n ? { [uiWalletAccount.address]: signature }\n : { ...originalSignatureMap, [uiWalletAccount.address]: signature };\n const outputMessages = Object.freeze([\n Object.freeze({\n content: signedMessage,\n signatures: Object.freeze(nextSignatureMap),\n }) as SignableMessage,\n ]);\n return outputMessages;\n },\n }),\n [uiWalletAccount, signMessage],\n );\n}\n","import { address } from '@solana/addresses';\nimport { ReadonlyUint8Array } from '@solana/codecs-core';\nimport { SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED, SolanaError } from '@solana/errors';\nimport { getAbortablePromise } from '@solana/promises';\nimport { TransactionModifyingSigner } from '@solana/signers';\nimport { getCompiledTransactionMessageDecoder } from '@solana/transaction-messages';\nimport {\n assertIsTransactionWithinSizeLimit,\n getTransactionCodec,\n getTransactionLifetimeConstraintFromCompiledTransactionMessage,\n Transaction,\n TransactionWithinSizeLimit,\n TransactionWithLifetime,\n} from '@solana/transactions';\nimport { UiWalletAccount } from '@wallet-standard/ui';\nimport { useMemo, useRef } from 'react';\n\nimport { OnlySolanaChains } from './chain';\nimport { useSignTransaction } from './useSignTransaction';\n\n/**\n * Use this to get a {@link TransactionSigner} capable of signing serialized transactions with the\n * private key of a {@link UiWalletAccount}\n *\n * @returns A {@link TransactionModifyingSigner}. This is a conservative assumption based on the\n * fact that your application can not control whether or not the wallet will modify the transaction\n * before signing it (eg. to add guard instructions, or a priority fee budget). Otherwise this\n * method could more specifically return a {@link TransactionSigner} or a\n * {@link TransactionPartialSigner}.\n *\n * @example\n * ```tsx\n * import { useWalletAccountTransactionSigner } from '@solana/react';\n *\n * function SignTransactionButton({ account, transaction }) {\n * const transactionSigner = useWalletAccountTransactionSigner(account, 'solana:devnet');\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const [{ signatures }] = await transactionSigner.modifyAndSignTransactions([transaction]);\n * const signatureBytes = signatures[transactionSigner.address];\n * window.alert(`Signature bytes: ${signatureBytes.toString()}`);\n * } catch (e) {\n * console.error('Failed to sign transaction', e);\n * }\n * }}\n * >\n * Sign Transaction\n * </button>\n * );\n * }\n * ```\n */\nexport function useWalletAccountTransactionSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: OnlySolanaChains<TWalletAccount['chains']>,\n): TransactionModifyingSigner<TWalletAccount['address']>;\nexport function useWalletAccountTransactionSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): TransactionModifyingSigner<TWalletAccount['address']>;\nexport function useWalletAccountTransactionSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): TransactionModifyingSigner<TWalletAccount['address']> {\n const encoderRef = useRef<ReturnType<typeof getTransactionCodec> | null>(null);\n const signTransaction = useSignTransaction(uiWalletAccount, chain);\n return useMemo(\n () => ({\n address: address(uiWalletAccount.address),\n async modifyAndSignTransactions(transactions, config = {}) {\n const { abortSignal, ...options } = config;\n abortSignal?.throwIfAborted();\n const transactionCodec = (encoderRef.current ||= getTransactionCodec());\n if (transactions.length > 1) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED);\n }\n if (transactions.length === 0) {\n return transactions as readonly (Transaction &\n TransactionWithinSizeLimit &\n TransactionWithLifetime)[];\n }\n const [transaction] = transactions;\n const wireTransactionBytes = transactionCodec.encode(transaction);\n const inputWithOptions = {\n ...options,\n transaction: wireTransactionBytes as Uint8Array,\n };\n const { signedTransaction } = await getAbortablePromise(signTransaction(inputWithOptions), abortSignal);\n const decodedSignedTransaction = transactionCodec.decode(\n signedTransaction,\n ) as (typeof transactions)[number];\n\n assertIsTransactionWithinSizeLimit(decodedSignedTransaction);\n\n const existingLifetime =\n 'lifetimeConstraint' in transaction\n ? (transaction as TransactionWithLifetime).lifetimeConstraint\n : undefined;\n\n if (existingLifetime) {\n if (uint8ArraysEqual(decodedSignedTransaction.messageBytes, transaction.messageBytes)) {\n // If the transaction has identical bytes, the lifetime won't have changed\n return Object.freeze([\n {\n ...decodedSignedTransaction,\n lifetimeConstraint: existingLifetime,\n },\n ]);\n }\n\n // If the transaction has changed, check the lifetime constraint field\n const compiledTransactionMessage = getCompiledTransactionMessageDecoder().decode(\n decodedSignedTransaction.messageBytes,\n );\n const currentToken =\n 'blockhash' in existingLifetime ? existingLifetime.blockhash : existingLifetime.nonce;\n\n if (compiledTransactionMessage.lifetimeToken === currentToken) {\n return Object.freeze([\n {\n ...decodedSignedTransaction,\n lifetimeConstraint: existingLifetime,\n },\n ]);\n }\n }\n\n // If we get here then there is no existing lifetime, or the lifetime has changed. We need to attach a new lifetime\n const compiledTransactionMessage = getCompiledTransactionMessageDecoder().decode(\n decodedSignedTransaction.messageBytes,\n );\n const lifetimeConstraint =\n await getTransactionLifetimeConstraintFromCompiledTransactionMessage(compiledTransactionMessage);\n return Object.freeze([\n {\n ...decodedSignedTransaction,\n lifetimeConstraint,\n },\n ]);\n },\n }),\n [uiWalletAccount.address, signTransaction],\n );\n}\n\nfunction uint8ArraysEqual(arr1: ReadonlyUint8Array, arr2: ReadonlyUint8Array) {\n return arr1.length === arr2.length && arr1.every((value, index) => value === arr2[index]);\n}\n","import { address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\nimport { getAbortablePromise } from '@solana/promises';\nimport { TransactionSendingSigner } from '@solana/signers';\nimport { getTransactionEncoder } from '@solana/transactions';\nimport { UiWalletAccount } from '@wallet-standard/ui';\nimport { useMemo, useRef } from 'react';\n\nimport { OnlySolanaChains } from './chain';\nimport { useSignAndSendTransaction } from './useSignAndSendTransaction';\n\n/**\n * Use this to get a {@link TransactionSendingSigner} capable of signing a serialized transaction\n * with the private key of a {@link UiWalletAccount} and sending it to the network for processing.\n *\n * @param chain The identifier of the chain the transaction is destined for. Wallets may use this to\n * simulate the transaction for the user.\n *\n * @example\n * ```tsx\n * import { useWalletAccountTransactionSendingSigner } from '@solana/react';\n * import {\n * appendTransactionMessageInstruction,\n * createSolanaRpc,\n * getBase58Decoder,\n * pipe,\n * setTransactionMessageFeePayerSigner,\n * setTransactionMessageLifetimeUsingBlockhash,\n * signAndSendTransactionMessageWithSigners,\n * } from '@solana/kit';\n *\n * function RecordMemoButton({ account, rpc, text }) {\n * const signer = useWalletAccountTransactionSendingSigner(account, 'solana:devnet');\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const { value: latestBlockhash } = await createSolanaRpc('https://api.devnet.solana.com')\n * .getLatestBlockhash()\n * .send();\n * const message = pipe(\n * createTransactionMessage({ version: 'legacy' }),\n * m => setTransactionMessageFeePayerSigner(signer, m),\n * m => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m),\n * m => appendTransactionMessageInstruction(getAddMemoInstruction({ memo: text }), m),\n * );\n * const signatureBytes = await signAndSendTransactionMessageWithSigners(message);\n * const base58Signature = getBase58Decoder().decode(signature);\n * window.alert(`View transaction: https://explorer.solana.com/tx/${base58Signature}?cluster=devnet`);\n * } catch (e) {\n * console.error('Failed to record memo', e);\n * }\n * }}\n * >\n * Record Memo\n * </button>\n * );\n * }\n * ```\n */\nexport function useWalletAccountTransactionSendingSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: OnlySolanaChains<TWalletAccount['chains']>,\n): TransactionSendingSigner<TWalletAccount['address']>;\nexport function useWalletAccountTransactionSendingSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): TransactionSendingSigner<TWalletAccount['address']>;\nexport function useWalletAccountTransactionSendingSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): TransactionSendingSigner<TWalletAccount['address']> {\n const encoderRef = useRef<ReturnType<typeof getTransactionEncoder> | null>(null);\n const signAndSendTransaction = useSignAndSendTransaction(uiWalletAccount, chain);\n return useMemo(\n () => ({\n address: address(uiWalletAccount.address),\n async signAndSendTransactions(transactions, config = {}) {\n const { abortSignal, ...options } = config;\n abortSignal?.throwIfAborted();\n const transactionEncoder = (encoderRef.current ||= getTransactionEncoder());\n if (transactions.length > 1) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED);\n }\n if (transactions.length === 0) {\n return [];\n }\n const [transaction] = transactions;\n const wireTransactionBytes = transactionEncoder.encode(transaction);\n const inputWithOptions = {\n ...options,\n transaction: wireTransactionBytes as Uint8Array,\n };\n const { signature } = await getAbortablePromise(signAndSendTransaction(inputWithOptions), abortSignal);\n return Object.freeze([signature as SignatureBytes]);\n },\n }),\n [signAndSendTransaction, uiWalletAccount.address],\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/useSignAndSendTransaction.ts","../src/useSignIn.ts","../src/useSignMessage.ts","../src/useSignTransaction.ts","../../codecs-core/src/bytes.ts","../src/useWalletAccountMessageSigner.ts","../src/useWalletAccountTransactionSigner.ts","../src/useWalletAccountTransactionSendingSigner.ts"],"names":["useCallback","getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","getWalletAccountFeature","WalletStandardError","WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED","SolanaSignAndSendTransaction","SolanaError","useMemo","address","SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED","getAbortablePromise","compiledTransactionMessage","useRef"],"mappings":"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","file":"index.browser.mjs","sourcesContent":["import {\n SolanaSignAndSendTransaction,\n SolanaSignAndSendTransactionFeature,\n SolanaSignAndSendTransactionInput,\n SolanaSignAndSendTransactionOutput,\n} from '@solana/wallet-standard-features';\nimport {\n WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED,\n WalletStandardError,\n} from '@wallet-standard/errors';\nimport { getWalletAccountFeature, type UiWalletAccount } from '@wallet-standard/ui';\nimport { getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED } from '@wallet-standard/ui-registry';\nimport { useCallback } from 'react';\n\nimport { OnlySolanaChains } from './chain';\n\ntype Input = Readonly<\n Omit<SolanaSignAndSendTransactionInput, 'account' | 'chain' | 'options'> & {\n options?: Readonly<{\n minContextSlot?: bigint;\n }>;\n }\n>;\ntype Output = SolanaSignAndSendTransactionOutput;\n\n/**\n * Use this to get a function capable of signing a serialized transaction with the private key of a\n * {@link UiWalletAccount} and sending it to the network for processing.\n *\n * @param chain The identifier of the chain the transaction is destined for. Wallets may use this to\n * simulate the transaction for the user.\n *\n * @example\n * ```tsx\n * import { getBase58Decoder } from '@solana/codecs-strings';\n * import { useSignAndSendTransaction } from '@solana/react';\n *\n * function SignAndSendTransactionButton({ account, transactionBytes }) {\n * const signAndSendTransaction = useSignAndSendTransaction(account, 'solana:devnet');\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const { signature } = await signAndSendTransaction({\n * transaction: transactionBytes,\n * });\n * const base58TransactionSignature = getBase58Decoder().decode(signature);\n * window.alert(\n * `View transaction: https://explorer.solana.com/tx/${base58TransactionSignature}?cluster=devnet`,\n * );\n * } catch (e) {\n * console.error('Failed to send transaction', e);\n * }\n * }}\n * >\n * Sign and Send Transaction\n * </button>\n * );\n * }\n * ```\n */\nexport function useSignAndSendTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: OnlySolanaChains<TWalletAccount['chains']>,\n): (input: Input) => Promise<Output>;\nexport function useSignAndSendTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (input: Input) => Promise<Output>;\nexport function useSignAndSendTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (input: Input) => Promise<Output> {\n const signAndSendTransactions = useSignAndSendTransactions(uiWalletAccount, chain);\n return useCallback(\n async input => {\n const [result] = await signAndSendTransactions(input);\n return result;\n },\n [signAndSendTransactions],\n );\n}\n\nfunction useSignAndSendTransactions<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (...inputs: readonly Input[]) => Promise<readonly Output[]> {\n if (!uiWalletAccount.chains.includes(chain)) {\n throw new WalletStandardError(WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED, {\n address: uiWalletAccount.address,\n chain,\n featureName: SolanaSignAndSendTransaction,\n supportedChains: [...uiWalletAccount.chains],\n supportedFeatures: [...uiWalletAccount.features],\n });\n }\n const signAndSendTransactionFeature = getWalletAccountFeature(\n uiWalletAccount,\n SolanaSignAndSendTransaction,\n ) as SolanaSignAndSendTransactionFeature[typeof SolanaSignAndSendTransaction];\n const account = getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletAccount);\n return useCallback(\n async (...inputs) => {\n const inputsWithChainAndAccount = inputs.map(({ options, ...rest }) => {\n const minContextSlot = options?.minContextSlot;\n return {\n ...rest,\n account,\n chain,\n ...(minContextSlot != null\n ? {\n options: {\n minContextSlot: Number(minContextSlot),\n },\n }\n : null),\n };\n });\n const results = await signAndSendTransactionFeature.signAndSendTransaction(...inputsWithChainAndAccount);\n return results;\n },\n [account, chain, signAndSendTransactionFeature],\n );\n}\n","import { Address } from '@solana/addresses';\nimport {\n SolanaSignIn,\n SolanaSignInFeature,\n SolanaSignInInput,\n SolanaSignInOutput,\n} from '@solana/wallet-standard-features';\nimport {\n getWalletAccountFeature,\n getWalletFeature,\n UiWallet,\n UiWalletAccount,\n UiWalletHandle,\n} from '@wallet-standard/ui';\nimport {\n getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,\n getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,\n getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,\n} from '@wallet-standard/ui-registry';\nimport { useCallback } from 'react';\n\ntype Input = SolanaSignInInput;\ntype Output = Omit<SolanaSignInOutput, 'account' | 'signatureType'> &\n Readonly<{\n account: UiWalletAccount;\n }>;\n\n/**\n * Use the ['Sign In With Solana'](https://phantom.app/learn/developers/sign-in-with-solana) feature\n * of a {@link UiWallet} or {@link UiWalletAccount}.\n *\n * @returns A function that you can call to sign in with the particular wallet and address specified\n * by the supplied {@link UiWalletAccount}\n *\n * @example\n * ```tsx\n * import { useSignIn } from '@solana/react';\n *\n * function SignInButton({ wallet }) {\n * const csrfToken = useCsrfToken();\n * const signIn = useSignIn(wallet);\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const { account, signedMessage, signature } = await signIn({\n * requestId: csrfToken,\n * });\n * // Authenticate the user, typically on the server, by verifying that\n * // `signedMessage` was signed by the person who holds the private key for\n * // `account.publicKey`.\n * //\n * // Authorize the user, also on the server, by decoding `signedMessage` as the\n * // text of a Sign In With Solana message, verifying that it was not modified\n * // from the values your application expects, and that its content is sufficient\n * // to grant them access.\n * window.alert(`You are now signed in with the address ${account.address}`);\n * } catch (e) {\n * console.error('Failed to sign in', e);\n * }\n * }}\n * >\n * Sign In\n * </button>\n * );\n * }\n * ```\n */\nexport function useSignIn(uiWalletAccount: UiWalletAccount): (input?: Omit<Input, 'address'>) => Promise<Output>;\n/**\n * @returns A function that you can call to sign in with the supplied {@link UiWallet}\n */\nexport function useSignIn(uiWallet: UiWallet): (input?: Input) => Promise<Output>;\nexport function useSignIn(uiWalletHandle: UiWalletHandle): (input?: Input) => Promise<Output> {\n const signIns = useSignIns(uiWalletHandle);\n return useCallback(\n async input => {\n const [result] = await signIns(input);\n return result;\n },\n [signIns],\n );\n}\n\nfunction useSignIns(\n uiWalletHandle: UiWalletHandle,\n): (...inputs: readonly (Input | undefined)[]) => Promise<readonly Output[]> {\n let signMessageFeature: SolanaSignInFeature[typeof SolanaSignIn];\n if ('address' in uiWalletHandle && typeof uiWalletHandle.address === 'string') {\n getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletHandle as UiWalletAccount);\n signMessageFeature = getWalletAccountFeature(\n uiWalletHandle as UiWalletAccount,\n SolanaSignIn,\n ) as SolanaSignInFeature[typeof SolanaSignIn];\n } else {\n signMessageFeature = getWalletFeature(uiWalletHandle, SolanaSignIn) as SolanaSignInFeature[typeof SolanaSignIn];\n }\n const wallet = getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletHandle);\n return useCallback(\n async (...inputs) => {\n const inputsWithAddressAndChainId = inputs.map(input => ({\n ...input,\n // Prioritize the `UiWalletAccount` address if it exists.\n ...('address' in uiWalletHandle ? { address: uiWalletHandle.address as Address } : null),\n }));\n const results = await signMessageFeature.signIn(...inputsWithAddressAndChainId);\n const resultsWithoutSignatureType = results.map(\n ({\n account,\n signatureType: _, // Solana signatures are always of type `ed25519` so drop this property.\n ...rest\n }) => ({\n ...rest,\n account: getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(\n wallet,\n account,\n ),\n }),\n );\n return resultsWithoutSignatureType;\n },\n [signMessageFeature, uiWalletHandle, wallet],\n );\n}\n","import {\n SolanaSignMessage,\n SolanaSignMessageFeature,\n SolanaSignMessageInput,\n SolanaSignMessageOutput,\n} from '@solana/wallet-standard-features';\nimport { getWalletAccountFeature, UiWalletAccount } from '@wallet-standard/ui';\nimport { getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED } from '@wallet-standard/ui-registry';\nimport { useCallback } from 'react';\n\ntype Input = Omit<SolanaSignMessageInput, 'account'>;\ntype Output = Omit<SolanaSignMessageOutput, 'signatureType'>;\n\n/**\n * Use this to get a function capable of signing a message with the private key of a\n * {@link UiWalletAccount}\n *\n * @example\n * ```tsx\n * import { useSignMessage } from '@solana/react';\n *\n * function SignMessageButton({ account, messageBytes }) {\n * const signMessage = useSignMessage(account);\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const { signature } = await signMessage({\n * message: messageBytes,\n * });\n * window.alert(`Signature bytes: ${signature.toString()}`);\n * } catch (e) {\n * console.error('Failed to sign message', e);\n * }\n * }}\n * >\n * Sign Message\n * </button>\n * );\n * }\n * ```\n */\nexport function useSignMessage<TWalletAccount extends UiWalletAccount>(\n ...config: Parameters<typeof useSignMessages<TWalletAccount>>\n): (input: Input) => Promise<Output> {\n const signMessages = useSignMessages(...config);\n return useCallback(\n async input => {\n const [result] = await signMessages(input);\n return result;\n },\n [signMessages],\n );\n}\n\nfunction useSignMessages<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n): (...inputs: readonly Input[]) => Promise<readonly Output[]> {\n const signMessageFeature = getWalletAccountFeature(\n uiWalletAccount,\n SolanaSignMessage,\n ) as SolanaSignMessageFeature[typeof SolanaSignMessage];\n const account = getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletAccount);\n return useCallback(\n async (...inputs) => {\n const inputsWithAccount = inputs.map(input => ({ ...input, account }));\n const results = await signMessageFeature.signMessage(...inputsWithAccount);\n const resultsWithoutSignatureType = results.map(\n ({\n signatureType: _, // Solana signatures are always of type `ed25519` so drop this property.\n ...rest\n }) => rest,\n );\n return resultsWithoutSignatureType;\n },\n [signMessageFeature, account],\n );\n}\n","import {\n SolanaSignAndSendTransaction,\n SolanaSignTransaction,\n SolanaSignTransactionFeature,\n SolanaSignTransactionInput,\n SolanaSignTransactionOutput,\n} from '@solana/wallet-standard-features';\nimport {\n WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED,\n WalletStandardError,\n} from '@wallet-standard/errors';\nimport { getWalletAccountFeature, UiWalletAccount } from '@wallet-standard/ui';\nimport { getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED } from '@wallet-standard/ui-registry';\nimport { useCallback } from 'react';\n\nimport { OnlySolanaChains } from './chain';\n\ntype Input = Readonly<\n Omit<SolanaSignTransactionInput, 'account' | 'chain' | 'options'> & {\n options?: Readonly<{\n minContextSlot?: bigint;\n }>;\n }\n>;\ntype Output = SolanaSignTransactionOutput;\n\n/**\n * Use this to get a function capable of signing a serialized transaction with the private key of a\n * {@link UiWalletAccount}\n *\n * @param chain The identifier of the chain the transaction is destined for. Wallets may use this to\n * simulate the transaction for the user.\n *\n * @example\n * ```tsx\n * import { useSignTransaction } from '@solana/react';\n *\n * function SignTransactionButton({ account, transactionBytes }) {\n * const signTransaction = useSignTransaction(account, 'solana:devnet');\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const { signedTransaction } = await signTransaction({\n * transaction: transactionBytes,\n * });\n * window.alert(`Signed transaction bytes: ${signedTransaction.toString()}`);\n * } catch (e) {\n * console.error('Failed to sign transaction', e);\n * }\n * }}\n * >\n * Sign Transaction\n * </button>\n * );\n * }\n * ```\n */\nexport function useSignTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: OnlySolanaChains<TWalletAccount['chains']>,\n): (input: Input) => Promise<Output>;\nexport function useSignTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (input: Input) => Promise<Output>;\nexport function useSignTransaction<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (input: Input) => Promise<Output> {\n const signTransactions = useSignTransactions(uiWalletAccount, chain);\n return useCallback(\n async input => {\n const [result] = await signTransactions(input);\n return result;\n },\n [signTransactions],\n );\n}\n\nfunction useSignTransactions<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): (...inputs: readonly Input[]) => Promise<readonly Output[]> {\n if (!uiWalletAccount.chains.includes(chain)) {\n throw new WalletStandardError(WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED, {\n address: uiWalletAccount.address,\n chain,\n featureName: SolanaSignAndSendTransaction,\n supportedChains: [...uiWalletAccount.chains],\n supportedFeatures: [...uiWalletAccount.features],\n });\n }\n const signTransactionFeature = getWalletAccountFeature(\n uiWalletAccount,\n SolanaSignTransaction,\n ) as SolanaSignTransactionFeature[typeof SolanaSignTransaction];\n const account = getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletAccount);\n return useCallback(\n async (...inputs) => {\n const inputsWithAccountAndChain = inputs.map(({ options, ...rest }) => {\n const minContextSlot = options?.minContextSlot;\n return {\n ...rest,\n account,\n chain,\n ...(minContextSlot != null\n ? {\n options: {\n minContextSlot: Number(minContextSlot),\n },\n }\n : null),\n };\n });\n const results = await signTransactionFeature.signTransaction(...inputsWithAccountAndChain);\n return results;\n },\n [signTransactionFeature, account, chain],\n );\n}\n","import { ReadonlyUint8Array } from './readonly-uint8array';\n\n/**\n * Concatenates an array of `Uint8Array`s into a single `Uint8Array`.\n * Reuses the original byte array when applicable.\n *\n * @param byteArrays - The array of byte arrays to concatenate.\n *\n * @example\n * ```ts\n * const bytes1 = new Uint8Array([0x01, 0x02]);\n * const bytes2 = new Uint8Array([]);\n * const bytes3 = new Uint8Array([0x03, 0x04]);\n * const bytes = mergeBytes([bytes1, bytes2, bytes3]);\n * // ^ [0x01, 0x02, 0x03, 0x04]\n * ```\n */\nexport const mergeBytes = (byteArrays: Uint8Array[]): Uint8Array => {\n const nonEmptyByteArrays = byteArrays.filter(arr => arr.length);\n if (nonEmptyByteArrays.length === 0) {\n return byteArrays.length ? byteArrays[0] : new Uint8Array();\n }\n\n if (nonEmptyByteArrays.length === 1) {\n return nonEmptyByteArrays[0];\n }\n\n const totalLength = nonEmptyByteArrays.reduce((total, arr) => total + arr.length, 0);\n const result = new Uint8Array(totalLength);\n let offset = 0;\n nonEmptyByteArrays.forEach(arr => {\n result.set(arr, offset);\n offset += arr.length;\n });\n return result;\n};\n\n/**\n * Pads a `Uint8Array` with zeroes to the specified length.\n * If the array is longer than the specified length, it is returned as-is.\n *\n * @param bytes - The byte array to pad.\n * @param length - The desired length of the byte array.\n *\n * @example\n * Adds zeroes to the end of the byte array to reach the desired length.\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02]);\n * const paddedBytes = padBytes(bytes, 4);\n * // ^ [0x01, 0x02, 0x00, 0x00]\n * ```\n *\n * @example\n * Returns the original byte array if it is already at the desired length.\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02]);\n * const paddedBytes = padBytes(bytes, 2);\n * // bytes === paddedBytes\n * ```\n */\nexport function padBytes(bytes: Uint8Array, length: number): Uint8Array;\nexport function padBytes(bytes: ReadonlyUint8Array, length: number): ReadonlyUint8Array;\nexport function padBytes(bytes: ReadonlyUint8Array, length: number): ReadonlyUint8Array {\n if (bytes.length >= length) return bytes;\n const paddedBytes = new Uint8Array(length).fill(0);\n paddedBytes.set(bytes);\n return paddedBytes;\n}\n\n/**\n * Fixes a `Uint8Array` to the specified length.\n * If the array is longer than the specified length, it is truncated.\n * If the array is shorter than the specified length, it is padded with zeroes.\n *\n * @param bytes - The byte array to truncate or pad.\n * @param length - The desired length of the byte array.\n *\n * @example\n * Truncates the byte array to the desired length.\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n * const fixedBytes = fixBytes(bytes, 2);\n * // ^ [0x01, 0x02]\n * ```\n *\n * @example\n * Adds zeroes to the end of the byte array to reach the desired length.\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02]);\n * const fixedBytes = fixBytes(bytes, 4);\n * // ^ [0x01, 0x02, 0x00, 0x00]\n * ```\n *\n * @example\n * Returns the original byte array if it is already at the desired length.\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02]);\n * const fixedBytes = fixBytes(bytes, 2);\n * // bytes === fixedBytes\n * ```\n */\nexport const fixBytes = (bytes: ReadonlyUint8Array | Uint8Array, length: number): ReadonlyUint8Array | Uint8Array =>\n padBytes(bytes.length <= length ? bytes : bytes.slice(0, length), length);\n\n/**\n * Returns true if and only if the provided `data` byte array contains\n * the provided `bytes` byte array at the specified `offset`.\n *\n * @param data - The byte sequence to search for.\n * @param bytes - The byte array in which to search for `data`.\n * @param offset - The position in `bytes` where the search begins.\n *\n * @example\n * ```ts\n * const bytes = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n * const data = new Uint8Array([0x02, 0x03]);\n * containsBytes(bytes, data, 1); // true\n * containsBytes(bytes, data, 2); // false\n * ```\n */\nexport function containsBytes(\n data: ReadonlyUint8Array | Uint8Array,\n bytes: ReadonlyUint8Array | Uint8Array,\n offset: number,\n): boolean {\n const slice = offset === 0 && data.length === bytes.length ? data : data.slice(offset, offset + bytes.length);\n return bytesEqual(slice, bytes);\n}\n\n/**\n * Returns true if and only if the provided `bytes1` and `bytes2` byte arrays are equal.\n *\n * @param bytes1 - The first byte array to compare.\n * @param bytes2 - The second byte array to compare.\n *\n * @example\n * ```ts\n * const bytes1 = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n * const bytes2 = new Uint8Array([0x01, 0x02, 0x03, 0x04]);\n * bytesEqual(bytes1, bytes2); // true\n * ```\n */\nexport function bytesEqual(bytes1: ReadonlyUint8Array | Uint8Array, bytes2: ReadonlyUint8Array | Uint8Array): boolean {\n return bytes1.length === bytes2.length && bytes1.every((value, index) => value === bytes2[index]);\n}\n","import { Address, address } from '@solana/addresses';\nimport { bytesEqual } from '@solana/codecs-core';\nimport { SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\nimport { getAbortablePromise } from '@solana/promises';\nimport { MessageModifyingSigner, SignableMessage } from '@solana/signers';\nimport type { UiWalletAccount } from '@wallet-standard/ui';\nimport { useMemo } from 'react';\n\nimport { useSignMessage } from './useSignMessage';\n\n/**\n * Use this to get a {@link MessageSigner} capable of signing messages with the private key of a\n * {@link UiWalletAccount}\n *\n * @returns A {@link MessageModifyingSigner}. This is a conservative assumption based on the fact\n * that your application can not control whether or not the wallet will modify the message before\n * signing it. Otherwise this method could more specifically return a {@link MessageSigner} or a\n * {@link MessagePartialSigner}.\n *\n * @example\n * ```tsx\n * import { useWalletAccountMessageSigner } from '@solana/react';\n * import { createSignableMessage } from '@solana/signers';\n *\n * function SignMessageButton({ account, text }) {\n * const messageSigner = useWalletAccountMessageSigner(account);\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const signableMessage = createSignableMessage(text);\n * const [signedMessage] = await messageSigner.modifyAndSignMessages([signableMessage]);\n * const messageWasModified = signableMessage.content !== signedMessage.content;\n * const signatureBytes = signedMessage.signatures[messageSigner.address];\n * window.alert(\n * `Signature bytes: ${signatureBytes.toString()}${\n * messageWasModified ? ' (message was modified)' : ''\n * }`,\n * );\n * } catch (e) {\n * console.error('Failed to sign message', e);\n * }\n * }}\n * >\n * Sign Message: {text}\n * </button>\n * );\n * }\n * ```\n */\nexport function useWalletAccountMessageSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n): MessageModifyingSigner<TWalletAccount['address']> {\n const signMessage = useSignMessage(uiWalletAccount);\n return useMemo(\n () => ({\n address: address(uiWalletAccount.address),\n async modifyAndSignMessages(messages, config) {\n config?.abortSignal?.throwIfAborted();\n if (messages.length > 1) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED);\n }\n if (messages.length === 0) {\n return messages;\n }\n const { content: originalMessage, signatures: originalSignatureMap } = messages[0];\n const input = {\n message: originalMessage,\n };\n const { signedMessage, signature } = await getAbortablePromise(signMessage(input), config?.abortSignal);\n const messageWasModified =\n originalMessage.length !== signedMessage.length ||\n originalMessage.some((originalByte, ii) => originalByte !== signedMessage[ii]);\n const originalSignature = originalSignatureMap[uiWalletAccount.address as Address<string>] as\n | SignatureBytes\n | undefined;\n const signatureIsNew = originalSignature === undefined || !bytesEqual(originalSignature, signature);\n if (!signatureIsNew && !messageWasModified) {\n // We already had this exact signature, and the message wasn't modified.\n // Don't replace the existing message object.\n return messages;\n }\n const nextSignatureMap = messageWasModified\n ? { [uiWalletAccount.address]: signature }\n : { ...originalSignatureMap, [uiWalletAccount.address]: signature };\n const outputMessages = Object.freeze([\n Object.freeze({\n content: signedMessage,\n signatures: Object.freeze(nextSignatureMap),\n }) as SignableMessage,\n ]);\n return outputMessages;\n },\n }),\n [uiWalletAccount, signMessage],\n );\n}\n","import { address } from '@solana/addresses';\nimport { bytesEqual } from '@solana/codecs-core';\nimport { SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED, SolanaError } from '@solana/errors';\nimport { getAbortablePromise } from '@solana/promises';\nimport { TransactionModifyingSigner } from '@solana/signers';\nimport { getCompiledTransactionMessageDecoder } from '@solana/transaction-messages';\nimport {\n assertIsTransactionWithinSizeLimit,\n getTransactionCodec,\n getTransactionLifetimeConstraintFromCompiledTransactionMessage,\n Transaction,\n TransactionWithinSizeLimit,\n TransactionWithLifetime,\n} from '@solana/transactions';\nimport { UiWalletAccount } from '@wallet-standard/ui';\nimport { useMemo, useRef } from 'react';\n\nimport { OnlySolanaChains } from './chain';\nimport { useSignTransaction } from './useSignTransaction';\n\n/**\n * Use this to get a {@link TransactionSigner} capable of signing serialized transactions with the\n * private key of a {@link UiWalletAccount}\n *\n * @returns A {@link TransactionModifyingSigner}. This is a conservative assumption based on the\n * fact that your application can not control whether or not the wallet will modify the transaction\n * before signing it (eg. to add guard instructions, or a priority fee budget). Otherwise this\n * method could more specifically return a {@link TransactionSigner} or a\n * {@link TransactionPartialSigner}.\n *\n * @example\n * ```tsx\n * import { useWalletAccountTransactionSigner } from '@solana/react';\n *\n * function SignTransactionButton({ account, transaction }) {\n * const transactionSigner = useWalletAccountTransactionSigner(account, 'solana:devnet');\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const [{ signatures }] = await transactionSigner.modifyAndSignTransactions([transaction]);\n * const signatureBytes = signatures[transactionSigner.address];\n * window.alert(`Signature bytes: ${signatureBytes.toString()}`);\n * } catch (e) {\n * console.error('Failed to sign transaction', e);\n * }\n * }}\n * >\n * Sign Transaction\n * </button>\n * );\n * }\n * ```\n */\nexport function useWalletAccountTransactionSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: OnlySolanaChains<TWalletAccount['chains']>,\n): TransactionModifyingSigner<TWalletAccount['address']>;\nexport function useWalletAccountTransactionSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): TransactionModifyingSigner<TWalletAccount['address']>;\nexport function useWalletAccountTransactionSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): TransactionModifyingSigner<TWalletAccount['address']> {\n const encoderRef = useRef<ReturnType<typeof getTransactionCodec> | null>(null);\n const signTransaction = useSignTransaction(uiWalletAccount, chain);\n return useMemo(\n () => ({\n address: address(uiWalletAccount.address),\n async modifyAndSignTransactions(transactions, config = {}) {\n const { abortSignal, ...options } = config;\n abortSignal?.throwIfAborted();\n const transactionCodec = (encoderRef.current ||= getTransactionCodec());\n if (transactions.length > 1) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED);\n }\n if (transactions.length === 0) {\n return transactions as readonly (Transaction &\n TransactionWithinSizeLimit &\n TransactionWithLifetime)[];\n }\n const [transaction] = transactions;\n const wireTransactionBytes = transactionCodec.encode(transaction);\n const inputWithOptions = {\n ...options,\n transaction: wireTransactionBytes as Uint8Array,\n };\n const { signedTransaction } = await getAbortablePromise(signTransaction(inputWithOptions), abortSignal);\n const decodedSignedTransaction = transactionCodec.decode(\n signedTransaction,\n ) as (typeof transactions)[number];\n\n assertIsTransactionWithinSizeLimit(decodedSignedTransaction);\n\n const existingLifetime =\n 'lifetimeConstraint' in transaction\n ? (transaction as TransactionWithLifetime).lifetimeConstraint\n : undefined;\n\n if (existingLifetime) {\n if (bytesEqual(decodedSignedTransaction.messageBytes, transaction.messageBytes)) {\n // If the transaction has identical bytes, the lifetime won't have changed\n return Object.freeze([\n {\n ...decodedSignedTransaction,\n lifetimeConstraint: existingLifetime,\n },\n ]);\n }\n\n // If the transaction has changed, check the lifetime constraint field\n const compiledTransactionMessage = getCompiledTransactionMessageDecoder().decode(\n decodedSignedTransaction.messageBytes,\n );\n const currentToken =\n 'blockhash' in existingLifetime ? existingLifetime.blockhash : existingLifetime.nonce;\n\n if (compiledTransactionMessage.lifetimeToken === currentToken) {\n return Object.freeze([\n {\n ...decodedSignedTransaction,\n lifetimeConstraint: existingLifetime,\n },\n ]);\n }\n }\n\n // If we get here then there is no existing lifetime, or the lifetime has changed. We need to attach a new lifetime\n const compiledTransactionMessage = getCompiledTransactionMessageDecoder().decode(\n decodedSignedTransaction.messageBytes,\n );\n const lifetimeConstraint =\n await getTransactionLifetimeConstraintFromCompiledTransactionMessage(compiledTransactionMessage);\n return Object.freeze([\n {\n ...decodedSignedTransaction,\n lifetimeConstraint,\n },\n ]);\n },\n }),\n [uiWalletAccount.address, signTransaction],\n );\n}\n","import { address } from '@solana/addresses';\nimport { SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED, SolanaError } from '@solana/errors';\nimport { SignatureBytes } from '@solana/keys';\nimport { getAbortablePromise } from '@solana/promises';\nimport { TransactionSendingSigner } from '@solana/signers';\nimport { getTransactionEncoder } from '@solana/transactions';\nimport { UiWalletAccount } from '@wallet-standard/ui';\nimport { useMemo, useRef } from 'react';\n\nimport { OnlySolanaChains } from './chain';\nimport { useSignAndSendTransaction } from './useSignAndSendTransaction';\n\n/**\n * Use this to get a {@link TransactionSendingSigner} capable of signing a serialized transaction\n * with the private key of a {@link UiWalletAccount} and sending it to the network for processing.\n *\n * @param chain The identifier of the chain the transaction is destined for. Wallets may use this to\n * simulate the transaction for the user.\n *\n * @example\n * ```tsx\n * import { useWalletAccountTransactionSendingSigner } from '@solana/react';\n * import {\n * appendTransactionMessageInstruction,\n * createSolanaRpc,\n * getBase58Decoder,\n * pipe,\n * setTransactionMessageFeePayerSigner,\n * setTransactionMessageLifetimeUsingBlockhash,\n * signAndSendTransactionMessageWithSigners,\n * } from '@solana/kit';\n *\n * function RecordMemoButton({ account, rpc, text }) {\n * const signer = useWalletAccountTransactionSendingSigner(account, 'solana:devnet');\n * return (\n * <button\n * onClick={async () => {\n * try {\n * const { value: latestBlockhash } = await createSolanaRpc('https://api.devnet.solana.com')\n * .getLatestBlockhash()\n * .send();\n * const message = pipe(\n * createTransactionMessage({ version: 'legacy' }),\n * m => setTransactionMessageFeePayerSigner(signer, m),\n * m => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m),\n * m => appendTransactionMessageInstruction(getAddMemoInstruction({ memo: text }), m),\n * );\n * const signatureBytes = await signAndSendTransactionMessageWithSigners(message);\n * const base58Signature = getBase58Decoder().decode(signature);\n * window.alert(`View transaction: https://explorer.solana.com/tx/${base58Signature}?cluster=devnet`);\n * } catch (e) {\n * console.error('Failed to record memo', e);\n * }\n * }}\n * >\n * Record Memo\n * </button>\n * );\n * }\n * ```\n */\nexport function useWalletAccountTransactionSendingSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: OnlySolanaChains<TWalletAccount['chains']>,\n): TransactionSendingSigner<TWalletAccount['address']>;\nexport function useWalletAccountTransactionSendingSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): TransactionSendingSigner<TWalletAccount['address']>;\nexport function useWalletAccountTransactionSendingSigner<TWalletAccount extends UiWalletAccount>(\n uiWalletAccount: TWalletAccount,\n chain: `solana:${string}`,\n): TransactionSendingSigner<TWalletAccount['address']> {\n const encoderRef = useRef<ReturnType<typeof getTransactionEncoder> | null>(null);\n const signAndSendTransaction = useSignAndSendTransaction(uiWalletAccount, chain);\n return useMemo(\n () => ({\n address: address(uiWalletAccount.address),\n async signAndSendTransactions(transactions, config = {}) {\n const { abortSignal, ...options } = config;\n abortSignal?.throwIfAborted();\n const transactionEncoder = (encoderRef.current ||= getTransactionEncoder());\n if (transactions.length > 1) {\n throw new SolanaError(SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED);\n }\n if (transactions.length === 0) {\n return [];\n }\n const [transaction] = transactions;\n const wireTransactionBytes = transactionEncoder.encode(transaction);\n const inputWithOptions = {\n ...options,\n transaction: wireTransactionBytes as Uint8Array,\n };\n const { signature } = await getAbortablePromise(signAndSendTransaction(inputWithOptions), abortSignal);\n return Object.freeze([signature as SignatureBytes]);\n },\n }),\n [signAndSendTransaction, uiWalletAccount.address],\n );\n}\n"]}
|
package/dist/index.native.mjs
CHANGED
|
@@ -183,6 +183,9 @@ function useSignTransactions(uiWalletAccount, chain) {
|
|
|
183
183
|
[signTransactionFeature, account, chain]
|
|
184
184
|
);
|
|
185
185
|
}
|
|
186
|
+
function bytesEqual(bytes1, bytes2) {
|
|
187
|
+
return bytes1.length === bytes2.length && bytes1.every((value, index) => value === bytes2[index]);
|
|
188
|
+
}
|
|
186
189
|
function useWalletAccountMessageSigner(uiWalletAccount) {
|
|
187
190
|
const signMessage = useSignMessage(uiWalletAccount);
|
|
188
191
|
return useMemo(
|
|
@@ -203,7 +206,7 @@ function useWalletAccountMessageSigner(uiWalletAccount) {
|
|
|
203
206
|
const { signedMessage, signature } = await getAbortablePromise(signMessage(input), config?.abortSignal);
|
|
204
207
|
const messageWasModified = originalMessage.length !== signedMessage.length || originalMessage.some((originalByte, ii) => originalByte !== signedMessage[ii]);
|
|
205
208
|
const originalSignature = originalSignatureMap[uiWalletAccount.address];
|
|
206
|
-
const signatureIsNew =
|
|
209
|
+
const signatureIsNew = originalSignature === void 0 || !bytesEqual(originalSignature, signature);
|
|
207
210
|
if (!signatureIsNew && !messageWasModified) {
|
|
208
211
|
return messages;
|
|
209
212
|
}
|
|
@@ -249,7 +252,7 @@ function useWalletAccountTransactionSigner(uiWalletAccount, chain) {
|
|
|
249
252
|
assertIsTransactionWithinSizeLimit(decodedSignedTransaction);
|
|
250
253
|
const existingLifetime = "lifetimeConstraint" in transaction ? transaction.lifetimeConstraint : void 0;
|
|
251
254
|
if (existingLifetime) {
|
|
252
|
-
if (
|
|
255
|
+
if (bytesEqual(decodedSignedTransaction.messageBytes, transaction.messageBytes)) {
|
|
253
256
|
return Object.freeze([
|
|
254
257
|
{
|
|
255
258
|
...decodedSignedTransaction,
|
|
@@ -285,9 +288,6 @@ function useWalletAccountTransactionSigner(uiWalletAccount, chain) {
|
|
|
285
288
|
[uiWalletAccount.address, signTransaction]
|
|
286
289
|
);
|
|
287
290
|
}
|
|
288
|
-
function uint8ArraysEqual(arr1, arr2) {
|
|
289
|
-
return arr1.length === arr2.length && arr1.every((value, index) => value === arr2[index]);
|
|
290
|
-
}
|
|
291
291
|
function useWalletAccountTransactionSendingSigner(uiWalletAccount, chain) {
|
|
292
292
|
const encoderRef = useRef(null);
|
|
293
293
|
const signAndSendTransaction = useSignAndSendTransaction(uiWalletAccount, chain);
|