@alchemy/wallet-apis 5.0.0-beta.3 → 5.0.0-beta.30

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 (201) hide show
  1. package/README.md +3 -1
  2. package/dist/esm/actions/prepareCalls.d.ts +8 -3
  3. package/dist/esm/actions/prepareCalls.js +8 -0
  4. package/dist/esm/actions/prepareCalls.js.map +1 -1
  5. package/dist/esm/actions/requestAccount.d.ts +4 -3
  6. package/dist/esm/actions/requestAccount.js.map +1 -1
  7. package/dist/esm/actions/sendCalls.d.ts +5 -2
  8. package/dist/esm/actions/sendCalls.js +5 -2
  9. package/dist/esm/actions/sendCalls.js.map +1 -1
  10. package/dist/esm/actions/sendPreparedCalls.d.ts +3 -1
  11. package/dist/esm/actions/sendPreparedCalls.js.map +1 -1
  12. package/dist/esm/actions/signPreparedCalls.d.ts +2 -0
  13. package/dist/esm/actions/signPreparedCalls.js +14 -1
  14. package/dist/esm/actions/signPreparedCalls.js.map +1 -1
  15. package/dist/esm/actions/signSignatureRequest.d.ts +4 -4
  16. package/dist/esm/actions/signSignatureRequest.js +1 -1
  17. package/dist/esm/actions/signSignatureRequest.js.map +1 -1
  18. package/dist/esm/actions/signTypedData.d.ts +14 -4
  19. package/dist/esm/actions/signTypedData.js.map +1 -1
  20. package/dist/esm/actions/solana/getCallsStatus.d.ts +24 -0
  21. package/dist/esm/actions/solana/getCallsStatus.js +44 -0
  22. package/dist/esm/actions/solana/getCallsStatus.js.map +1 -0
  23. package/dist/esm/actions/solana/prepareCalls.d.ts +46 -0
  24. package/dist/esm/actions/solana/prepareCalls.js +70 -0
  25. package/dist/esm/actions/solana/prepareCalls.js.map +1 -0
  26. package/dist/esm/actions/solana/sendCalls.d.ts +34 -0
  27. package/dist/esm/actions/solana/sendCalls.js +44 -0
  28. package/dist/esm/actions/solana/sendCalls.js.map +1 -0
  29. package/dist/esm/actions/solana/sendPreparedCalls.d.ts +24 -0
  30. package/dist/esm/actions/solana/sendPreparedCalls.js +32 -0
  31. package/dist/esm/actions/solana/sendPreparedCalls.js.map +1 -0
  32. package/dist/esm/actions/solana/signPreparedCalls.d.ts +23 -0
  33. package/dist/esm/actions/solana/signPreparedCalls.js +24 -0
  34. package/dist/esm/actions/solana/signPreparedCalls.js.map +1 -0
  35. package/dist/esm/actions/solana/signSignatureRequest.d.ts +10 -0
  36. package/dist/esm/actions/solana/signSignatureRequest.js +33 -0
  37. package/dist/esm/actions/solana/signSignatureRequest.js.map +1 -0
  38. package/dist/esm/actions/solana/waitForCallsStatus.d.ts +24 -0
  39. package/dist/esm/actions/solana/waitForCallsStatus.js +46 -0
  40. package/dist/esm/actions/solana/waitForCallsStatus.js.map +1 -0
  41. package/dist/esm/actions/undelegateAccount.d.ts +37 -0
  42. package/dist/esm/actions/undelegateAccount.js +49 -0
  43. package/dist/esm/actions/undelegateAccount.js.map +1 -0
  44. package/dist/esm/adapters/SolanaSignerError.d.ts +4 -0
  45. package/dist/esm/adapters/SolanaSignerError.js +13 -0
  46. package/dist/esm/adapters/SolanaSignerError.js.map +1 -0
  47. package/dist/esm/adapters/fromKeypair.d.ts +21 -0
  48. package/dist/esm/adapters/fromKeypair.js +46 -0
  49. package/dist/esm/adapters/fromKeypair.js.map +1 -0
  50. package/dist/esm/adapters/fromKitSigner.d.ts +21 -0
  51. package/dist/esm/adapters/fromKitSigner.js +61 -0
  52. package/dist/esm/adapters/fromKitSigner.js.map +1 -0
  53. package/dist/esm/adapters/fromWalletAdapter.d.ts +26 -0
  54. package/dist/esm/adapters/fromWalletAdapter.js +45 -0
  55. package/dist/esm/adapters/fromWalletAdapter.js.map +1 -0
  56. package/dist/esm/adapters/fromWalletStandard.d.ts +31 -0
  57. package/dist/esm/adapters/fromWalletStandard.js +53 -0
  58. package/dist/esm/adapters/fromWalletStandard.js.map +1 -0
  59. package/dist/esm/adapters/resolveSignerSlot.d.ts +10 -0
  60. package/dist/esm/adapters/resolveSignerSlot.js +39 -0
  61. package/dist/esm/adapters/resolveSignerSlot.js.map +1 -0
  62. package/dist/esm/client.d.ts +29 -14
  63. package/dist/esm/client.js +63 -19
  64. package/dist/esm/client.js.map +1 -1
  65. package/dist/esm/decorators/smartWalletActions.d.ts +2 -0
  66. package/dist/esm/decorators/smartWalletActions.js +4 -2
  67. package/dist/esm/decorators/smartWalletActions.js.map +1 -1
  68. package/dist/esm/decorators/solanaSmartWalletActions.d.ts +16 -0
  69. package/dist/esm/decorators/solanaSmartWalletActions.js +16 -0
  70. package/dist/esm/decorators/solanaSmartWalletActions.js.map +1 -0
  71. package/dist/esm/experimental/actions/requestQuoteV0.d.ts +48 -11
  72. package/dist/esm/experimental/actions/requestQuoteV0.js +8 -4
  73. package/dist/esm/experimental/actions/requestQuoteV0.js.map +1 -1
  74. package/dist/esm/experimental/swapActionsDecorator.d.ts +3 -0
  75. package/dist/esm/experimental/swapActionsDecorator.js.map +1 -1
  76. package/dist/esm/exports/index.d.ts +5 -3
  77. package/dist/esm/exports/index.js +1 -0
  78. package/dist/esm/exports/index.js.map +1 -1
  79. package/dist/esm/exports/solana.d.ts +24 -0
  80. package/dist/esm/exports/solana.js +15 -0
  81. package/dist/esm/exports/solana.js.map +1 -0
  82. package/dist/esm/types.d.ts +28 -4
  83. package/dist/esm/types.js.map +1 -1
  84. package/dist/esm/utils/assertions.d.ts +4 -2
  85. package/dist/esm/utils/assertions.js +6 -0
  86. package/dist/esm/utils/assertions.js.map +1 -1
  87. package/dist/esm/utils/capabilities.d.ts +22 -6
  88. package/dist/esm/utils/capabilities.js +19 -2
  89. package/dist/esm/utils/capabilities.js.map +1 -1
  90. package/dist/esm/utils/format.d.ts +2 -2
  91. package/dist/esm/utils/format.js +4 -3
  92. package/dist/esm/utils/format.js.map +1 -1
  93. package/dist/esm/utils/schema.d.ts +14 -14
  94. package/dist/esm/utils/schema.js +35 -39
  95. package/dist/esm/utils/schema.js.map +1 -1
  96. package/dist/esm/version.d.ts +1 -1
  97. package/dist/esm/version.js +1 -1
  98. package/dist/esm/version.js.map +1 -1
  99. package/dist/types/actions/prepareCalls.d.ts +8 -3
  100. package/dist/types/actions/prepareCalls.d.ts.map +1 -1
  101. package/dist/types/actions/requestAccount.d.ts +4 -3
  102. package/dist/types/actions/requestAccount.d.ts.map +1 -1
  103. package/dist/types/actions/sendCalls.d.ts +5 -2
  104. package/dist/types/actions/sendCalls.d.ts.map +1 -1
  105. package/dist/types/actions/sendPreparedCalls.d.ts +3 -1
  106. package/dist/types/actions/sendPreparedCalls.d.ts.map +1 -1
  107. package/dist/types/actions/signPreparedCalls.d.ts +2 -0
  108. package/dist/types/actions/signPreparedCalls.d.ts.map +1 -1
  109. package/dist/types/actions/signSignatureRequest.d.ts +4 -4
  110. package/dist/types/actions/signSignatureRequest.d.ts.map +1 -1
  111. package/dist/types/actions/signTypedData.d.ts +14 -4
  112. package/dist/types/actions/signTypedData.d.ts.map +1 -1
  113. package/dist/types/actions/solana/getCallsStatus.d.ts +25 -0
  114. package/dist/types/actions/solana/getCallsStatus.d.ts.map +1 -0
  115. package/dist/types/actions/solana/prepareCalls.d.ts +47 -0
  116. package/dist/types/actions/solana/prepareCalls.d.ts.map +1 -0
  117. package/dist/types/actions/solana/sendCalls.d.ts +35 -0
  118. package/dist/types/actions/solana/sendCalls.d.ts.map +1 -0
  119. package/dist/types/actions/solana/sendPreparedCalls.d.ts +25 -0
  120. package/dist/types/actions/solana/sendPreparedCalls.d.ts.map +1 -0
  121. package/dist/types/actions/solana/signPreparedCalls.d.ts +24 -0
  122. package/dist/types/actions/solana/signPreparedCalls.d.ts.map +1 -0
  123. package/dist/types/actions/solana/signSignatureRequest.d.ts +11 -0
  124. package/dist/types/actions/solana/signSignatureRequest.d.ts.map +1 -0
  125. package/dist/types/actions/solana/waitForCallsStatus.d.ts +25 -0
  126. package/dist/types/actions/solana/waitForCallsStatus.d.ts.map +1 -0
  127. package/dist/types/actions/undelegateAccount.d.ts +38 -0
  128. package/dist/types/actions/undelegateAccount.d.ts.map +1 -0
  129. package/dist/types/adapters/SolanaSignerError.d.ts +5 -0
  130. package/dist/types/adapters/SolanaSignerError.d.ts.map +1 -0
  131. package/dist/types/adapters/fromKeypair.d.ts +22 -0
  132. package/dist/types/adapters/fromKeypair.d.ts.map +1 -0
  133. package/dist/types/adapters/fromKitSigner.d.ts +22 -0
  134. package/dist/types/adapters/fromKitSigner.d.ts.map +1 -0
  135. package/dist/types/adapters/fromWalletAdapter.d.ts +27 -0
  136. package/dist/types/adapters/fromWalletAdapter.d.ts.map +1 -0
  137. package/dist/types/adapters/fromWalletStandard.d.ts +32 -0
  138. package/dist/types/adapters/fromWalletStandard.d.ts.map +1 -0
  139. package/dist/types/adapters/resolveSignerSlot.d.ts +11 -0
  140. package/dist/types/adapters/resolveSignerSlot.d.ts.map +1 -0
  141. package/dist/types/client.d.ts +29 -14
  142. package/dist/types/client.d.ts.map +1 -1
  143. package/dist/types/decorators/smartWalletActions.d.ts +2 -0
  144. package/dist/types/decorators/smartWalletActions.d.ts.map +1 -1
  145. package/dist/types/decorators/solanaSmartWalletActions.d.ts +17 -0
  146. package/dist/types/decorators/solanaSmartWalletActions.d.ts.map +1 -0
  147. package/dist/types/experimental/actions/requestQuoteV0.d.ts +48 -11
  148. package/dist/types/experimental/actions/requestQuoteV0.d.ts.map +1 -1
  149. package/dist/types/experimental/swapActionsDecorator.d.ts +3 -0
  150. package/dist/types/experimental/swapActionsDecorator.d.ts.map +1 -1
  151. package/dist/types/exports/index.d.ts +5 -3
  152. package/dist/types/exports/index.d.ts.map +1 -1
  153. package/dist/types/exports/solana.d.ts +25 -0
  154. package/dist/types/exports/solana.d.ts.map +1 -0
  155. package/dist/types/types.d.ts +28 -4
  156. package/dist/types/types.d.ts.map +1 -1
  157. package/dist/types/utils/assertions.d.ts +4 -2
  158. package/dist/types/utils/assertions.d.ts.map +1 -1
  159. package/dist/types/utils/capabilities.d.ts +22 -6
  160. package/dist/types/utils/capabilities.d.ts.map +1 -1
  161. package/dist/types/utils/format.d.ts +2 -2
  162. package/dist/types/utils/format.d.ts.map +1 -1
  163. package/dist/types/utils/schema.d.ts +14 -14
  164. package/dist/types/utils/schema.d.ts.map +1 -1
  165. package/dist/types/version.d.ts +1 -1
  166. package/dist/types/version.d.ts.map +1 -1
  167. package/package.json +29 -11
  168. package/src/actions/prepareCalls.ts +21 -3
  169. package/src/actions/requestAccount.ts +7 -5
  170. package/src/actions/sendCalls.ts +5 -2
  171. package/src/actions/sendPreparedCalls.ts +4 -1
  172. package/src/actions/signPreparedCalls.ts +15 -2
  173. package/src/actions/signSignatureRequest.ts +8 -8
  174. package/src/actions/signTypedData.ts +15 -7
  175. package/src/actions/solana/getCallsStatus.ts +79 -0
  176. package/src/actions/solana/prepareCalls.ts +120 -0
  177. package/src/actions/solana/sendCalls.ts +66 -0
  178. package/src/actions/solana/sendPreparedCalls.ts +65 -0
  179. package/src/actions/solana/signPreparedCalls.ts +50 -0
  180. package/src/actions/solana/signSignatureRequest.ts +63 -0
  181. package/src/actions/solana/waitForCallsStatus.ts +84 -0
  182. package/src/actions/undelegateAccount.ts +68 -0
  183. package/src/adapters/SolanaSignerError.ts +5 -0
  184. package/src/adapters/fromKeypair.ts +58 -0
  185. package/src/adapters/fromKitSigner.ts +82 -0
  186. package/src/adapters/fromWalletAdapter.ts +58 -0
  187. package/src/adapters/fromWalletStandard.ts +100 -0
  188. package/src/adapters/resolveSignerSlot.ts +46 -0
  189. package/src/client.ts +131 -18
  190. package/src/decorators/smartWalletActions.ts +11 -2
  191. package/src/decorators/solanaSmartWalletActions.ts +62 -0
  192. package/src/experimental/actions/requestQuoteV0.ts +40 -15
  193. package/src/experimental/swapActionsDecorator.ts +3 -0
  194. package/src/exports/index.ts +10 -4
  195. package/src/exports/solana.ts +36 -0
  196. package/src/types.ts +38 -7
  197. package/src/utils/assertions.ts +17 -2
  198. package/src/utils/capabilities.ts +40 -8
  199. package/src/utils/format.ts +8 -3
  200. package/src/utils/schema.ts +58 -69
  201. package/src/version.ts +1 -1
