thirdweb 5.57.2 → 5.58.0-nightly-3229e1f03c3cbb62ddc8dccf22ad8a8feb0a95f0-20240920000335

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 (206) hide show
  1. package/dist/cjs/exports/extensions/erc1155.js +3 -2
  2. package/dist/cjs/exports/extensions/erc1155.js.map +1 -1
  3. package/dist/cjs/extensions/erc1155/drops/read/getClaimConditions.js +1 -1
  4. package/dist/cjs/extensions/erc1155/drops/read/getClaimConditions.js.map +1 -1
  5. package/dist/cjs/extensions/erc20/drops/read/getClaimConditions.js +1 -1
  6. package/dist/cjs/extensions/erc20/drops/read/getClaimConditions.js.map +1 -1
  7. package/dist/cjs/extensions/erc721/drops/read/getClaimConditions.js +1 -1
  8. package/dist/cjs/extensions/erc721/drops/read/getClaimConditions.js.map +1 -1
  9. package/dist/cjs/react/core/hooks/wallets/useAutoConnect.js +3 -1
  10. package/dist/cjs/react/core/hooks/wallets/useAutoConnect.js.map +1 -1
  11. package/dist/cjs/react/core/utils/walletIcon.js +5 -1
  12. package/dist/cjs/react/core/utils/walletIcon.js.map +1 -1
  13. package/dist/cjs/react/native/ui/connect/InAppWalletUI.js +1 -0
  14. package/dist/cjs/react/native/ui/connect/InAppWalletUI.js.map +1 -1
  15. package/dist/cjs/react/native/ui/icons/svgs.js +12 -1
  16. package/dist/cjs/react/native/ui/icons/svgs.js.map +1 -1
  17. package/dist/cjs/react/web/ui/ConnectWallet/ConnectButton.js +3 -2
  18. package/dist/cjs/react/web/ui/ConnectWallet/ConnectButton.js.map +1 -1
  19. package/dist/cjs/react/web/ui/ConnectWallet/Details.js +1 -1
  20. package/dist/cjs/react/web/ui/ConnectWallet/Details.js.map +1 -1
  21. package/dist/cjs/react/web/ui/ConnectWallet/Modal/ConnectEmbed.js +3 -2
  22. package/dist/cjs/react/web/ui/ConnectWallet/Modal/ConnectEmbed.js.map +1 -1
  23. package/dist/cjs/react/web/wallets/shared/ConnectWalletSocialOptions.js +1 -0
  24. package/dist/cjs/react/web/wallets/shared/ConnectWalletSocialOptions.js.map +1 -1
  25. package/dist/cjs/react/web/wallets/shared/oauthSignIn.js +2 -1
  26. package/dist/cjs/react/web/wallets/shared/oauthSignIn.js.map +1 -1
  27. package/dist/cjs/utils/fetch.js +10 -4
  28. package/dist/cjs/utils/fetch.js.map +1 -1
  29. package/dist/cjs/version.js +1 -1
  30. package/dist/cjs/version.js.map +1 -1
  31. package/dist/cjs/wallets/in-app/core/authentication/types.js +2 -0
  32. package/dist/cjs/wallets/in-app/core/authentication/types.js.map +1 -1
  33. package/dist/cjs/wallets/in-app/core/wallet/in-app-core.js.map +1 -1
  34. package/dist/cjs/wallets/in-app/native/native-connector.js +1 -0
  35. package/dist/cjs/wallets/in-app/native/native-connector.js.map +1 -1
  36. package/dist/cjs/wallets/in-app/web/in-app.js +1 -0
  37. package/dist/cjs/wallets/in-app/web/in-app.js.map +1 -1
  38. package/dist/cjs/wallets/in-app/web/lib/actions/generate-wallet.enclave.js +26 -0
  39. package/dist/cjs/wallets/in-app/web/lib/actions/generate-wallet.enclave.js.map +1 -0
  40. package/dist/cjs/wallets/in-app/web/lib/actions/get-enclave-user-status.js +31 -0
  41. package/dist/cjs/wallets/in-app/web/lib/actions/get-enclave-user-status.js.map +1 -0
  42. package/dist/cjs/wallets/in-app/web/lib/actions/sign-message.enclave.js +30 -0
  43. package/dist/cjs/wallets/in-app/web/lib/actions/sign-message.enclave.js.map +1 -0
  44. package/dist/cjs/wallets/in-app/web/lib/actions/sign-transaction.enclave.js +28 -0
  45. package/dist/cjs/wallets/in-app/web/lib/actions/sign-transaction.enclave.js.map +1 -0
  46. package/dist/cjs/wallets/in-app/web/lib/actions/sign-typed-data.enclave.js +27 -0
  47. package/dist/cjs/wallets/in-app/web/lib/actions/sign-typed-data.enclave.js.map +1 -0
  48. package/dist/cjs/wallets/in-app/web/lib/auth/iframe-auth.js +42 -5
  49. package/dist/cjs/wallets/in-app/web/lib/auth/iframe-auth.js.map +1 -1
  50. package/dist/cjs/wallets/in-app/web/lib/enclave-wallet.js +195 -0
  51. package/dist/cjs/wallets/in-app/web/lib/enclave-wallet.js.map +1 -0
  52. package/dist/cjs/wallets/in-app/web/lib/get-auth-token.js +14 -0
  53. package/dist/cjs/wallets/in-app/web/lib/get-auth-token.js.map +1 -0
  54. package/dist/cjs/wallets/in-app/web/lib/{in-app-account.js → iframe-wallet.js} +8 -5
  55. package/dist/cjs/wallets/in-app/web/lib/iframe-wallet.js.map +1 -0
  56. package/dist/cjs/wallets/in-app/web/lib/web-connector.js +98 -37
  57. package/dist/cjs/wallets/in-app/web/lib/web-connector.js.map +1 -1
  58. package/dist/cjs/wallets/in-app/web/lib/web-wallet.js +3 -0
  59. package/dist/cjs/wallets/in-app/web/lib/web-wallet.js.map +1 -0
  60. package/dist/cjs/wallets/types.js +1 -0
  61. package/dist/cjs/wallets/types.js.map +1 -1
  62. package/dist/esm/exports/extensions/erc1155.js +1 -1
  63. package/dist/esm/exports/extensions/erc1155.js.map +1 -1
  64. package/dist/esm/extensions/erc1155/drops/read/getClaimConditions.js +1 -1
  65. package/dist/esm/extensions/erc1155/drops/read/getClaimConditions.js.map +1 -1
  66. package/dist/esm/extensions/erc20/drops/read/getClaimConditions.js +1 -1
  67. package/dist/esm/extensions/erc20/drops/read/getClaimConditions.js.map +1 -1
  68. package/dist/esm/extensions/erc721/drops/read/getClaimConditions.js +1 -1
  69. package/dist/esm/extensions/erc721/drops/read/getClaimConditions.js.map +1 -1
  70. package/dist/esm/react/core/hooks/wallets/useAutoConnect.js +3 -1
  71. package/dist/esm/react/core/hooks/wallets/useAutoConnect.js.map +1 -1
  72. package/dist/esm/react/core/utils/walletIcon.js +4 -0
  73. package/dist/esm/react/core/utils/walletIcon.js.map +1 -1
  74. package/dist/esm/react/native/ui/connect/InAppWalletUI.js +2 -1
  75. package/dist/esm/react/native/ui/connect/InAppWalletUI.js.map +1 -1
  76. package/dist/esm/react/native/ui/icons/svgs.js +11 -0
  77. package/dist/esm/react/native/ui/icons/svgs.js.map +1 -1
  78. package/dist/esm/react/web/ui/ConnectWallet/ConnectButton.js +3 -2
  79. package/dist/esm/react/web/ui/ConnectWallet/ConnectButton.js.map +1 -1
  80. package/dist/esm/react/web/ui/ConnectWallet/Details.js +1 -1
  81. package/dist/esm/react/web/ui/ConnectWallet/Details.js.map +1 -1
  82. package/dist/esm/react/web/ui/ConnectWallet/Modal/ConnectEmbed.js +3 -2
  83. package/dist/esm/react/web/ui/ConnectWallet/Modal/ConnectEmbed.js.map +1 -1
  84. package/dist/esm/react/web/wallets/shared/ConnectWalletSocialOptions.js +1 -0
  85. package/dist/esm/react/web/wallets/shared/ConnectWalletSocialOptions.js.map +1 -1
  86. package/dist/esm/react/web/wallets/shared/oauthSignIn.js +2 -1
  87. package/dist/esm/react/web/wallets/shared/oauthSignIn.js.map +1 -1
  88. package/dist/esm/utils/fetch.js +10 -4
  89. package/dist/esm/utils/fetch.js.map +1 -1
  90. package/dist/esm/version.js +1 -1
  91. package/dist/esm/version.js.map +1 -1
  92. package/dist/esm/wallets/in-app/core/authentication/types.js +2 -0
  93. package/dist/esm/wallets/in-app/core/authentication/types.js.map +1 -1
  94. package/dist/esm/wallets/in-app/core/wallet/in-app-core.js.map +1 -1
  95. package/dist/esm/wallets/in-app/native/native-connector.js +1 -0
  96. package/dist/esm/wallets/in-app/native/native-connector.js.map +1 -1
  97. package/dist/esm/wallets/in-app/web/in-app.js +1 -0
  98. package/dist/esm/wallets/in-app/web/in-app.js.map +1 -1
  99. package/dist/esm/wallets/in-app/web/lib/actions/generate-wallet.enclave.js +23 -0
  100. package/dist/esm/wallets/in-app/web/lib/actions/generate-wallet.enclave.js.map +1 -0
  101. package/dist/esm/wallets/in-app/web/lib/actions/get-enclave-user-status.js +28 -0
  102. package/dist/esm/wallets/in-app/web/lib/actions/get-enclave-user-status.js.map +1 -0
  103. package/dist/esm/wallets/in-app/web/lib/actions/sign-message.enclave.js +27 -0
  104. package/dist/esm/wallets/in-app/web/lib/actions/sign-message.enclave.js.map +1 -0
  105. package/dist/esm/wallets/in-app/web/lib/actions/sign-transaction.enclave.js +25 -0
  106. package/dist/esm/wallets/in-app/web/lib/actions/sign-transaction.enclave.js.map +1 -0
  107. package/dist/esm/wallets/in-app/web/lib/actions/sign-typed-data.enclave.js +24 -0
  108. package/dist/esm/wallets/in-app/web/lib/actions/sign-typed-data.enclave.js.map +1 -0
  109. package/dist/esm/wallets/in-app/web/lib/auth/iframe-auth.js +42 -5
  110. package/dist/esm/wallets/in-app/web/lib/auth/iframe-auth.js.map +1 -1
  111. package/dist/esm/wallets/in-app/web/lib/enclave-wallet.js +191 -0
  112. package/dist/esm/wallets/in-app/web/lib/enclave-wallet.js.map +1 -0
  113. package/dist/esm/wallets/in-app/web/lib/get-auth-token.js +11 -0
  114. package/dist/esm/wallets/in-app/web/lib/get-auth-token.js.map +1 -0
  115. package/dist/esm/wallets/in-app/web/lib/{in-app-account.js → iframe-wallet.js} +8 -5
  116. package/dist/esm/wallets/in-app/web/lib/iframe-wallet.js.map +1 -0
  117. package/dist/esm/wallets/in-app/web/lib/web-connector.js +98 -37
  118. package/dist/esm/wallets/in-app/web/lib/web-connector.js.map +1 -1
  119. package/dist/esm/wallets/in-app/web/lib/web-wallet.js +2 -0
  120. package/dist/esm/wallets/in-app/web/lib/web-wallet.js.map +1 -0
  121. package/dist/esm/wallets/types.js +1 -0
  122. package/dist/esm/wallets/types.js.map +1 -1
  123. package/dist/types/exports/extensions/erc1155.d.ts +1 -1
  124. package/dist/types/exports/extensions/erc1155.d.ts.map +1 -1
  125. package/dist/types/react/core/hooks/connection/types.d.ts +5 -0
  126. package/dist/types/react/core/hooks/connection/types.d.ts.map +1 -1
  127. package/dist/types/react/core/hooks/wallets/useAutoConnect.d.ts.map +1 -1
  128. package/dist/types/react/core/utils/walletIcon.d.ts +3 -1
  129. package/dist/types/react/core/utils/walletIcon.d.ts.map +1 -1
  130. package/dist/types/react/native/ui/connect/InAppWalletUI.d.ts.map +1 -1
  131. package/dist/types/react/native/ui/icons/svgs.d.ts +1 -0
  132. package/dist/types/react/native/ui/icons/svgs.d.ts.map +1 -1
  133. package/dist/types/react/web/ui/ConnectWallet/ConnectButton.d.ts.map +1 -1
  134. package/dist/types/react/web/ui/ConnectWallet/Modal/ConnectEmbed.d.ts.map +1 -1
  135. package/dist/types/react/web/wallets/shared/ConnectWalletSocialOptions.d.ts.map +1 -1
  136. package/dist/types/react/web/wallets/shared/oauthSignIn.d.ts.map +1 -1
  137. package/dist/types/utils/fetch.d.ts.map +1 -1
  138. package/dist/types/version.d.ts +1 -1
  139. package/dist/types/version.d.ts.map +1 -1
  140. package/dist/types/wallets/in-app/core/authentication/types.d.ts +5 -2
  141. package/dist/types/wallets/in-app/core/authentication/types.d.ts.map +1 -1
  142. package/dist/types/wallets/in-app/core/wallet/in-app-core.d.ts.map +1 -1
  143. package/dist/types/wallets/in-app/native/native-connector.d.ts.map +1 -1
  144. package/dist/types/wallets/in-app/web/in-app.d.ts +1 -0
  145. package/dist/types/wallets/in-app/web/in-app.d.ts.map +1 -1
  146. package/dist/types/wallets/in-app/web/lib/actions/generate-wallet.enclave.d.ts +15 -0
  147. package/dist/types/wallets/in-app/web/lib/actions/generate-wallet.enclave.d.ts.map +1 -0
  148. package/dist/types/wallets/in-app/web/lib/actions/get-enclave-user-status.d.ts +14 -0
  149. package/dist/types/wallets/in-app/web/lib/actions/get-enclave-user-status.d.ts.map +1 -0
  150. package/dist/types/wallets/in-app/web/lib/actions/sign-message.enclave.d.ts +17 -0
  151. package/dist/types/wallets/in-app/web/lib/actions/sign-message.enclave.d.ts.map +1 -0
  152. package/dist/types/wallets/in-app/web/lib/actions/sign-transaction.enclave.d.ts +9 -0
  153. package/dist/types/wallets/in-app/web/lib/actions/sign-transaction.enclave.d.ts.map +1 -0
  154. package/dist/types/wallets/in-app/web/lib/actions/sign-typed-data.enclave.d.ts +16 -0
  155. package/dist/types/wallets/in-app/web/lib/actions/sign-typed-data.enclave.d.ts.map +1 -0
  156. package/dist/types/wallets/in-app/web/lib/auth/iframe-auth.d.ts +2 -1
  157. package/dist/types/wallets/in-app/web/lib/auth/iframe-auth.d.ts.map +1 -1
  158. package/dist/types/wallets/in-app/web/lib/enclave-wallet.d.ts +61 -0
  159. package/dist/types/wallets/in-app/web/lib/enclave-wallet.d.ts.map +1 -0
  160. package/dist/types/wallets/in-app/web/lib/get-auth-token.d.ts +4 -0
  161. package/dist/types/wallets/in-app/web/lib/get-auth-token.d.ts.map +1 -0
  162. package/dist/types/wallets/in-app/web/lib/{in-app-account.d.ts → iframe-wallet.d.ts} +5 -8
  163. package/dist/types/wallets/in-app/web/lib/iframe-wallet.d.ts.map +1 -0
  164. package/dist/types/wallets/in-app/web/lib/web-connector.d.ts +4 -2
  165. package/dist/types/wallets/in-app/web/lib/web-connector.d.ts.map +1 -1
  166. package/dist/types/wallets/in-app/web/lib/web-wallet.d.ts +15 -0
  167. package/dist/types/wallets/in-app/web/lib/web-wallet.d.ts.map +1 -0
  168. package/dist/types/wallets/types.d.ts +2 -2
  169. package/dist/types/wallets/types.d.ts.map +1 -1
  170. package/package.json +1 -1
  171. package/src/exports/extensions/erc1155.ts +1 -0
  172. package/src/extensions/erc1155/drops/read/getClaimConditions.ts +1 -1
  173. package/src/extensions/erc20/drops/read/getClaimConditions.ts +1 -1
  174. package/src/extensions/erc721/drops/read/getClaimConditions.ts +1 -1
  175. package/src/extensions/prebuilts/deploy-published.test.ts +34 -1
  176. package/src/react/core/hooks/connection/types.ts +6 -0
  177. package/src/react/core/hooks/wallets/useAutoConnect.ts +4 -1
  178. package/src/react/core/utils/walletIcon.ts +5 -0
  179. package/src/react/native/ui/connect/InAppWalletUI.tsx +2 -0
  180. package/src/react/native/ui/icons/svgs.ts +12 -0
  181. package/src/react/web/ui/ConnectWallet/ConnectButton.tsx +5 -1
  182. package/src/react/web/ui/ConnectWallet/Details.tsx +1 -1
  183. package/src/react/web/ui/ConnectWallet/Modal/ConnectEmbed.tsx +5 -1
  184. package/src/react/web/wallets/shared/ConnectWalletSocialOptions.tsx +1 -0
  185. package/src/react/web/wallets/shared/oauthSignIn.ts +2 -1
  186. package/src/utils/fetch.ts +11 -4
  187. package/src/version.ts +1 -1
  188. package/src/wallets/in-app/core/authentication/types.ts +5 -1
  189. package/src/wallets/in-app/core/wallet/in-app-core.ts +1 -0
  190. package/src/wallets/in-app/native/native-connector.ts +1 -0
  191. package/src/wallets/in-app/web/in-app.ts +1 -0
  192. package/src/wallets/in-app/web/lib/actions/generate-wallet.enclave.ts +44 -0
  193. package/src/wallets/in-app/web/lib/actions/get-enclave-user-status.ts +44 -0
  194. package/src/wallets/in-app/web/lib/actions/sign-message.enclave.ts +52 -0
  195. package/src/wallets/in-app/web/lib/actions/sign-transaction.enclave.ts +48 -0
  196. package/src/wallets/in-app/web/lib/actions/sign-typed-data.enclave.ts +51 -0
  197. package/src/wallets/in-app/web/lib/auth/iframe-auth.ts +42 -6
  198. package/src/wallets/in-app/web/lib/enclave-wallet.ts +244 -0
  199. package/src/wallets/in-app/web/lib/get-auth-token.ts +17 -0
  200. package/src/wallets/in-app/web/lib/{in-app-account.ts → iframe-wallet.ts} +14 -15
  201. package/src/wallets/in-app/web/lib/web-connector.ts +107 -39
  202. package/src/wallets/in-app/web/lib/web-wallet.ts +23 -0
  203. package/src/wallets/types.ts +1 -0
  204. package/dist/cjs/wallets/in-app/web/lib/in-app-account.js.map +0 -1
  205. package/dist/esm/wallets/in-app/web/lib/in-app-account.js.map +0 -1
  206. package/dist/types/wallets/in-app/web/lib/in-app-account.d.ts.map +0 -1
