@solana/react 2.0.0-canary-20240731173615

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +311 -0
  3. package/dist/index.browser.cjs +318 -0
  4. package/dist/index.browser.cjs.map +1 -0
  5. package/dist/index.browser.mjs +310 -0
  6. package/dist/index.browser.mjs.map +1 -0
  7. package/dist/index.native.mjs +310 -0
  8. package/dist/index.native.mjs.map +1 -0
  9. package/dist/index.node.cjs +318 -0
  10. package/dist/index.node.cjs.map +1 -0
  11. package/dist/index.node.mjs +310 -0
  12. package/dist/index.node.mjs.map +1 -0
  13. package/dist/types/abortable-promise.d.ts +2 -0
  14. package/dist/types/abortable-promise.d.ts.map +1 -0
  15. package/dist/types/chain.d.ts +5 -0
  16. package/dist/types/chain.d.ts.map +1 -0
  17. package/dist/types/index.d.ts +8 -0
  18. package/dist/types/index.d.ts.map +1 -0
  19. package/dist/types/useSignAndSendTransaction.d.ts +16 -0
  20. package/dist/types/useSignAndSendTransaction.d.ts.map +1 -0
  21. package/dist/types/useSignIn.d.ts +13 -0
  22. package/dist/types/useSignIn.d.ts.map +1 -0
  23. package/dist/types/useSignMessage.d.ts +11 -0
  24. package/dist/types/useSignMessage.d.ts.map +1 -0
  25. package/dist/types/useSignTransaction.d.ts +16 -0
  26. package/dist/types/useSignTransaction.d.ts.map +1 -0
  27. package/dist/types/useWalletAccountMessageSigner.d.ts +7 -0
  28. package/dist/types/useWalletAccountMessageSigner.d.ts.map +1 -0
  29. package/dist/types/useWalletAccountTransactionSendingSigner.d.ts +9 -0
  30. package/dist/types/useWalletAccountTransactionSendingSigner.d.ts.map +1 -0
  31. package/dist/types/useWalletAccountTransactionSigner.d.ts +10 -0
  32. package/dist/types/useWalletAccountTransactionSigner.d.ts.map +1 -0
  33. package/package.json +90 -0