@@ -0,0 +1,46 @@
1
+ import { SolanaSignerError } from "./SolanaSignerError.js";
2
+ import { findSignerSlot } from "./resolveSignerSlot.js";
3
+ /**
4
+ * Adapts a raw Ed25519 keypair signer into a {@link SolanaSigner}.
5
+ *
6
+ * Use this for legacy `@solana/web3.js` v1 `Keypair` signers or any signer
7
+ * that exposes a `signMessage(bytes) => signature` interface. For
8
+ * `@solana/kit` signers, use {@link fromKitSigner}. For browser wallets
9
+ * (wallet adapter, Phantom, etc.), use {@link fromWalletAdapter}. For
10
+ * wallet-standard wallets, use {@link fromWalletStandard}.
11
+ *
12
+ * Requires `@solana/kit` or `@solana/web3.js` as a peer dependency.
13
+ *
14
+ * @param {SolanaKeypairSigner} signer - The raw Ed25519 keypair signer to adapt
15
+ * @returns {SolanaSigner} A SolanaSigner compatible with `createSmartWalletClient`
16
+ */
17
+ export function fromKeypair(signer) {
18
+ return {
19
+ address: signer.address,
20
+ async signTransaction({ transaction }) {
21
+ const numSigs = transaction[0];
22
+ const messageStart = 1 + numSigs * 64;
23
+ const messageBytes = transaction.slice(messageStart);
24
+ let sig;
25
+ try {
26
+ sig = await signer.signMessage(messageBytes);
27
+ }
28
+ catch (e) {
29
+ throw new SolanaSignerError("Keypair signer failed to sign message", {
30
+ cause: e,
31
+ });
32
+ }
33
+ if (sig.length !== 64) {
34
+ throw new SolanaSignerError(`Expected a 64-byte Ed25519 signature but received ${sig.length} bytes`);
35
+ }
36
+ const slotIndex = await findSignerSlot(transaction, signer.address);
37
+ if (slotIndex < 0) {
38
+ throw new SolanaSignerError(`Signer ${signer.address} is not a required signer in this transaction`);
39
+ }
40
+ const signedTx = new Uint8Array(transaction);
41
+ signedTx.set(sig, 1 + slotIndex * 64);
42
+ return { signedTransaction: signedTx };
43
+ },
44
+ };
45
+ }
46
+ //# sourceMappingURL=fromKeypair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fromKeypair.js","sourceRoot":"","sources":["../../../src/adapters/fromKeypair.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAQxD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,WAAW,CAAC,MAA2B;IACrD,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE;YACnC,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,YAAY,GAAG,CAAC,GAAG,OAAO,GAAG,EAAE,CAAC;YACtC,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACrD,IAAI,GAAe,CAAC;YACpB,IAAI,CAAC;gBACH,GAAG,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YAC/C,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,IAAI,iBAAiB,CAAC,uCAAuC,EAAE;oBACnE,KAAK,EAAE,CAAU;iBAClB,CAAC,CAAC;YACL,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;gBACtB,MAAM,IAAI,iBAAiB,CACzB,qDAAqD,GAAG,CAAC,MAAM,QAAQ,CACxE,CAAC;YACJ,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YACpE,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;gBAClB,MAAM,IAAI,iBAAiB,CACzB,UAAU,MAAM,CAAC,OAAO,+CAA+C,CACxE,CAAC;YACJ,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;YAC7C,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,GAAG,EAAE,CAAC,CAAC;YACtC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { SolanaSigner } from \"../types.js\";\nimport { SolanaSignerError } from \"./SolanaSignerError.js\";\nimport { findSignerSlot } from \"./resolveSignerSlot.js\";\n\n/** Raw Ed25519 keypair signer (e.g. `Keypair` from `@solana/web3.js` v1 or a bare Ed25519 key). */\nexport interface SolanaKeypairSigner {\n address: string;\n signMessage(message: Uint8Array): Promise<Uint8Array>;\n}\n\n/**\n * Adapts a raw Ed25519 keypair signer into a {@link SolanaSigner}.\n *\n * Use this for legacy `@solana/web3.js` v1 `Keypair` signers or any signer\n * that exposes a `signMessage(bytes) => signature` interface. For\n * `@solana/kit` signers, use {@link fromKitSigner}. For browser wallets\n * (wallet adapter, Phantom, etc.), use {@link fromWalletAdapter}. For\n * wallet-standard wallets, use {@link fromWalletStandard}.\n *\n * Requires `@solana/kit` or `@solana/web3.js` as a peer dependency.\n *\n * @param {SolanaKeypairSigner} signer - The raw Ed25519 keypair signer to adapt\n * @returns {SolanaSigner} A SolanaSigner compatible with `createSmartWalletClient`\n */\nexport function fromKeypair(signer: SolanaKeypairSigner): SolanaSigner {\n return {\n address: signer.address,\n async signTransaction({ transaction }) {\n const numSigs = transaction[0];\n const messageStart = 1 + numSigs * 64;\n const messageBytes = transaction.slice(messageStart);\n let sig: Uint8Array;\n try {\n sig = await signer.signMessage(messageBytes);\n } catch (e) {\n throw new SolanaSignerError(\"Keypair signer failed to sign message\", {\n cause: e as Error,\n });\n }\n if (sig.length !== 64) {\n throw new SolanaSignerError(\n `Expected a 64-byte Ed25519 signature but received ${sig.length} bytes`,\n );\n }\n\n const slotIndex = await findSignerSlot(transaction, signer.address);\n if (slotIndex < 0) {\n throw new SolanaSignerError(\n `Signer ${signer.address} is not a required signer in this transaction`,\n );\n }\n\n const signedTx = new Uint8Array(transaction);\n signedTx.set(sig, 1 + slotIndex * 64);\n return { signedTransaction: signedTx };\n },\n };\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import type { SolanaSigner } from "../types.js";
2
+ /** Any {@link https://solanakit.com @solana/kit} signer that implements `signTransactions` (e.g. `TransactionPartialSigner`, `KeyPairSigner`). */
3
+ export interface SolanaTransactionPartialSigner {
4
+ address: string;
5
+ signTransactions(transactions: readonly unknown[]): Promise<readonly Record<string, Uint8Array>[]>;
6
+ }
7
+ /**
8
+ * Adapts an {@link https://solanakit.com @solana/kit} signer into a {@link SolanaSigner}.
9
+ *
10
+ * Accepts any signer that implements `signTransactions`, including
11
+ * `KeyPairSigner`, `TransactionPartialSigner`, and `NoopSigner`. For raw
12
+ * Ed25519 keypairs, use {@link fromKeypair}. For browser wallets (wallet
13
+ * adapter, Phantom, etc.), use {@link fromWalletAdapter}. For
14
+ * wallet-standard wallets, use {@link fromWalletStandard}.
15
+ *
16
+ * Requires `@solana/kit` as a peer dependency.
17
+ *
18
+ * @param {SolanaTransactionPartialSigner} signer - The @solana/kit signer to adapt
19
+ * @returns {SolanaSigner} A SolanaSigner compatible with `createSmartWalletClient`
20
+ */
21
+ export declare function fromKitSigner(signer: SolanaTransactionPartialSigner): SolanaSigner;
@@ -0,0 +1,61 @@
1
+ import { SolanaSignerError } from "./SolanaSignerError.js";
2
+ import { findSignerSlot } from "./resolveSignerSlot.js";
3
+ /**
4
+ * Adapts an {@link https://solanakit.com @solana/kit} signer into a {@link SolanaSigner}.
5
+ *
6
+ * Accepts any signer that implements `signTransactions`, including
7
+ * `KeyPairSigner`, `TransactionPartialSigner`, and `NoopSigner`. For raw
8
+ * Ed25519 keypairs, use {@link fromKeypair}. For browser wallets (wallet
9
+ * adapter, Phantom, etc.), use {@link fromWalletAdapter}. For
10
+ * wallet-standard wallets, use {@link fromWalletStandard}.
11
+ *
12
+ * Requires `@solana/kit` as a peer dependency.
13
+ *
14
+ * @param {SolanaTransactionPartialSigner} signer - The @solana/kit signer to adapt
15
+ * @returns {SolanaSigner} A SolanaSigner compatible with `createSmartWalletClient`
16
+ */
17
+ export function fromKitSigner(signer) {
18
+ return {
19
+ address: signer.address,
20
+ async signTransaction({ transaction }) {
21
+ let tx;
22
+ try {
23
+ const { getTransactionCodec } = await import("@solana/kit");
24
+ const codec = getTransactionCodec();
25
+ tx = codec.decode(transaction);
26
+ }
27
+ catch (e) {
28
+ throw new SolanaSignerError("Failed to decode transaction", {
29
+ cause: e,
30
+ });
31
+ }
32
+ let sigDict;
33
+ try {
34
+ [sigDict] = await signer.signTransactions([tx]);
35
+ }
36
+ catch (e) {
37
+ throw new SolanaSignerError("Kit signer failed to sign transaction", {
38
+ cause: e,
39
+ });
40
+ }
41
+ if (!sigDict) {
42
+ throw new SolanaSignerError("TransactionPartialSigner returned no signatures");
43
+ }
44
+ const sig = sigDict[signer.address];
45
+ if (!sig) {
46
+ throw new SolanaSignerError(`TransactionPartialSigner did not produce a signature for ${signer.address}`);
47
+ }
48
+ if (sig.length !== 64) {
49
+ throw new SolanaSignerError(`Expected a 64-byte Ed25519 signature but received ${sig.length} bytes`);
50
+ }
51
+ const slotIndex = await findSignerSlot(transaction, signer.address);
52
+ if (slotIndex < 0) {
53
+ throw new SolanaSignerError(`Signer ${signer.address} is not a required signer in this transaction`);
54
+ }
55
+ const signedTx = new Uint8Array(transaction);
56
+ signedTx.set(sig, 1 + slotIndex * 64);
57
+ return { signedTransaction: signedTx };
58
+ },
59
+ };
60
+ }
61
+ //# sourceMappingURL=fromKitSigner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fromKitSigner.js","sourceRoot":"","sources":["../../../src/adapters/fromKitSigner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAUxD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAsC;IAEtC,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE;YACnC,IAAI,EAAW,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;gBAC5D,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC;gBACpC,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,IAAI,iBAAiB,CAAC,8BAA8B,EAAE;oBAC1D,KAAK,EAAE,CAAU;iBAClB,CAAC,CAAC;YACL,CAAC;YAED,IAAI,OAA+C,CAAC;YACpD,IAAI,CAAC;gBACH,CAAC,OAAO,CAAC,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAClD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,IAAI,iBAAiB,CAAC,uCAAuC,EAAE;oBACnE,KAAK,EAAE,CAAU;iBAClB,CAAC,CAAC;YACL,CAAC;YACD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,iBAAiB,CACzB,iDAAiD,CAClD,CAAC;YACJ,CAAC;YAED,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,IAAI,iBAAiB,CACzB,4DAA4D,MAAM,CAAC,OAAO,EAAE,CAC7E,CAAC;YACJ,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;gBACtB,MAAM,IAAI,iBAAiB,CACzB,qDAAqD,GAAG,CAAC,MAAM,QAAQ,CACxE,CAAC;YACJ,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YACpE,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;gBAClB,MAAM,IAAI,iBAAiB,CACzB,UAAU,MAAM,CAAC,OAAO,+CAA+C,CACxE,CAAC;YACJ,CAAC;YAED,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;YAC7C,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,SAAS,GAAG,EAAE,CAAC,CAAC;YACtC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { SolanaSigner } from \"../types.js\";\nimport { SolanaSignerError } from \"./SolanaSignerError.js\";\nimport { findSignerSlot } from \"./resolveSignerSlot.js\";\n\n/** Any {@link https://solanakit.com @solana/kit} signer that implements `signTransactions` (e.g. `TransactionPartialSigner`, `KeyPairSigner`). */\nexport interface SolanaTransactionPartialSigner {\n address: string;\n signTransactions(\n transactions: readonly unknown[],\n ): Promise<readonly Record<string, Uint8Array>[]>;\n}\n\n/**\n * Adapts an {@link https://solanakit.com @solana/kit} signer into a {@link SolanaSigner}.\n *\n * Accepts any signer that implements `signTransactions`, including\n * `KeyPairSigner`, `TransactionPartialSigner`, and `NoopSigner`. For raw\n * Ed25519 keypairs, use {@link fromKeypair}. For browser wallets (wallet\n * adapter, Phantom, etc.), use {@link fromWalletAdapter}. For\n * wallet-standard wallets, use {@link fromWalletStandard}.\n *\n * Requires `@solana/kit` as a peer dependency.\n *\n * @param {SolanaTransactionPartialSigner} signer - The @solana/kit signer to adapt\n * @returns {SolanaSigner} A SolanaSigner compatible with `createSmartWalletClient`\n */\nexport function fromKitSigner(\n signer: SolanaTransactionPartialSigner,\n): SolanaSigner {\n return {\n address: signer.address,\n async signTransaction({ transaction }) {\n let tx: unknown;\n try {\n const { getTransactionCodec } = await import(\"@solana/kit\");\n const codec = getTransactionCodec();\n tx = codec.decode(transaction);\n } catch (e) {\n throw new SolanaSignerError(\"Failed to decode transaction\", {\n cause: e as Error,\n });\n }\n\n let sigDict: Record<string, Uint8Array> | undefined;\n try {\n [sigDict] = await signer.signTransactions([tx]);\n } catch (e) {\n throw new SolanaSignerError(\"Kit signer failed to sign transaction\", {\n cause: e as Error,\n });\n }\n if (!sigDict) {\n throw new SolanaSignerError(\n \"TransactionPartialSigner returned no signatures\",\n );\n }\n\n const sig = sigDict[signer.address];\n if (!sig) {\n throw new SolanaSignerError(\n `TransactionPartialSigner did not produce a signature for ${signer.address}`,\n );\n }\n if (sig.length !== 64) {\n throw new SolanaSignerError(\n `Expected a 64-byte Ed25519 signature but received ${sig.length} bytes`,\n );\n }\n\n const slotIndex = await findSignerSlot(transaction, signer.address);\n if (slotIndex < 0) {\n throw new SolanaSignerError(\n `Signer ${signer.address} is not a required signer in this transaction`,\n );\n }\n\n const signedTx = new Uint8Array(transaction);\n signedTx.set(sig, 1 + slotIndex * 64);\n return { signedTransaction: signedTx };\n },\n };\n}\n"]}
@@ -0,0 +1,26 @@
1
+ import type { SolanaSigner } from "../types.js";
2
+ import type { VersionedTransaction } from "@solana/web3.js";
3
+ /** Any signer with a `publicKey` and `signTransaction(VersionedTransaction)` method — matches `useWallet()` from `@solana/wallet-adapter-react` and injected wallet providers like `window.phantom.solana`. */
4
+ export interface WalletAdapterSigner {
5
+ publicKey: {
6
+ toBase58(): string;
7
+ };
8
+ signTransaction: <T extends VersionedTransaction>(transaction: T) => Promise<T>;
9
+ }
10
+ /**
11
+ * Adapts a wallet that signs `VersionedTransaction` objects into a {@link SolanaSigner}.
12
+ *
13
+ * Works with `useWallet()` from `@solana/wallet-adapter-react` and injected
14
+ * browser wallet providers (e.g. `window.phantom.solana`). Handles the
15
+ * `Uint8Array` ↔ `VersionedTransaction` conversion internally.
16
+ *
17
+ * For `@solana/kit` signers, use {@link fromKitSigner}. For raw Ed25519
18
+ * keypairs, use {@link fromKeypair}. For wallet-standard wallets, use
19
+ * {@link fromWalletStandard}.
20
+ *
21
+ * Requires `@solana/web3.js` as a peer dependency.
22
+ *
23
+ * @param {WalletAdapterSigner} signer - The wallet adapter signer
24
+ * @returns {SolanaSigner} A SolanaSigner compatible with `createSmartWalletClient`
25
+ */
26
+ export declare function fromWalletAdapter(signer: WalletAdapterSigner): SolanaSigner;
@@ -0,0 +1,45 @@
1
+ import { SolanaSignerError } from "./SolanaSignerError.js";
2
+ /**
3
+ * Adapts a wallet that signs `VersionedTransaction` objects into a {@link SolanaSigner}.
4
+ *
5
+ * Works with `useWallet()` from `@solana/wallet-adapter-react` and injected
6
+ * browser wallet providers (e.g. `window.phantom.solana`). Handles the
7
+ * `Uint8Array` ↔ `VersionedTransaction` conversion internally.
8
+ *
9
+ * For `@solana/kit` signers, use {@link fromKitSigner}. For raw Ed25519
10
+ * keypairs, use {@link fromKeypair}. For wallet-standard wallets, use
11
+ * {@link fromWalletStandard}.
12
+ *
13
+ * Requires `@solana/web3.js` as a peer dependency.
14
+ *
15
+ * @param {WalletAdapterSigner} signer - The wallet adapter signer
16
+ * @returns {SolanaSigner} A SolanaSigner compatible with `createSmartWalletClient`
17
+ */
18
+ export function fromWalletAdapter(signer) {
19
+ return {
20
+ address: signer.publicKey.toBase58(),
21
+ async signTransaction({ transaction }) {
22
+ let tx;
23
+ try {
24
+ const web3 = await import("@solana/web3.js");
25
+ tx = web3.VersionedTransaction.deserialize(transaction);
26
+ }
27
+ catch (e) {
28
+ throw new SolanaSignerError("Failed to deserialize transaction", {
29
+ cause: e,
30
+ });
31
+ }
32
+ let signed;
33
+ try {
34
+ signed = await signer.signTransaction(tx);
35
+ }
36
+ catch (e) {
37
+ throw new SolanaSignerError("Wallet adapter failed to sign transaction", {
38
+ cause: e,
39
+ });
40
+ }
41
+ return { signedTransaction: new Uint8Array(signed.serialize()) };
42
+ },
43
+ };
44
+ }
45
+ //# sourceMappingURL=fromWalletAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fromWalletAdapter.js","sourceRoot":"","sources":["../../../src/adapters/fromWalletAdapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAU3D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAA2B;IAC3D,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE;QACpC,KAAK,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE;YACnC,IAAI,EAAwB,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;gBAC7C,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YAC1D,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,IAAI,iBAAiB,CAAC,mCAAmC,EAAE;oBAC/D,KAAK,EAAE,CAAU;iBAClB,CAAC,CAAC;YACL,CAAC;YAED,IAAI,MAA4B,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;YAC5C,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,IAAI,iBAAiB,CACzB,2CAA2C,EAC3C;oBACE,KAAK,EAAE,CAAU;iBAClB,CACF,CAAC;YACJ,CAAC;YAED,OAAO,EAAE,iBAAiB,EAAE,IAAI,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC;QACnE,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { SolanaSigner } from \"../types.js\";\nimport type { VersionedTransaction } from \"@solana/web3.js\";\nimport { SolanaSignerError } from \"./SolanaSignerError.js\";\n\n/** Any signer with a `publicKey` and `signTransaction(VersionedTransaction)` method — matches `useWallet()` from `@solana/wallet-adapter-react` and injected wallet providers like `window.phantom.solana`. */\nexport interface WalletAdapterSigner {\n publicKey: { toBase58(): string };\n signTransaction: <T extends VersionedTransaction>(\n transaction: T,\n ) => Promise<T>;\n}\n\n/**\n * Adapts a wallet that signs `VersionedTransaction` objects into a {@link SolanaSigner}.\n *\n * Works with `useWallet()` from `@solana/wallet-adapter-react` and injected\n * browser wallet providers (e.g. `window.phantom.solana`). Handles the\n * `Uint8Array` ↔ `VersionedTransaction` conversion internally.\n *\n * For `@solana/kit` signers, use {@link fromKitSigner}. For raw Ed25519\n * keypairs, use {@link fromKeypair}. For wallet-standard wallets, use\n * {@link fromWalletStandard}.\n *\n * Requires `@solana/web3.js` as a peer dependency.\n *\n * @param {WalletAdapterSigner} signer - The wallet adapter signer\n * @returns {SolanaSigner} A SolanaSigner compatible with `createSmartWalletClient`\n */\nexport function fromWalletAdapter(signer: WalletAdapterSigner): SolanaSigner {\n return {\n address: signer.publicKey.toBase58(),\n async signTransaction({ transaction }) {\n let tx: VersionedTransaction;\n try {\n const web3 = await import(\"@solana/web3.js\");\n tx = web3.VersionedTransaction.deserialize(transaction);\n } catch (e) {\n throw new SolanaSignerError(\"Failed to deserialize transaction\", {\n cause: e as Error,\n });\n }\n\n let signed: VersionedTransaction;\n try {\n signed = await signer.signTransaction(tx);\n } catch (e) {\n throw new SolanaSignerError(\n \"Wallet adapter failed to sign transaction\",\n {\n cause: e as Error,\n },\n );\n }\n\n return { signedTransaction: new Uint8Array(signed.serialize()) };\n },\n };\n}\n"]}
@@ -0,0 +1,31 @@
1
+ import type { SolanaSigner } from "../types.js";
2
+ /** Minimal structural shape of a wallet-standard account. */
3
+ export interface WalletStandardAccount {
4
+ address: string;
5
+ publicKey?: Uint8Array;
6
+ chains?: readonly string[];
7
+ features?: readonly string[];
8
+ [key: string]: unknown;
9
+ }
10
+ /** Minimal structural shape of a wallet-standard wallet. */
11
+ export interface WalletStandardWallet {
12
+ features: {
13
+ readonly [name: string]: unknown;
14
+ };
15
+ }
16
+ /**
17
+ * Adapts a Wallet Standard wallet into a {@link SolanaSigner}.
18
+ *
19
+ * Works with any wallet that implements the `solana:signTransaction` feature
20
+ * from the Wallet Standard spec (Phantom, Solflare, etc.). No peer dependency
21
+ * required — the interface uses `Uint8Array` directly.
22
+ *
23
+ * For `@solana/wallet-adapter-react` wallets, use {@link fromWalletAdapter}.
24
+ * For `@solana/kit` signers, use {@link fromKitSigner}. For raw Ed25519
25
+ * keypairs, use {@link fromKeypair}.
26
+ *
27
+ * @param {WalletStandardWallet} wallet - The wallet-standard wallet object
28
+ * @param {WalletStandardAccount} account - The account to sign with
29
+ * @returns {SolanaSigner} A SolanaSigner compatible with `createSmartWalletClient`
30
+ */
31
+ export declare function fromWalletStandard(wallet: WalletStandardWallet, account: WalletStandardAccount): SolanaSigner;
@@ -0,0 +1,53 @@
1
+ import { SolanaSignerError } from "./SolanaSignerError.js";
2
+ const SIGN_TRANSACTION = "solana:signTransaction";
3
+ function isSolanaSignTransactionFeature(feature) {
4
+ return (typeof feature === "object" &&
5
+ feature !== null &&
6
+ "signTransaction" in feature &&
7
+ typeof feature.signTransaction ===
8
+ "function");
9
+ }
10
+ /**
11
+ * Adapts a Wallet Standard wallet into a {@link SolanaSigner}.
12
+ *
13
+ * Works with any wallet that implements the `solana:signTransaction` feature
14
+ * from the Wallet Standard spec (Phantom, Solflare, etc.). No peer dependency
15
+ * required — the interface uses `Uint8Array` directly.
16
+ *
17
+ * For `@solana/wallet-adapter-react` wallets, use {@link fromWalletAdapter}.
18
+ * For `@solana/kit` signers, use {@link fromKitSigner}. For raw Ed25519
19
+ * keypairs, use {@link fromKeypair}.
20
+ *
21
+ * @param {WalletStandardWallet} wallet - The wallet-standard wallet object
22
+ * @param {WalletStandardAccount} account - The account to sign with
23
+ * @returns {SolanaSigner} A SolanaSigner compatible with `createSmartWalletClient`
24
+ */
25
+ export function fromWalletStandard(wallet, account) {
26
+ const feature = wallet.features[SIGN_TRANSACTION];
27
+ if (!isSolanaSignTransactionFeature(feature)) {
28
+ throw new SolanaSignerError(`Wallet does not support the "${SIGN_TRANSACTION}" feature.`);
29
+ }
30
+ if (account.features && !account.features.includes(SIGN_TRANSACTION)) {
31
+ throw new SolanaSignerError(`Account ${account.address} does not support the "${SIGN_TRANSACTION}" feature.`);
32
+ }
33
+ return {
34
+ address: account.address,
35
+ async signTransaction({ transaction }) {
36
+ let output;
37
+ try {
38
+ [output] = await feature.signTransaction({ account, transaction });
39
+ }
40
+ catch (e) {
41
+ throw new SolanaSignerError("Wallet standard wallet failed to sign transaction", { cause: e });
42
+ }
43
+ if (!output) {
44
+ throw new SolanaSignerError("Wallet returned no signed transaction.");
45
+ }
46
+ if (!(output.signedTransaction instanceof Uint8Array)) {
47
+ throw new SolanaSignerError("Wallet returned an invalid signed transaction.");
48
+ }
49
+ return output;
50
+ },
51
+ };
52
+ }
53
+ //# sourceMappingURL=fromWalletStandard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fromWalletStandard.js","sourceRoot":"","sources":["../../../src/adapters/fromWalletStandard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AAyBlD,SAAS,8BAA8B,CACrC,OAAgB;IAEhB,OAAO,CACL,OAAO,OAAO,KAAK,QAAQ;QAC3B,OAAO,KAAK,IAAI;QAChB,iBAAiB,IAAI,OAAO;QAC5B,OAAQ,OAAyC,CAAC,eAAe;YAC/D,UAAU,CACb,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAA4B,EAC5B,OAA8B;IAE9B,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAElD,IAAI,CAAC,8BAA8B,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,iBAAiB,CACzB,gCAAgC,gBAAgB,YAAY,CAC7D,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,iBAAiB,CACzB,WAAW,OAAO,CAAC,OAAO,0BAA0B,gBAAgB,YAAY,CACjF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE;YACnC,IAAI,MAAqD,CAAC;YAC1D,IAAI,CAAC;gBACH,CAAC,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;YACrE,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,IAAI,iBAAiB,CACzB,mDAAmD,EACnD,EAAE,KAAK,EAAE,CAAU,EAAE,CACtB,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,iBAAiB,CAAC,wCAAwC,CAAC,CAAC;YACxE,CAAC;YAED,IAAI,CAAC,CAAC,MAAM,CAAC,iBAAiB,YAAY,UAAU,CAAC,EAAE,CAAC;gBACtD,MAAM,IAAI,iBAAiB,CACzB,gDAAgD,CACjD,CAAC;YACJ,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { SolanaSignerError } from \"./SolanaSignerError.js\";\nimport type { SolanaSigner } from \"../types.js\";\n\nconst SIGN_TRANSACTION = \"solana:signTransaction\";\n\n/** Minimal structural shape of a wallet-standard account. */\nexport interface WalletStandardAccount {\n address: string;\n publicKey?: Uint8Array;\n chains?: readonly string[];\n features?: readonly string[];\n [key: string]: unknown;\n}\n\n/** Minimal structural shape of a wallet-standard wallet. */\nexport interface WalletStandardWallet {\n features: { readonly [name: string]: unknown };\n}\n\ninterface SolanaSignTransactionFeature {\n readonly signTransaction: (\n ...inputs: readonly {\n account: WalletStandardAccount;\n transaction: Uint8Array;\n }[]\n ) => Promise<readonly { signedTransaction: Uint8Array }[]>;\n}\n\nfunction isSolanaSignTransactionFeature(\n feature: unknown,\n): feature is SolanaSignTransactionFeature {\n return (\n typeof feature === \"object\" &&\n feature !== null &&\n \"signTransaction\" in feature &&\n typeof (feature as { signTransaction?: unknown }).signTransaction ===\n \"function\"\n );\n}\n\n/**\n * Adapts a Wallet Standard wallet into a {@link SolanaSigner}.\n *\n * Works with any wallet that implements the `solana:signTransaction` feature\n * from the Wallet Standard spec (Phantom, Solflare, etc.). No peer dependency\n * required — the interface uses `Uint8Array` directly.\n *\n * For `@solana/wallet-adapter-react` wallets, use {@link fromWalletAdapter}.\n * For `@solana/kit` signers, use {@link fromKitSigner}. For raw Ed25519\n * keypairs, use {@link fromKeypair}.\n *\n * @param {WalletStandardWallet} wallet - The wallet-standard wallet object\n * @param {WalletStandardAccount} account - The account to sign with\n * @returns {SolanaSigner} A SolanaSigner compatible with `createSmartWalletClient`\n */\nexport function fromWalletStandard(\n wallet: WalletStandardWallet,\n account: WalletStandardAccount,\n): SolanaSigner {\n const feature = wallet.features[SIGN_TRANSACTION];\n\n if (!isSolanaSignTransactionFeature(feature)) {\n throw new SolanaSignerError(\n `Wallet does not support the \"${SIGN_TRANSACTION}\" feature.`,\n );\n }\n\n if (account.features && !account.features.includes(SIGN_TRANSACTION)) {\n throw new SolanaSignerError(\n `Account ${account.address} does not support the \"${SIGN_TRANSACTION}\" feature.`,\n );\n }\n\n return {\n address: account.address,\n async signTransaction({ transaction }) {\n let output: { signedTransaction: Uint8Array } | undefined;\n try {\n [output] = await feature.signTransaction({ account, transaction });\n } catch (e) {\n throw new SolanaSignerError(\n \"Wallet standard wallet failed to sign transaction\",\n { cause: e as Error },\n );\n }\n\n if (!output) {\n throw new SolanaSignerError(\"Wallet returned no signed transaction.\");\n }\n\n if (!(output.signedTransaction instanceof Uint8Array)) {\n throw new SolanaSignerError(\n \"Wallet returned an invalid signed transaction.\",\n );\n }\n\n return output;\n },\n };\n}\n"]}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Finds the signature slot index for `signerAddress` by decoding the
3
+ * transaction message and looking up the address in the account keys.
4
+ * Tries `@solana/kit` first, falls back to `@solana/web3.js`.
5
+ *
6
+ * @param {Uint8Array} transaction - The serialized Solana transaction bytes
7
+ * @param {string} signerAddress - The base58-encoded address of the signer
8
+ * @returns {Promise<number>} The slot index, or -1 if the address is not a required signer
9
+ */
10
+ export declare function findSignerSlot(transaction: Uint8Array, signerAddress: string): Promise<number>;
@@ -0,0 +1,39 @@
1
+ import { SolanaSignerError } from "./SolanaSignerError.js";
2
+ /**
3
+ * Finds the signature slot index for `signerAddress` by decoding the
4
+ * transaction message and looking up the address in the account keys.
5
+ * Tries `@solana/kit` first, falls back to `@solana/web3.js`.
6
+ *
7
+ * @param {Uint8Array} transaction - The serialized Solana transaction bytes
8
+ * @param {string} signerAddress - The base58-encoded address of the signer
9
+ * @returns {Promise<number>} The slot index, or -1 if the address is not a required signer
10
+ */
11
+ export async function findSignerSlot(transaction, signerAddress) {
12
+ let accounts;
13
+ let numRequiredSigners;
14
+ try {
15
+ const { getCompiledTransactionMessageDecoder } = await import("@solana/kit");
16
+ const numSigs = transaction[0];
17
+ const messageBytes = transaction.slice(1 + numSigs * 64);
18
+ const decoded = getCompiledTransactionMessageDecoder().decode(messageBytes);
19
+ accounts = decoded.staticAccounts;
20
+ numRequiredSigners = decoded.header.numSignerAccounts;
21
+ }
22
+ catch {
23
+ try {
24
+ const { VersionedTransaction } = await import("@solana/web3.js");
25
+ const vtx = VersionedTransaction.deserialize(transaction);
26
+ accounts = vtx.message.staticAccountKeys.map((k) => k.toBase58());
27
+ numRequiredSigners = vtx.message.header.numRequiredSignatures;
28
+ }
29
+ catch {
30
+ throw new SolanaSignerError("Failed to decode transaction: install @solana/kit or @solana/web3.js");
31
+ }
32
+ }
33
+ const slotIndex = accounts.indexOf(signerAddress);
34
+ if (slotIndex < 0 || slotIndex >= numRequiredSigners) {
35
+ return -1;
36
+ }
37
+ return slotIndex;
38
+ }
39
+ //# sourceMappingURL=resolveSignerSlot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveSignerSlot.js","sourceRoot":"","sources":["../../../src/adapters/resolveSignerSlot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAAuB,EACvB,aAAqB;IAErB,IAAI,QAA2B,CAAC;IAChC,IAAI,kBAA0B,CAAC;IAE/B,IAAI,CAAC;QACH,MAAM,EAAE,oCAAoC,EAAE,GAAG,MAAM,MAAM,CAC3D,aAAa,CACd,CAAC;QACF,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,oCAAoC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC5E,QAAQ,GAAG,OAAO,CAAC,cAAmC,CAAC;QACvD,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;YACjE,MAAM,GAAG,GAAG,oBAAoB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YAC1D,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YAClE,kBAAkB,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,iBAAiB,CACzB,sEAAsE,CACvE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAClD,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,IAAI,kBAAkB,EAAE,CAAC;QACrD,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import { SolanaSignerError } from \"./SolanaSignerError.js\";\n\n/**\n * Finds the signature slot index for `signerAddress` by decoding the\n * transaction message and looking up the address in the account keys.\n * Tries `@solana/kit` first, falls back to `@solana/web3.js`.\n *\n * @param {Uint8Array} transaction - The serialized Solana transaction bytes\n * @param {string} signerAddress - The base58-encoded address of the signer\n * @returns {Promise<number>} The slot index, or -1 if the address is not a required signer\n */\nexport async function findSignerSlot(\n transaction: Uint8Array,\n signerAddress: string,\n): Promise<number> {\n let accounts: readonly string[];\n let numRequiredSigners: number;\n\n try {\n const { getCompiledTransactionMessageDecoder } = await import(\n \"@solana/kit\"\n );\n const numSigs = transaction[0];\n const messageBytes = transaction.slice(1 + numSigs * 64);\n const decoded = getCompiledTransactionMessageDecoder().decode(messageBytes);\n accounts = decoded.staticAccounts as readonly string[];\n numRequiredSigners = decoded.header.numSignerAccounts;\n } catch {\n try {\n const { VersionedTransaction } = await import(\"@solana/web3.js\");\n const vtx = VersionedTransaction.deserialize(transaction);\n accounts = vtx.message.staticAccountKeys.map((k) => k.toBase58());\n numRequiredSigners = vtx.message.header.numRequiredSignatures;\n } catch {\n throw new SolanaSignerError(\n \"Failed to decode transaction: install @solana/kit or @solana/web3.js\",\n );\n }\n }\n\n const slotIndex = accounts.indexOf(signerAddress);\n if (slotIndex < 0 || slotIndex >= numRequiredSigners) {\n return -1;\n }\n return slotIndex;\n}\n"]}
@@ -1,7 +1,9 @@
1
1
  import { type Address, type Chain } from "viem";