@@ -0,0 +1,48 @@
1
+ import type { ThirdwebClient } from "../../../../../client/client.js";
2
+ import { getThirdwebBaseUrl } from "../../../../../utils/domains.js";
3
+ import type { Hex } from "../../../../../utils/encoding/hex.js";
4
+ import { getClientFetch } from "../../../../../utils/fetch.js";
5
+ import type { Ecosystem } from "../../types.js";
6
+ import { getAuthToken } from "../get-auth-token.js";
7
+
8
+ export async function signTransaction({
9
+ client,
10
+ ecosystem,
11
+ payload,
12
+ }: {
13
+ client: ThirdwebClient;
14
+ ecosystem?: Ecosystem;
15
+ payload: Record<string, Hex | number | undefined>;
16
+ }) {
17
+ console.log("payload", payload);
18
+ const clientFetch = getClientFetch(client, ecosystem);
19
+ const authToken = await getAuthToken(client, ecosystem);
20
+
21
+ const response = await clientFetch(
22
+ `${getThirdwebBaseUrl("inAppWallet")}/api/v1/enclave-wallet/sign-transaction`,
23
+ {
24
+ method: "POST",
25
+ headers: {
26
+ "Content-Type": "application/json",
27
+ "x-thirdweb-client-id": client.clientId,
28
+ Authorization: `Bearer embedded-wallet-token:${authToken}`,
29
+ },
30
+ body: JSON.stringify({
31
+ transactionPayload: payload,
32
+ }),
33
+ },
34
+ );
35
+
36
+ if (!response.ok) {
37
+ throw new Error("Failed to sign transaction");
38
+ }
39
+
40
+ const signedTransaction = (await response.json()) as {
41
+ r: string;
42
+ s: string;
43
+ v: number;
44
+ signature: string;
45
+ hash: string;
46
+ };
47
+ return signedTransaction.signature as Hex;
48
+ }
@@ -0,0 +1,51 @@
1
+ import type { TypedData } from "abitype";
2
+ import type { TypedDataDefinition } from "viem";
3
+ import type { ThirdwebClient } from "../../../../../client/client.js";
4
+ import { getThirdwebBaseUrl } from "../../../../../utils/domains.js";
5
+ import { getClientFetch } from "../../../../../utils/fetch.js";
6
+ import type { Ecosystem } from "../../types.js";
7
+ import { getAuthToken } from "../get-auth-token.js";
8
+
9
+ export async function signTypedData<
10
+ const typedData extends TypedData | Record<string, unknown>,
11
+ primaryType extends keyof typedData | "EIP712Domain" = keyof typedData,
12
+ >({
13
+ client,
14
+ ecosystem,
15
+ payload,
16
+ }: {
17
+ client: ThirdwebClient;
18
+ ecosystem?: Ecosystem;
19
+ payload: TypedDataDefinition<typedData, primaryType>;
20
+ }) {
21
+ const clientFetch = getClientFetch(client, ecosystem);
22
+ const authToken = await getAuthToken(client, ecosystem);
23
+
24
+ const response = await clientFetch(
25
+ `${getThirdwebBaseUrl("inAppWallet")}/api/v1/enclave-wallet/sign-typed-data`,
26
+ {
27
+ method: "POST",
28
+ headers: {
29
+ "Content-Type": "application/json",
30
+ "x-thirdweb-client-id": client.clientId,
31
+ Authorization: `Bearer embedded-wallet-token:${authToken}`,
32
+ },
33
+ body: JSON.stringify({
34
+ ...payload,
35
+ }),
36
+ },
37
+ );
38
+
39
+ if (!response.ok) {
40
+ throw new Error("Failed to sign typed data");
41
+ }
42
+
43
+ const signedTypedData = (await response.json()) as {
44
+ r: string;
45
+ s: string;
46
+ v: number;
47
+ signature: string;
48
+ hash: string;
49
+ };
50
+ return signedTypedData;
51
+ }
@@ -10,6 +10,8 @@ import type {
10
10
  } from "../../../core/authentication/types.js";