@@ -0,0 +1,310 @@
1
+ import { SolanaSignAndSendTransaction, SolanaSignIn, SolanaSignMessage, SolanaSignTransaction } from '@solana/wallet-standard-features';
2
+ import { WalletStandardError, WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED } from '@wallet-standard/errors';
3
+ import { getWalletAccountFeature, getWalletFeature } from '@wallet-standard/ui';
4
+ import { getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED } from '@wallet-standard/ui-registry';
5
+ import { useCallback, useMemo, useRef } from 'react';
6
+ import { address } from '@solana/addresses';
7
+ import { SolanaError, SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED } from '@solana/errors';
8
+ import { getTransactionCodec, getTransactionEncoder } from '@solana/transactions';
9
+
10
+ // src/useSignAndSendTransaction.ts
11
+ function useSignAndSendTransaction(uiWalletAccount, chain) {
12
+ const signAndSendTransactions = useSignAndSendTransactions(uiWalletAccount, chain);
13
+ return useCallback(
14
+ async (input) => {
15
+ const [result] = await signAndSendTransactions(input);
16
+ return result;
17
+ },
18
+ [signAndSendTransactions]
19
+ );
20
+ }
21
+ function useSignAndSendTransactions(uiWalletAccount, chain) {
22
+ if (!uiWalletAccount.chains.includes(chain)) {
23
+ throw new WalletStandardError(WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED, {
24
+ address: uiWalletAccount.address,
25
+ chain,
26
+ featureName: SolanaSignAndSendTransaction,
27
+ supportedChains: [...uiWalletAccount.chains],
28
+ supportedFeatures: [...uiWalletAccount.features]
29
+ });
30
+ }
31
+ const signAndSendTransactionFeature = getWalletAccountFeature(
32
+ uiWalletAccount,
33
+ SolanaSignAndSendTransaction
34
+ );
35
+ const account = getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletAccount);
36
+ return useCallback(
37
+ async (...inputs) => {
38
+ const inputsWithChainAndAccount = inputs.map(({ options, ...rest }) => {
39
+ const minContextSlot = options?.minContextSlot;
40
+ return {
41
+ ...rest,
42
+ account,
43
+ chain,
44
+ ...minContextSlot != null ? {
45
+ options: {
46
+ minContextSlot: Number(minContextSlot)
47
+ }
48
+ } : null
49
+ };
50
+ });
51
+ const results = await signAndSendTransactionFeature.signAndSendTransaction(...inputsWithChainAndAccount);
52
+ return results;
53
+ },
54
+ [account, chain, signAndSendTransactionFeature]
55
+ );
56
+ }
57
+ function useSignIn(uiWalletHandle) {
58
+ const signIns = useSignIns(uiWalletHandle);
59
+ return useCallback(
60
+ async (input) => {
61
+ const [result] = await signIns(input);
62
+ return result;
63
+ },
64
+ [signIns]
65
+ );
66
+ }
67
+ function useSignIns(uiWalletHandle) {
68
+ let signMessageFeature;
69
+ if ("address" in uiWalletHandle && typeof uiWalletHandle.address === "string") {
70
+ getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletHandle);
71
+ signMessageFeature = getWalletAccountFeature(
72
+ uiWalletHandle,
73
+ SolanaSignIn
74
+ );
75
+ } else {
76
+ signMessageFeature = getWalletFeature(uiWalletHandle, SolanaSignIn);
77
+ }
78
+ const wallet = getWalletForHandle_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletHandle);
79
+ return useCallback(
80
+ async (...inputs) => {
81
+ const inputsWithAddressAndChainId = inputs.map((input) => ({
82
+ ...input,
83
+ // Prioritize the `UiWalletAccount` address if it exists.
84
+ ..."address" in uiWalletHandle ? { address: uiWalletHandle.address } : null
85
+ }));
86
+ const results = await signMessageFeature.signIn(...inputsWithAddressAndChainId);
87
+ const resultsWithoutSignatureType = results.map(
88
+ ({
89
+ account,
90
+ signatureType: _,
91
+ // Solana signatures are always of type `ed25519` so drop this property.
92
+ ...rest
93
+ }) => ({
94
+ ...rest,
95
+ account: getOrCreateUiWalletAccountForStandardWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(
96
+ wallet,
97
+ account
98
+ )
99
+ })
100
+ );
101
+ return resultsWithoutSignatureType;
102
+ },
103
+ [signMessageFeature, uiWalletHandle, wallet]
104
+ );
105
+ }
106
+ function useSignMessage(...config) {
107
+ const signMessages = useSignMessages(...config);
108
+ return useCallback(
109
+ async (input) => {
110
+ const [result] = await signMessages(input);
111
+ return result;
112
+ },
113
+ [signMessages]
114
+ );
115
+ }
116
+ function useSignMessages(uiWalletAccount) {
117
+ const signMessageFeature = getWalletAccountFeature(
118
+ uiWalletAccount,
119
+ SolanaSignMessage
120
+ );
121
+ const account = getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletAccount);
122
+ return useCallback(
123
+ async (...inputs) => {
124
+ const inputsWithAccount = inputs.map((input) => ({ ...input, account }));
125
+ const results = await signMessageFeature.signMessage(...inputsWithAccount);
126
+ const resultsWithoutSignatureType = results.map(
127
+ ({
128
+ signatureType: _,
129
+ // Solana signatures are always of type `ed25519` so drop this property.
130
+ ...rest
131
+ }) => rest
132
+ );
133
+ return resultsWithoutSignatureType;
134
+ },
135
+ [signMessageFeature, account]
136
+ );
137
+ }
138
+ function useSignTransaction(uiWalletAccount, chain) {
139
+ const signTransactions = useSignTransactions(uiWalletAccount, chain);
140
+ return useCallback(
141
+ async (input) => {
142
+ const [result] = await signTransactions(input);
143
+ return result;
144
+ },
145
+ [signTransactions]
146
+ );
147
+ }
148
+ function useSignTransactions(uiWalletAccount, chain) {
149
+ if (!uiWalletAccount.chains.includes(chain)) {
150
+ throw new WalletStandardError(WALLET_STANDARD_ERROR__FEATURES__WALLET_ACCOUNT_CHAIN_UNSUPPORTED, {
151
+ address: uiWalletAccount.address,
152
+ chain,
153
+ featureName: SolanaSignAndSendTransaction,
154
+ supportedChains: [...uiWalletAccount.chains],
155
+ supportedFeatures: [...uiWalletAccount.features]
156
+ });
157
+ }
158
+ const signTransactionFeature = getWalletAccountFeature(
159
+ uiWalletAccount,
160
+ SolanaSignTransaction
161
+ );
162
+ const account = getWalletAccountForUiWalletAccount_DO_NOT_USE_OR_YOU_WILL_BE_FIRED(uiWalletAccount);
163
+ return useCallback(
164
+ async (...inputs) => {
165
+ const inputsWithAccountAndChain = inputs.map(({ options, ...rest }) => {
166
+ const minContextSlot = options?.minContextSlot;
167
+ return {
168
+ ...rest,
169
+ account,
170
+ chain,
171
+ ...minContextSlot != null ? {
172
+ options: {
173
+ minContextSlot: Number(minContextSlot)
174
+ }
175
+ } : null
176
+ };
177
+ });
178
+ const results = await signTransactionFeature.signTransaction(...inputsWithAccountAndChain);
179
+ return results;
180
+ },
181
+ [signTransactionFeature, account, chain]
182
+ );
183
+ }
184
+
185
+ // src/abortable-promise.ts
186
+ function getAbortablePromise(promise, abortSignal) {
187
+ if (!abortSignal) {
188
+ return promise;
189
+ } else {
190
+ return Promise.race([
191
+ // This promise only ever rejects if the signal is aborted. Otherwise it idles forever.
192
+ // It's important that this come before the input promise; in the event of an abort, we
193
+ // want to throw even if the input promise's result is ready
194
+ new Promise((_, reject) => {
195
+ if (abortSignal.aborted) {
196
+ reject(abortSignal.reason);
197
+ } else {
198
+ abortSignal.addEventListener("abort", function() {
199
+ reject(this.reason);
200
+ });
201
+ }
202
+ }),
203
+ promise
204
+ ]);
205
+ }
206
+ }
207
+
208
+ // src/useWalletAccountMessageSigner.ts
209
+ function useWalletAccountMessageSigner(uiWalletAccount) {
210
+ const signMessage = useSignMessage(uiWalletAccount);
211
+ return useMemo(
212
+ () => ({
213
+ address: address(uiWalletAccount.address),
214
+ async modifyAndSignMessages(messages, config) {
215
+ config?.abortSignal?.throwIfAborted();
216
+ if (messages.length > 1) {
217
+ throw new SolanaError(SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED);
218
+ }
219
+ if (messages.length === 0) {
220
+ return messages;
221
+ }
222
+ const { content: originalMessage, signatures: originalSignatureMap } = messages[0];
223
+ const input = {
224
+ message: originalMessage
225
+ };
226
+ const { signedMessage, signature } = await getAbortablePromise(signMessage(input), config?.abortSignal);
227
+ const messageWasModified = originalMessage.length !== signedMessage.length || originalMessage.some((originalByte, ii) => originalByte !== signedMessage[ii]);
228
+ const originalSignature = originalSignatureMap[uiWalletAccount.address];
229
+ const signatureIsNew = !originalSignature?.every((originalByte, ii) => originalByte === signature[ii]);
230
+ if (!signatureIsNew && !messageWasModified) {
231
+ return messages;
232
+ }
233
+ const nextSignatureMap = messageWasModified ? { [uiWalletAccount.address]: signature } : { ...originalSignatureMap, [uiWalletAccount.address]: signature };
234
+ const outputMessages = Object.freeze([
235
+ Object.freeze({
236
+ content: signedMessage,
237
+ signatures: Object.freeze(nextSignatureMap)
238
+ })
239
+ ]);
240
+ return outputMessages;
241
+ }
242
+ }),
243
+ [uiWalletAccount, signMessage]
244
+ );
245
+ }
246
+ function useWalletAccountTransactionSigner(uiWalletAccount, chain) {
247
+ const encoderRef = useRef();
248
+ const signTransaction = useSignTransaction(uiWalletAccount, chain);
249
+ return useMemo(
250
+ () => ({
251
+ address: address(uiWalletAccount.address),
252
+ async modifyAndSignTransactions(transactions, config = {}) {
253
+ const { abortSignal, ...options } = config;
254
+ abortSignal?.throwIfAborted();
255
+ const transactionCodec = encoderRef.current ||= getTransactionCodec();
256
+ if (transactions.length > 1) {
257
+ throw new SolanaError(SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED);
258
+ }
259
+ if (transactions.length === 0) {
260
+ return transactions;
261
+ }
262
+ const [transaction] = transactions;
263
+ const wireTransactionBytes = transactionCodec.encode(transaction);
264
+ const inputWithOptions = {
265
+ ...options,
266
+ transaction: wireTransactionBytes
267
+ };
268
+ const { signedTransaction } = await getAbortablePromise(signTransaction(inputWithOptions), abortSignal);
269
+ const decodedSignedTransaction = transactionCodec.decode(
270
+ signedTransaction
271
+ );
272
+ return Object.freeze([decodedSignedTransaction]);
273
+ }
274
+ }),
275
+ [uiWalletAccount.address, signTransaction]
276
+ );
277
+ }
278
+ function useWalletAccountTransactionSendingSigner(uiWalletAccount, chain) {
279
+ const encoderRef = useRef();
280
+ const signAndSendTransaction = useSignAndSendTransaction(uiWalletAccount, chain);
281
+ return useMemo(
282
+ () => ({
283
+ address: address(uiWalletAccount.address),
284
+ async signAndSendTransactions(transactions, config = {}) {
285
+ const { abortSignal, ...options } = config;
286
+ abortSignal?.throwIfAborted();
287
+ const transactionEncoder = encoderRef.current ||= getTransactionEncoder();
288
+ if (transactions.length > 1) {
289
+ throw new SolanaError(SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED);
290
+ }
291
+ if (transactions.length === 0) {
292
+ return [];
293
+ }
294
+ const [transaction] = transactions;
295
+ const wireTransactionBytes = transactionEncoder.encode(transaction);
296
+ const inputWithOptions = {
297
+ ...options,
298
+ transaction: wireTransactionBytes
299
+ };
300
+ const { signature } = await getAbortablePromise(signAndSendTransaction(inputWithOptions), abortSignal);
301
+ return Object.freeze([signature]);
302
+ }
303
+ }),
304
+ [signAndSendTransaction, uiWalletAccount.address]
305
+ );
306
+ }
307
+
308
+ export { useSignAndSendTransaction, useSignIn, useSignMessage, useSignTransaction, useWalletAccountMessageSigner, useWalletAccountTransactionSendingSigner, useWalletAccountTransactionSigner };
309
+ //# sourceMappingURL=index.native.mjs.map
310
+ //# sourceMappingURL=index.native.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/useSignAndSendTransaction.ts","../src/useSignIn.ts","../src/useSignMessage.ts","../src/useSignTransaction.ts","../src/abortable-promise.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","useRef"],"mappings":"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","file":"index.native.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 * Returns a function you can call to sign and send a serialized transaction.\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 * Returns a function you can call to sign in to a domain\n */\nexport function useSignIn(uiWalletAccount: UiWalletAccount): (input?: Omit<Input, 'address'>) => Promise<Output>;\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 * Returns a function you can call to sign a serialized transaction.\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 * Returns a function you can call to sign a serialized transaction.\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","export function getAbortablePromise<T>(promise: Promise<T>, abortSignal?: AbortSignal): Promise<T> {\n if (!abortSignal) {\n return promise;\n } else {\n return Promise.race([\n // This promise only ever rejects if the signal is aborted. Otherwise it idles forever.\n // It's important that this come before the input promise; in the event of an abort, we\n // want to throw even if the input promise's result is ready\n new Promise<never>((_, reject) => {\n if (abortSignal.aborted) {\n reject(abortSignal.reason);\n } else {\n abortSignal.addEventListener('abort', function () {\n reject(this.reason);\n });\n }\n }),\n promise,\n ]);\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 { MessageModifyingSigner, SignableMessage } from '@solana/signers';\nimport type { UiWalletAccount } from '@wallet-standard/ui';\nimport { useMemo } from 'react';\n\nimport { getAbortablePromise } from './abortable-promise';\nimport { useSignMessage } from './useSignMessage';\n\n/**\n * Returns an object that conforms to the `MessageModifyingSigner` interface of `@solana/signers`.\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 { SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED, SolanaError } from '@solana/errors';\nimport { TransactionModifyingSigner } from '@solana/signers';\nimport { getTransactionCodec } from '@solana/transactions';\nimport { UiWalletAccount } from '@wallet-standard/ui';\nimport { useMemo, useRef } from 'react';\n\nimport { getAbortablePromise } from './abortable-promise';\nimport { OnlySolanaChains } from './chain';\nimport { useSignTransaction } from './useSignTransaction';\n\n/**\n * Returns an object that conforms to the `TransactionModifyingSigner` interface of\n * `@solana/signers`.\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>>();\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;\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 return Object.freeze([decodedSignedTransaction]);\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 { TransactionSendingSigner } from '@solana/signers';\nimport { getTransactionEncoder } from '@solana/transactions';\nimport { UiWalletAccount } from '@wallet-standard/ui';\nimport { useMemo, useRef } from 'react';\n\nimport { getAbortablePromise } from './abortable-promise';\nimport { OnlySolanaChains } from './chain';\nimport { useSignAndSendTransaction } from './useSignAndSendTransaction';\n\n/**\n * Returns an object that conforms to the `TransactionSendingSigner` interface of `@solana/signers`.\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>>();\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"]}