2
- import type { SmartWalletClient, SmartWalletSigner } from "./types.js";
2
+ import type { SmartWalletClient, SmartWalletSigner, SolanaSmartWalletClient, SolanaSigner, SolanaChainDef } from "./types.js";
3
3
  import type { AlchemyWalletTransport } from "./transport.js";
4
- export type CreateSmartWalletClientParams = {
4
+ import type { SolanaChainId } from "@alchemy/wallet-api-types";
5
+ export declare const SOLANA_CHAINS: Record<SolanaChainId, SolanaChainDef>;
6
+ export type CreateEvmSmartWalletClientParams = {
5
7
  signer: SmartWalletSigner;
6
8
  transport: AlchemyWalletTransport;
7
9
  chain: Chain;
@@ -11,19 +13,32 @@ export type CreateSmartWalletClientParams = {
11
13
  policyIds?: string[];
12
14
  };
13
15
  };
16
+ export type CreateSolanaSmartWalletClientParams = {
17
+ signer: SolanaSigner;
18
+ transport: AlchemyWalletTransport;
19
+ chain: SolanaChainId;
20
+ account?: string;
21
+ paymaster?: {
22
+ policyId: string;
23
+ };
24
+ };
25
+ /** Either {@link CreateEvmSmartWalletClientParams} or {@link CreateSolanaSmartWalletClientParams}. */
26
+ export type CreateSmartWalletClientParams = CreateEvmSmartWalletClientParams | CreateSolanaSmartWalletClientParams;
27
+ /**
28
+ * Creates a smart wallet client for EVM chains with actions for preparing,
29
+ * signing, and sending user operations.
30
+ *
31
+ * @param {CreateEvmSmartWalletClientParams} params - EVM client configuration
32
+ * @returns {SmartWalletClient} An EVM smart wallet client with smart wallet actions
33
+ */
34
+ export declare function createSmartWalletClient(params: CreateEvmSmartWalletClientParams): SmartWalletClient;
14
35
  /**
15
- * Creates a smart wallet client with wallet API actions.
36
+ * Creates a smart wallet client for Solana chains with actions for preparing,
37
+ * signing, and sending transactions.
16
38
  *
17
- * By default, the client uses EIP-7702 with the signer's address, allowing you to call
18
- * `prepareCalls` or `sendCalls` directly without first calling `requestAccount`.
19
- * Use `requestAccount` only if you need a non-7702 smart account.
39
+ * Solana-specific adapters are in `@alchemy/wallet-apis/solana`.
20
40
  *
21
- * @param {CreateSmartWalletClientParams} params - Parameters for creating the smart wallet client.
22
- * @param {SmartWalletSigner} params.signer - The signer to use for signing transactions.
23
- * @param {AlchemyWalletTransport} params.transport - The transport to use for RPC calls.
24
- * @param {Chain} params.chain - The blockchain network to connect to.
25
- * @param {AccountParam} [params.account] - Optional account. Can be an address string or an object with an `address` property. Defaults to the signer's address (EIP-7702).
26
- * @param {object} [params.paymaster] - Optional paymaster configuration with policy IDs.
27
- * @returns {SmartWalletClient} A wallet client extended with smart wallet actions.
41
+ * @param {CreateSolanaSmartWalletClientParams} params - Solana client configuration
42
+ * @returns {SolanaSmartWalletClient} A Solana smart wallet client with Solana smart wallet actions
28
43
  */
29
- export declare const createSmartWalletClient: ({ signer, transport, chain, account, paymaster, }: CreateSmartWalletClientParams) => SmartWalletClient;
44
+ export declare function createSmartWalletClient(params: CreateSolanaSmartWalletClientParams): SolanaSmartWalletClient;
@@ -1,25 +1,48 @@
1
- import { createClient } from "viem";
1
+ import { BaseError } from "@alchemy/common";
2
+ import { createClient, defineChain } from "viem";
2
3
  import { smartWalletActions } from "./decorators/smartWalletActions.js";
4
+ import { solanaSmartWalletActions } from "./decorators/solanaSmartWalletActions.js";
3
5
  import { createInternalState } from "./internal.js";
4
6
  import { isLocalAccount } from "./utils/assertions.js";
5
- /**
6
- * Creates a smart wallet client with wallet API actions.
7
- *
8
- * By default, the client uses EIP-7702 with the signer's address, allowing you to call
9
- * `prepareCalls` or `sendCalls` directly without first calling `requestAccount`.
10
- * Use `requestAccount` only if you need a non-7702 smart account.
11
- *
12
- * @param {CreateSmartWalletClientParams} params - Parameters for creating the smart wallet client.
13
- * @param {SmartWalletSigner} params.signer - The signer to use for signing transactions.
14
- * @param {AlchemyWalletTransport} params.transport - The transport to use for RPC calls.
15
- * @param {Chain} params.chain - The blockchain network to connect to.
16
- * @param {AccountParam} [params.account] - Optional account. Can be an address string or an object with an `address` property. Defaults to the signer's address (EIP-7702).
17
- * @param {object} [params.paymaster] - Optional paymaster configuration with policy IDs.
18
- * @returns {SmartWalletClient} A wallet client extended with smart wallet actions.
19
- */
20
- export const createSmartWalletClient = ({ signer, transport, chain, account, paymaster, }) => {
7
+ // ── Solana chain definitions ────────────────────────────────────────────
8
+ const solanaMainnet = {
9
+ ...defineChain({
10
+ id: 0,
11
+ name: "Solana Mainnet",
12
+ nativeCurrency: { name: "SOL", symbol: "SOL", decimals: 9 },
13
+ rpcUrls: { default: { http: [] } },
14
+ }),
15
+ solanaChainId: "solana:mainnet",
16
+ };
17
+ const solanaDevnet = {
18
+ ...defineChain({
19
+ id: 0,
20
+ name: "Solana Devnet",
21
+ nativeCurrency: { name: "SOL", symbol: "SOL", decimals: 9 },
22
+ rpcUrls: { default: { http: [] } },
23
+ }),
24
+ solanaChainId: "solana:devnet",
25
+ };
26
+ export const SOLANA_CHAINS = {
27
+ "solana:mainnet": solanaMainnet,
28
+ "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp": solanaMainnet,
29
+ "solana:devnet": solanaDevnet,
30
+ "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1": solanaDevnet,
31
+ };
32
+ // ── Factory ─────────────────────────────────────────────────────────────
33
+ function isSolanaParams(params) {
34
+ return typeof params.chain === "string" && params.chain.startsWith("solana:");
35
+ }
36
+ export function createSmartWalletClient(params) {
37
+ if (isSolanaParams(params)) {
38
+ return createSolanaClient(params);
39
+ }
40
+ return createEvmClient(params);
41
+ }
42
+ // ── EVM path ────────────────────────────────────────────────────────────
43
+ function createEvmClient({ signer, transport, chain, account, paymaster, }) {
21
44
  const _policyIds = [
22
- ...(paymaster?.policyId ? [paymaster?.policyId] : []),
45
+ ...(paymaster?.policyId ? [paymaster.policyId] : []),
23
46
  ...(paymaster?.policyIds ?? []),
24
47
  ];
25
48
  // If no account address is provided, the client defaults to using the signer's address via EIP-7702.
@@ -37,5 +60,26 @@ export const createSmartWalletClient = ({ signer, transport, chain, account, pay
37
60
  owner: signer,
38
61
  }))
39
62
  .extend(smartWalletActions);
40
- };
63
+ }
64
+ // ── Solana path ─────────────────────────────────────────────────────────
65
+ function createSolanaClient({ signer, transport, chain, account, paymaster, }) {
66
+ const _policyIds = paymaster?.policyId ? [paymaster.policyId] : [];
67
+ const _account = account ?? signer.address;
68
+ const _chain = SOLANA_CHAINS[chain];
69
+ if (!_chain) {
70
+ throw new BaseError(`Unsupported Solana chain: ${chain}`);
71
+ }
72
+ return createClient({
73
+ transport,
74
+ chain: _chain,
75
+ name: "alchemySolanaSmartWalletClient",
76
+ })
77
+ .extend(() => ({
78
+ policyIds: _policyIds,
79
+ internal: createInternalState(),
80
+ owner: signer,
81
+ solanaAccount: _account,
82
+ }))
83
+ .extend(solanaSmartWalletActions);
84
+ }
41
85
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA4B,MAAM,MAAM,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAExE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAcvD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,EACtC,MAAM,EACN,SAAS,EACT,KAAK,EACL,OAAO,EACP,SAAS,GACqB,EAAqB,EAAE;IACrD,MAAM,UAAU,GAAG;QACjB,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,SAAS,EAAE,SAAS,IAAI,EAAE,CAAC;KAChC,CAAC;IAEF,qGAAqG;IACrG,MAAM,QAAQ,GACZ,OAAO;QACP,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAErE,OAAO,YAAY,CAAC;QAClB,OAAO,EAAE,QAAQ;QACjB,SAAS;QACT,KAAK;QACL,IAAI,EAAE,0BAA0B;KACjC,CAAC;SACC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QACb,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,mBAAmB,EAAE;QAC/B,KAAK,EAAE,MAAM;KACd,CAAC,CAAC;SACF,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAChC,CAAC,CAAC","sourcesContent":["import { createClient, type Address, type Chain } from \"viem\";\nimport { smartWalletActions } from \"./decorators/smartWalletActions.js\";\nimport type { SmartWalletClient, SmartWalletSigner } from \"./types.js\";\nimport { createInternalState } from \"./internal.js\";\nimport { isLocalAccount } from \"./utils/assertions.js\";\nimport type { AlchemyWalletTransport } from \"./transport.js\";\n\nexport type CreateSmartWalletClientParams = {\n signer: SmartWalletSigner;\n transport: AlchemyWalletTransport;\n chain: Chain;\n account?: Address;\n paymaster?: {\n policyId?: string;\n policyIds?: string[];\n };\n};\n\n/**\n * Creates a smart wallet client with wallet API actions.\n *\n * By default, the client uses EIP-7702 with the signer's address, allowing you to call\n * `prepareCalls` or `sendCalls` directly without first calling `requestAccount`.\n * Use `requestAccount` only if you need a non-7702 smart account.\n *\n * @param {CreateSmartWalletClientParams} params - Parameters for creating the smart wallet client.\n * @param {SmartWalletSigner} params.signer - The signer to use for signing transactions.\n * @param {AlchemyWalletTransport} params.transport - The transport to use for RPC calls.\n * @param {Chain} params.chain - The blockchain network to connect to.\n * @param {AccountParam} [params.account] - Optional account. Can be an address string or an object with an `address` property. Defaults to the signer's address (EIP-7702).\n * @param {object} [params.paymaster] - Optional paymaster configuration with policy IDs.\n * @returns {SmartWalletClient} A wallet client extended with smart wallet actions.\n */\nexport const createSmartWalletClient = ({\n signer,\n transport,\n chain,\n account,\n paymaster,\n}: CreateSmartWalletClientParams): SmartWalletClient => {\n const _policyIds = [\n ...(paymaster?.policyId ? [paymaster?.policyId] : []),\n ...(paymaster?.policyIds ?? []),\n ];\n\n // If no account address is provided, the client defaults to using the signer's address via EIP-7702.\n const _account =\n account ??\n (isLocalAccount(signer) ? signer.address : signer.account.address);\n\n return createClient({\n account: _account,\n transport,\n chain,\n name: \"alchemySmartWalletClient\",\n })\n .extend(() => ({\n policyIds: _policyIds,\n internal: createInternalState(),\n owner: signer,\n }))\n .extend(smartWalletActions);\n};\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,WAAW,EAA4B,MAAM,MAAM,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AAQpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAIvD,2EAA2E;AAE3E,MAAM,aAAa,GAAmB;IACpC,GAAG,WAAW,CAAC;QACb,EAAE,EAAE,CAAC;QACL,IAAI,EAAE,gBAAgB;QACtB,cAAc,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE;QAC3D,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;KACnC,CAAC;IACF,aAAa,EAAE,gBAAgB;CAChC,CAAC;AAEF,MAAM,YAAY,GAAmB;IACnC,GAAG,WAAW,CAAC;QACb,EAAE,EAAE,CAAC;QACL,IAAI,EAAE,eAAe;QACrB,cAAc,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE;QAC3D,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;KACnC,CAAC;IACF,aAAa,EAAE,eAAe;CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAA0C;IAClE,gBAAgB,EAAE,aAAa;IAC/B,yCAAyC,EAAE,aAAa;IACxD,eAAe,EAAE,YAAY;IAC7B,yCAAyC,EAAE,YAAY;CACxD,CAAC;AA8BF,2EAA2E;AAE3E,SAAS,cAAc,CACrB,MAAqC;IAErC,OAAO,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AAChF,CAAC;AAwBD,MAAM,UAAU,uBAAuB,CACrC,MAAqC;IAErC,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,2EAA2E;AAE3E,SAAS,eAAe,CAAC,EACvB,MAAM,EACN,SAAS,EACT,KAAK,EACL,OAAO,EACP,SAAS,GACwB;IACjC,MAAM,UAAU,GAAG;QACjB,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,GAAG,CAAC,SAAS,EAAE,SAAS,IAAI,EAAE,CAAC;KAChC,CAAC;IAEF,qGAAqG;IACrG,MAAM,QAAQ,GACZ,OAAO;QACP,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAErE,OAAO,YAAY,CAAC;QAClB,OAAO,EAAE,QAAQ;QACjB,SAAS;QACT,KAAK;QACL,IAAI,EAAE,0BAA0B;KACjC,CAAC;SACC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QACb,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,mBAAmB,EAAE;QAC/B,KAAK,EAAE,MAAM;KACd,CAAC,CAAC;SACF,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAChC,CAAC;AAED,2EAA2E;AAE3E,SAAS,kBAAkB,CAAC,EAC1B,MAAM,EACN,SAAS,EACT,KAAK,EACL,OAAO,EACP,SAAS,GAC2B;IACpC,MAAM,UAAU,GAAG,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnE,MAAM,QAAQ,GAAG,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;IAE3C,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,SAAS,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,YAAY,CAAC;QAClB,SAAS;QACT,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,gCAAgC;KACvC,CAAC;SACC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QACb,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,mBAAmB,EAAE;QAC/B,KAAK,EAAE,MAAM;QACb,aAAa,EAAE,QAAQ;KACxB,CAAC,CAAC;SACF,MAAM,CAAC,wBAAwB,CAAC,CAAC;AACtC,CAAC","sourcesContent":["import { BaseError } from \"@alchemy/common\";\nimport { createClient, defineChain, type Address, type Chain } from \"viem\";\nimport { smartWalletActions } from \"./decorators/smartWalletActions.js\";\nimport { solanaSmartWalletActions } from \"./decorators/solanaSmartWalletActions.js\";\nimport type {\n SmartWalletClient,\n SmartWalletSigner,\n SolanaSmartWalletClient,\n SolanaSigner,\n SolanaChainDef,\n} from \"./types.js\";\nimport { createInternalState } from \"./internal.js\";\nimport { isLocalAccount } from \"./utils/assertions.js\";\nimport type { AlchemyWalletTransport } from \"./transport.js\";\nimport type { SolanaChainId } from \"@alchemy/wallet-api-types\";\n\n// ── Solana chain definitions ────────────────────────────────────────────\n\nconst solanaMainnet: SolanaChainDef = {\n ...defineChain({\n id: 0,\n name: \"Solana Mainnet\",\n nativeCurrency: { name: \"SOL\", symbol: \"SOL\", decimals: 9 },\n rpcUrls: { default: { http: [] } },\n }),\n solanaChainId: \"solana:mainnet\",\n};\n\nconst solanaDevnet: SolanaChainDef = {\n ...defineChain({\n id: 0,\n name: \"Solana Devnet\",\n nativeCurrency: { name: \"SOL\", symbol: \"SOL\", decimals: 9 },\n rpcUrls: { default: { http: [] } },\n }),\n solanaChainId: \"solana:devnet\",\n};\n\nexport const SOLANA_CHAINS: Record<SolanaChainId, SolanaChainDef> = {\n \"solana:mainnet\": solanaMainnet,\n \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\": solanaMainnet,\n \"solana:devnet\": solanaDevnet,\n \"solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1\": solanaDevnet,\n};\n\n// ── Param types ─────────────────────────────────────────────────────────\n\nexport type CreateEvmSmartWalletClientParams = {\n signer: SmartWalletSigner;\n transport: AlchemyWalletTransport;\n chain: Chain;\n account?: Address;\n paymaster?: {\n policyId?: string;\n policyIds?: string[];\n };\n};\n\nexport type CreateSolanaSmartWalletClientParams = {\n signer: SolanaSigner;\n transport: AlchemyWalletTransport;\n chain: SolanaChainId;\n account?: string;\n paymaster?: {\n policyId: string;\n };\n};\n\n/** Either {@link CreateEvmSmartWalletClientParams} or {@link CreateSolanaSmartWalletClientParams}. */\nexport type CreateSmartWalletClientParams =\n | CreateEvmSmartWalletClientParams\n | CreateSolanaSmartWalletClientParams;\n\n// ── Factory ─────────────────────────────────────────────────────────────\n\nfunction isSolanaParams(\n params: CreateSmartWalletClientParams,\n): params is CreateSolanaSmartWalletClientParams {\n return typeof params.chain === \"string\" && params.chain.startsWith(\"solana:\");\n}\n\n/**\n * Creates a smart wallet client for EVM chains with actions for preparing,\n * signing, and sending user operations.\n *\n * @param {CreateEvmSmartWalletClientParams} params - EVM client configuration\n * @returns {SmartWalletClient} An EVM smart wallet client with smart wallet actions\n */\nexport function createSmartWalletClient(\n params: CreateEvmSmartWalletClientParams,\n): SmartWalletClient;\n/**\n * Creates a smart wallet client for Solana chains with actions for preparing,\n * signing, and sending transactions.\n *\n * Solana-specific adapters are in `@alchemy/wallet-apis/solana`.\n *\n * @param {CreateSolanaSmartWalletClientParams} params - Solana client configuration\n * @returns {SolanaSmartWalletClient} A Solana smart wallet client with Solana smart wallet actions\n */\nexport function createSmartWalletClient(\n params: CreateSolanaSmartWalletClientParams,\n): SolanaSmartWalletClient;\nexport function createSmartWalletClient(\n params: CreateSmartWalletClientParams,\n): SmartWalletClient | SolanaSmartWalletClient {\n if (isSolanaParams(params)) {\n return createSolanaClient(params);\n }\n return createEvmClient(params);\n}\n\n// ── EVM path ────────────────────────────────────────────────────────────\n\nfunction createEvmClient({\n signer,\n transport,\n chain,\n account,\n paymaster,\n}: CreateEvmSmartWalletClientParams): SmartWalletClient {\n const _policyIds = [\n ...(paymaster?.policyId ? [paymaster.policyId] : []),\n ...(paymaster?.policyIds ?? []),\n ];\n\n // If no account address is provided, the client defaults to using the signer's address via EIP-7702.\n const _account =\n account ??\n (isLocalAccount(signer) ? signer.address : signer.account.address);\n\n return createClient({\n account: _account,\n transport,\n chain,\n name: \"alchemySmartWalletClient\",\n })\n .extend(() => ({\n policyIds: _policyIds,\n internal: createInternalState(),\n owner: signer,\n }))\n .extend(smartWalletActions);\n}\n\n// ── Solana path ─────────────────────────────────────────────────────────\n\nfunction createSolanaClient({\n signer,\n transport,\n chain,\n account,\n paymaster,\n}: CreateSolanaSmartWalletClientParams): SolanaSmartWalletClient {\n const _policyIds = paymaster?.policyId ? [paymaster.policyId] : [];\n\n const _account = account ?? signer.address;\n\n const _chain = SOLANA_CHAINS[chain];\n if (!_chain) {\n throw new BaseError(`Unsupported Solana chain: ${chain}`);\n }\n\n return createClient({\n transport,\n chain: _chain,\n name: \"alchemySolanaSmartWalletClient\",\n })\n .extend(() => ({\n policyIds: _policyIds,\n internal: createInternalState(),\n owner: signer,\n solanaAccount: _account,\n }))\n .extend(solanaSmartWalletActions);\n}\n"]}
@@ -10,6 +10,7 @@ import { type SignMessageParams } from "../actions/signMessage.js";
10
10
  import { type SignTypedDataParams } from "../actions/signTypedData.js";