11
11
  import type { ClientIdWithQuerierType, Ecosystem } from "../../types.js";
12
12
  import type { InAppWalletIframeCommunicator } from "../../utils/iFrameCommunication/InAppWalletIframeCommunicator.js";
13
+ import { generateWallet } from "../actions/generate-wallet.enclave.js";
14
+ import { getEnclaveUserStatus } from "../actions/get-enclave-user-status.js";
13
15
  import { BaseLogin } from "./base-login.js";
14
16
 
15
17
  export type AuthQuerierTypes = {
@@ -20,7 +22,7 @@ export type AuthQuerierTypes = {
20
22
  clientId: string;
21
23
  authCookie: string;
22
24
  walletUserId: string;
23
- deviceShareStored: string;
25
+ deviceShareStored: string | null;
24
26
  };
25
27
  loginWithStoredTokenDetails: {
26
28
  storedToken: AuthStoredTokenWithCookieReturnType["storedToken"];
@@ -33,6 +35,7 @@ export type AuthQuerierTypes = {
33
35
  */
34
36
  export class Auth {
35
37
  protected client: ThirdwebClient;
38
+ protected ecosystem?: Ecosystem;
36
39
  protected AuthQuerier: InAppWalletIframeCommunicator<AuthQuerierTypes>;
37
40
  protected localStorage: ClientScopedStorage;
38
41
  protected onAuthSuccess: (
@@ -58,6 +61,7 @@ export class Auth {
58
61
  ) => Promise<AuthLoginReturnType>;
59
62
  }) {
60
63
  this.client = client;
64
+ this.ecosystem = ecosystem;
61
65
 
62
66
  this.AuthQuerier = querier;
63
67
  this.localStorage = new ClientScopedStorage({
@@ -103,6 +107,42 @@ export class Auth {
103
107
  recoveryCode?: string,
104
108
  ): Promise<AuthLoginReturnType> {
105
109
  await this.preLogin();
110
+
111
+ const user = await getEnclaveUserStatus({
112
+ authToken: authToken.storedToken.cookieString,
113
+ client: this.client,
114
+ ecosystem: this.ecosystem,
115
+ });
116
+ if (!user) {
117
+ throw new Error("Cannot login, no user found for auth token");
118
+ }
119
+
120
+ // If they're already an enclave wallet, proceed to login
121
+ if (user.wallets.length > 0 && user.wallets[0]?.type === "enclave") {
122
+ return this.postLogin({
123
+ storedToken: authToken.storedToken,
124
+ walletDetails: {
125
+ walletAddress: user.wallets[0].address,
126
+ },
127
+ });
128
+ }
129
+
130
+ if (user.wallets.length === 0 && this.ecosystem) {
131
+ // If this is a new ecosystem wallet without an enclave yet, we'll generate an enclave
132
+ const result = await generateWallet({
133
+ authToken: authToken.storedToken.cookieString,
134
+ client: this.client,
135
+ ecosystem: this.ecosystem,
136
+ });
137
+ return this.postLogin({
138
+ storedToken: authToken.storedToken,
139
+ walletDetails: {
140
+ walletAddress: result.address,
141
+ },
142
+ });
143
+ }
144
+
145
+ // If this is an existing sharded wallet or in-app wallet, we'll login with the sharded wallet
106
146
  const result = await this.AuthQuerier.call<AuthAndWalletRpcReturnType>({
107
147
  procedureName: "loginWithStoredTokenDetails",
108
148
  params: {
@@ -280,15 +320,11 @@ export class Auth {
280
320
  * @internal
281
321
  */
282
322
  async logout(): Promise<LogoutReturnType> {
283
- const { success } = await this.AuthQuerier.call<LogoutReturnType>({
284
- procedureName: "logout",
285
- params: undefined,
286
- });
287
323
  const isRemoveAuthCookie = await this.localStorage.removeAuthCookie();
288
324
  const isRemoveUserId = await this.localStorage.removeWalletUserId();
289
325
 
290
326
  return {
291
- success: success || isRemoveAuthCookie || isRemoveUserId,
327
+ success: isRemoveAuthCookie || isRemoveUserId,
292
328
  };
293
329
  }
294
330
  }
@@ -0,0 +1,244 @@
1
+ import { bytesToHex } from "viem";
2
+ import { getCachedChain } from "../../../../chains/utils.js";
3
+ import type { ThirdwebClient } from "../../../../client/client.js";
4
+ import { eth_sendRawTransaction } from "../../../../rpc/actions/eth_sendRawTransaction.js";
5
+ import { getRpcClient } from "../../../../rpc/rpc.js";
6
+ import { getAddress } from "../../../../utils/address.js";
7
+ import { type Hex, toHex } from "../../../../utils/encoding/hex.js";
8
+ import { parseTypedData } from "../../../../utils/signatures/helpers/parseTypedData.js";
9
+ import { webLocalStorage } from "../../../../utils/storage/webStorage.js";
10
+ import type { Prettify } from "../../../../utils/type-utils.js";
11
+ import type {
12
+ Account,
13
+ SendTransactionOption,
14
+ } from "../../../interfaces/wallet.js";
15
+ import { ClientScopedStorage } from "../../core/authentication/client-scoped-storage.js";
16
+ import {
17
+ type GetUser,
18
+ RecoveryShareManagement,
19
+ UserWalletStatus,
20
+ type WalletAddressObjectType,
21
+ } from "../../core/authentication/types.js";
22
+ import type { Ecosystem } from "../types.js";
23
+ import { getEnclaveUserStatus } from "./actions/get-enclave-user-status.js";
24
+ import { signMessage as signEnclaveMessage } from "./actions/sign-message.enclave.js";
25
+ import { signTransaction as signEnclaveTransaction } from "./actions/sign-transaction.enclave.js";
26
+ import { signTypedData as signEnclaveTypedData } from "./actions/sign-typed-data.enclave.js";
27
+ import type { IWebWallet, PostWalletSetup } from "./web-wallet.js";
28
+
29
+ export type UserStatus = {
30
+ linkedAccounts: {
31
+ type: string;
32
+ details:
33
+ | { email: string; [key: string]: string }
34
+ | { phone: string; [key: string]: string }
35
+ | { address: string; [key: string]: string }
36
+ | { id: string; [key: string]: string };
37
+ }[];
38
+ wallets:
39
+ | [
40
+ {
41
+ address: string;
42
+ createdAt: string;
43
+ type: "sharded" | "enclave";
44
+ },
45
+ ]
46
+ | [];
47
+ id: string;
48
+ };
49
+
50
+ export class EnclaveWallet implements IWebWallet {
51
+ public client: ThirdwebClient;
52
+ public ecosystem?: Ecosystem;
53
+ public address: string;
54
+ protected localStorage: ClientScopedStorage;
55
+
56
+ constructor({
57
+ client,
58
+ ecosystem,
59
+ address,
60
+ }: Prettify<{
61
+ client: ThirdwebClient;
62
+ ecosystem?: Ecosystem;
63
+ address: string;
64
+ }>) {
65
+ this.client = client;
66
+ this.ecosystem = ecosystem;
67
+ this.address = address;
68
+
69
+ this.localStorage = new ClientScopedStorage({
70
+ storage: webLocalStorage,
71
+ clientId: client.clientId,
72
+ ecosystemId: ecosystem?.id,
73
+ });
74
+ }
75
+
76
+ /**
77
+ * Store the auth token for use
78
+ * @returns `{walletAddress: string }` The user's wallet details
79
+ * @internal
80
+ */
81
+ async postWalletSetUp({
82
+ walletAddress,
83
+ authToken,
84
+ }: PostWalletSetup): Promise<WalletAddressObjectType> {
85
+ await this.localStorage.saveAuthCookie(authToken);
86
+ return { walletAddress };
87
+ }
88
+
89
+ /**
90
+ * Gets the current user's details
91
+ * @internal
92
+ */
93
+ async getUserWalletStatus(): Promise<GetUser> {
94
+ const token = await this.localStorage.getAuthCookie();
95
+ if (!token) {
96
+ return { status: UserWalletStatus.LOGGED_OUT };
97
+ }
98
+
99
+ const userStatus = await getEnclaveUserStatus({
100
+ authToken: token,
101
+ client: this.client,
102
+ ecosystem: this.ecosystem,
103
+ });
104
+ if (!userStatus) {
105
+ return { status: UserWalletStatus.LOGGED_OUT };
106
+ }
107
+ const wallet = userStatus.wallets[0];
108
+
109
+ const authDetails = {
110
+ email: userStatus.linkedAccounts.find(
111
+ (account) => account.type === "email",
112
+ )?.details.email,
113
+ phoneNumber: userStatus.linkedAccounts.find(
114
+ (account) => account.type === "phone",
115
+ )?.details.phone,
116
+ userWalletId: userStatus.id || "",
117
+ recoveryShareManagement: RecoveryShareManagement.ENCLAVE,
118
+ };
119
+
120
+ if (!wallet) {
121
+ return {
122
+ status: UserWalletStatus.LOGGED_IN_WALLET_UNINITIALIZED,
123
+ authDetails,
124
+ };
125
+ }
126
+
127
+ return {
128
+ status: UserWalletStatus.LOGGED_IN_WALLET_INITIALIZED,
129
+ walletAddress: wallet.address,
130
+ authDetails,
131
+ account: await this.getAccount(),
132
+ };
133
+ }
134
+
135
+ /**
136
+ * Returns an account to perform wallet operations
137
+ * @internal
138
+ */
139
+ async getAccount(): Promise<Account> {
140
+ const client = this.client;
141
+ const ecosystem = this.ecosystem;
142
+
143
+ const _signTransaction = async (tx: SendTransactionOption) => {
144
+ const rpcRequest = getRpcClient({
145
+ client,
146
+ chain: getCachedChain(tx.chainId),
147
+ });
148
+ const transaction: Record<string, Hex | number | undefined> = {
149
+ to: (tx.to as Hex) ?? undefined,
150
+ data: tx.data ? toHex(tx.data) : undefined,
151
+ value: tx.value ? toHex(tx.value) : undefined,
152
+ gas: tx.gas ? toHex(tx.gas + tx.gas / BigInt(10)) : undefined, // Add a 10% buffer to gas
153
+ nonce: tx.nonce
154
+ ? toHex(tx.nonce)
155
+ : toHex(
156
+ await import(
157
+ "../../../../rpc/actions/eth_getTransactionCount.js"
158
+ ).then(({ eth_getTransactionCount }) =>
159
+ eth_getTransactionCount(rpcRequest, {
160
+ address: this.address,
161
+ blockTag: "pending",
162
+ }),
163
+ ),
164
+ ),
165
+ chainId: toHex(tx.chainId),
166
+ };
167
+
168
+ if (tx.maxFeePerGas) {
169
+ transaction.maxFeePerGas = toHex(tx.maxFeePerGas);
170
+ transaction.maxPriorityFeePerGas = tx.maxPriorityFeePerGas
171
+ ? toHex(tx.maxPriorityFeePerGas)
172
+ : undefined;
173
+ transaction.type = 2;
174
+ } else {
175
+ transaction.gasPrice = tx.gasPrice ? toHex(tx.gasPrice) : undefined;
176
+ transaction.type = 0;
177
+ }
178
+
179
+ return signEnclaveTransaction({
180
+ client,
181
+ ecosystem,
182
+ payload: transaction,
183
+ });
184
+ };
185
+ return {
186
+ address: getAddress(this.address),
187
+ async signTransaction(tx) {
188
+ if (!tx.chainId) {
189
+ throw new Error("chainId required in tx to sign");
190
+ }
191
+
192
+ return _signTransaction({
193
+ chainId: tx.chainId,
194
+ ...tx,
195
+ });
196
+ },
197
+ async sendTransaction(tx) {
198
+ const rpcRequest = getRpcClient({
199
+ client,
200
+ chain: getCachedChain(tx.chainId),
201
+ });
202
+ const signedTx = await _signTransaction(tx);
203
+ const transactionHash = await eth_sendRawTransaction(
204
+ rpcRequest,
205
+ signedTx,
206
+ );
207
+ return {
208
+ transactionHash,
209
+ };
210
+ },
211
+ async signMessage({ message }) {
212
+ const messagePayload = (() => {
213
+ if (typeof message === "string") {
214
+ return { message, isRaw: false };
215
+ }
216
+ return {
217
+ message:
218
+ typeof message.raw === "string"
219
+ ? message.raw
220
+ : bytesToHex(message.raw),
221
+ isRaw: true,
222
+ };
223
+ })();
224
+
225
+ const { signature } = await signEnclaveMessage({
226
+ client,
227
+ ecosystem,
228
+ payload: messagePayload,
229
+ });
230
+ return signature as Hex;
231
+ },
232
+ async signTypedData(_typedData) {
233
+ const parsedTypedData = parseTypedData(_typedData);
234
+ const { signature } = await signEnclaveTypedData({
235
+ client,
236
+ ecosystem,
237
+ payload: parsedTypedData,
238
+ });
239
+
240
+ return signature as Hex;
241
+ },
242
+ };
243
+ }
244
+ }
@@ -0,0 +1,17 @@
1
+ import type { ThirdwebClient } from "../../../../client/client.js";
2
+ import { webLocalStorage } from "../../../../utils/storage/webStorage.js";
3
+ import { ClientScopedStorage } from "../../core/authentication/client-scoped-storage.js";
4
+ import type { Ecosystem } from "../types.js";
5
+
6
+ export async function getAuthToken(
7
+ client: ThirdwebClient,
8
+ ecosystem?: Ecosystem,
9
+ ) {
10
+ const localStorage = new ClientScopedStorage({
11
+ storage: webLocalStorage,
12
+ clientId: client.clientId,
13
+ ecosystemId: ecosystem?.id,
14
+ });
15
+
16
+ return localStorage.getAuthCookie();
17
+ }
@@ -19,7 +19,6 @@ import { ClientScopedStorage } from "../../core/authentication/client-scoped-sto
19
19
  import {
20
20
  type GetUser,
21
21
  type GetUserWalletStatusRpcReturnType,
22
- type SetUpWalletRpcReturnType,
23
22
  UserWalletStatus,
24
23
  type WalletAddressObjectType,
25
24
  } from "../../core/authentication/types.js";
@@ -32,6 +31,7 @@ import type {
32
31
  SignedTypedDataReturnType,
33
32
  } from "../types.js";
34
33
  import type { InAppWalletIframeCommunicator } from "../utils/iFrameCommunication/InAppWalletIframeCommunicator.js";
34
+ import type { IWebWallet, PostWalletSetup } from "./web-wallet.js";
35
35
 
36
36
  export type WalletManagementTypes = {
37
37
  createWallet: undefined;
@@ -70,14 +70,10 @@ export type SignerProcedureTypes = {
70
70
  //connect: { provider: Provider };
71
71
  };
72
72
 
73
- type PostWalletSetup = SetUpWalletRpcReturnType & {
74
- walletUserId: string;
75
- };
76
-
77
73
  /**
78
74
  *
79
75
  */
80
- export class IFrameWallet {
76
+ export class IFrameWallet implements IWebWallet {
81
77
  public client: ThirdwebClient;
82
78
  public ecosystem?: Ecosystem;
83
79
  protected walletManagerQuerier: InAppWalletIframeCommunicator<
@@ -114,16 +110,19 @@ export class IFrameWallet {
114
110
  * @returns `{walletAddress : string }` The user's wallet details
115
111
  * @internal
116
112
  */
117
- async postWalletSetUp({
118
- deviceShareStored,
119
- walletAddress,
120
- isIframeStorageEnabled,
121
- walletUserId,
122
- }: PostWalletSetup): Promise<WalletAddressObjectType> {
123
- if (!isIframeStorageEnabled) {
124
- await this.localStorage.saveDeviceShare(deviceShareStored, walletUserId);
113
+ async postWalletSetUp(
114
+ props: PostWalletSetup,
115
+ ): Promise<WalletAddressObjectType> {
116
+ if ("isIframeStorageEnabled" in props) {
117
+ if (!props.isIframeStorageEnabled) {
118
+ await this.localStorage.saveDeviceShare(
119
+ props.deviceShareStored,
120
+ props.walletUserId,
121
+ );
122
+ }
123
+ return { walletAddress: props.walletAddress };
125
124
  }
126
- return { walletAddress };
125
+ throw new Error("Invalid postWalletSetUp props");
127
126
  }
128
127
 
129
128
  /**