11
11
  import { type GrantPermissionsParams, type GrantPermissionsResult } from "../actions/grantPermissions.js";
12
12
  import { type GetCapabilitiesParams, type GetCapabilitiesResult } from "../actions/getCapabilities.js";
13
+ import { type UndelegateAccountParams, type UndelegateAccountResult } from "../actions/undelegateAccount.js";
13
14
  import type { InnerWalletApiClient } from "../types.js";
14
15
  import { type GetCallsStatusParameters, type GetCallsStatusReturnType, type WaitForCallsStatusParameters, type WaitForCallsStatusReturnType } from "viem/actions";
15
16
  export type SmartWalletActions = {
@@ -26,6 +27,7 @@ export type SmartWalletActions = {
26
27
  getCallsStatus: (params: GetCallsStatusParameters) => Promise<GetCallsStatusReturnType>;
27
28
  waitForCallsStatus: (params: WaitForCallsStatusParameters) => Promise<WaitForCallsStatusReturnType>;
28
29
  getCapabilities: (params?: GetCapabilitiesParams | undefined) => Promise<GetCapabilitiesResult>;
30
+ undelegateAccount: (params?: UndelegateAccountParams) => Promise<UndelegateAccountResult>;
29
31
  };
30
32
  /**
31
33
  * Decorator that adds smart wallet actions to a wallet API client.
@@ -10,6 +10,7 @@ import { signMessage } from "../actions/signMessage.js";
10
10
  import { signTypedData, } from "../actions/signTypedData.js";
11
11
  import { grantPermissions, } from "../actions/grantPermissions.js";
12
12
  import { getCapabilities, } from "../actions/getCapabilities.js";
13
+ import { undelegateAccount, } from "../actions/undelegateAccount.js";
13
14
  import { getCallsStatus, waitForCallsStatus, } from "viem/actions";
14
15
  /**
15
16
  * Decorator that adds smart wallet actions to a wallet API client.
@@ -19,7 +20,7 @@ import { getCallsStatus, waitForCallsStatus, } from "viem/actions";
19
20
  * @returns {SmartWalletActions} An object containing smart wallet action methods
20
21
  */
21
22
  export const smartWalletActions = (client) => ({
22
- // Alchemy methods.
23
+ // Alchemy actions.
23
24
  requestAccount: (params) => requestAccount(client, params),
24
25
  prepareCalls: (params) => prepareCalls(client, params),
25
26
  listAccounts: (params) => listAccounts(client, params),
@@ -31,7 +32,8 @@ export const smartWalletActions = (client) => ({
31
32
  signTypedData: (params) => signTypedData(client, params),
32
33
  grantPermissions: (params) => grantPermissions(client, params),
33
34
  getCapabilities: (params) => getCapabilities(client, params),
34
- // Viem methods.
35
+ undelegateAccount: (params) => undelegateAccount(client, params),
36
+ // Viem actions.
35
37
  getCallsStatus: (params) => getCallsStatus(client, params),
36
38
  waitForCallsStatus: (params) => waitForCallsStatus(client, params),
37
39
  });